Built-in sandbox SHIM: vis_attach / vis_attach_bytes — the GENERIC
producer twin of the matplotlib capture. A tool running in python_execution
writes any artifact (a PNG it rendered, a CSV/JSON/PDF/wav it built, whatever)
and hands it to vis_attach(path) (or vis_attach_bytes(data, name)); the
engine then OWNS the bytes as a durable session_iteration_attachment row,
exactly like a matplotlib figure — surviving a web/TUI restart and (for image
media-types) replayable to a vision model cross-turn.
No parsing, no round-trip through the model-facing stdout: we control the whole
boundary. The Python side reads the file through the sandbox's OWN confined
open (so filesystem-root confinement is enforced for free — a path outside
the roots raises the normal sandbox error), sniffs the media-type (magic bytes
then extension then utf-8 probe), base64-encodes, and calls the tiny host
bridge __vis_record_attachment__, which appends the attachment map to the
per-block *image-sink* (mpl-capture/record-attachment!). run-python-block
drains that sink into the block outcome's :attachments; the loop stamps each with
the producing block's tool-call-id and hands them to db-store-iteration!'s
:attachments.
Registered unconditionally as a foundation shim (like shim-yaml /
shim-matplotlib): its :ext/sandbox-shims entry autoloads vis_attach into
every sandbox (main + every sub_loop fork).
Built-in sandbox SHIM: `vis_attach` / `vis_attach_bytes` — the GENERIC producer twin of the matplotlib capture. A tool running in `python_execution` writes any artifact (a PNG it rendered, a CSV/JSON/PDF/wav it built, whatever) and hands it to `vis_attach(path)` (or `vis_attach_bytes(data, name)`); the engine then OWNS the bytes as a durable `session_iteration_attachment` row, exactly like a matplotlib figure — surviving a web/TUI restart and (for image media-types) replayable to a vision model cross-turn. No parsing, no round-trip through the model-facing stdout: we control the whole boundary. The Python side reads the file through the sandbox's OWN confined `open` (so filesystem-root confinement is enforced for free — a path outside the roots raises the normal sandbox error), sniffs the media-type (magic bytes then extension then utf-8 probe), base64-encodes, and calls the tiny host bridge `__vis_record_attachment__`, which appends the attachment map to the per-block `*image-sink*` (`mpl-capture/record-attachment!`). `run-python-block` drains that sink into the block outcome's `:attachments`; the loop stamps each with the producing block's tool-call-id and hands them to `db-store-iteration!`'s `:attachments`. Registered unconditionally as a foundation shim (like shim-yaml / shim-matplotlib): its `:ext/sandbox-shims` entry autoloads `vis_attach` into every sandbox (main + every `sub_loop` fork).
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |