| name | zio-golem-base-image |
|---|---|
| description | Explains the zio-golem WIT folder structure and how to regenerate the agent_guest.wasm base image. Use when working with WIT definitions, upgrading Golem versions, or regenerating the guest runtime WASM. |
The base image agent_guest.wasm is a QuickJS-based WASM component that serves as the guest runtime for Scala.js agents on Golem. It must be regenerated whenever WIT definitions change.
golem/wit/
├── main.wit # Hand-maintained world definition (golem:agent-guest)
├── deps.toml # wit-deps manifest — points to golemcloud/golem main branch
├── deps.lock # Auto-generated lock file (gitignored)
└── deps/ # Auto-populated by wit-deps (gitignored)
├── golem-core/
├── golem-agent/
├── golem-1.x/
├── golem-rdbms/
├── golem-durability/
├── blobstore/
├── cli/
├── clocks/
├── config/
├── ...
└── sockets/
main.witdefines thegolem:agent-guestworld — the set of imports/exports the agent component uses. This file is checked in and maintained manually.deps.tomldeclares a single dependency source: the golem repo's main branch tarball.wit-depsdownloads and extracts the WIT packages from it.deps/anddeps.lockare gitignored — they are populated by runningwit-depsfromgolem/.
The base image must be regenerated whenever:
wit/main.witchanges — adding/removing imports or exports- WIT dependencies update — e.g., upgrading from Golem v1.5.0 to a newer version (update
deps.tomlthen regenerate) wasm-rquickjsupdates — a new version of the wrapper generator may produce different output
The generated agent_guest.wasm is checked in at two locations (embedded in the sbt and mill plugins):
golem/sbt/src/main/resources/golem/wasm/agent_guest.wasmgolem/mill/resources/golem/wasm/agent_guest.wasm
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-wasip1cargo install cargo-componentcargo install wit-deps-cliThe script enforces a specific version of wasm-rquickjs and will refuse to run if the installed version does not match. The required version is defined by REQUIRED_WASM_RQUICKJS_VERSION in generate-agent-guest-wasm.sh.
cargo install wasm-rquickjs-cli@0.1.0From the repository root (zio-blocks/):
./golem/tools/generate-agent-guest-wasm.shThe script performs these steps:
- Runs
wit-deps updateingolem/to fetch the latest WIT dependencies intogolem/wit/deps/ - Stages a clean WIT package in
.generated/agent-wit-root/(copiesmain.wit+deps/) - Runs
wasm-rquickjs generate-wrapper-crateto produce a Rust crate from the WIT - Builds with
cargo component build --releasetargetingwasm32-wasip1 - Installs the resulting
agent_guest.wasminto both plugin resource directories
To update the WIT dependencies without regenerating the WASM:
cd golem && wit-depsThe generation script always uses wit-deps update to ensure deps are fresh. To update deps without a full regeneration:
cd golem && wit-deps updateAt build time, the sbt/mill GolemPlugin extracts the embedded agent_guest.wasm from plugin resources and writes it to the user project's .generated/agent_guest.wasm. Then golem-cli uses this base runtime to compose the final component: it injects the user's Scala.js bundle into the QuickJS runtime and wraps it as a proper Golem agent component.
The Scala SDK does not parse WIT to generate Scala bindings. Instead, Scala macros + ZIO Schema produce AgentMetadata at compile time, and WitTypeBuilder maps schema types to WIT-compatible JS representations at runtime. The WIT definitions only flow through the WASM guest runtime.