Dashboard code editor
Edit agent source on the project Code tab, then Save, Compile & upload, Promote this build, and Deploy to cloud, in that order. Promote only sets the active build; deploy is what rolls it out, and that request uses the active build (it does not send build_id).
Open the Code tab
- Where: Project → Code in the sub-navigation (between Overview and Sessions).
- Working tree: Source lives on the project. Save writes that tree; compile reads the saved tree, not a laptop
agent.js. - Entry file: Shown in the publish bar. Seeded echo projects use
echo/agent.ts. - Projects created from agent templates already have template source in the tree.
File tree and Save
The left panel lists workspace files; click one to edit it, and you can add or delete files as you go. Unsaved edits sit behind a banner until you save.
- Save writes the full tree (PUT source API). Compile never sees unsaved buffers.
- Paths: Relative only. No
.., no absolute paths.node_modulesis never stored. Packages come frompackage.jsonat compile time. - Per-file and total source size follow your plan; the caps are below.
Root package.json
New template projects get a root package.json that pins @voicethere/agent and local npm scripts (verify, upload, and the rest of the CLI loop).
Older trees without that file are left alone. The tab shows Add package.json if you want a starter in the unsaved tree (save when you are ready), and New file works too.
Dashboard compile ignores scripts and strips @voicethere/agent and @types/node from the stored manifest, because VoiceThere already provides those packages at session runtime. Keep the scripts for local @voicethere/cli and @voicethere/agent work.
Download source and compiled
Next to Save on the Code tab you can download artifacts without the CLI:
- Download source returns a zip of the saved workspace (the same tree compile uses). Unsaved editor changes are not included; save first if you need them in the archive.
- Download compiled returns the bundled
agent.jsfor your newest passing build (or the active build when set). Run Compile & upload first when no build exists yet. - On project Overview, each passing row in Build history has a Downloadaction for that build's bundle.
The same bytes are available from the CLI (project read API key). voicethere source download -o ./workspace.zip --project <uuid> writes the saved workspace zip (omit --project to use the linked .voicethere/config.json). voicethere build download -o ./agent.js --project <uuid> writes the active passing bundle, or add --build-id <uuid> for a specific row. voicethere source pull is unchanged: it still writes files into the linked local repo instead of a zip.
Editor IntelliSense
Open the editor and you already have types for @voicethere/agent and Node built-ins (process, Buffer, and related globals), with no compile job for those.
Refresh types calls POST /api/v1/projects/:id/source/compile with { "mode": "typings" }. It typechecks saved source and loads dependency typings into Monaco from npm packages in package.json, and it does not store a build.
Compile & upload
Compile & upload hits the same endpoint with { "mode": "compile" }. The job bundles the entry file into agent.js, runs the same verify checks as CLI upload, and stores a new build, which is the same outcome as npm run verify then voicethere build upload. The browser does not upload a laptop dist/agent.js.
Compile & upload does not promote or deploy; when the job finishes, the bar shows the new build id (one compile at a time per project), and failures land in that same bar rather than a toast you will miss.
Promote
Promote this build calls POST /api/v1/projects/:id/promote with { "build_id": "<compile build id>" }, which makes that compile the project's active build. Live sessions keep the old bundle until you deploy.
The button turns on after a successful compile for that id, and off again once you have promoted it, so you can pin the active build without rolling out yet.
Deploy to cloud
Deploy to cloud stays disabled until the build id in the bar is the one you just promoted. It calls POST /api/v1/deployments with { "project_id": "<id>", "mode": "drain" } and does not send build_id, so rollout uses the active build.
Drain is the default: new sessions pick up the new bundle while existing ones finish on the old one. Environment variables, secrets, and runner settings stay as they are; this deploy only ships the bundle.
CLI mapping
| Goal | Code tab | CLI |
|---|---|---|
| Download saved source as a zip | Download source | voicethere source download -o ./workspace.zip --project <uuid> |
| Download a compiled bundle | Download compiled (Code tab) or Download on a Build history row | voicethere build download -o ./agent.js --project <uuid> --build-id <uuid> |
| Store a new verified bundle | Compile & upload | voicethere build upload (after a local @voicethere/agent build) |
| Refresh dependency typings only | Refresh types | Local typecheck via @voicethere/agent tooling (no separate upload) |
| Set the active build without rolling out | Promote this build | voicethere build promote |
| Roll out to cloud | Deploy to cloud (after promote on the Code tab) | voicethere deploy --wait |
voicethere deploy --wait still promotes if you skip a separate promote step, which the Code tab will not do. Overview still has Build promotion and Cloud rollout if you prefer that layout.
npm dependencies
Public npm is always on in the dashboard Code tab. Put a dependencies object in package.json, and compile installs from the public npm registry using semver ranges (for example ^1.2.3).
- Allowed: package names on the public registry with semver specs. No
file:,git:,workspace:, or custom registry URLs. - Allowed in
package.json: npmscriptsfor local CLI workflows (compile ignores them). Not allowed:overridesorresolutions. - Dependency count and compiled output size are capped per plan at compile time.
For custom registries, native addons, or packages outside the dashboard sandbox, build locally with @voicethere/cli and voicethere build upload. See Quickstart.
Source size and typings pack limits
Stored UTF-8 source in the Code tab is capped per subscription tier. node_modules does not count toward source size:
| Plan | Max source size |
|---|---|
| Free | 10 MB |
| Budget / Budget+ | 25 MB |
| Advanced / Ultimate | 50 MB |
IntelliSense for @voicethere/agent and Node (@types/node) loads when you open the Code tab. Those default typings are not stored on the project and do not count toward the pack cap below.
After Refresh types or Compile & upload, the platform stores a JSON pack of dependency .d.ts files from npm packages in your package.json. Monaco merges that pack with the always-on agent and Node types.
| Plan | Max typings pack size |
|---|---|
| Free | 10 MB |
| Budget / Budget+ | 25 MB |
| Advanced / Ultimate | 50 MB |
Save, compile, and type refresh fail when you go over a cap. Trim files or npm dependencies, or upgrade the project subscription. The public pricing table lists Code editor source size and Code editor typings pack per tier.
When to stay on the CLI
Some work still belongs on a laptop. package.json scripts such as upload still run voicethere build upload against a local dist/agent.js, which is the path for laptop or CI bundles rather than the dashboard compile button.
- Custom npm registries and native modules: local
@voicethere/agent build, CLI upload, thenvoicethere deploy --wait(promote is included when you use deploy). - Large repos or CI pipelines:
voicethere build validate,voicethere build upload, optionalvoicethere build promote, andvoicethere deploy --wait. - Blank projects: create locally or seed a template in the dashboard, then edit in Code or copy template sources from Agent templates.