← First Pair Library

27 Three Language Surfaces

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.