Saxonberg Server API
    Preparing search index...

    Type Alias DialogueOpenResult

    DialogueOpenResult:
        | { ok: true }
        | { ok: false; reason: "no-tree" | "busy" | "no-viewer" }

    The outcome of BrainStatics.open. ok:false carries the reason so the talk controller renders the right decline prose: no-tree (host has no usable tree), busy (host already in a conversation — 1:1), no-viewer (no live connection to prompt).