All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
--max-memoryflag (onrun/call/info) caps a component's WebAssembly linear memory. Accepts a byte count or a size with a unit — binary (512MiB) or decimal (512MB). When a component tries to grow memory past the cap, the growth fails inside the sandbox instead of ballooning the host process — useful when running untrusted components (e.g. metadata/tool extraction withact info --tools).
act-buildnow lowercases OCI repository names before pushing (tags are preserved), so pushes to registries that reject uppercase repositories succeed.- Updated dependencies, including swapping the unmaintained
fs2file-lock crate forfs4inact-store.
act-build validateno longer rejects valid components. The tool-provider interface moved fromact:coreto theact:toolspackage; validate now recognizesact:tools/tool-providerinstead of the obsoleteact:core/tool-provider.act-buildnow reports the same manifest digest the registry stores. It previously hashed a non-canonical serialization while pushing canonical JSON, so digest-pinned pulls 404'd; it now hashes and pushes the identical canonical bytes, with a warn-only cross-check against the registry's returned digest.
act-storeworkspace crate — a content-addressed OCI image-layout component store shared between act-cli and act-toolserver. Resolves remote refs read-through, preserves upstream OCI manifests verbatim (so signatures remain meaningful), and collects connected artifacts on pull (sigstore bundle, SBOM, SLSA provenance, ...) via the OCI 1.1 referrers API. Lives at<XDG_DATA_HOME>/act/store(~/.local/share/act/storeon Linux). Published to crates.io as a standalone library for downstream consumers.act storesubcommand group for managing the local component store:act store list [--format text|json]— list every stored component.act store update [<ref>]— re-resolve stored refs and re-pull any whose upstream digest moved. Without an argument, updates every component; mutable tags (:latest,:0.1) advance,@sha256:pins never do.act store gc— delete store blobs no longer referenced by any component.
- Remote refs resolve through the shared store instead of the bespoke
~/.cache/act/components/<sha256(ref)>.wasmcache.act run/call/inforead-through the store (pulling on first use, then serving from disk). Local files still run in place; the store is populated for them only when you explicitlyact pull <file>. act pullnow populates the shared store (with referrer collection for OCI sources).-o/-Ostill optionally export a copy.- Component reference parsing is centralized in
act-store::Refso act-cli and act-toolserver agree on howoci://,https://,file://, and bare refs are normalized. - Release workflow publishes the entire workspace to crates.io
(
cargo publish --workspace), so new crates added anywhere in the workspace ship on the next tagged release without a workflow edit.
- The legacy
~/.cache/act/components/<sha256(ref)>.wasmcache is no longer written or consulted. Existing cache files are harmless leftovers you can delete by hand; act-store starts fresh in its own data dir.
- MCP bridge now renders
application/jsonandapplication/*+jsontool output as readable text instead of base64. Components returningJson<T>previously surfaced unreadable base64 over MCP; JSON content now decodes verbatim, matching the ACT-HTTP transport.
act run --session-args '<json>': pre-open a single session at startup and serve the component as "session-of-1". Every call transparently uses the pre-opened session, the session machinery is hidden from clients (no MCP virtualopen_session/close_sessiontools, no/sessionsHTTP endpoints), and any client-suppliedstd:session-idis overridden. Requires a component that exportsact:sessions/session-provider. (Previously--session-argswas available only onact callfor a single invocation.)
cargo install act-clinow works without settingRUSTFLAGS='--cfg reqwest_unstable'. The unused reqwesthttp3feature has been dropped (HTTP/2 support is unaffected).
wasi:socketssandboxing — restrict a component's outbound socket access with--sockets-policy,--sockets-allow, and--sockets-deny(host/CIDR + ports/protocols, e.g.db:5432/tcp), configurable via flags, theACT_SOCKETS_ALLOWenv var, or config profiles. Enforced as a capability ceiling in the wasmtime store.act-build init <lang>— scaffold a new component for Rust, Python, or JavaScript in one command, with--outputto choose the target directory and ready-to-run test targets.- MCP over Streamable HTTP — serve the MCP adapter over Streamable HTTP
with
act run <component> --mcp --http. file://component references —act run file:///abs/path.wasmnow resolves to a local file. An explicit URI scheme (file://,oci://,http(s)://) is now authoritative and selects the reference kind directly instead of going through path/OCI guessing.
- Upgraded dependencies, most notably wasmtime 43 -> 45.
- The MCP bridge now injects a
_metaargument channel into tool schemas so LLM-driven MCP clients can passstd:session-idto session-provider components.
-
act-build push <wasm> <ref>— publish a WASM component as a CNCF Wasm OCI Artifact. The manifest carries anapplication/vnd.wasm.config.v0+jsonconfig blob (witharchitecture,os,layerDigests, andcomponent.{exports, imports}derived from the component's exports/imports) per the CNCF TAG-Runtime Wasm OCI Artifact spec, and the layer isapplication/wasm. Replaces inlineoras pushshell blocks in component justfiles.Flags:
--also-tag,--annotation key=value,--source,--description,--skip-if-identical(matching-content skip / drift error),--skip-if-exists(unconditional skip for non-reproducible builds),--dry-run. Output ends with an oras-compatibleDigest: sha256:...line so existing scripts that grep for it keep working.Auth resolution:
OCI_USERNAME/OCI_PASSWORDenv →GITHUB_TOKENfor ghcr.io →~/.docker/config.json(DOCKER_CONFIGhonored) → anonymous.
act(host):resolve_ocinow validates that the OCI layer media type isapplication/wasm. Empty/legacy media types log a warning; anything else is rejected.
-
act call --session-args '{...}'. When set, the host opens a session against the component before the call (open-session(args, metadata)), injects the returned id asstd:session-idmetadata for the tool call, prints the result, and closes the session before exit. The whole open / call / close cycle runs in one process, so the wasm instance stays alive for the full sequence. This makes session-aware components (bridges, stateful components) usable as ordinary one-shot CLI invocations:act call ghcr.io/actpkg/openapi-bridge:0.2.0 find_pets_by_status \ --args '{"status":"sold"}' \ --session-args '{"spec_url":"https://petstore3.swagger.io/api/v3/openapi.json"}' \ --http-policy open
If the component doesn't export
act:sessions/session-provider, using--session-argsis a clear error rather than a silent no-op.
act session openandact session closeCLI subcommands. They inherently can't deliver the primary use case for sessions (component-side ephemeral state) — each invocation is a one-shot process whose wasm instance dies on exit, so a session opened in oneact session openis unusable from a subsequentact call. For real session work, useact run --httporact run --mcp, where the host process holds the wasm instance and the session lives as long as the host.act session open-args-schemastays — it's a useful smoke test that doesn't depend on persistent state.
Adds first-class support for act:sessions/session-provider. Stateful
components (database connections, browser automation, REPLs, the new
act-http-bridge / mcp-bridge / openapi-bridge) can now expose
typed open-session args, and agents address per-session state via
std:session-id metadata.
act session open-args-schema | open | closeCLI subcommands.- ACT-HTTP
/sessions/open-args-schema,POST /sessions, andDELETE /sessions/{id}endpoints (per ACT-SESSIONS §6.2). Mapped tostd:session-not-found → 404via the bumped act-types. - MCP transport: synthetic
open_session/close_sessiontools intools/listfor components that export session-provider, with_meta.std:session-opannotations (per ACT-SESSIONS §6.1). - MCP
_meta.std:session-id(and any other request-level meta keys) is now forwarded into the WIT call metadata so components see the agent's session-id. - Host runtime tracks open session-ids per actor and auto-closes them on shutdown (ACT-SESSIONS §2.5).
tests/fixtures/sessions-canary.wasm— hand-rolled canary exercising session-provider for host-side integration tests.
- Bumped
act-types0.5 → 0.7. Drops the inline session HTTP wire types fromsrc/http.rsin favour of the canonicalact_types::http::OpenSessionRequest/OpenSessionResponse.
- World now imports
act:tools/tool-provider@0.1.0instead ofact:core/tool-provider@0.3.0. Components built against the old WIT will not load — rebuild withact-sdk0.6.x (Rust) oract-sdk-py0.2.x. call-tooltakes flat(name, arguments, metadata)instead of atool-callrecord.ErrorreplacesToolError(the type lives inact:core/typesnow and is shared by non-tool providers).
-v/-vvverbosity flag — opt-in plumbing logs (default level demoted toinfo).
- MCP transport rewritten on rmcp 1.5: hand-rolled
src/mcp.rsreplaced with a thinActRmcpBridgeover the official Anthropic crate. Tool discovery, calls, content mapping, and error mapping go throughrmcp::modeltypes. Includes a stdio round-trip integration test. act infotext output restyled with terminal colors (yellow component name, dimmed version, cyan tool names, green annotations). Output evaporates to plain text when stdout isn't a TTY orNO_COLORis set. Tool parameters show(optional)markers; theOption<T>wrapper is stripped from rendered types.
- The
--schemaflag onact info, the/metadata-schemaHTTP route, themetadata_schemafield onact infoJSON output, and the rmcp bridge's metadata-schema fetch/inject path. The WIT function is gone inact:tools@0.1.0; a discovery mechanism is planned for a future minor version.
act info --tools --format textnow extracts the real inner type from schemars'Option<T>JSON Schema instead of rendering the union.
- Stdio MCP server now uses the official
rmcpcrate.act run <component> --mcpis a thin bridge overrmcp::ServerHandlerinstead of the previous hand-rolled JSON-RPC dispatcher. No user-visible wire change — Claude Desktop, Cline, and Cursor continue to work unchanged. Enables future MCP features (new content types, streaming-HTTP transport, resources/prompts/sampling) by tracking rmcp upstream.
act-cli/src/mcp.rs(384-line hand-rolled JSON-RPC dispatcher). Functionality moved tosrc/rmcp_bridge.rs.
--fs-allownow implicitly grants traversal of ancestor directories on the path to any allowed target. WASI's path-resolver stats every intermediate directory when opening nested files; without this, users had to list each parent explicitly (--fs-allow /tmp --fs-allow "$DB/**"just to reach a file under$DB). An allow entry for/tmp/work/db.sqlitenow implicitly permits/tmp/workand/tmpfor directory traversal — sibling files in those directories remain denied.
- Runtime policy (Layer 1) for outgoing HTTP and filesystem access. Declarative
allow/deny/openmodes, configured via~/.config/act/config.tomlor CLI flags (--fs-allow,--fs-deny,--http-allow,--http-deny,--fs-policy,--http-policy). Filesystem gates every path op through a glob matcher with a virtual-root preopen (Unix:/; Windows: one/c,/d, … per accessible drive). HTTP gates each request by host / scheme / method / port / CIDR and filters DNS-resolved IPs against both deny- and allow-CIDR rules via a reqwest DNS resolver hook. Per-hop redirect policy re-checks each target URL. - Enforcing capability declarations. Components'
[std.capabilities.*]entries inact.tomlare now a ceiling the host applies to the user's policy — missing declaration or declared-but-emptyallowis a hard deny regardless of user config.[std.capabilities."wasi:filesystem"].allowtakes{path, mode}entries withmode = "ro"/"rw".[std.capabilities."wasi:http"].allowtakes{host, scheme?, methods?, ports?}. Wildcards:host = "*"(any host),path = "**"(any path).act-build packvalidates declarations at pack time. - reqwest-backed HTTP client replacing wasmtime-wasi-http's
default_send_request. Outgoingwasi:httprequests route through a per-componentActHttpClient. Negotiates HTTP/2 via ALPN; HTTP/3 compiles in (--cfg reqwest_unstable) but stays dormant pending alt-svc cache warmup. SSE-friendly defaults: HTTP/2 keep-alive pings every 30s, TCP keep-alive, 10-minute idle-pool timeout. - Windows long-path support via an embedded application manifest.
- READMEs ship with the
actandact-buildrelease packages.
- Metadata key renamed
[act-component]→[act]acrossCargo.toml/pyproject.toml/package.json. Components must update the one-line key. act-typesbumped to 0.5 — required for the newFilesystemAllow/HttpAllow/FsModetypes.- Deny-CIDR denials surface as
DnsErrorinstead ofConnectionRefusedby walking the reqwest error chain. Policy-denied requests are attributable to DNS rather than a refused socket. - p3
wasi:filesystem/preopensis shadowed when fs policy is anything other thanopen. Returns zero preopens; p3 guests can't obtain aDescriptor::Dirand every path op fails at the default impl. Per-op gating for p3 filesystem awaits upstream wasmtime-wasi API changes.
- Advisory
warn_missing_capabilitieshelper — undeclared capability classes now hard-deny at policy check time, which is a stronger signal than a startup warning.
fs.denyentries no longer silently ignored — unused rules now emit a warning at startup.
- Upgrade to
act:core@0.3.0. Host runtime dispatches on the newtool-resultvariant:streaming(stream<tool-event>)uses the existing pipe-to-consumer path;immediate(list<tool-event>)pushes events directly into the consumer without stream machinery. - Rename
StreamEvent→ToolEventthroughout the runtime, HTTP, MCP, and CLI code paths. - Remove the hardcoded 30s stream-consumption timeout; cancellation is now driven by the protocol (dropping the stream reader) or runtime-level interruption (epoch/fuel).
- Bump
act-typesto 0.4 andwasmparser/wasm-encoderto 0.247.
--versionflag onactandact-buildbinaries.
publishCI steps are now idempotent and safe to re-run.
- npm packages now preserve executable permissions on binaries (fixes silent failure when running
npx @actcore/acton CI) - npm shims (
bin/act,bin/act-build) ensure executable permission before spawning the binary as a fallback
- npm release pipeline packs
.tgzarchives before upload to preserve file permissions across artifact transfer - Per-crate SBOM attestation in release workflow
- CI/release pipeline refactored into reusable workflows (
build-sbom.yml,build-docker.yml, consolidatedbuild-pypi.ymlmatrix), with stricter job dependencies so a partial build failure can no longer publish a split release across crates.io and PyPI. - GitHub Release notes now come from
CHANGELOG.mdinstead of auto-generated PR lists, so users see the humanized entry. - Docker and SBOM builds now run on PRs (dry-run) to catch regressions before tag push.
- Explicit
timeout-minutesadded across all CI jobs to surface hangs instead of burning the 6h default. ci.ymlnow cancels stacked runs on fast re-pushes via a concurrency group.
- PyPI sdist upload rejection caused by a
License-Filepath mismatch in maturin-generated metadata (license files are still shipped inside the sdist). - SBOM artifact attestation path now matches the per-crate directory layout (
act-build/*.cdx.json,act-cli/*.cdx.json). build-docker.ymlno longer requests permissions its caller can't grant, which was preventing CI jobs from starting.
- Release workflow now correctly bundles per-crate CycloneDX SBOMs generated by
cargo cyclonedx, which previously produced an emptysbomartifact and broke the attest job. - PyPI publish step is now idempotent across release re-runs (
skip-existing: true) and emits verbose errors on upload failure.
- Fix npm CI build failing with
EBADPLATFORMby replacingnpm version --workspaceswith direct version substitution - Fix pypi sdist build failing due to
../README.mdpath inpyproject.toml
act-buildcrate — build tool for ACT WASM components, sharing the workspace withact-cli- README files for both
act-cliandact-build
- MIME-aware display for
act calloutput — content parts now rendered according to their MIME type - Support for nested
ComponentInfo.stdstructure - Workspace metadata (version, license, repository, etc.) unified via
[workspace.package]inheritance - All dependencies updated to latest versions;
act-typesswitched to 0.3 registry release
- Redundant
cargo checkstep from CI workflow
--httpflag foract run— explicit HTTP transport selection,--listennow accepts port number or full address- Universal agent skill (
skills/act/SKILL.md) — works with Claude Code, Cursor, OpenCode, Codex, OpenClaw vianpx skills add actcore/act-cli - SECURITY.md with trusted publishing, SBOM, and sandbox policies
- Snap packaging (experimental)
- npm root package moved to
@actcore/act - README rewritten with current CLI commands and platform support matrix
- OCI refs with numeric tags (e.g.
ghcr.io/actpkg/sqlite:0.1.0) now resolved correctly - Tracing filter uses
act=infoinstead ofact_cli=infoto match binary name
- Publish workflow uses crates.io trusted publishing (OIDC) instead of long-lived API token
- SBOM artifact path in release workflow
- npm publish no longer misinterprets tarball paths as git URLs
- Component references: all commands now accept HTTP/S URLs, OCI registry refs, and local paths (not just file paths). Remote components are cached in
~/.cache/act/components/ act pullcommand to download components from OCI registries or HTTP URLs with-o/-Oflagsact info --tools --format text|jsonfor rich component introspection showingstd:skill, metadata schema, tool annotations, usage hints, and tags- Progress bars (indicatif) for HTTP and OCI downloads
- CycloneDX SBOM generation and attestation in release workflow
- Breaking: CLI commands restructured —
serve→run -l,mcp→run --mcp,tools→info --tools. Old commands removed. act infonow shows--format text(markdown-like, default) or--format json(machine-readable)
- macOS setup action now uses separate x86_64/aarch64 binaries instead of removed universal binary
0.2.0 - 2026-03-18
- Filesystem capabilities: grant WASM components filesystem access via
--allow-dir guest:host(directory mode) or--allow-fs(full access). Components declarewasi:filesystemcapability; host warns if not granted. - Config file support: load settings from
~/.config/act/config.tomlwith named profiles (--profile), filesystem policies, and metadata injection. Override config path with--config. std:fs:mount-rootsupport: components declare their preferred guest mount point; host adjusts directory mappings accordingly.- Profile metadata merging: profile metadata merges with per-request metadata (CLI > profile > defaults).
create_store()now accepts filesystem configuration for WASI preopened directories.- HTTP handlers merge base metadata (from profile/CLI) with per-request metadata.
- Switched
act-typesto path dependency for development.
0.1.0 - 2026-03-15
Initial release of the ACT CLI host — loads WebAssembly components and exposes them via HTTP, MCP, and CLI.
act serve— serve a component as an ACT-HTTP serveract mcp— serve a component over MCP stdioact call— invoke a tool directly from the command lineact info— show component metadata (read fromact:componentcustom section without instantiation)act tools— list tools exposed by a component- HTTP transport with SSE streaming support
- MCP transport with tool annotations mapping
- Component metadata via
--metadata/--metadata-fileCLI flags - CI pipeline with multi-platform builds (Linux, macOS, Windows, RISC-V)
- GitHub Release workflow with artifacts
- Setup action for component e2e testing (
actcore/act-cli/setup@v0)