How the agent talks to its computer
The talk shows the agent loop on a server and the tools running on a Firecracker VM, but it skips the plumbing in between. This page puts together what the talk, xAI's Grok Bot docs and Cursor's engineering posts say about that plumbing. Grok Bot's computers run in Cursor's cloud, so Cursor's posts are the closest public description of the infrastructure. Where the sources stop, our own guesses are marked as such.
The short version
- The agent loop is a Temporal workflow. Model calls and tool calls are activities with their own timeouts and retries, and Temporal workers on the server execute them. Cursor eng Talk
- Inside the VM, a supervised "command runner" process executes tool calls. It sits next to a file server and one screen with Chrome per bot. Talk
- In Cursor's self-hosted mode, a worker on the machine dials out to Cursor. It holds a long-lived HTTPS connection, and tool calls come down it. We think Grok Bot's command runner works the same way. Cursor eng Inferred
- Only some tools touch the computer. Connectors and remote MCP servers run on the server, and OAuth tokens never reach the VM. xAI docs
- A sleeping computer is restored from a snapshot on the next tool call. Only certain tools are allowed to wake it. Talk Inferred
How to read this page
Claims carry one of these tags. Solid tags are things a source says. Dashed tags and dashed boxes are things we inferred or couldn't find. Untagged notes and takeaways are our own explanation of the tagged material.
Said in the lecture or shown on a slide.
Grok Bot's product docs (docs.x.ai and cursor.com/docs/grok-bot).
Cursor's posts and docs about its cloud agents. That's the same platform, but these weren't written about Grok Bot specifically.
Our reading of the evidence. Plausible, not confirmed.
Not public. We looked and found nothing.
Quick answers
The questions people ask first. One row each, with the evidence and a link to the section with the details.
| Question | Short answer | Evidence | More |
|---|---|---|---|
| Where things run | |||
| Where does the agent run? | On Cursor's servers, as a Temporal workflow. Model calls and tool calls are its activities. None of it runs on the VM or your device. | TalkCursor eng | §08 |
| What is the "agent process"? | No program stays running per user. Server workers pick up the workflow's tasks, and the workflow probably ends about 2 minutes after the work is done. | Cursor engInferred | §08 |
| What is a Bot, and how many computers does a user have? | A Bot is a named agent with its own role, chat, routines and memory. All of a user's Bots share one computer, with one screen each. | xAI docs | §03 |
| What is a Team Bot? | A Bot the owner publishes for the team. It has one setup and one team memory, but a 1:1 conversation usually runs on the computer and accounts of whoever is talking. Slack channels and group chats use a computer of the Bot's own. | xAI docs | §04 |
| What is the computer used for? | Anything that needs an operating system: shell and code, files in /workspace, a logged-in browser, desktop apps, screenshots, command-line MCP servers. | TalkxAI docs | §05 |
| How does a tool call reach the computer? | The server routes it to a command runner inside the VM, most likely over a connection the VM opens to the server. | TalkCursor engInferred | §12 |
| When is the computer on? | Only when a tool needs it. It's snapshotted a few minutes after the last activity (never mid-turn) and restored on the next tool call that may wake it. | TalkInferred | §13 |
| Where do helper agents run? | Each is its own durable workflow, most likely on the server. The computer-use helper drives the user's screens. Bigger coding tasks can go to Cursor Cloud Agents on separate VMs. | TalkCursor engxAI docs | §05 |
| Starting work | |||
| What can start a turn? | You, a call or meeting, a schedule, a webhook, events from Slack, GitHub, Linear, Sentry, PagerDuty or email, another Bot, or a helper finishing. | TalkxAI docs | §11 |
| How do routines work? | Each belongs to one Bot and is created by asking it. Up to 50 per Bot, at least 5 minutes apart, last 20 runs kept. They run in the cloud; one that only uses connectors shouldn't need the computer. | xAI docsTalkInferred | §11 |
| What if I message it while it's working? | Your message jumps the queue and can redirect or stop the turn. Everything else waits, and quick bursts become one turn. | TalkxAI docs | §11 |
| Where things are stored | |||
| Conversation | Server: an append-only log plus the database. Apps fetch new messages in order after a signal. Long histories get summarized. | TalkCursor eng | §06 |
| Memory | Server, in four layers: facts about you (always in the prompt), the 30 most relevant log entries, short-lived notes, and everything else via search. Updated after each turn. | Talk | §07 |
| Skills | One private library shared by all your Bots, most likely stored on the server. The prompt holds a one-line pointer; the full text is read when needed. | xAI docsTalkInferred | §06 |
| Files | /workspace on the computer's durable disk, shared by all your Bots. Before the computer sleeps, files sync to cloud storage; which ones (most likely /workspace) isn't documented. Team Bot uploads land on the computer of the chat they're sent in; otherwise attachment storage isn't documented. | xAI docsTalkInferredUnknown | §14 |
| Passwords, tokens, logins | OAuth tokens stay on Cursor's backend. You enter passwords by taking over the screen; secrets for supported connections go in a masked request the model never sees. Browser and CLI logins live on the computer. | xAI docs | §06 |
| What survives a reset or update? | /workspace files and most logins. Hand-installed packages and temp folders may not. A reset can lose very recent changes. | xAI docs | §13 |
| What's lost if a server crashes mid-turn? | Nothing that finished. Temporal retries the running step on another worker. The risk: a command that ran but wasn't recorded could run twice. | Cursor engInferred | §16 |
| Safety | |||
| Who checks risky actions? | A separate review model, before they run (memory writes aren't reviewed). Approvals wait for you in your own chats; ones from routines or other Bots expire after about 10 minutes. The talk's slide said 15 seconds. | xAI docsTalk | §17 |
| Are Bots isolated from each other? | No. The boundary is the user account. All of a user's Bots share the computer. | xAI docs | §03 |
| Can I give each Bot different tools? | Not for your own Bots: connectors and the computer are shared, and only enabled skills differ per Bot. Team Bots get their own plugins, skills and secrets, chosen by the owner. | xAI docs | §03 |
| Can it touch my own laptop? | Only if "Execution on Local Computer" is on. The default is "Ask every time". The review model doesn't cover it. | xAI docs | §17 |
| Which model does it use? | xAI's own models, possibly third-party ones too. No model picker. Enterprise teams can screen every model request (beta). | xAI docs | |
The whole system
Every component, how a user's Bots share one computer, how Team Bots differ, what the computer is for, where every piece of data is stored, and what a single turn reads and writes.
System map
Three zones: your apps, the server side (where the loop, the conversation and memory live), and the per-user VM (where tools run). Dashed boxes are components we believe exist but that no source names.
*.*.cursorvm.com| Link | What we know | Evidence |
|---|---|---|
| 1Apps ↔ server | Apps send messages with unique IDs. The server answers with tiny "something changed" signals, and apps fetch from the database in sequence order. Cursor streams conversation updates from an append-only store. | TalkCursor eng |
| 2Loop → model | Inference runs as a Temporal activity with its own timeout and retries, so an inference outage doesn't lose the turn. | Cursor eng |
| 3Loop → connectors | Connectors and remote MCP servers are called from Cursor's servers. Bots use them without ever receiving the OAuth tokens, and tokens are never stored on the computer. | xAI docs |
| 4VM worker → server | For Cursor's self-hosted machines, a worker on the machine opens a long-lived outbound HTTPS connection, and tool calls come down it. We assume the hosted VMs run the same worker. The protocol on that connection isn't public. | Cursor engInferred |
| 5Control plane → VM | The VM is snapshotted when idle and restored on the next tool call. How the server tells the Firecracker host to do this isn't public. | TalkUnknown |
| 6Apps → VM | Corporate TLS proxies must allow *.*.cursorvm.com. The two-level pattern looks like one hostname per machine. We think that's how the live desktop view and take-control reach the file server. | xAI docsInferred |
Worth noticing
- A conversation can carry on without the VM. The loop, the history and the memory all live on the server, which is why the talk stresses that the VM can be rebuilt at any time.
- The "tool router" and "worker gateway" are our names. Some component has to decide which tools go to the VM and hold the VM's connection, but no source names them.
- Cursor's posts say VNC and Chrome live in the VM and are shared by a parent agent and its computer-use helper.
Bots, accounts and the one computer
In Grok Bot, a "Bot" is a named agent you create, with its own role and instructions. One account can have several. They each get their own chat, but they all run on the same computer. The colours below follow each Bot from the account to the server and onto the computer. The Bot names are made-up examples.
You message each Bot separately, add it to Slack, or put several in one group chat. They can pass work to each other. xAI docs
Routines, enabled skills and settings belong to the Bot's profile. Duplicating a Bot doesn't copy its conversations or learned memory. xAI docs Facts about you are shared by all your agents, and each agent writes to its own file. Talk
Each Bot gets its own screen and runs one computer-use task on it at a time. Screens are "separate work surfaces, not separate security boundaries." xAI docs
| What | Per Bot or shared? | Evidence |
|---|---|---|
| Role, instructions, chat history | Per Bot | xAI docs |
| Routines, settings, enabled skills | Per Bot (part of its profile). The skill library itself is shared by all your Bots. | xAI docs |
| Learned memory | Per Bot, plus shared facts about you | xAI docsTalk |
| Screen and Chrome window | Per Bot, on the same computer | xAI docsTalk |
| Files in /workspace | Shared. That's how Bots hand files to each other. | xAI docs |
| Browser cookies, logins, CLI credentials | Shared. One Bot can use a login another Bot set up. | xAI docs |
| The computer itself | Shared. One Firecracker VM per user account. | xAI docs |
| What | Your own Bots | Team Bots | Evidence |
|---|---|---|---|
| Connectors and plugins | Account-wide: every Bot can use every connected account. You can switch off individual plugin tools under Connect apps → Your plugins → Manage plugins and skills, but that applies to all your Bots. Typing @ attaches a connector to one task. | The owner and managers add the Bot's shared plugins. OAuth plugins use the access of the person talking to it; key-based plugins use the Bot's own credential for everyone. | xAI docs |
| Skills | One private library shared by all your Bots. Each Bot has its own set of enabled skills, the only tool-related setting we found documented per Bot. Typing / references a skill. | Team skills are saved by the owner or managers and apply in every teammate's conversation. | xAI docs |
| Computer tools and logins | Shell, files, browser and desktop, plus every login on the computer, are available to every Bot. | The owner's chat runs on the owner's computer, and a teammate's chat or DM usually on theirs. Slack channels, threads, group DMs and group chats use a computer of the Bot's own. | xAI docs |
| Personal connectors | Not applicable: every connector is already yours. | Used without asking in a 1:1 chat. In shared conversations the Bot asks first (Allow once, or Always allow for this Bot). | xAI docs |
| Secrets | Masked secret requests for supported connections. Team Secrets only reach setup scripts, never the Bots directly. | Up to 25 per Bot, used by name and shown as [REDACTED] in command output, file reads and plugin calls. Every teammate's conversation can use them. | xAI docs |
| Custom MCP servers | Reportedly added by asking the Bot (a third-party guide citing Cursor forum replies). Command-line ones run on the computer. Whether they're limited to that one Bot isn't documented. | Remote servers use the Bot's credential or each person's sign-in. Command servers run on the conversation's computer, and ones that need secrets only work in the owner's chat. | xAI docsUnknown |
| Limits on what a Bot may do | Auto Review rules, the network allowlist and the local execution policy apply to all your Bots. "Rules" written in a Bot's description are instructions it follows, not enforcement. | The same, plus the team's connector policy: admins block connectors on Cursor's Plugins & MCPs page, and blocked ones show as "Disabled by team admin". | xAI docs |
Consequences worth knowing
- Deleting a Bot doesn't remove its files or sign-ins from the computer.
- If one of your own Bots needs different tools or its own computer, the documented route is a separate Cursor user. There's no per-Bot switch for connectors.
- Team Bots, which the owner publishes for a whole team, work differently. The next section covers them.
- The talk describes the same setup from the infrastructure side: when you run five or ten bots, each one needs its own browser, so each gets its own virtual screen on shared machinery.
Team Bots: one Bot, many conversations
A Team Bot is a Bot its owner publishes for the whole team. It keeps one setup and one team memory, but its conversations run on different computers and with different accounts, depending on who is talking and where. The docs describe this behaviour; how it's wired underneath is our reading.
xAI docs Inferred: one setup, many conversations
Every conversation uses the same Team Bot setup. Which computer and whose accounts it uses depend on the conversation. xAI docs Group chats in the app are only listed in Cursor's Teams docs. Whether the Bot's own computer is one per Bot or one per channel isn't stated. Unknown
| What | Personal Bot | Team Bot | Evidence |
|---|---|---|---|
| Who sets it up | You | The owner, plus any managers. Admins choose who gets it by default. Teammates can't change its setup. | xAI docs |
| Which computer | Always your one computer | The owner's chat: the owner's computer. A teammate's chat or Slack DM: usually that teammate's computer. Slack channels, threads, group DMs and group chats: a computer of the Bot's own, separate from everyone's. The Team Bots docs call it "one shared computer for that Bot"; they don't say whether it's one per channel or whether it persists. | xAI docs |
| OAuth plugins (Gmail and the like) | Your accounts | The account of whoever is talking to it. Each teammate connects their own the first time. | xAI docs |
| Key-based plugins | Your keys | The Bot's own credential, the same for everyone | xAI docs |
| Teammates' own connectors | Not applicable | Used without asking in a 1:1 chat. In shared conversations it asks first (Allow once, or Always allow for this Bot). | xAI docs |
| Secrets | Masked secret requests | Up to 25 per Bot, used by name, shown as [REDACTED] in output, available in every teammate's conversation | xAI docs |
| Files you upload in a chat | Not documented | Land on the computer that chat runs on, so a teammate's uploads go to their own computer, not the owner's | xAI docs |
| Skills and files | Shared library, enabled per Bot | Team skills and files set by the owner or managers, used in every conversation | xAI docs |
| Memory | Facts about you plus the Bot's own memory | Team memory read by every conversation, plus private notes with each person | xAI docs |
| Usage | Counts against you | Each teammate's chats count against their own allowance. Routines count against whoever set them up. | xAI docs |
Underneath (our reading)
- The Team Bot is most likely one stored setup on the server (instructions, plugins, skills, secrets, files, team memory). Each conversation runs its own copy of the agent loop, with its own Temporal workflow. Inferred
- When a turn starts, the server picks the computer and the accounts from who is talking and where. The setup stays fixed; the computer and personal access come from the conversation. Inferred
- One thing doesn't add up: secrets work in every teammate's conversation, but command-line MCP servers that need secrets only work in the owner's chat. Their configuration may live on the owner's computer. Unknown
- Not documented: whether the Bot's own computer is one per Bot or one per channel, and whether it persists between sessions. Unknown
- Anything posted in a channel thread is visible to the whole channel, and the Bot's secrets reach every teammate. The docs recommend scoped, read-only service-account keys. xAI docs
What the computer is actually for
The computer does much more than browse the web. Anything that needs a real operating system happens there: running programs, keeping files, holding logged-in sessions, appearing on the network. The thinking, the memory and the connections to your apps all stay on the server.
Runs on the computer
TalkxAI docs
xAI docs
TalkxAI docs
Talk
Talk
xAI docs
xAI docs
TalkxAI docs
Never touches it
TalkCursor eng
xAI docs
Talk Inferred: skills
xAI docs
Talk
Not clear from the sources
Inferred
Unknown
Unknown
Cursor engInferred
| Request | What it uses | Computer |
|---|---|---|
| "Summarize my unread email" | Gmail connector on the server, then SendToUser | stays asleep |
| A routine at 8:00 that only reads from connectors | Connectors, then SendToUser (like the routine on the slide that "didn't need it") | stays asleep |
| "Compare this TV on Costco and Amazon" | The browser on the bot's screen | wakes it |
| "Clean up the CSV I sent and chart it" | Files in /workspace, then a script in the shell | wakes it |
| "Log into the vendor portal and download the invoice" | Browser, then a hand-off to you for 2FA, then files | wakes it |
| "Fix the bug in our repo" | If the Bot delegates it: a Cursor Cloud Agent on a separate VM, with the Bot gathering context and writing the prompt | separate VM |
How to think about it
- The server is the bot's brain and memory. The computer is its desk and hands: the place where work needs a real machine with real files and logged-in software.
- That split is why the computer can sleep most of the time. Plenty of turns (email, calendar, chat, memory lookups) most likely never need it.
- All of a user's Bots share this one computer, each with its own screen. The Bots section above shows what's shared and what isn't.
Where everything lives
Every piece of data we could find, where it's kept, when it's written, how it gets used, and whether it belongs to one Bot or to the whole account.
| What | Lives in | Written | Used | Scope | Evidence |
|---|---|---|---|---|---|
| Conversation and the agent loop | |||||
| Loop progress | Server Temporal history | After every activity (model call, tool call, save) | Replayed on another worker after a crash | Per task | Cursor eng |
| Conversation transcript | Server append-only log + database | Every step of every turn | Apps fetch it in order after a signal; becomes the prompt's history | Per Bot conversation | TalkCursor eng |
| Conversation summary | Server | About 10 minutes after a big turn, or mid-turn if a turn gets too long | Replaces older messages at the start of the next prompt; the last few messages to you stay word for word | Per conversation | Talk |
| Tool definitions | Server prompt prefix | Fixed until the next summary; a deploy adds a note instead of new text | Full details for a core set; other tools listed by name and loaded when needed | Per conversation | Talk |
| Memory and instructions | |||||
| Profile (facts about you) | Server | A pass after each turn adds and replaces facts; it can only remove facts it was shown | Always in the prompt: up to 100 facts in 4,000 characters | Read by all your Bots; each Bot writes to its own file | Talk |
| Log (dated events) | Server | Not documented | The 30 most relevant recent entries go in the prompt | Per Bot | TalkInferred scope |
| Notes | Server | Not documented | Short-term details that fade quickly | Per Bot | TalkInferred scope |
| Older memory | Server files | As above | Found with a memory search tool when needed | Per Bot | Talk |
| Team memory (Team Bots) | Server | Not documented | Read by every teammate's conversation; notes with each person stay private to that person | Per Team Bot | xAI docsInferred location |
| Skills | Server private skill library (most likely) | Saved from a finished task, a recorded demonstration (up to 10 minutes) or written instructions | A one-line pointer in the prompt; full text read on demand; type / to reference one | Library shared by all your Bots; enabled per Bot | xAI docsTalkInferred location |
| Routines | Server the Bot's profile | By asking the Bot; it confirms schedule, inputs, result and approval limits, and new routines need your OK | A schedule or event starts a run; the last 20 runs are kept | Per Bot (up to 50) | xAI docs |
| On the computer | |||||
| Files | Computer /workspace on a durable disk | By tools running on the computer. Before sleep, files sync to cloud storage; that this covers /workspace is our reading | Shell and file tools; how Bots hand files to each other | Shared by all your Bots | xAI docsTalkInferred |
| Running programs, open apps | Computer memory snapshot | At sleep | Restored in place on wake; a reset goes back to the last snapshot; an image update starts from a fresh image, so running programs are lost (files and most logins are kept) | Per user | TalkxAI docs |
| Browser cookies and logins | Computer durable disk | When you or a Bot log in (you take over for passwords and 2FA) | By every Bot's Chrome; can drop when the computer is recreated | Shared by all your Bots | xAI docs |
| Command-line credentials | Computer | When a CLI tool is logged in | Shell commands | Shared by all your Bots | xAI docs |
| Cloud Agent results | Computer, then attached to the reply | When a coding agent reports back, its images, videos and files are copied to the computer | Attached to the Bot's reply | Per conversation | xAI docs |
| Your personal review rules | Device, synced to Computer | When you add a rule in that desktop app | By the review model; each desktop install has its own | Per desktop install | xAI docs |
| Credentials and secrets | |||||
| Connector OAuth tokens | Server connector backend | When you connect an app | By server-side tool calls; never sent to the computer or the model | Account (or team) | xAI docs |
| Secure secret requests | Not documented | You type the value in a masked field | By the supported connection; excluded from the transcript and the model | Per connection | xAI docsStorage unknown |
| Team Secrets | Server encrypted, in the Cursor dashboard | Set by admins | Delivered to Team Setup Scripts as environment variables when the computer starts; never given to Bots directly | Team | xAI docs |
| Team Bot secrets | Not documented | Set by the owner or managers (up to 25) | Used by name in every teammate's conversation; values shown as [REDACTED] in output | Per Team Bot | xAI docsStorage unknown |
| The machine itself | |||||
| VM snapshot (memory + disk) | Not documented host side | A few minutes after the last activity, never mid-turn | Restored on wake; a reset rebuilds from the last saved data | Per user | TalkxAI docs |
| Network policy | Server team settings | By admins | Reaches running computers within about a minute; sleeping ones on wake | Team | xAI docs |
| Chat attachments | Not documented | When you attach (up to 6 per message; 25 MB per document, image or audio; 200 MB per video) | Go to the Bot you attach them to; not copied when a Bot is duplicated. With Team Bots, they land on the computer of the chat they're sent in. | Per Bot | xAI docsStorage unknown |
The pattern
- Anything about you or your conversations (transcript, memory, routines, tokens, and most likely skills) lives on the server, so a rebuilt computer loses none of it.
- Anything an operating system needs (files, browser logins, CLI credentials, running programs) lives on the computer and is shared by all your Bots.
- The only thing we found stored on your device is your personal review rules, and those are copied to the computer too.
What one turn reads and writes
The same storage, seen through one turn: what gets loaded before the first model call, what's written while it works, and what happens afterwards while you're away.
Profile facts, the top 30 log entries and a snapshot of routines go into the system prompt.
TalkTool definitions sit in the fixed start of the prompt. The first message adds environment details and a list of tool names.
TalkConversation history, starting from the latest summary, follows. The newest message goes last, with the time and short notes on what changed.
TalkSkills appear only as one-line pointers. The computer isn't touched yet.
TalkEvery model call and tool result is recorded in Temporal's history.
Cursor engEvery step is appended to the conversation log, and open apps get a signal.
TalkTools that need it change files in /workspace, browser state and installed tools.
TalkxAI docsLong outputs go to files, and the context keeps only the path. Whether those files sit on the computer or in server storage isn't said.
TalkUnknownSkill text (most likely from the server), memory search results and tool details are read only when the model asks for them.
TalkA memory pass adds new facts and replaces old ones. It can only remove facts it was shown.
TalkAfter about 2 idle minutes the agent process stops.
TalkAfter a few idle minutes, files sync to cloud storage, then memory and disk are snapshotted and the machine stops.
TalkAbout 10 minutes after a big turn, while the provider's cache is still warm, a summary is written for the next time you write.
TalkWhy it's built this way
- Everything in step 1 is kept in a fixed order so the provider can reuse its cached work. Only the newest message is new on each call.
- Step 2 writes to two places on purpose: Temporal history so a crash can resume, and the conversation log so every app shows the same thing.
- Step 3 uses idle time for the expensive bits (summaries, snapshots) so the next turn starts small and fast.
The agent loop
How a turn runs on Temporal, how each tool call finds where it should run, what happens when the computer is asleep, and how work starts and results go out.
The loop as a Temporal workflow
A plausible event history for one task, using the pieces the sources describe. The workflow code only makes decisions; every call to the outside world is an activity, and Temporal records each result.
- Talk
WorkflowStartedA trigger arrives: your message, a routine, a Slack mention, a helper finishing.
- Talk
Activity: loadStateConversation, memory, routines and (most likely) skills come from the database.
- Cursor eng
Activity: inferenceThe model answers with a tool call, e.g.
Shell("npm test"). - Cursor eng
Activity: toolCall c42 · attempt 1 timed outEach activity has its own timeout and retry policy.
- Cursor eng
Activity: toolCall c42 · attempt 2 completedThe result is written to the workflow history. If the server dies now, this call won't run again.
- Talk
Activity: saveStepThe step is appended to the conversation log, and apps get a "something changed" signal.
- Talk
Activity: inferenceThe model decides it's done and calls SendToUser.
- Talk
Activity: sendToUserThe last message can end the turn without another model call.
- Inferred
Waiting for new messages…New input could arrive as a Temporal signal. If nothing comes, the workflow exits.
- Inferred
WorkflowCompletedThis would match the slide's "stops after 2 idle minutes".
What Temporal gives them
Crash recovery without replaying finished steps, per-activity timeouts and retries, and runs that last days or weeks. Cursor reports 50M+ actions a day across 7M+ workflows.
Cursor engOne workflow per task
Cursor moved from one "eternal" workflow per agent to shorter workflows that exit after a single task, mainly to make version upgrades easier.
Cursor engWhere "2 idle minutes" fits
Our guess: the workflow waits briefly for follow-up messages, then completes. The next trigger starts a fresh workflow from saved state. It could also be the worker evicting the workflow from its cache. The talk doesn't say which.
InferredTerms, for anyone new to Temporal
- Workflow: deterministic code that decides what to do next. Temporal replays it from the recorded history after a crash.
- Activity: any call with side effects (model, database, VM). Its result gets recorded, so after a crash, completed activities aren't run again.
- Worker: a process on a server pod that polls Temporal for workflow and activity tasks. It's the "agent process" on the slides.
Routing a tool call
The model asks for a tool. Before anything touches a VM, the server has to decide where the tool runs and whether the computer may be woken for it.
xAI docs Talk Inferred: web search
Talk xAI docs
Talk Inferred
Why we think the third question exists
- That exact error message is on the talk's tool-design slide. It only makes sense if some tools refuse to wake the computer while Shell and Read are allowed to.
- Our guess at why: screen tools (screenshot, click) assume a live desktop session. Waking a VM just to take a screenshot of a desktop that was frozen mid-state isn't useful, so the model is told to wake it on purpose first.
- The tool list itself never changes between turns (that would break the prompt cache). Unavailable tools return errors instead.
A tool call on a sleeping computer, step by step
The most involved path through the system. The dot on each message shows its evidence. Most of the middle is inferred, because no source describes the wire protocol.
toolCall(Shell, c42)c42 once the worker is onlinec42c42The details that matter
- "Same worker ID" comes from Cursor's self-hosted post: when a snapshot is restored, the worker "starts with the same ID". That's what lets a pending call find the machine again after a restore.
- Restoring a snapshot kills open connections. The VM's memory comes back, but the TCP sessions it had are gone. A worker that dials out handles this by reconnecting, which fits the "same ID" detail.
- The activity has to wait for the worker to come back, inside its own timeout. If the restore fails, the activity fails and Temporal retries it.
How work starts and how results go out
Every turn starts with a trigger and ends with a reply, a draft, an approval request, or nothing at all. All of it is handled on the server.
Authorization: Bearer <key>; a 200 only means the run startedxAI docs Talk
Talk xAI docs
Talk xAI docs
Routines belong to one Bot
Created by asking that Bot. Up to 50 per Bot. Deleting the Bot deletes them.
xAI docsThey run in the cloud
With your laptop closed. A routine that only needs connectors shouldn't need the computer, like the one on the talk's slide.
xAI docs Talk InferredLimited history
The last 20 runs are kept, each as running, succeeded or failed with a reason. Failed rate-limited runs aren't retried.
xAI docsPaused when you're gone
After a long absence Grok Bot may ask whether to keep routines running, and pauses them if you don't answer.
xAI docsWorth noticing
- Event triggers come from Cursor account integrations, which are separate from the Slack or GitHub connectors a Bot uses to act.
- Group chats hold two to six Bots. You can @mention one, several or everyone, or let them decide who answers. Approvals, secret requests and drafts never show up in groups.
- Webhooks are fire-and-forget. A 200 means a run started; the result shows up later in the Bot's conversation.
The computer
Which side opens the connection, how sleep and wake work, and what's inside the VM.
Who connects to whom
Two candidate designs for reaching the VM. The evidence suggests both are used, for different jobs.
A. The VM dials out
A worker in the VM opens a long-lived connection to the server, and calls come down it.
- Cursor's self-hosted workers work this way: "Cursor never initiates a connection into your network."
- After a restore, the worker "starts with the same ID", which suggests it reconnects as itself.
- No inbound ports on the VM, and no need to know its address.
B. Someone dials in
Each VM has a public hostname behind a proxy, and clients connect to services inside it.
*.*.cursorvm.com- The Teams docs tell admins to allow
*.*.cursorvm.comthrough TLS-inspecting proxies. That's a two-level hostname, plausibly service and machine. - The VM's file server provides the "live desktop view", and you can take control from the app.
- Streaming a desktop straight from the VM to your app avoids sending video through the agent loop.
| Job | Our best guess | Confidence |
|---|---|---|
| Tool calls from the loop | A: the in-VM worker dials out to a gateway, the same design as Cursor's self-hosted workers. | Medium-high |
| Live desktop, take control | B: the app connects to the VM's file server through a per-VM hostname. | Medium |
| Snapshot, restore, reset | Neither: the host manages Firecracker directly. The VM can't restore itself. | Unknown how |
| Network policy updates | Pushed to running computers "within about a minute"; sleeping ones apply them on wake. They could be enforced at the host or by an agent in the VM. | xAI docs |
What we couldn't find
- The protocol on the worker connection (WebSocket, gRPC streaming or long-poll), and how the worker and server authenticate each other.
- Whether Firecracker's host-to-guest socket (vsock) is used for any of this.
Sleep and wake
The computer sleeps a few minutes after the last activity, never in the middle of a turn, and wakes on the next tool call that's allowed to wake it.
Last activity
The last tool call finishes. Talk
Idle check
A few minutes pass with no turn running. Talk
Flush files
Files sync to cloud storage. Talk
Snapshot, stop
Memory and disk are saved, and the machine stops. Talk
Tool call
Shell or Read is called for a sleeping computer. Talk
Restore
The snapshot is restored in place, with logins and tools intact. Talk
Reconnect
The worker comes back with the same ID. Cursor eng Inferred
Deliver
The waiting call is sent. Conversation state comes from the server. Talk
Reset can lose recent work
A reset rebuilds from the last saved data. Very recent changes are lost "if the computer can't be reached to save them", which suggests the server asks the VM to save before a reset.
xAI docs InferredUpdates recreate the machine
Image updates recreate the computer on a fresh image and keep your files and logins, though some sign-ins can drop. Packages installed by hand and temp folders may not survive.
xAI docsTerminate keeps the disk
An admin terminate stops running bots but keeps the durable disk, and the next session starts a fresh computer on it. Hibernation is not deletion.
xAI docsLayers of persistence
- The snapshot (memory + disk) makes waking fast and keeps running processes and logged-in browsers exactly as they were.
- The durable disk, plus whatever the pre-sleep sync copies to cloud storage, survives even when a snapshot can't be used: updates, recreates and terminates. Which files are synced, and whether that cloud storage is simply the durable disk, isn't documented. Inferred
- "Never mid-turn" means the control plane must know whether a turn is running. Temporal can tell it, since an open activity means the computer is in use. That link is our inference.
Inside the VM
Three nested layers, and a clear split between what survives and what doesn't.
Talk
Talk
Talk Cursor eng
xAI docs
| Thing | Fate | Source |
|---|---|---|
| Files under /workspace | kept across sleep, updates, recovery | xAI docs |
| Browser sessions, logins | kept on the durable disk | xAI docs |
| Installed tools (between sleeps) | kept in the snapshot | Talk |
| Hand-installed packages, temp dirs | replaceable on update or recovery | xAI docs |
| Connector OAuth tokens | never on the VM | xAI docs |
| Values typed in a secure secret request | kept out of the transcript and the model (supported connections only; passwords use screen takeover) | xAI docs |
| Team Secrets | given to setup scripts as environment variables | xAI docs |
Env names PATH, HOME, SAND_*, LD_* | reserved by the "computer runtime" | xAI docs |
| sudo | allowed by default; admins can turn it off | xAI docs |
Worth noticing
- Bots share the whole computer: files, cookies, logins, command-line credentials. The docs call screens "separate work surfaces, not separate security boundaries".
- The reserved
SAND_prefix hints at an in-house sandbox runtime that configures itself through environment variables. Nothing else about it is public.
Reliability
Where state lives, what each failure costs, and the security boundaries.
Three kinds of state, kept apart on purpose
Cursor describes the agent loop, the machine and the conversation as three separate components. Each one can fail or be replaced without the other two noticing much.
Agent loop
Temporal workflow history- Holds
- Where the task is, which activities finished, their results.
- Survives
- Server pods being replaced, EC2 nodes going down, inference outages.
- Recovery
- Replay the history on another worker and continue from the last completed step.
Machine
VM snapshot + durable disk- Holds
- Files, installed tools, browser logins, running processes.
- Survives
- Hibernation, pod replacement, image updates (files and most logins survive; running programs don't).
- Recovery
- Restore the snapshot, or start a fresh computer on the durable disk (plus whatever was synced to cloud storage before sleep).
Conversation
Append-only log + database- Holds
- Messages and steps every app shows, plus memory and routines (and most likely skills).
- Survives
- Lost signals, app restarts, retried steps.
- Recovery
- Apps re-fetch in sequence order. If a step was re-run, the client rewinds its stream and shows the new data.
From Cursor's post
- Because the loop lives in Temporal and not on the VM, they can manage pod lifecycles independently, including hibernating and resuming pods.
- Helper agents can run on a completely different kind of pod and can outlive their parent.
What happens when things fail
Each failure mode, what absorbs it, and where the evidence comes from. The amber row is the one we'd watch most closely if we built this.
| Failure | What happens | Source |
|---|---|---|
| Server pod dies mid-turn | Temporal hands the workflow to another worker. Completed activities aren't repeated, and the running one is retried. | Cursor eng Talk |
| Model provider outage | The inference activity times out and retries under its own policy. The turn waits instead of failing. | Cursor eng |
| VM pod replaced or crashes | The loop doesn't notice until the next tool call, which restores or rebuilds the computer. | Cursor eng Inferred |
| A command ran, but the result was lost | If the server dies after the VM ran c42 and before Temporal recorded it, the activity retries and the command could run twice. The worker needs to de-duplicate by call ID, or the tool needs to be safe to repeat. The talk says steps are written to be idempotent, but not how. | Talk Inferred |
| App misses a signal | Harmless. The signal has no data, and apps fill gaps from the database by sequence number. | Talk |
| A step is re-run after a retry | The client detects it, rewinds its stream and shows the new data. | Cursor eng |
| Reset while the VM is unreachable | It rebuilds from the last saved data, so very recent changes can be lost. | xAI docs |
Security boundaries
Where the walls are, mapped onto the architecture.
Between users
Firecracker gives each user a separate kernel, memory and devices. One user can't reach another's computer.
xAI docsBetween bots
None. Bots "isolate personalities and workspaces, not compute." Give a workload its own Cursor user if it needs its own computer.
xAI docsBefore a risky action
A separate review model checks shell commands, app calls, computer use and delegation before they run. It can allow, ask you, or deny. Memory writes aren't reviewed.
xAI docsSecrets
OAuth tokens stay on the server. For passwords, 2FA, CAPTCHAs and payments you take over the screen yourself. Secrets for supported connections go in a masked request, kept out of the transcript and away from the model.
xAI docsAlso documented
- Network policy has three modes (allow all, defaults plus team allowlist, allowlist only). Traffic leaves through shared static egress IPs.
- Auto Review covers work inside the hosted computer. Commands on your own laptop go through a separate approval policy.
- Approval cards in a chat you're in wait for your answer. Cards from work started without you (a routine, a trigger, another Bot) expire after about ten minutes and don't run. The talk's slide said "no answer in 15 seconds means blocked"; the docs describe the ten-minute expiry.
- Team Bots use a computer of their own for Slack channels and group chats, shared by those conversations, so anything posted there is visible to the channel. Their secrets are usable in every teammate's conversation.
- Enterprise teams can record bot actions (including scrubbed shell commands) and export events over OpenTelemetry.
For our team
A sketch of how we'd build the same thing, and the questions nobody has answered publicly.
How we'd build it
A minimal version of the inferred design, in TypeScript with the Temporal SDK. It's here to make the moving parts concrete. We wrote it; it isn't based on anyone's real code.
workflow.ts · runs on server workers// One workflow per task. No I/O here: only decisions.
export async function agentTask(convId: string) {
let inbox: Msg[] = [];
setHandler(newMessage, (m) => { inbox.push(m); });
const state = await loadState(convId);
for (;;) {
const step = await inference(state.prompt(inbox));
inbox = [];
if (step.kind === 'send_to_user') {
await sendToUser(convId, step.message);
// wait briefly for follow-ups, then exit
if (!(await condition(() => inbox.length > 0, '2 minutes'))) return;
continue;
}
const result = await toolCall({ convId, callId: step.callId,
tool: step.tool, args: step.args });
await saveStep(convId, step, result); // append + signal apps
state.add(step, result);
}
}
activities.ts · the tool routerexport async function toolCall(c: ToolCall) {
if (SERVER_TOOLS.has(c.tool)) return runOnServer(c);
const vm = await controlPlane.state(c.userId);
if (vm === 'asleep') {
if (!WAKING_TOOLS.has(c.tool))
return error('The computer is asleep. Use Shell ' +
'or Read to wake it, then try again.');
await controlPlane.restore(c.userId);
}
// the worker reconnects after a restore
const worker = await gateway.waitFor(c.userId, '60s');
return worker.call(c.callId, c.tool, c.args);
}
worker.ts · runs inside the VM, started by the supervisor// Dials out, so the VM needs no inbound ports and survives restores.
for (;;) {
const conn = await dialOut(GATEWAY_URL, { workerId: WORKER_ID }); // same ID after every restore
for await (const call of conn.calls()) {
// de-duplicate by call ID: Temporal may retry a call that already ran
const result = (await doneLog.get(call.id)) ?? (await doneLog.put(call.id, await execute(call)));
conn.reply(call.id, result);
}
// connection dropped (snapshot restored, network blip): loop and reconnect
}
Decisions this sketch forces
- doneLog has to persist (on disk in the VM) or retries can repeat side effects after a restore.
- Activity timeouts must cover a restore plus the command itself, or long commands need heartbeats.
- The control plane must know when a turn is running, so it never snapshots mid-turn.
Open questions
Things we looked for and didn't find. If anyone on the team can find out more, these are worth asking.
- The worker protocolWebSocket, gRPC streaming or long-poll? How do the worker and the server authenticate each other?
- Hosted vs. self-hostedDo hosted VMs run the same dial-out worker as self-hosted machines, or something else?
- vsockDoes anything use Firecracker's host-to-guest socket instead of the network?
- What "2 idle minutes" endsThe workflow? The worker's cache? A separate session process?
- Call de-duplicationHow are retried tool calls kept from running twice inside the VM?
- The SAND_ runtimeWhat is the "computer runtime" that reserves these environment variables?
- Where policy is enforcedIs the network allowlist applied at the host or inside the VM?
- File sync before sleepWhich files are synced to cloud storage before the computer sleeps, and is that the durable disk or a separate copy?
- Where the review model runsOn the server next to the loop, or somewhere else? The docs don't say.
- Attachments and secretsWhere are personal-Bot chat attachments and the values from secure secret requests stored? (Team Bot uploads land on the chat's computer.)
- Web search and image generationServer-side tools, or something that runs on the computer?
- Team Bot routingHow does a conversation get its computer and accounts? Is the Bot's own computer one per Bot or one per channel, and does it persist? Why do command-line MCP servers that need secrets only work in the owner's chat?
- Where helpers runCursor says a computer-use helper shares the VM's Chrome and VNC, and that some helpers run on a different kind of pod. Which Grok Bot helpers run where isn't documented.
Sources
Primary sources first. The talk itself isn't online as a transcript; the slides and our transcript are covered on the talk notes page.
- Grok Bot overview (xAI docs)
- Grok Bot: the computer and apps (xAI docs)
- Grok Bot security (Cursor docs)
- Grok Bot for Teams and Enterprise (Cursor docs)
- What we've learned building cloud agents (Cursor blog)
- Run cloud agents on machines you manage (Cursor blog)
- Self-hosted agents (Cursor docs)
- Bring your own machine (Cursor docs)
- Self-hosted machines help (Cursor help)
- Cursor agents can now control their own computers (Cursor blog)
- Bots (xAI docs)
- Team Bots (xAI docs)
- Settings and notifications (xAI docs)
- Teams and enterprises (xAI docs)
- Skills, routines and automations (xAI docs)
- Chat and collaboration (xAI docs)
- Approvals, security and privacy (xAI docs)
- Files and results (xAI docs)
- Grok Bot 101 (xAI guide)
- Grok Bot security FAQ (Cursor docs)
- Routines help (Cursor help)
- Grok Bot architecture explained (third party)
- A deep dive into Grok Bot (third party)
- Building always-on agents (third party summary of the talk)