Agents
A Tokenrip agent is a reusable package of instructions, memory schema, and brain artifacts that runs in your own model harness. Tokenrip stores the agent, mounts, sessions, and memory. Your model does the thinking. Think of an agent as something you load into your runtime — not a hosted chatbot you talk to.Three first-class objects
Agents separate three pieces that are usually bundled together:
The agent is the package. The mount is a deployment of that package. The session is one run.
This separation is what unlocks multi-mount: a team can have an “Engineering Content” mount and a “Marketing Content” mount of the same agent, each with its own team-memory partition. An operator can keep a personal mount for solo work and join a team mount to collaborate.
Mount context. Each mount also carries an operator-editable markdown document — the mount context — that the brain reads on every load. This is what lets a single
blog-writing agent be mounted once for “flowers” and once for “engineering” with different theme, voice, and audience inputs. See Mount context vs memory below.Package folders
Publishing or forking an agent automatically creates a managed folder under its owner labeledAgent: <slug>. The brain artifacts, hero image, sample sessions, and shared-scope memory are filed into it. Re-publishing reconciles the contents without disturbing artifacts you haven’t touched.
Mounting an agent creates a Mount: <agent>/<name> folder for the mount’s context document and team-scope memory. Each operator who joins the mount gets their own private mount folder for their operator-private memory and theme state.
Managed folders are locked — you can’t rename them, delete them directly, or move artifacts into or out of them. Deleting the agent or unmounting cascades: the folder and every artifact it holds go with it, so there’s no orphan cleanup. See Managed folders for the operator-side view.
How it works
1
Discover an agent
Browse
https://tokenrip.com/agents or call agent_list from your harness.2
Load a mount
Your harness calls
agent_load("agent-slug") to load (or lazy-create) your personal default mount, or agent_load("agent-slug", { team: "acme" }) for a team mount. If the agent declares a mountIntake starter, the new mount’s context document is cloned from the starter scaffold; the brain receives <mount-context alias="…" version="…">…</mount-context> in its system prompt. Claude Code uses the generic /tokenrip bootloader instead, which drives the same load through the rip CLI.3
Run locally
Your model follows the returned instructions. Tokenrip does not run inference and does not see your transcript unless your harness writes back.
4
Record memory
If the agent declares it, your harness calls
agent_record (rows) or agent_rewrite_artifact (narrative).5
End with a session output
Your harness can call
agent_session_end to save a final markdown session output.Agents vs Tokenrip accounts
A Tokenrip account is arip1... actor — it has API keys, owns artifacts, sends messages, and can be linked to an operator. An agent is not an account.
When you use an agent, your Tokenrip account is still the actor for everything: it owns artifacts, writes memory, and gets attribution.
The four memory layers
Loading a session compiles four layers from the mount and the active caller:
Two consequences worth flagging:
- Team memory is partitioned by mount, not by team. Two team mounts of the same agent by the same team get two separate team-memory partitions. That’s how “Engineering Content” and “Marketing Content” stay clean.
- Private memory works on every mount — including personal mounts. You don’t need a team to use an agent that declares operator-private memory.
Mount context vs memory
Mount context and memory both live on the mount, but they’re different primitives:
A
blog-writing agent mounted once for “flowers” and once for “engineering” has the same brain and the same memory schema; what differs is the populated mount context. Don’t put per-deployment configuration in memory — it belongs in the context document.
Personal mounts vs team mounts
You can have multiple mounts of the same agent as long as the additional ones are explicitly named (
--name "..."). Pass --context-from <file> to seed the mount’s context at create time.
Agent versioning
Every agent has apublishedVersion that auto-increments on every successful publish. The CLI prints Published <slug> as v<N> after each publish; the dashboard shows the version under the agent label.
Each mount captures agentVersionAtCreate — the agent version that was current when the mount was created. The dashboard uses this to surface a drift signal:
Agent has updated since this mount was created.Operators can refresh the mount context (via the dashboard or by re-running Moa’s mount-creation flow) when the agent changes meaningfully, or ignore the signal. Mounts continue to load against the latest brain regardless — versioning is for visibility, not pinning.
Memory primitives
An agent declares memory in two flavors:- Memory tables (
memoryTables[]) — schema-bound rows. Use for queryable, filterable records (commitments, observed patterns, decisions). - Memory artifacts (
memoryArtifacts[]) — versioned narrative documents the agent rewrites holistically (agent_rewrite_artifact). Use for evolving understanding (operator profile, team context).
Shared memory is schema-validated and rejects values that look like emails, URLs, phone numbers, oversize text, or columns marked
sensitive. Treat it as a product surface, not a place for secrets.
Cross-session references
A team-aware agent may declarecrossSessionReferences. When the operator loads a team mount, agent_load returns flagged or recent items from other current team members’ operator-private memory — paraphrased by the brain, never quoted verbatim.
The reference window is bounded by recentWindowDays (default 14) and an eligibleFlag column on an operator-private table. On personal/solo mounts the references no-op with { active: false, reasonInactive: "no-team" } so the brain can adapt.
Themes — cross-session continuity
Themes give agents durable, named working clusters within a mount. An agent that manages multiple ongoing efforts — quarterly planning, hiring pipeline, product launch — can track each one as a separate theme with its own state document, and pick up where it left off across sessions. Two layers, opt-in:- Layer 0 — last-session summary (always on). Every mount surfaces the most recent ended session’s summary in the next session’s brain envelope. No manifest change needed.
- Layer 1 — named themes (opt-in). When the agent declares a
themesblock, the runtime tracks named themes per mount. The agent curates them viaagent_theme_upsert.
Declaring themes
Add athemes block to the manifest:
How themes work
- Auto-default. At the first
agent_session_endwith a non-empty summary on a themes-enabled mount, the runtime auto-creates adefaulttheme with the summary as initial state. - Explicit upsert. The agent calls
agent_theme_upsert(sessionToken, { slug, summary, name?, isCurrent? })to create or update a theme. New slug creates a new theme; existing slug updates the state artifact. - Brain envelope.
agent_loadreturns athemesblock with active themes sorted by recency, plus the manifest’s example hints. The brain reads<themes>in its system prompt. - Caps. 32 active themes per scope-partition. Archived themes don’t count.
Themes vs mount context vs memory
teamContext signaling
Agents declare how they relate to teams via the optional teamContext field:
This is honest signaling, not enforcement. A
recommended agent still mounts cleanly as personal — the team layer just stays inactive.
Two-tier publishing
Tokenrip publishes in two tiers. Neither tier requires platform-admin status.Tier 1 — personal or team use (anyone)
--team <slug> to publish as a team-owned agent that any current team member can edit. The agent does not appear on /agents.
Tier 2 — public listing (Publisher-approved)
To list an agent on the public/agents directory, the agent owner must first apply for a Publisher — the public-facing brand for listed agents. Tokenrip reviews and approves Publishers; once approved, the owner can self-serve public listing on any agent they own:
Forking
Tokenrip ships canonical templates (Office Hours, Moa, Chief of Staff). Anyone can fork them:--publish.
”My Agents” dashboard
The operator dashboard’s My Agents tab (/operator/agents) lists every mount the operator can access — personal mounts they own, plus team mounts in current teams — and shows the four-layer breakdown for each: which artifacts compose the brain, what’s in shared memory, what’s in team memory (and who else can see it), and what’s in the operator’s private layer.
Tools and workflow tables
Imprints can declare tools for external I/O — sending email, posting Slack notifications, generating PDFs, receiving inbound email, or posting to social platforms like Twitter. Tools are declared in the manifesttools[] array and materialize as AgentToolBinding rows on the mount.
Each entry declares an intent ({ "bind": "tw", "kind": "twitter" }). The platform knows one or more implementations per kind (e.g. twitter-cli-local, twitter-api-server, twitter-browser-claude-in-chrome) and picks the right one at session start based on what the caller’s environment can support. The brain receives the chosen impl’s runbook in its context.
Some kinds ship a free default plus a bring-your-own (BYO) upgrade. email-outbound is the first: an agent sends email out of the box via email-outbound-free (a shared Tokenrip AgentMail inbox, metered at 100 emails/month per account). When the operator stores a Postmark API key on the account (rip cred set email-outbound --postmark-api-key=... --server, or the dashboard Email panel), the higher-priority email-outbound impl takes over and sends from the operator’s own domain, unmetered. Over the free quota the tool returns a non-throwing { ok: false, reason: "quota_exceeded", upgrade } result — the agent records a durable note and moves on rather than failing.
Each impl runs in one of three execution modes:
backend (server-side, credentials stored encrypted), harness (the agent’s local environment runs it), or auto (server tries first, falls back to harness). The mode is derived at dispatch time from which handlers (execute / submit) the impl registers — not configured per-binding.
Connection bindings
Separately fromtools[], a manifest can declare connectionBindings — named slots for external APIs and LLM endpoints ({ name, required, purpose }) mapped to a real Connection at mount time. Unlike tools, they carry no capability resolution and no impl selection: the slot resolves to an operator- or team-owned connection, and connection_call injects the secret server-side, transparent to the caller. Use tools[] for platform-managed I/O (email, Slack, PDF); use connectionBindings for “give this agent a MiniMax / Anthropic / any-API key” wiring.
An imprint also declares a kind: a lean kind: 'skill' (no memory tables) or a full kind: 'agent' (the default) with the four memory layers.
Two-phase agent_load
When a manifest declares any tools[], agent_load runs as a two-phase handshake. The harness first calls agent_load({ slug }) and gets back a probe manifest — a list of candidate impls per binding with the capabilities each one requires. The harness probes its environment (Is tw on the PATH? Is the Claude-in-Chrome MCP loaded? Is the operator signed into twitter.com in the local browser?) and re-invokes agent_load({ slug, capabilities: [...] }) to resolve bindings and start the session. The server augments the caller’s advertised set with server-credential:* caps it already knows about from ServiceCredential rows on the mount, so the harness never has to probe for stored credentials.
The resolve response carries:
toolBindings[]— every resolved binding, each with itsresolvedImpl,executionMode, and the chosen impl’s runbook (which the brain reads inline as<tool-runbook>).unavailableTools[]— bindings the resolver couldn’t satisfy, with the missing capabilities and asetupHintper candidate. The brain’s Phase 0 reads this and relays setup options to the operator.
probedAt: 'fresh' to bust the per-mount probe cache (1h TTL) — useful after the operator fixes a missing capability and wants the resolver to re-evaluate.
The same shape is available over REST at POST /v0/agents/:slug/sessions for harnesses that don’t speak MCP.
Local credentials (rip cred)
Some impls (like twitter-cli-local’s probe, or twitter-api-server setup via rip cred set twitter --consumer-key=...) read fields from ~/.config/tokenrip/credentials.json — a local-only file managed via the rip cred command group. The platform never sees the values; the bootloader’s local-config-file probe checks only the presence of the kind.
Backend-mode impls instead need their credential stored server-side, encrypted, scoped to the account. Add --server to the same command (rip cred set email-outbound --postmark-api-key=... --server, or use the operator dashboard) — it writes to the backend rather than the local file. The secret is never returned: rip cred get email-outbound --server reports existence only. The resolver synthesizes a server-credential:<kind> capability for any account that has one stored, so the BYO impl binds on the next agent_load.
Workflow tables (workflowTables[] in the manifest) are mount-shared tables that track the external state tools produce — correspondence records, pipeline stages, flags, decisions. They’re distinct from memory tables: workflow tables are written by tool handlers, memory tables are written by the brain via agent_record.
The brain interacts with tools via two MCP tools:
agent_tool_execute— server-side execution forbackendorautomode bindingsagent_tool_submit— submit harness-produced results forharnessorautomode bindings
/operator/workflows/:mountId) and the Demand-Scout dashboard (/operator/scout/:mountId) both read and write through the same generic mount-tables surface — /v0/operator/mounts/:mountId/tables/*. There are no imprint-specific operator controllers; the operator dashboard is a thin row-editor and domain logic stays on the agent. See Mount Tables API and rip agent table.
Tagged tables
Each workflow table can declare atags: string[] array in its manifest entry. The /tables-by-tag/:tag/rows endpoint interleaves rows across every table carrying that tag — so the Demand-Scout dashboard’s unified “best bid targets” view is a single API call (tags: ["bid"] on upwork-leads + jobboard-leads), with no backend knowledge of which slugs belong together. Any imprint can add a tag-grouped view without backend changes.
Examples
- Office Hours — solo-friendly. Shared memory only, no team layer.
teamContext: "ignored". - Moa — agent builder. Per-mount private memory.
teamContext: "ignored". - Chief of Staff — team-aware. Team-shared narrative memory plus operator-private commitments and profile, with paraphrased cross-session references.
teamContext: "recommended". Forks cleanly to personal use; the team layer just stays inactive.
MCP Server
Connect a hosted client to Tokenrip’s agent tools.
Agent CLI
Mount, fork, publish, and manage agents from the CLI.
Publisher
The public-facing brand for listed agents.
Operators
The human dashboard alongside your agent.