feat(backend): enforce user-owned sessions

This commit is contained in:
User
2026-07-16 18:32:52 +02:00
parent 72db6b823d
commit 458eb13c89
15 changed files with 626 additions and 105 deletions
+39
View File
@@ -9,6 +9,9 @@ from tht.cli.schema_cmd import _load_config_or_exit
session_app = typer.Typer(help="Sessioni (directory artefatti)")
preferences_app = typer.Typer(help="Preferenze private del principal corrente")
session_app.add_typer(preferences_app, name="preferences")
def session_repository(cfg):
"""Configured persistence boundary for every workflow command."""
@@ -17,6 +20,42 @@ def session_repository(cfg):
return build_session_repository(cfg)
@preferences_app.command("get")
def preferences_get_cmd(
json_out: bool = typer.Option(False, "--json", help="Emetti JSON puro."),
config: Path = CONFIG_OPT,
) -> None:
"""Legge le preferenze private del principal risolto dal repository."""
cfg = _load_config_or_exit(config)
preferences = session_repository(cfg).get_preferences()
if json_out:
typer.echo(json.dumps(preferences, ensure_ascii=False, sort_keys=True))
else:
typer.echo(json.dumps(preferences, ensure_ascii=False, indent=2, sort_keys=True))
@preferences_app.command("set")
def preferences_set_cmd(
preferences_json: str = typer.Argument(..., help="Oggetto JSON delle preferenze."),
json_out: bool = typer.Option(False, "--json", help="Non emette testo al successo."),
config: Path = CONFIG_OPT,
) -> None:
"""Sostituisce le preferenze private del principal risolto dal repository."""
try:
preferences = json.loads(preferences_json)
except json.JSONDecodeError as exc:
typer.secho(f"ERRORE: preferenze JSON non valide: {exc}", fg=typer.colors.RED, err=True)
raise typer.Exit(code=2) from None
if not isinstance(preferences, dict):
typer.secho("ERRORE: le preferenze devono essere un oggetto JSON", fg=typer.colors.RED, err=True)
raise typer.Exit(code=2)
cfg = _load_config_or_exit(config)
session_repository(cfg).set_preferences(preferences)
if json_out:
return
typer.secho("OK: preferenze aggiornate.", fg=typer.colors.GREEN)
def session_dir(cfg, session_id: str) -> Path:
"""Legacy path bridge for out-of-scope datamart/memory compatibility only.