- Rename `wrenn.code_interpreter` → `wrenn.code_runner` (canonical).
Keep old path as deprecation alias that emits a FutureWarning on
import, mirroring the existing `Sandbox` → `Capsule` pattern.
Submodule shims `code_interpreter/{capsule,async_capsule,models}.py`
keep direct-submodule imports working.
- Fix sync/async ctor-failure-safe `__del__`: initialise `_kernel_id`,
`_kernel_name`, `_proxy_client` before calling `super().__init__` so
a failed creation no longer crashes the destructor with
AttributeError.
- Send the kernel name to Jupyter. Previously `POST /api/kernels` had
no body, so the server picked an arbitrary default kernelspec. Now
sends `{"name": "wrenn"}` (override via `Capsule(kernel=...)`) and
reuses an existing kernel only when its `name` matches.
- Preserve Jupyter `text/plain` verbatim in `Result.from_bundle`.
The previous outer-quote strip was lossy (the string `'2'` became
indistinguishable from the int `2`, and strings containing escaped
quotes were mangled). `text` is now the `repr()` Jupyter sends.
Updated the stale `test_capsule_features` quote-strip test.
- Validate `run_code(language=...)`. Anything other than `"python"`
now raises `ValueError` instead of being silently ignored.
- Async `__del__` no longer touches the event loop; users must call
`await close()` or use `async with`.
- New unit suite `tests/test_code_runner_unit.py` (46 tests): MIME
unpacking, deprecation alias + warning, default template + kernel,
custom kernel override, ctor-failure-safe __del__, kernel
create/reuse/cache, retry on 5xx, 4xx propagation, request shape,
run_code stream/result/error/foreign-parent/idle/unsupported-language,
async variants.
- New e2e suite `tests/test_code_runner_e2e.py` (44 tests, integration
marker): template == `code-runner-beta`, kernel == `wrenn`, stdout
/stderr capture, state/import/function/class persistence, exceptions
(Value/Name/Syntax), callbacks, multi-line, `text` repr preservation,
filesystem round-trip, isolation between capsules, deprecated import
path. MIME-type class covers html, markdown, json, latex, svg,
javascript, png (matplotlib + seaborn), jpeg, multi-format bundles,
and text-round-trip via numpy + requests.
- `make test-code-runner` runs unit + e2e together. `make test`
extended to include the unit file.
- README: "Code Interpreter" section renamed to "Code Runner", all
imports updated, `kernel=` documented, removed the incorrect
"quotes stripped automatically" claim, replaced with the actual
`text/plain` semantics.
- CLAUDE.md: appended a "Code Runner Module" section covering module
path, defaults, kernel-reuse semantics, lifecycle invariant, and
the new test files + make target.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace flat CodeResult with a proper model hierarchy: Execution
(top-level), Result (per-output with typed MIME fields), Logs
(stdout/stderr as lists), and ExecutionError (structured
name/value/traceback). Handle display_data messages for rich output,
add streaming callbacks (on_result, on_stdout, on_stderr, on_error),
and remove the misleading stdout-to-text fallback.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add sandbox filesystem methods (list_dir, mkdir, remove, upload,
download, stream_upload, stream_download) and interactive PTY sessions
(PtySession, AsyncPtySession) with reconnect support per
FILE_TERMINAL.md spec. Refactor error handling into exceptions.py as
shared handle_response(). Replace API-key-only proxy auth with unified
_proxy_headers() supporting both API key and JWT. Fix stream_upload to
build multipart manually instead of relying on httpx files= with
generators. Switch Makefile SPEC_URL from main to dev branch. Regenerate
models from updated OpenAPI spec (adds teams, channels, metrics, PTY
endpoints). Add comprehensive unit and integration tests. Trim AGENTS.md
to verified facts only.
Introduces the core Wrenn client and a dedicated sandbox execution
environment. This includes automated model generation and a custom
exception hierarchy to support robust integration.
- Add `WrennClient` in `src/wrenn/client.py` for API interaction.
- Implement `Sandbox` in `src/wrenn/sandbox.py` for isolated execution.
- Add Pydantic/model support via `_generated.py`.
- Define project-specific error types in `exceptions.py`.
- Include AGENTS.md documentation for specialized logic.
- Add comprehensive unit and integration tests.
- Update build system (Makefile, uv.lock, pyproject.toml) and LICENSE.