antigravity-codes 0.1.10

Typed Rust SDK for the Google Antigravity localharness agent runtime: serde models of its protobuf-JSON WebSocket protocol, the length-prefixed stdio handshake, and an async (Tokio) client with step assembly, tool dispatch, hooks, and policy callbacks.
Documentation
# 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.