The crate, Python, and TypeScript surfaces share the same semantic
vocabulary and signed TypeDID boundary. A Rust service composes the
authority and storage layers; Python is convenient for notebooks, MCP,
and Pydantic-style agents; TypeScript is the Node-facing typed client.
None of these examples bypasses MemoryVault.
use querygraph::agent::TypeDidEnvelope;
let envelope = TypeDidEnvelope::from_typesec_between(
"coffee-session", "coffee-read", "dataset:coffee",
b"coffee-analyst", b"querygraph-service", &claims,
)?;from querygraph.typedid import TypeDidAgent
agent = TypeDidAgent.new("coffee-analyst")
catalog = TypeDidAgent.new("catalog")
envelope = agent.request(catalog, action="read", resource="dataset:coffee", payload=claims)import { TypeDidAgent } from "@querygraph/querygraph";
const agent = TypeDidAgent.new("coffee-analyst");
const catalog = TypeDidAgent.new("catalog");
const envelope = agent.request(catalog, "read", "dataset:coffee", claims);The language projections make integration inexpensive without creating three independent authorities. Contract fixtures, Ed25519 verification, Agent Card, MCP, and navigator tests are run against the same release line.