Everything under the workspace root. The tree and one folder's contents, a window of a file's text, search that blends text, structure, meaning and history, and the ordinary changes: make a folder, delete, move, copy. It also holds what a workspace knows about itself — which repos it contains, how its packages depend on each other, which apps are in it, and starting or stopping one.
31 calls. Pick one to open it, or use the list on the right.
GET/workspace/treeThe workspace file tree
Every folder and file under the workspace root, as one walk. Name a conversation to read its own private copy of the tree instead of the shared one. Folders the daemon skips, such as installed packages, come back without their contents; ask for those separately.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.tree();
GET/workspace/childrenA bounded folder listing
The entries inside a folder as one flat list. Direct children are the default, which is how the explorer opens a folder the full tree walk left closed; callers that need a small subtree can ask for up to five levels without a request per directory.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.children({ "path": "src/app.ts"});
GET/workspace/fileRead part of a text file
A window of one file's text, plus how large the whole file is. Never the entire file: an unbounded read is how a single enormous log stalls the daemon for everyone, so ask for the slice you mean to show and page through if you need more.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.file({ "path": "src/app.ts"});
GET/workspace/derivedRead a file's derived text
What a document, picture, recording or archive says, as text, from the shadow the sandbox keeps beside it. This is the same rendering an agent reads instead of the bytes, so it is also the way to check what one is working from. Nothing is derived here: a file with no shadow yet answers that it has none, and whether it could have one.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.derived({ "path": "src/app.ts"});
POST/workspace/deriveDerive a file's text now
Renders one file to text and answers with the result, for when its shadow is missing or you want it rebuilt. The same work the background pass does when that setting is on, so this is how a reader gets the text without turning it on for the whole workspace. Costs a parse of exactly one file; a format nothing can read says so rather than failing.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.derive({ "path": "src/app.ts"});
POST/workspace/media-ticketGet a pass for streaming a media file
Mints the short-lived ticket a video or audio element hands to the streaming route, which serves byte ranges and so cannot carry an ordinary header. Minting it here means a caller can tell whether this sandbox streams media at all, rather than discovering it mid-playback.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.mediaTicket({ "agent": "…", "path": "src/app.ts"});
POST/workspace/download-ticketGet a pass for downloading files and folders together
Mints the short-lived ticket the download route takes, bound to a selection of files and folders. The route answers one ZIP streamed straight from disk: folders whole, already-compressed formats stored as they are and everything else deflated. Minting it first means a missing or unreadable path is refused here, before the browser starts a download that cannot finish.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.downloadTicket({ "agent": "…", "paths": [ "src/app.ts", "README.md" ]});
GET/workspace/resolveTurn a written path into a real file
Matches a path somebody wrote in prose against the real tree and says which file it means. A path mentioned in a message is often only the tail of the real one, so this is the lookup behind every clickable file reference rather than a plain existence check.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.resolve({ "path": "src/app.ts"});
GET/workspace/searchSearch the code
Ranked results across the whole workspace, grouped, each carrying why it matched and how fresh it is. Left alone it blends plain text, structure, meaning and history in one pass; narrow it to a single kind of search when you already know which you want. Long result sets resume from the cursor it hands back.
What you send
Field
Type
Where
queryrequiredWhat to look for
string
query
modeNarrow the search to one kind:…
"q" | "find" | "files" | "def" … (7)
query
includeIgnoredSearch inside installed packages and other…
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.search({ "query": "…"});
GET/workspace/healthA repo's shape in numbers
Where one repo's risk sits: the files that change often and are complicated at once, what the index holds, and which modules the rest of the code leans on most. Scoped to a repo, because a codebase is a repo rather than the whole drop.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.health({ "repo": "root"});
GET/workspace/classifySort a messy drop into buckets
Proposes which of the loose things in the workspace are code, documents, media or archives. A read-only suggestion by fixed rules, with no model involved: nothing moves until a caller applies the moves it likes through the move call.
What you send
Nothing. Call it as it is.
What comes back
Field
Type
classificationsOne entry per repository folder and…
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.mkdir({ "path": "src/app.ts"});
DELETE/workspace/entryDelete a file or folder
Removes one entry and everything under it. It goes to the trash rather than being erased, and the answer carries the id that brings it back through the restore call for a day. The path travels in the body rather than the address, the same as every other write in this group.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.delete({ "path": "src/app.ts"});
POST/workspace/restoreBring back something deleted
Puts an entry a delete sent to the trash back where it was, recreating the folders above it. Nothing is written over: when something new holds the name, it comes back beside it and the answer says where. Trash older than a day is gone.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.copy({ "from": "src/app.ts", "to": "src/server.ts"});
POST/workspace/extractUnpack an archive
Unpacks a zip or tar already in the workspace into a new folder beside it, named after the archive. An archive that is one folder of its own name lands as that folder rather than as it twice, and a .gz, .bz2, .xz or .zst holding a single file lands as that file. Nothing is ever written over: the answer says where it landed. Formats with no tool here, such as .7z and .rar, are refused.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.extract({ "path": "src/app.ts"});
GET/workspace/setupWhich projects have their dependencies installed
Per project, whether its dependencies are actually present. A project that arrives by import comes without them, so files landing is not the same as the project working: until this says a project is ready, its type checks and tests can only mislead you.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.setup();
POST/workspace/setup/installInstall a project's dependencies
Starts the install for one or more projects in a terminal you can attach to, and answers immediately. The run survives a page reload and its output stays in the terminal history.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.addRepo({ "name": "nightly changelog", "cloneUrl": "https://sandbox-a1b2c3d4e5f6.intentic.dev", "branch": "main"});
POST/workspace/repos/newStart a new repo
Makes an empty repository in the workspace: a folder named after it, initialised, with a README that names it and one commit, so an agent can start on it at once. Nothing is cloned and nothing leaves the machine.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.createRepo({ "name": "nightly changelog"});
POST/workspace/syncPull every repo up to date
Fetches every repo that has a remote and fast-forwards the ones that can move safely, reporting what happened to each. This runs by itself at the start of a turn; call it directly to refresh on demand, or to re-sync a repo that had drifted.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.templates();
POST/workspace/repos/{repo}/appsScaffold new apps into a repo
Starts scaffolding one or more apps inside an existing multi-package repo and answers straight away. Watch the terminal it opens for progress and for anything that goes wrong.
import { sandbox } from "@intentic/sandbox-client";const result = await sandbox.workspace.packageGraph({ "repo": "root"});
GET/workspace/modulesEvery package across every repo
The named packages in the whole workspace, which is what a review list groups changed files under when a reader wants packages rather than paths. Whole-workspace in one answer, because a review spans repos and asking per repo would be a fan-out on every open.