Prepare a matching SDK and gateway
Python and TypeScript clients need a compatible gateway executable. The source
path below builds the gateway and SDK from the same checkout. For a packaged
installation, use the instructions and checksums supplied with your release.
CARGO_TARGET_DIR. The built gateway is its
debug/rpc_gateway executable. Pass that absolute path to .gateway(...) in
the examples below. Run Python snippets in an async entry point; the
repository README
has a complete asyncio.run example that reads status and shuts down cleanly.
When native release archives are available, use rpc_gateway from the matching
meta-rpc-gateway-<version>-<target> archive and install the matching
meerkat-meta Python package or @rkat/meta-sdk TypeScript package. Follow that
release’s platform and checksum instructions. Linux x86_64 and aarch64 and macOS
arm64 archives are published with the release, listed in index.json and
checksums.sha256; macOS x86_64 and Windows archives may arrive later, listed in
index-trailing.json and checksums-trailing.sha256. Rust hosts use the
meerkat-meta crate directly:
Bootstrap a runtime
The fastest way to get a running system isstart_meta_runtime. It takes a
module configuration, agent event stream, and a startup timeout. Host-supplied
modules are optional, so this runnable baseline starts with an empty module and
discovery list.
- Rust
- TypeScript
- Python
Use the unified runtime
For production deployments that combine a Meerkat mob with Meta modules, use theUnifiedRuntime builder:
Open the console
Once the runtime is serving HTTP, open the admin console at:http_base_url in the initialization result. A library host may choose its own
address.
For an SDK-launched rpc_gateway, protected console APIs are auth-closed by
default: without configured auth, the gateway trusts no signing key. Configure
.auth(...) and the matching bearer-token or authenticated-proxy handling
described in Authentication. Alternatively, for a
loopback-only or authenticated-proxy-protected demo, explicitly add
.console_auth_required(False) in Python or .consoleAuthRequired(false) in
TypeScript before .build(). These are deliberate opt-outs, not production
defaults. Keep the runtime alive while browsing; the status-only examples above
shut it down when finished, and a console host should retain that cleanup on exit.
The console shows the agent sidebar, conversation workspace, signals rail, topology, logs, and health overview. The bundled app seeds from REST, sends through JSON-RPC, and tails replayable timeline frames over SSE.
Keep agents available across sessions
For durable agent identities, use a roster and the identity-first API. The following sketch shows how a personal agent connects to a triage agent;MOB_TOML supplies their profiles as described in roster:
Profiles are templates; members are declared. The
[profiles.*] tables in
MOB_TOML produce no members on their own: the identities your roster returns
(or ensure_member names) are the only members that exist, and nothing spawns
one member per profile for you. Both SDKs pass a typed RosterContext to the
roster callback: Python exposes context.mob_definition and
context.previous_identities; TypeScript exposes context.mobDefinition and
context.previousIdentities. The stock gateway supplies its compiled mob
definition, so a profile-shaped roster can derive members from that definition’s
profiles. Custom or older hosts may omit the definition (None/null), and
missing prior identities default to an empty list. See
Profiles are templates.The prior-identity list is call-site-dependent, not an authoritative membership
snapshot on every callback. Topology-query and edge-reconciliation snapshots
supply registered identities; bootstrap, full roster refresh/reconcile, and
reset-time spec adoption currently pass an empty list. An empty list does not
establish that no identities are registered.If the definition declares [wiring] (auto_wire_orchestrator or
role_wiring), call rt.mob_handle().reconcile_edges() after boot and after
each rt.reconcile(); ensure_member reconciles on its own. Pin
runtime_mode = "turn_driven" on profiles that back addressable identities:
meerkat defaults to autonomous_host, which runs a kickoff turn at spawn and
skips ambient per-turn recall for generic SDK/work delivery. Non-steer local
canonical console-human input can carry configured typed injected context even
for autonomous_host; that exception does not cover arbitrary external
bindings. See Runtime modes.respawn() for non-destructive recovery that keeps continuity, and reset() only when the app intentionally wants a destructive new generation and session.
If you change a durable identity’s role in the roster, its resume fails closed
until that boot declares the migration with .role_migrations([...]). See the
Python SDK page for the builder form and
Configuration for the init
parameter.
What’s next
- Modules — how the module system works
- Events — the unified event model
- Operational subsystems - gating, delivery, durable scheduling, memory
- Architecture — internal design and crate structure
