personal memory agent
1# SPDX-License-Identifier: AGPL-3.0-only
2# Copyright (c) 2026 sol pbc
3
4import importlib
5import sys
6from types import SimpleNamespace
7
8
9def _setup_genai(monkeypatch):
10 import types
11
12 google_mod = types.ModuleType("google")
13 genai_mod = types.ModuleType("google.genai")
14
15 class DummyModels:
16 def generate_content(self, *a, **k):
17 DummyModels.kwargs = {"args": a, "kwargs": k}
18 return SimpleNamespace(text="plan")
19
20 class DummyClient:
21 def __init__(self, *a, **k):
22 self.models = SimpleNamespace(
23 generate_content=DummyModels().generate_content
24 )
25
26 genai_mod.Client = DummyClient
27 genai_mod.types = types.SimpleNamespace(
28 GenerateContentConfig=lambda **k: SimpleNamespace(**k),
29 ThinkingConfig=lambda **k: SimpleNamespace(**k),
30 )
31 google_mod.genai = genai_mod
32 monkeypatch.setitem(sys.modules, "google", google_mod)
33 monkeypatch.setitem(sys.modules, "google.genai", genai_mod)
34
35
36def test_generate_plan(monkeypatch):
37 sys.modules.pop("think.planner", None)
38 mod = importlib.import_module("think.planner")
39
40 # Mock generate to return "plan"
41 def mock_generate(**kwargs):
42 return "plan"
43
44 monkeypatch.setattr("think.models.generate", mock_generate)
45 result = mod.generate_plan("do something")
46 assert result == "plan"
47
48
49def test_planner_main(tmp_path, monkeypatch, capsys):
50 sys.modules.pop("think.planner", None)
51 mod = importlib.import_module("think.planner")
52 monkeypatch.setenv("_SOLSTONE_JOURNAL_OVERRIDE", str(tmp_path))
53 monkeypatch.setattr(mod, "generate_plan", lambda *a, **k: "ok")
54 task = tmp_path / "t.txt"
55 task.write_text("hi")
56 monkeypatch.setattr("sys.argv", ["sol planner", str(task)])
57 mod.main()
58 out = capsys.readouterr().out.strip()
59 assert out == "ok"