branch:
README.md
2325 bytesRaw
# Workspace Chat
An AI chat agent with a persistent virtual filesystem. Demonstrates `Workspace` from `@cloudflare/shell` integrated with `AIChatAgent` from `@cloudflare/ai-chat`, using `@cloudflare/codemode` for sandboxed multi-file JS execution with `state.*`.
## What it shows
- **Workspace as tool backend** — The AI has tools to read, write, list, delete files, create directories, glob search, and run sandboxed state scripts
- **Persistent storage** — Files survive across conversations (backed by Durable Object SQLite)
- **File browser sidebar** — Browse workspace contents in real-time alongside the chat
- **Streaming responses** — Uses Workers AI with streaming via the AI SDK
- **Sandboxed JS refactors** — Multi-file edits run through `@cloudflare/codemode` with `state.*` instead of bash
## Run it
```sh
npm install
npm start
```
## Key pattern
```typescript
import { AIChatAgent } from "@cloudflare/ai-chat";
import { Workspace } from "@cloudflare/shell";
import { stateTools } from "@cloudflare/shell/workers";
import { DynamicWorkerExecutor, resolveProvider } from "@cloudflare/codemode";
export class WorkspaceChatAgent extends AIChatAgent {
workspace = new Workspace(this, { namespace: "ws" });
async onChatMessage(_onFinish, options) {
return streamText({
tools: {
readFile: tool({
execute: async ({ path }) => this.workspace.readFile(path)
}),
writeFile: tool({
execute: async ({ path, content }) =>
this.workspace.writeFile(path, content)
}),
runStateCode: tool({
execute: async ({ code }) => {
const executor = new DynamicWorkerExecutor({
loader: this.env.LOADER
});
return executor.execute(code, [
resolveProvider(stateTools(this.workspace))
]);
}
})
}
}).toUIMessageStreamResponse();
}
}
```
## Try these prompts
- "Create a hello world HTML page at /index.html"
- "Show me what files are in the workspace"
- "Create a Node.js project with package.json and src/index.ts"
- "Find all .ts files in the workspace"
- "Use the state runtime to rename `foo` to `bar` across all files in /src"
- "Plan edits for /src/config.json and /src/index.ts, preview them, then apply the plan"