/workspace. The
Editor and Bash tools read and write it, the files panel lists it, and the
canvas renders one file at a time beside the conversation.
Where files live
~/report.md and /workspace/report.md
both resolve to the same file, traversal outside the workspace is refused, and
/tmp raises an explicit error because every bash command gets its own /tmp
that no other tool can see.
Scratch belongs in .tmp/. It is hidden from the files panel and cleaned up, so
intermediate downloads and working data do not clutter what the user sees.
Opening a file on the canvas
TheCanvas tool opens one finished file in the side panel.
ui event:
What the canvas renders
Any failure, including an unreachable service or an unparseable file, falls back
to the download card rather than an error page.
Editing on the canvas
Text files open with an Edit button. Markdown opens in a rich editor with a toolbar, a/ menu for inserting blocks, and drag handles for moving them. It
covers headings, lists, checklists, tables, quotes, code, links and dividers, and
saving writes plain markdown back to the file. Right-clicking a table cell adds or
deletes a row or column, or deletes the table, and the toolbar can delete a table
too. Each block takes its direction from its own text, so Arabic and English
paragraphs sit side by side, and the / menu opens under Arabic text as it does
under English.
Images and videos pasted, dropped or picked into a document are saved in a
media/ folder beside it and linked by a relative path. The canvas shows those
images and plays those videos in the markdown view too.
Markdown that contains math, raw HTML or footnotes opens in a plain-text editor
instead, so saving cannot drop them. Other text and code files also edit as plain
text. Every other format on the canvas is view-only.
Configuring office rendering
Spreadsheets and.docx render from raw bytes in the browser and need no
service. Presentations and the PDF fallback call a shared render service,
configured with two environment variables:
.cache/office/ directory in the workspace, so
reopening a deck does not repay the conversion.
Uploads
Users attach files in the composer. The loop ingests them before the model call: images and PDFs go to the model as media when.vision(True), and every
attachment is written into the workspace so tools can open it.
.vision(False). The attachment stays in the
workspace and the model receives a note naming the file, which it can then read
with a tool.
The HTTP API
Files are also a REST surface, which is what the files panel and mobile clients use. All routes require auth.
Deleting moves a file to trash and keeps it restorable for thirty days through
GET /trash, POST /trash/{id}/restore and DELETE /trash/{id}.
Sharing
POST /share takes a path, either chat/<id> or file/<path>, and an
audience, either public, the default, or org:<id> for members of that
organization only. The agent HTTP API lists the
rest of the share routes.
A shared chat carries the files it references, so a recipient can open the
artifact without an account. Only chats fork, and a fork lands in the forker’s
active workspace.
The shared page has one bar: the Cycls logo, the file’s name, who shared it and
when, Open in new tab for HTML, Download, and one button named after the
agent’s brand. A signed-out visitor gets Sign in, which returns to the share
afterwards, and Google One Tap when the agent turns it on. A signed-in visitor gets
Go to Atlas, and an agent without sign-in shows Try Atlas. The page follows
the system’s light or dark theme. A
shared file fills the rest of the screen. A shared chat, and the loading and error
pages, use the same bar, and a chat keeps Continue this conversation. The page
is translated to Arabic. An org-only link asks a signed-out visitor to sign in,
and tells someone signed in outside the organization “This link isn’t shared with
your account”.
Next
Connectors and MCP
Let a user connect an account, then give tools the credential.