# Changelog
All notable changes to `antigravity-codes` are documented here.
The version tracks the `google-antigravity` release whose harness the crate was
generated from and tested against.
## [0.1.10] - 2026-08-08
Initial release. Tested against `google-antigravity` 0.1.10.
### Added
- **Wire types** — 154 messages and 22 enums generated from the
`FileDescriptorProto` embedded in the shipped `localharness_pb2.py`, covering
everything reachable from `InputEvent`, `OutputEvent`, and the handshake
messages. Generated by `scripts/codegen_antigravity.py`, a stdlib-only
descriptor reader (upstream uses protobuf edition 2024, which `protoc` < v31
cannot parse and `prost` does not support).
- **`handshake`** — encoder and decoder for the length-prefixed binary protobuf
exchange over stdio, locked against bytes captured from a live harness.
- **`process`** — binary discovery (`$ANTIGRAVITY_HARNESS_PATH`, then `PATH`),
process launch, stderr retention, and a `HarnessOptions` builder for both the
`InputConfig` and the `HarnessConfig`.
- **`RawClient`** — handshake, WebSocket connect with backoff over both loopback
spellings, initialize exchange, and frame codec.
- **`Client` / `Turn`** — step assembly from delta frames, turn completion from
trajectory state, usage accounting, and replies to the harness's tool, hook,
policy, question, and tool-confirmation requests.
- **`handlers`** — registration for those five callbacks, with defaults chosen
to keep a turn moving rather than deadlock it.
- Corpus tests over frames captured from a live 0.1.10 harness, asserting that
decoding loses no field, plus synthetic fixtures for the callback paths.
- Integration tests that drive a real harness; most need no API key.
- `scripts/check_antigravity_schema_drift.py`, which diffs the committed
descriptor snapshot against the latest wheel on PyPI.
### Verified against a live model
The corpus and the client-obligation paths were exercised against a real Gemini
endpoint, not just the descriptor:
- Two captured sessions of a successful turn — one plain, one agentic
(`listDirectory` → `viewFile` → answer) — decode with no field loss.
- `examples/custom_tool.rs` completes the full round trip: a
`LIFECYCLE_HOOK_PRE_TOOL` hook request, a client-side `ToolCall`, the
`ToolResponse` this crate sends back, and the model's answer built from it.
Two defaults were corrected as a result:
- `HarnessOptions` now defaults to `HarnessSideTools::read_only()`. Previously
it enabled nothing, and the agent would explain that it had no tools rather
than read the workspace. This matches the reference Python SDK's default.
- Examples and tests use `gemini-flash-latest`, taking `ANTIGRAVITY_MODEL` as an
override. The `pro` models have zero free-tier quota and return
`429 … limit: 0`.
### Notes
- Unknown enum values and unknown `oneof` arms decode rather than fail. The
harness is versioned independently of this crate and has no version handshake
of its own, so forward compatibility is absorbed at the type level.
- The harness binary is not vendored. It ships only in the platform wheels on
PyPI; see the README for how to extract it.