Files
wehub-resource-sync bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:30:44 +08:00

142 lines
4.4 KiB
Plaintext

---
title: TypeScript Quickstart
icon: /images/typescript-logo.svg
description: Create a Mirage TypeScript workspace, mount RAM as a virtual filesystem, and run shell commands with @struktoai/mirage-node.
keywords: ["Mirage TypeScript quickstart", "@struktoai/mirage-node", "virtual filesystem", "AI agents", "shell commands"]
---
## Installation
Install the Node runtime:
```bash
pnpm add @struktoai/mirage-node
pnpm add -D tsx typescript
```
`npm install @struktoai/mirage-node` and `yarn add @struktoai/mirage-node` work too.
## Create a Workspace
Start with the RAM resource so you can try Mirage without credentials.
```ts
import { MountMode, RAMResource, Workspace } from '@struktoai/mirage-node'
async function main(): Promise<void> {
const ws = new Workspace({ '/data': new RAMResource() }, { mode: MountMode.WRITE })
await ws.execute('echo "hello mirage" | tee /data/hello.txt')
const result = await ws.execute('cat /data/hello.txt')
process.stdout.write(result.stdoutText)
await ws.close()
}
main()
```
Run it:
```bash
pnpm tsx quickstart.ts
```
## Run Commands
Once a resource is mounted, you can use Mirage like a shell over your virtual filesystem:
```ts
import { MountMode, RAMResource, Workspace } from '@struktoai/mirage-node'
async function main(): Promise<void> {
const ws = new Workspace({ '/data': new RAMResource() }, { mode: MountMode.WRITE })
await ws.execute(`echo '{"name": "alice"}' | tee /data/user.json`)
const files = await ws.execute('ls /data/')
process.stdout.write(files.stdoutText)
const name = await ws.execute('jq ".name" /data/user.json')
process.stdout.write(name.stdoutText)
const match = await ws.execute('grep alice /data/user.json')
process.stdout.write(match.stdoutText)
await ws.close()
}
main()
```
## Estimate Before You Run
`execute(..., { provision: true })` returns a `ProvisionResult` instead
of running the command: network/cache bytes, read ops, and a
`precision` telling you how much to trust the numbers (`exact`,
`range`, `unknown` -- totals under `unknown` are floors). Pipelines,
`&&`/`||`, `if`/`case`, loops, and subshells aggregate automatically.
```ts
const plan = await ws.execute('cat /data/user.json | wc -l', { provision: true })
console.log(plan.networkRead, plan.readOps, plan.precision)
```
Read commands are estimated out of the box on every backend. When you
register your own command, pass `provision:` to `command({...})`
(reuse a helper like `makeFileReadProvision(myStat)` or
`defaultProvision(name, myStat)`, or wrap a bespoke command list with
`withDefaultProvisions(commands, myStat)`), or omit it and the planner
reports `unknown`. Full semantics live in the
[CLI provision docs](/home/cli#5-dry-run-with-provision).
## Output Safeguards
To keep huge reads from flooding an agent, `cat`, `grep`, `rg`, `head`,
and `tail` cap their **final** output at 2000 lines by default. When a
cap fires, the agent sees the truncated bytes plus a stderr notice
(`output truncated at safeguard limit (2000 lines); ...`); the exit code
stays 0.
Caps fire only on the **terminal** command of a pipeline, so
`cat big.txt | head -n 30` still shows 30 lines.
### Configure per mount
Pass a `commandSafeguards` option keyed by mount prefix, then command.
Each `CommandSafeguard` sets `maxLines` / `maxBytes` (output cap) and/or
`timeoutSeconds` (deadline); `onExceed` is `TRUNCATE` (default, exit 0
plus notice) or `ERROR` (exit 1 plus notice):
```ts
import {
CommandSafeguard,
MountMode,
OnExceed,
RAMResource,
Workspace,
} from '@struktoai/mirage-node'
const ws = new Workspace(
{ '/data': new RAMResource() },
{
mode: MountMode.WRITE,
commandSafeguards: {
'/data': {
head: new CommandSafeguard({ maxLines: 100 }), // cap, keep going
grep: new CommandSafeguard({ maxLines: 50, onExceed: OnExceed.ERROR }),
rg: new CommandSafeguard({ timeoutSeconds: 30 }), // deadline
},
},
},
)
```
The same limits are available to the CLI as a `command_safeguards` block in the workspace YAML.
## Next Steps
- See [TypeScript Installation](/typescript/install) for optional native peers (FUSE, Redis, Postgres, MongoDB, SSH, Email).
- Browse [TypeScript Agents](/typescript/agents/index) to wire Mirage into OpenAI Agents SDK, Vercel AI SDK, LangChain, Mastra, and more.
- Pick a real backend from the Resources section, such as [S3](/typescript/setup/s3), [Slack](/typescript/slack), or [Discord](/typescript/discord).