v0.14.0-rc1 - Talk to the agent you're selling
Pre-releasev0.14.0-rc1 - Talk to the agent you're selling
The chat widget is back. Buyers open your agent's page, sign once, and start talking — every turn paid on-chain, no wallet popup per message.
v0.14.0-rc1 re-lands the built-in browser chat widget that was carved out of rc0, and pairs it with the payment plumbing it needs: an opt-in auth-capture unlock gate that settles a client-signed fee split on-chain, and fee-revenue metrics for operators who want to see what a session actually earned. Every type=agent offer now ships a themed, zero-dependency chat page on its own origin at /chat.
The rest of the cycle is fixes: the payment path now surfaces the on-chain settle tx hash when a settle errors (so you never pay twice by accident), agent offers stop leaking their internal backing model to buyers, and a handful of CLI and tunnel edges got smoothed.
Install with OBOL_RELEASE=v0.14.0-rc1 (command below) and put it through its paces before the tagged release.
Note
rc0's release note said the widget would return on top of x402 batch-settlement. What actually ships here is the session-key design: one Sign-In-With-Ethereum signature derives a local session key, you fund it once, and each turn is paid with a silently-signed EIP-3009 transferWithAuthorization (gasless for the payer). Same UX goal — no per-turn popup — reached without the deposit-once escrow, which remains in progress.
Important
The auth-capture unlock gate is opt-in and disabled by default. Obol takes no fee unless you explicitly configure authCaptureUnlock in your verifier pricing config with your own feeRecipient and fee bps. Enabling it also requires a facilitator that supports the v2-eip155-auth-capture scheme (hosted facilitator: beta-2.0.2, see obol-infrastructure#2997).
Warning
This software is early alpha, you could lose what you put in. Please use caution when it comes to non-testnet assets.
Install / Upgrade
# Install this release
OBOL_RELEASE=v0.14.0-rc1 bash <(curl -s https://stack.obol.org)
# Run the stack
obol stack init && obol stack up
# Declare an agent, then make it sellable — the chat page comes with it
obol agent new quant --skills buy-x402 --model <model> --create-wallet
obol sell agent quant --price 0.01 --token USDC --network base-sepoliaRelease Highlights
The agent chat widget - a buyer-ready chat page on every agent offer
Every offer of type=agent now serves a self-contained chat client at /chat on its dedicated origin, and embeds it on the offer's landing page. It renders in the same identity as the rest of that origin — the offer's display name and the same resolved storefront theme tokens as its landing page — so default and branded storefronts flow through identically.
The payment flow is what makes it usable:
- The visitor connects an injected wallet and signs one fixed Sign-In-With-Ethereum message.
- The
keccak256of that signature becomes a deterministic local session key, which never leaves the page and is never persisted — re-signing the same message re-derives it. - They fund that session address once with a small USDC transfer.
- Every subsequent turn is paid silently over x402: an EIP-3009
transferWithAuthorizationsigned by the session key, gasless for the payer, with no wallet prompt per message.
Pricing is discovered at runtime from the origin's own 402 challenge — price, model, network and asset all come from the challenge on POST /v1/chat/completions, so the page never carries stale hardcoded pricing. A per-turn spend cap pins payment to the price shown when the page loaded; if the price moves up mid-session, the turn is refused rather than silently overpaid.
The widget's only dependency (viem + x402) is bundled into the controller binary and served from the same origin, so the page loads with zero external requests and works on air-gapped stacks.
Note
/chat holds a hot session key that signs USDC transfers, so it is served with Content-Security-Policy: frame-ancestors 'self' — the offer's own landing page can embed it, but it cannot be framed cross-origin. The /chat and /chat-vendor.js routes and the landing-page embed exist only for type=agent offers; every other offer type is untouched.
Auth-capture unlock gate + fee revenue metrics (opt-in)
A new optional gate lets an operator sell a session unlock whose payment carries a client-signed fee split, captured on-chain by AuthCaptureEscrow rather than divided off-chain after the fact. The buyer signs the feeBps → feeRecipient terms as part of the authorization, so the split is bounded by what they agreed to and enforced by the escrow contract at capture time.
Operators get fee_revenue_atomic and settled-volume Prometheus metrics alongside the existing verifier metrics.
This is configured per-stack under authCaptureUnlock in the verifier pricing config (fixed rate — minFeeBps == maxFeeBps), and is off unless you turn it on.
Agent offers stop leaking their internal model
Agent offers run their own pinned model and ignore the request's model field, so surfacing that id to buyers was both meaningless and a staleness trap — it went wrong the moment an operator swapped the backing model. It is now omitted everywhere buyer-facing: /api/services.json, the /skill.md worked examples, the 402 challenge copy and extra block, pay-agent, and the bazaar example. Inference offers, where the buyer genuinely selects a model, are unchanged.
Don't pay twice - settle failures now surface the on-chain tx
When the facilitator returns an error from /settle but the transaction already landed on-chain, the unlock path now surfaces that tx hash in X-PAYMENT-RESPONSE (matching the regular paid path) and returns a hint telling you to verify against the chain before retrying. Previously the hash was dropped, and a retry could pay a second time.
Breaking changes / Migration notes
- No breaking changes. This is an RC over v0.14.0-rc0; upgrade in place with
obol stack up. - The chat widget requires no configuration — it appears automatically on
type=agentoffers once the controller is upgraded. A dedicated public hostname (--hostname, permanent Cloudflare tunnel) gives it its own origin. - The auth-capture unlock gate is opt-in and needs a
v2-eip155-auth-capture-capable facilitator; existing offers are unaffected if you don't enable it.
What's Changed
- fix(ui): honor OBOL_NONINTERACTIVE on a real TTY by @bussyjd in #789
- fix(agentcrd): strip server-managed metadata before ResumeAll re-apply by @bussyjd in #790
- fix(serviceoffercontroller): align well-known/x402 resource path with openapi for inference/agent by @bussyjd in #791
- fix(stack): don't treat own cluster's ports as conflicts under --force by @bussyjd in #792
- fix(tunnel): make hostname add idempotent for already-bound hosts by @bussyjd in #793
The headline work in this RC landed through the integration branch (#800) rather than as individual merges to main, so it does not appear in the auto-generated list above:
- feat(storefront): built-in browser chat widget for agent-type offers (#752), hardening (#785), re-land after the rc0 carve-out (#801)
- feat(x402): auth-capture unlock gate + fee revenue metrics (#798)
- feat(agents): complete agent model-strip (#673)
- fix(network): stop reth liveness probe from killing consistency recovery (#750)
- fix(x402): default 402 challenge resource.url to https on public hosts (#751)
Full Changelog: v0.14.0-rc0...v0.14.0-rc1
