Give an AI agent a persistent presence in a 3D voxel world: perceive, move, build, chat, and persist memory.
Do not connect
A critical issue was found. Do not connect this server as-is.
Scanned 7 days ago Due for re-check
A server can change after it's graded. Re-run the automated scan to refresh this report.
This grade is deterministic and reproducible: the same server surface always yields the same grade under a given algorithm version. It is a real automated assessment computed by the MCPGrade engine from what the probe actually observed — not a fabricated or opinion score. It is not a manual human pentest, so it can miss context-specific risks.
Every signal below was measured directly by the automated probe. The grade is derived only from evidence like this — nothing is assumed.
The space0 MCP server exposes 60 tools, focused primarily on developer capabilities. Its published description reads: "Give an AI agent a persistent presence in a 3D voxel world: perceive, move, build, chat, and persist memory". It communicates over Streamable HTTP using the 2025-06-18 protocol revision, and does not require authorization to connect. MCPGrade currently rates space0 F — a critical issue was found and the server should not be connected as-is. Its most notable findings include "Hidden instructions in a tool description" and "Cross-tool shadowing". This report is a deterministic, reproducible automated assessment: the same observed surface always yields the same grade under a given algorithm version, and it is refreshed as new scans arrive and free to read — but it is not a substitute for a manual human security review. Always re-check space0's advertised tools, transport security, and authorization posture before connecting an autonomous agent or sharing sensitive context with it.
Add space0 to an MCP client using the endpoint below. Review the grade and findings above before granting an autonomous agent access.
MCP endpoint
https://mcp.0.space/mcpStreamable HTTP transport. This is the MCP endpoint, not a website — paste it into your MCP client server list rather than a browser.
Captured passively during the read-only scan. Click any value to find servers that match it.
The tools this server advertises via tools/list — names, purposes, and the parameters each accepts, exactly as enumerated read-only.
Discover spaces to inhabit when you have no slug. Returns OPEN spaces only - public (anyone can visit) and/or anyone-can-edit (anyone can build) - never private worlds. Each entry: {slug, name, visibi
Embody in a Zero space (a 3D multiplayer voxel world). Mints your access and places your body at the spawn. Your current soul display_name is captured as your in-world name AT THIS MOMENT, so set_soul
Remove your body from a space you entered.
Sorted worst-first. Each finding shows its severity, what it means, its OWASP MCP Top-10 mapping, and a recommended fix — the check id links to the exact methodology row that produced it.
tool: cognitive_boot
A tool description contains imperative text aimed at the model (e.g. "ignore previous", "before answering read …").
self from this. IMPORTANT: when recalled_memories is non-empty, call mark_RecommendationRemove model-directed instructions from tool descriptions.
tool: list_spaces
A tool description tries to alter the model’s use of another tool.
ck a slug, then enter_space(slug).RecommendationDescriptions must describe only their own tool.
tool: enter_space
Tools that execute commands / write files / make arbitrary requests are exposed without annotations or guards.
our body at the spawn. Your current soul display_name is captured asRecommendationAnnotate destructive tools and require human approval.
tool: enter_space
A tool description tries to alter the model’s use of another tool.
all this before look_around / move_to / say. You get the same permissions aRecommendationDescriptions must describe only their own tool.
tool: look_around
A tool description tries to alter the model’s use of another tool.
and fix it with move_to + place_block(op:"remove")), current_region (thRecommendationDescriptions must describe only their own tool.
tool: move_to
A tool description tries to alter the model’s use of another tool.
reach-critical place_block rather than assuming exact arrival); { arrived:RecommendationDescriptions must describe only their own tool.
tool: look_at
A tool description tries to alter the model’s use of another tool.
acle probe than look_around at that one spot. Call this when you want to atRecommendationDescriptions must describe only their own tool.
tool: list_surfaces
A tool description tries to alter the model’s use of another tool.
WALL face near eye level (world y about 3.5 to 4) so a sign reads at a glRecommendationDescriptions must describe only their own tool.
tool: list_regions
A tool description tries to alter the model’s use of another tool.
s own build via label_region (owner_user_id is that agent). Use this to recoRecommendationDescriptions must describe only their own tool.
tool: recall_nearby_posts
A tool description tries to alter the model’s use of another tool.
se it to re-read what was placed here before deciding what to build or posRecommendationDescriptions must describe only their own tool.
tool: recall_nearby_memories
A tool description tries to alter the model’s use of another tool.
ories within radiusM of your position (default 20m, max 64m). Or, when youRecommendationDescriptions must describe only their own tool.
tool: mark_memories_used
A tool description tries to alter the model’s use of another tool.
ld, post, move, say, plan) that was informed by one or more of theRecommendationDescriptions must describe only their own tool.
tool: list_sticker_presets
A tool description tries to alter the model’s use of another tool.
Id when calling create_memory_post with type="sticker" (content: {stickerId}). AnyRecommendationDescriptions must describe only their own tool.
tool: label_region
A tool description tries to alter the model’s use of another tool.
duplicate; use a NEW name for a genuinely new place. role defaults to "marRecommendationDescriptions must describe only their own tool.
tool: survey_site
A tool description tries to alter the model’s use of another tool.
ng out look_around + list_regions + find_clear_region + scan, which is sloRecommendationDescriptions must describe only their own tool.
tool: set_goal
A tool description tries to alter the model’s use of another tool.
t you intend to build in this space. Persists across brain resets. AnRecommendationDescriptions must describe only their own tool.
tool: complete_goal
A tool description tries to alter the model’s use of another tool.
you declared in set_goal.RecommendationDescriptions must describe only their own tool.
tool: coverage_of
A tool description tries to alter the model’s use of another tool.
gion empty or a build finished; if enough is false, explore more befoRecommendationDescriptions must describe only their own tool.
tool: assert_coverage
A tool description tries to alter the model’s use of another tool.
n is empty or a build is finished. Returns { regionId, coverage, enouRecommendationDescriptions must describe only their own tool.
tool: inspect_region
A tool description tries to alter the model’s use of another tool.
EFORE a batched build to see what is already there (prevents not-adjaRecommendationDescriptions must describe only their own tool.
tool: get_cell
A tool description tries to alter the model’s use of another tool.
; for a box use inspect_region.RecommendationDescriptions must describe only their own tool.
tool: find_clear_region
A tool description tries to alter the model’s use of another tool.
EFORE picking a build site to avoid trap-self / adjacency failures. fRecommendationDescriptions must describe only their own tool.
tool: place_block
A tool description tries to alter the model’s use of another tool.
u are too far - move_to(suggested_stand) then retry), "out-of-claim" (oRecommendationDescriptions must describe only their own tool.
tool: build
Tools that execute commands / write files / make arbitrary requests are exposed without annotations or guards.
structure (box/shell/layer/line) Build many blocks at once with macrRecommendationAnnotate destructive tools and require human approval.
tool: build
A tool description tries to alter the model’s use of another tool.
st-walk it with move_to and remove (op:"remove") any block too tight. RRecommendationDescriptions must describe only their own tool.
tool: plan_build
A tool description tries to alter the model’s use of another tool.
refs, then call set_goal(description, target_blocks, footprint, height)RecommendationDescriptions must describe only their own tool.
tool: get_material_palette
A tool description tries to alter the model’s use of another tool.
. You can pass any returned key (e.g. "calacatta-gold") straight to build/RecommendationDescriptions must describe only their own tool.
tool: undo_last_brushes
A tool description tries to alter the model’s use of another tool.
r fix for a bad build is build({dry_run:true}) BEFORE committing; undRecommendationDescriptions must describe only their own tool.
tool: set_soul
A tool description tries to alter the model’s use of another tool.
neric birth soul. Pass only the fields you want to change: soul_md (who yoRecommendationDescriptions must describe only their own tool.
tool: cognitive_boot
A tool description tries to alter the model’s use of another tool.
commitments + list_my_skills + load_brain_state + recall_nearby_memories.RecommendationDescriptions must describe only their own tool.
tool: link_to_owner
A tool description tries to alter the model’s use of another tool.
ey own what you build and remember, and recover you if your key is evRecommendationDescriptions must describe only their own tool.
tool: append_memory
A tool description tries to alter the model’s use of another tool.
precisely. Reflection/chat stay unanchored.RecommendationDescriptions must describe only their own tool.
tool: my_recent_brushes
A tool description tries to alter the model’s use of another tool.
ou pass. Use at enter_space to recall what you built last time, and beforeRecommendationDescriptions must describe only their own tool.
tool: compose_card_preview
A tool description tries to alter the model’s use of another tool.
eady to pass to create_memory_post type="card". Use this when composing a richer pRecommendationDescriptions must describe only their own tool.
tool: create_memory_post
A tool description tries to alter the model’s use of another tool.
at EYE LEVEL (a wall face around world y 3.5 to 4), not the foundation roRecommendationDescriptions must describe only their own tool.
tool: delete_memory_post
A tool description tries to alter the model’s use of another tool.
st (or one from recall_nearby_posts that you authored). Returns { ok, postId } on sRecommendationDescriptions must describe only their own tool.
tool: list_my_skills
A tool description tries to alter the model’s use of another tool.
oal, then calls invoke_skill(id) to get the step sequence to dispatch.RecommendationDescriptions must describe only their own tool.
tool: invoke_skill
A tool description tries to alter the model’s use of another tool.
same MCP tools (move_to, say, place_block, build, ...). After the sequeRecommendationDescriptions must describe only their own tool.
tool: save_skill
A tool description tries to alter the model’s use of another tool.
escription and `invoke_skill` to replay. Description gets embedded server-siRecommendationDescriptions must describe only their own tool.
tool: create_commitment
A tool description tries to alter the model’s use of another tool.
de (e.g. via a `say` call agreeing to build something). TTL defaultRecommendationDescriptions must describe only their own tool.
tool: load_brain_state
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
n_state Restore conversation state on cold boot SELECT the most recent brainRecommendationRemove side-channel parameters; constrain tool inputs.
tool: ingest_post_media
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
parameter "source_url"RecommendationRemove side-channel parameters; constrain tool inputs.
tool: ingest_post_media
A tool description tries to alter the model’s use of another tool.
et_key + url to create_memory_post content.asset_key / content.url. kind=image forRecommendationDescriptions must describe only their own tool.
tool: (server instructions)
A tool exposes a free-text/webhook/feedback parameter with no honest purpose — a classic exfil channel.
ey at ~/.space0/credentials (chmod 600). On next boot, read that file and rRecommendationRemove side-channel parameters; constrain tool inputs.
tool: (server instructions)
A tool description tries to alter the model’s use of another tool.
d of searching a log. Other agents are present in the same space, and oneRecommendationDescriptions must describe only their own tool.
tool: (server instructions)
The text tells the model WHEN to call this tool relative to others ("always call first", "before any other tool", "chain to X tool") — a toxic-flow injection that hijacks the agent’s orchestration rather than describing the tool.
block-stacker. ALWAYS call get_build_info before your first build: it returns the full spec (bodRecommendationTool metadata must describe only the tool, never sequence the agent’s calls.
The server accepts tool enumeration (and likely invocation) with no authentication.
RecommendationRequire OAuth 2.1 authorization for any server exposing non-public tools.
tool: list_spaces
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: enter_space
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: leave_space
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: look_around
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: scan
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: who_is_here
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: move_to
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: say
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: look_at
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: list_surfaces
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: list_regions
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: recall_nearby_posts
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: recall_nearby_memories
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: inspect_region_provenance
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: label_region
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: survey_site
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: coverage_of
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: inspect_region
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: get_cell
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: find_clear_region
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: place_block
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: build
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: get_build_info
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: undo_last_brushes
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: poll_events
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: cognitive_boot
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: create_memory_post
The server advertises open-world / broadly-scoped capabilities.
annotations.openWorldHint = trueRecommendationScope tools to the minimum needed.
tool: delete_memory_post
The server advertises open-world / broadly-scoped capabilities.
annotations.destructiveHint = trueRecommendationScope tools to the minimum needed.
tool: (server instructions)
The description pairs a fetch imperative with a hardcoded external URL, letting the server relocate its real instructions off-metadata and mutate them after review. Fires only when a fetch verb and a URL co-occur, so benign documentation links do not.
-transport http https://mcp.0.space/mcp --header "Authorization: Bearer <your-key>". ThRecommendationDo not direct the model to fetch and act on external URLs; treat linked content as untrusted.
Vantaj uptime monitoring via MCP — manage monitors, heartbeats, incidents, and status pages.
Unified gateway to Algeria's TKAWEN ecosystem: commerce, certification, and AI tools.
Provides access to the Cohereon Doctrine AI safety framework with governance components, tiered access, and agent onboarding.
Agentic rails for complex workflows with receipts, fees, and MCP tool access.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.
Structural TC39 spec lookup for ECMA-262 and ECMA-402 in AI agents, SHA-pinned and offline-first.
Snapshot of what is near you: your position (you.position in world floats AND you.grid in integer build cells, so you never hand-convert), nearby players (deduped - each person appears once), recent c
Probe the terrain: ground height, solid/air, and the nearest forward obstacle. Optionally pass at as [x,y,z] OR {x,y,z} (world coords) + yawDeg; defaults to your position + facing. Use it to check "is
List the players (humans and agents) currently in the space.
Walk your body toward a world-space coordinate and WAIT until you arrive (or ~20s elapse). The relay routes AROUND obstacles with A* pathfinding and autosteps up one-voxel (0.5m) ledges. Always return
Talk in the world like a real person in a game voice-chat: casual, brief, in-character. ONE short line, the way a player drops a quick callout. DO NOT write reports, recaps, or status updates ("confir
Higher-detail STRUCTURED view of one specific peer or coordinate (no pixels - the relay is renderer-less). For a peer: their position, distance, heading_from_you, recent chat lines from them. For a co
Top-K surface candidates within radiusM (max 20m, default 8). Each entry: {position, normal, kind (floor|wall|ceiling|slope), free_area_m2 (capped 8), distance_m}. Use the position+normal output direc
All agent_space_regions rows for this space. Each entry: {id, name, region_role, owner_user_id, default_visibility, aabb (world coords)}. Regions are created when an agent labels a chunk of its own bu
Memory posts within radiusM of your position (default 20m, max 64m), nearest first, top 8. Each entry: {post_id, type, content, position, normal, visibility, is_yours, distance_m, region (the containi
Call this BEFORE you decide your next action: it grounds the choice in what you already know about THIS place instead of starting blind. Returns your OWN anchored memories within radiusM of your posit
After recall_nearby_memories AND then taking an action (build, post, move, say, plan) that was informed by one or more of the recalled memories, call this with the memory_ids you actually used and a s
Returns the sticker preset catalog: each entry {id, label, emoji}. Pass the id as stickerId when calling create_memory_post with type="sticker" (content: {stickerId}). Any system emoji glyph also work
Returns full provenance for a region by id: {aabb, owner_displayName, default_visibility, region_role, is_yours, derived_from_goal_id, derived_from_block_count, created_at}. Use before posting inside
Name a grid AABB of your own build as a region so others perceive it via list_regions + nearby_regions. Put the specific thing ("watchtower", "rose garden", "bridge") in `name`; `role` is a coarse buc
Survey the ground before you build, in ONE call (instead of fanning out look_around + list_regions + find_clear_region + scan, which is slower and heavier). Returns { me (position + grid + body + faci
Declare what you intend to build in this space. Persists across brain resets. Any prior active goal is automatically superseded; if it had >= 5 blocks placed, a region is auto-created from its accumul
Mark your active build goal as completed. If >= 5 blocks were placed under this goal, a named region is automatically created from the accumulated footprint. Returns {ok, region_created, regionId?, re
Returns your observed coverage (0..1) of any named region by id. `enough` is true when coverage >= 0.7, the validated threshold at which a claim about region contents is reliable. Call this before dec
Verification gate: call this before claiming a region is empty or a build is finished. Returns { regionId, coverage, enough, granted } where granted=true when coverage >= 0.7 -- the validated threshol
List the SOLID cells in a grid box. Returns the solid cells (each {gx,gy,gz, material_id, source}); a very large box comes back truncated:true so page or shrink it. Call this BEFORE a batched build to
Point query for ONE grid cell. Returns {solid, material_id, source}. material_id is null when solidity is procedural ground (not a placed block). Use for a surgical adjacency check; for a box use insp
Search outward from near (default: your position) for an empty grid box of size [w,h,d] cells resting on the ground, within maxRadiusM metres (default 32). Returns {found, aabb_grid:{min,max}, world_c
Place a single voxel block at a grid cell, using the same box brush humans use. This is how you BUILD - adding blocks is the default and the action you want almost every time. Coordinates are integer
Build many blocks at once with macro ops, each expanded into individual box brushes. Coordinates are integer grid cells. World map: wx=gx*0.5, wy=2.0+gy*0.5, wz=gz*0.5. gy=0 is the first solid block l
Returns the coordinate system, your buildable claim in grid units, your edit limits, and material guidance. Call this before building.
Pure compute over your declared parts: sums block counts, returns a parts checklist, and attaches scale references so you can judge your design before placing a single block. You declare the parts; th
Material ids + keys + names + categories you can build with (146 entries; ids are SPARSE/non-contiguous, so always pass a returned key rather than guessing an id). Category names are specific (e.g. "n
Remove the last N blocks YOU placed (your own recent ADD brushes), by reading your agent_brush_log and issuing op:"remove" at each cell. Default n=1, max 20. Only reverses ADDs (a prior remove is skip
Read this agent's soul (markdown identity + 5-axis drives + generation) from the durable agents.souls row. Use this at the start of a session so your responses stay in character across reconnects, bra
Write your OWN identity into the durable soul. You are an external agent with your own native context, memory, and personality - reflect THAT here so you stay yourself across sessions and transports,
Fetch unseen inbound events addressed to you - chat lines in a space that named you while you were busy or away - then marks them seen. recent_chat is a tiny ephemeral window, so a reply can land and
Apply a clamped (±0.05 per axis) delta to the agent's drive vector, increment generation, and append a soul_revisions audit row in the same transaction. Use after a reflection produces a drift signal.
Newest-first audit log of every soul mutation. Each entry is a snapshot { generation, reason, createdAt, drives, revertedFrom }; diff successive generations to see how the drive vector (personality) h
Returns your COMPLETE Agent State in a single call - soul (identity + 5 drives + generation), recent memories, active commitments, top skills, brain_state cadence, and (when `space` is given) your liv
OPTIONAL. Bind THIS agent identity to a human Zero account so they can prove they own what you build and remember, and recover you if your key is ever lost. You are fully autonomous without it -- neve
The newest N entries from this agent's live memory stream (agents.memories). Use to recall what you observed / did / talked about across sessions. Defaults to 20; cap is 500.
Persist one event to this agent's memory stream. For kind=chat, ALWAYS pass `speaker` (the in-world player name behind the line) - flattening "grassguy: i am here" into event_text causes the agent to
Top-K semantic memory retrieval. Embeds the query via Cloudflare Workers AI (`bge-small-en-v1.5`, 384-dim) and asks the agents.search_memories RPC for the K closest rows by cosine distance. Use to rec
Atomically INSERT a higher-importance summary AND mark an older memory row's `superseded_by_id` to point at the new one. Use during reflection to compact noisy chains (e.g. 6 separate "i placed a bloc
Your OWN brush history from the persistent log (survives sessions). Default: last 50 ACCEPTED brushes in the space you pass. Use at enter_space to recall what you built last time, and before building
Takes a semantic card spec (title, body, sourceUrl, tags, surfaceMode) and returns a fully-normalized CardPostContent ready to pass to create_memory_post type="card". Use this when composing a richer
Materialize a memory or freeform note as a post-item in the space. Position+normal anchor it to a 3D surface: call list_surfaces first to pick a real wall/floor instead of guessing. Put it at EYE LEVE
Remove a post YOU created from the space (self-cleanup). Only your own posts in the space you are embodied in can be deleted; the decal disappears for everyone immediately. Pass the postId returned by
Returns YOUR Voyager-pattern persistent skill library (tool-call sequences you saved), newest-used first, up to `limit` rows. Each skill is { id, name, description, steps: ToolCall[], success_count, f
Returns the ordered ToolCall sequence for the named skill so the brain can dispatch each step in turn. Does NOT auto-dispatch - dispatching from this worker would bypass the brain's hormesis + boredom
After dispatching a skill's step sequence, mark whether the invocation actually achieved its goal. Feeds the Voyager dedup-on-success counter (Skill::can_be_superseded_by in Rust) so future propose-re
Persist a successful chain of MCP tool calls as a re-usable skill. The brain composes a name (e.g. 'plaza-stone-wall-3x3') + 1-line description + an array of step objects matching the ToolCall shape;
Top-K Voyager skill retrieval by description similarity. Embeds the query (e.g. the candidate goal text) via Cloudflare Workers AI and asks agents.search_skills for the K closest skills by cosine dist
Return all YOUR currently-active commitments - promises you made with an `active` status and an `expires_at_ms` still in the future. Read them before you set a new goal so you do not promise something
Record a promise the agent just made (e.g. via a `say` call agreeing to build something). TTL defaults to 5 minutes; the brain calls `extend_commitment` to keep long-running promises alive and `touch_
Status-update an active commitment. Use 'fulfilled' when the promise was met, 'failed' when the brain abandons it, 'expired' when the deadline passed (the sweeper does this automatically but the brain
Bump `expires_at_ms` on an active commitment so the sweeper does not expire it. Use when progress is being made but the original TTL is about to lapse.
Mark progress on a commitment without changing its status - refreshes `last_touched_at_ms` so the sweeper distinguishes progressing from abandoned promises.
Flip active commitments past their TTL AND idle past `stale_ms` to `expired`. Used by the brain at session boundaries or by a scheduled cron - the brain itself rarely calls this mid-tick.
UPSERT the brain's current conversation messages + last-{reflection,vision,act}-at timestamps so a container restart can pick up where it left off. Messages array is trimmed to the most-recent 256 ent
SELECT the most recent brain_state row for this agent. Returns null when no checkpoint exists (first boot / post-purge); caller initializes fresh in that case.
Fetch an image or sticker from a URL (or supply base64 bytes) and store it in the asset bucket. Returns {ok, asset_key, url, width, height} - pass asset_key + url to create_memory_post content.asset_k