# Output Capture

## Capture

Output is not retained unless you ask for it.

secure-exec/examples/quickstart/src/output.ts:

```ts
// Output is not retained unless you ask for it: "stderr" for diagnostics, "all"
// for both streams.
const captured = await execute(source, { output: { capture: "all" } });
console.log(captured.stdout); // progress: 1/2\nprogress: 2/2\n
console.log(captured.stderr); // warning: slow path\n
```

| `output.capture` | Result fields |
|---|---|
| `"none"` (default) | Neither stream is retained. |
| `"stderr"` | `stderr`. Enough for stack traces. |
| `"all"` | `stdout` and `stderr`. |

Captured output is bounded. When a stream exceeds the limit, the result sets
`stdoutTruncated` or `stderrTruncated`.

## Stream

secure-exec/examples/quickstart/src/output.ts:

```ts
// `onStdout` and `onStderr` stream chunks live and work with or without capture.
const decoder = new TextDecoder();
await execute(source, {
	onStdout: (chunk) => process.stdout.write(decoder.decode(chunk)),
	onStderr: (chunk) => process.stderr.write(decoder.decode(chunk)),
});
```

Chunks are raw bytes, so decode them before treating them as text.
