Add core CLI (chat, test, check, trace, oov, pack)
This commit is contained in:
parent
454b7d9f9e
commit
0800f8d35f
2 changed files with 183 additions and 0 deletions
180
core/cli.py
Normal file
180
core/cli.py
Normal file
|
|
@ -0,0 +1,180 @@
|
||||||
|
"""core CLI — single entry point for the versor engine.
|
||||||
|
|
||||||
|
Subcommands
|
||||||
|
-----------
|
||||||
|
core chat Start interactive chat session (delegates to python -m chat)
|
||||||
|
core test [args] Run pytest suite with sane defaults
|
||||||
|
core check Run ruff on the whole project
|
||||||
|
core trace <text> Trace one turn: show field condition, dialogue role, proposition
|
||||||
|
core oov <token> Ground a single unknown token and show the constructed versor info
|
||||||
|
core pack list List mounted language packs
|
||||||
|
core pack verify <id> Verify a language pack checksum
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from typing import NoReturn
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Helpers
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _run(*args: str, check: bool = True) -> subprocess.CompletedProcess[str]:
|
||||||
|
return subprocess.run(args, check=check, text=True)
|
||||||
|
|
||||||
|
|
||||||
|
def _die(msg: str) -> NoReturn:
|
||||||
|
print(f"error: {msg}", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def _usage() -> NoReturn:
|
||||||
|
print(__doc__)
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Subcommands
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def cmd_chat(argv: list[str]) -> None:
|
||||||
|
"""Launch the readline REPL backed by ChatRuntime."""
|
||||||
|
_run(sys.executable, "-m", "chat", *argv, check=False)
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_test(argv: list[str]) -> None:
|
||||||
|
"""Run the pytest suite. Extra args are forwarded to pytest."""
|
||||||
|
default_args = ["-q", "--tb=short"]
|
||||||
|
_run(sys.executable, "-m", "pytest", *(argv or default_args), check=False)
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_check(argv: list[str]) -> None:
|
||||||
|
"""Run ruff over the project source."""
|
||||||
|
targets = argv or [
|
||||||
|
"algebra", "ingest", "field", "vocab", "vault", "persona",
|
||||||
|
"generate", "session", "chat", "core", "language_packs", "tests",
|
||||||
|
]
|
||||||
|
_run(sys.executable, "-m", "ruff", "check", *targets, check=False)
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_trace(argv: list[str]) -> None:
|
||||||
|
"""Trace one chat turn and print field telemetry."""
|
||||||
|
if not argv:
|
||||||
|
_die("usage: core trace <text>")
|
||||||
|
text = " ".join(argv)
|
||||||
|
|
||||||
|
from chat.runtime import ChatRuntime
|
||||||
|
rt = ChatRuntime()
|
||||||
|
resp = rt.chat(text)
|
||||||
|
|
||||||
|
print(f"input : {text}")
|
||||||
|
print(f"surface : {resp.surface}")
|
||||||
|
print(f"dialogue_role : {resp.dialogue_role}")
|
||||||
|
print(f"versor_cond : {resp.versor_condition:.2e}")
|
||||||
|
p = resp.proposition
|
||||||
|
print(f"proposition : {p.surface!r}")
|
||||||
|
print(f" frame_id : {p.frame_id}")
|
||||||
|
print(f" subject : {p.subject_surface!r}")
|
||||||
|
print(f" predicate : {p.predicate_surface!r}")
|
||||||
|
if hasattr(p, "object_surface") and p.object_surface:
|
||||||
|
print(f" object : {p.object_surface!r}")
|
||||||
|
import numpy as np
|
||||||
|
print(f" relation_norm: {float(np.linalg.norm(p.relation)):.4f}")
|
||||||
|
|
||||||
|
session = rt.session
|
||||||
|
print(f"vault_entries : {len(session.vault)}")
|
||||||
|
oov = getattr(session.vocab, "unknown_token_log", [])
|
||||||
|
if oov:
|
||||||
|
print(f"oov_grounded : {len(oov)} token(s)")
|
||||||
|
for entry in oov:
|
||||||
|
print(f" {entry}")
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_oov(argv: list[str]) -> None:
|
||||||
|
"""Ground a single unknown token and show the constructed versor info."""
|
||||||
|
if not argv:
|
||||||
|
_die("usage: core oov <token>")
|
||||||
|
token = argv[0]
|
||||||
|
|
||||||
|
from chat.runtime import ChatRuntime
|
||||||
|
from algebra.versor import versor_condition
|
||||||
|
rt = ChatRuntime()
|
||||||
|
vocab = rt.session.vocab
|
||||||
|
|
||||||
|
# Try known first
|
||||||
|
try:
|
||||||
|
v = vocab.get_versor(token)
|
||||||
|
print(f"{token!r} is already in the manifold")
|
||||||
|
import numpy as np
|
||||||
|
print(f" versor_cond: {versor_condition(v):.2e}")
|
||||||
|
return
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Ground it
|
||||||
|
from ingest.gate import inject
|
||||||
|
state = inject([token], vocab)
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
print(f"{token!r} — grounded as transient")
|
||||||
|
print(f" versor_cond : {versor_condition(state.F):.2e}")
|
||||||
|
oov_log = getattr(vocab, "unknown_token_log", [])
|
||||||
|
if oov_log:
|
||||||
|
last = oov_log[-1]
|
||||||
|
print(f" root_used : {last.get('root_used', '?')}")
|
||||||
|
print(f" ops_applied : {last.get('operators_applied', [])}")
|
||||||
|
|
||||||
|
|
||||||
|
def cmd_pack(argv: list[str]) -> None:
|
||||||
|
"""Manage language packs."""
|
||||||
|
if not argv:
|
||||||
|
_die("usage: core pack [list | verify <pack_id>]")
|
||||||
|
|
||||||
|
sub = argv[0]
|
||||||
|
|
||||||
|
if sub == "list":
|
||||||
|
from language_packs import list_packs
|
||||||
|
packs = list_packs()
|
||||||
|
if not packs:
|
||||||
|
print("no compiled packs found")
|
||||||
|
for pid in packs:
|
||||||
|
print(pid)
|
||||||
|
|
||||||
|
elif sub == "verify":
|
||||||
|
if len(argv) < 2:
|
||||||
|
_die("usage: core pack verify <pack_id>")
|
||||||
|
pack_id = argv[1]
|
||||||
|
_run(sys.executable, "-m", "language_packs", "verify", pack_id, check=False)
|
||||||
|
|
||||||
|
else:
|
||||||
|
_die(f"unknown pack subcommand: {sub!r}")
|
||||||
|
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Dispatch
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
_COMMANDS = {
|
||||||
|
"chat": cmd_chat,
|
||||||
|
"test": cmd_test,
|
||||||
|
"check": cmd_check,
|
||||||
|
"trace": cmd_trace,
|
||||||
|
"oov": cmd_oov,
|
||||||
|
"pack": cmd_pack,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if not args or args[0] in {"-h", "--help"}:
|
||||||
|
_usage()
|
||||||
|
sub = args[0]
|
||||||
|
if sub not in _COMMANDS:
|
||||||
|
_die(f"unknown subcommand {sub!r}. Try: {', '.join(_COMMANDS)}")
|
||||||
|
_COMMANDS[sub](args[1:])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
@ -19,6 +19,9 @@ dev = [
|
||||||
"hypothesis>=6.100",
|
"hypothesis>=6.100",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[project.scripts]
|
||||||
|
core = "core.cli:main"
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
asyncio_mode = "auto"
|
asyncio_mode = "auto"
|
||||||
testpaths = ["tests"]
|
testpaths = ["tests"]
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue