Skip to content

contexte_app

contexte_app

Ce que l'utilisateur regarde DANS Diapason, à l'instant.

Spatial Mesh, handoff — 25 août 2026. « Diapason, continue ce projet sur mon téléphone » suppose que « ce projet » ait un référent. Il n'en avait aucun : les dix-neuf routes du frontend sont statiques, sans le moindre paramètre, et la ressource sélectionnée vit en état local de composant (selectedId dans la page Projets, activeId dans les Notes). Ni le serveur, ni le modèle, ne pouvaient dire quel projet était ouvert.

Ce module est le miroir exact d'etat_bureau : un cliché VOLATILE en variable de module, jamais persisté, lu sans jamais attendre, décrit en une phrase française, et injecté en FIN de contexte du tour — un état qui change à chaque clic n'a rien à faire dans un préambule qu'Ollama met en cache.

Il ne porte QUE ce qui traverse réellement : l'écran et la ressource sélectionnée. Pas de filtre, pas de position de défilement, pas d'onglet — le client mobile ne sait rien en restaurer, et un champ qui voyage sans être lu finirait par se faire promettre.

Classes

ContexteApp dataclass

ContexteApp(
    chemin: str,
    ecran: str,
    ressource_type: str = "",
    ressource_id: str = "",
    ressource_titre: str = "",
    quand: float = 0.0,
)

L'écran ouvert, et la chose qu'on y regarde.

Functions:

poser_contexte

poser_contexte(
    chemin: str,
    *,
    ressource_type: str = "",
    ressource_id: str = "",
    ressource_titre: str = "",
) -> Optional[ContexteApp]

Le frontend dit ce qu'il affiche. Refusé si l'écran est inconnu.

Source code in src/diapason/desktop/contexte_app.py
def poser_contexte(
    chemin: str,
    *,
    ressource_type: str = "",
    ressource_id: str = "",
    ressource_titre: str = "",
) -> Optional[ContexteApp]:
    """Le frontend dit ce qu'il affiche. Refusé si l'écran est inconnu."""
    global _cache
    chemin = (chemin or "").strip() or "/"
    entree = _ECRANS.get(chemin)
    if entree is None:
        # Pas d'invention : un écran hors liste blanche efface le cliché
        # plutôt que d'en garder un périmé qui mentirait au tour suivant.
        _cache = None
        return None
    _, ecran = entree
    rtype = (ressource_type or "").strip().lower()
    if rtype not in _SELECTIONNABLES:
        rtype, ressource_id, ressource_titre = "", "", ""
    _cache = ContexteApp(
        chemin=chemin,
        ecran=ecran,
        ressource_type=rtype,
        ressource_id=str(ressource_id or "")[:120],
        ressource_titre=" ".join(str(ressource_titre or "").split())[:120],
        quand=time.monotonic(),
    )
    return _cache

dernier_contexte

dernier_contexte() -> Optional[ContexteApp]

Le cliché s'il est encore frais — jamais une milliseconde d'attente.

Source code in src/diapason/desktop/contexte_app.py
def dernier_contexte() -> Optional[ContexteApp]:
    """Le cliché s'il est encore frais — jamais une milliseconde d'attente."""
    if _cache is not None and _cache.frais:
        return _cache
    return None

oublier

oublier() -> None

L'onglet se ferme : ce qu'il affichait n'est plus vrai.

Source code in src/diapason/desktop/contexte_app.py
def oublier() -> None:
    """L'onglet se ferme : ce qu'il affichait n'est plus vrai."""
    global _cache
    _cache = None

decrire

decrire(contexte: ContexteApp) -> str

Le cliché en une phrase française, pour le contexte du modèle.

Source code in src/diapason/desktop/contexte_app.py
def decrire(contexte: ContexteApp) -> str:
    """Le cliché en une phrase française, pour le contexte du modèle."""
    if contexte.ressource_id and contexte.ressource_titre:
        quoi = {
            "project": "le projet",
            "note": "la note",
            "task": "la tâche",
        }.get(contexte.ressource_type, "l'élément")
        return (
            f"Dans Diapason : {contexte.ecran}, {quoi} "
            f{contexte.ressource_titre} » ouvert(e)."
        )
    return f"Dans Diapason : {contexte.ecran}."