synapse/memory/service.py was deleted on 2026-08-25 when memory curation moved in-process (curator.py) - there is no longer a second FastAPI app to run on :8001. This CLI was evidently built against a pre-curator baseline: `nexus serve` spawned `synapse.memory.service:app` (fails with ModuleNotFoundError, logged only to memory.log where nobody would see it), `nexus start memory`/`stop memory` had no handler at all (silently fell through to show_help()), and doctor/status/monitor all carried a "memory service" row that could never be anything but down. Removed rather than repaired, since there's nothing to repair: the service, its SERVICES entry, --memory-port/--no-memory, the -m/--memory target everywhere it was offered (start/stop/logs/LEGACY_TARGETS), and the memory_port/memory_url settings this PR had added. The `nexus memory list|add|rm` data commands (nexus_api.py, hitting the backend's own /memory REST endpoint) are untouched - unrelated, and still work.
78 lines
2.7 KiB
Python
78 lines
2.7 KiB
Python
"""Tests for the ASCII monitor — renderer + collectors, no live stack required."""
|
|
from __future__ import annotations
|
|
|
|
from nexusos_cli.monitor import _bar, _fmt_bytes, _recent_tools, render_frame
|
|
|
|
|
|
def test_bar_bounds():
|
|
assert _bar(0, 10, unicode=False) == "-" * 10
|
|
assert _bar(1, 10, unicode=False) == "#" * 10
|
|
assert _bar(0.5, 10, unicode=False).count("#") == 5
|
|
|
|
|
|
def test_fmt_bytes():
|
|
assert _fmt_bytes(None) == "—"
|
|
assert _fmt_bytes(512) == "512B"
|
|
assert _fmt_bytes(2048).endswith("K")
|
|
|
|
|
|
def test_render_frame_contains_sections():
|
|
snap = {
|
|
"ts": "2026-08-20T12:00:00-05:00",
|
|
"version": "0.0.0",
|
|
"services": {
|
|
"backend": {"running": True, "pid": 11, "url": "http://127.0.0.1:8000"},
|
|
"frontend": {"running": False, "pid": None, "url": "http://127.0.0.1:5173"},
|
|
"provider": {
|
|
"provider": "ollama",
|
|
"url": "http://127.0.0.1:11434",
|
|
"reachable": True,
|
|
},
|
|
},
|
|
"api": {
|
|
"online": True,
|
|
"version": "0.0.0",
|
|
"ollama": "running",
|
|
"memories": 3,
|
|
"conversations": 2,
|
|
"playbooks": 1,
|
|
"models": 4,
|
|
"action_tool_policy": "ask",
|
|
},
|
|
"host": {"cpu_pct": 12.5, "mem_used": 1_000_000_000, "mem_total": 8_000_000_000, "mem_pct": 12.5},
|
|
"procs": {"cpu_pct": 1.0, "rss": 50_000_000, "pids": [11]},
|
|
"toolchains": [
|
|
{"lang": "python", "ready": True, "tool": "/usr/bin/python", "summary": "python"},
|
|
{"lang": "rust", "ready": False, "tool": None, "summary": "rust"},
|
|
],
|
|
"recent_tools": ["run_snippet", "render_preview"],
|
|
"paths": {},
|
|
}
|
|
frame = render_frame(snap, width=72, unicode=False)
|
|
assert "SERVICES" in frame
|
|
assert "RESOURCES" in frame
|
|
assert "DATA / TOOLS" in frame
|
|
assert "RUN TOOLCHAINS" in frame
|
|
assert "backend" in frame and "UP" in frame
|
|
assert "frontend" in frame and "DOWN" in frame
|
|
assert "run_snippet" in frame
|
|
assert "ready python" in frame
|
|
assert "missing rust" in frame
|
|
# Fixed-width box: every content line same length.
|
|
lengths = {len(line) for line in frame.splitlines()}
|
|
assert len(lengths) == 1
|
|
|
|
|
|
def test_recent_tools_parses_status_sentinels(tmp_path):
|
|
log = tmp_path / "chat.log"
|
|
log.write_text(
|
|
"noise\n__status__tools\n__status__run_snippet\n"
|
|
'payload {"name": "render_preview"}\n__status__remember\n',
|
|
encoding="utf-8",
|
|
)
|
|
found = _recent_tools(log, limit=5)
|
|
assert "run_snippet" in found
|
|
assert "remember" in found
|
|
assert "render_preview" in found
|
|
assert "tools" not in found
|