You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently, the acp-utils and wisp crates contain an acp client that's used for the tui client.
But another use case is wanting to connect to an agent running aether server over a websocket, using a browser based acp client.
The latest version of the acp crate (2.2+) now supports a wasm compilation target
At a high level, I think we would want something like:
1.Bump the ACP crate to 2.2.0 or later.
2. Untangle acp-utils from tokio/non-compatible deps for wasm, or create new crate(sl
3. Add a spawner-generic connection layer without Send bounds and pure acp reducer.
4. Add a wasm-bindgen facade
5. Provide a nice high level API for a consumer to connect using aether acp client in a browser via wasm and websocket
Plan saved to docs/aether/plans/issue-527-plan.md (force-added since plans/ is gitignored) and committed as 81dc5bc3 on aether/issue-527.
Summary of the plan:
Phase 0 — Bump ACP 2.1.0 → 2.2.0: verified via registry sources that 2.2.0's wasm delta is the opt-in wasm_js feature (Web Crypto UUID backend, PR fix(aether-lspd): Race condition with lsp events #308), unstable_tool_call_name is stabilized (must drop that feature flag), and the ConnectTo: Send + 'static bound is retained — so the plan works within it via executor choice rather than a trait fork.
Phase 1 — New aether-acp-core crate: moves serde-only wire types (meta, config_option_id, notifications split, AcpEvent, AcpClientError) out of tokio-coupled acp-utils, adds a Spawner trait (TokioSpawner / WasmSpawner) and a spawner-generic connect_acp_client ported onto futures::channel (same primitives ACP core uses internally).
Phase 2 — Pure reducer: extracts conversation folding from wisp's TUI-coupled acp_reducer.rs into reduce() → (snapshot, effects) over schema::v2 types.
Phase 3 — WebSysTransport: message-based web-sys::WebSocket → Lines adapter (no byte-stream shim possible in browsers), mirroring binary-reject/close/backpressure semantics of websocket.rs.
Phase 4 — aether-acp-wasm facade: thin wasm-bindgenWasmAcpClient (connect/session/prompt/cancel/event-subscribe) + packages/aether-acp-wasm TS wrapper reusing the AetherMessage shape; deliberately not extending the Node-only aether-sdk.
Activity
contextbridge-pr-automation commentedon Sep 26, 2026
Plan saved to
docs/aether/plans/issue-527-plan.md(force-added sinceplans/is gitignored) and committed as81dc5bc3onaether/issue-527.Summary of the plan:
wasm_jsfeature (Web Crypto UUID backend, PR fix(aether-lspd): Race condition with lsp events #308),unstable_tool_call_nameis stabilized (must drop that feature flag), and theConnectTo: Send + 'staticbound is retained — so the plan works within it via executor choice rather than a trait fork.aether-acp-corecrate: moves serde-only wire types (meta,config_option_id,notificationssplit,AcpEvent,AcpClientError) out of tokio-coupledacp-utils, adds aSpawnertrait (TokioSpawner/WasmSpawner) and a spawner-genericconnect_acp_clientported ontofutures::channel(same primitives ACP core uses internally).wisp's TUI-coupledacp_reducer.rsintoreduce() → (snapshot, effects)overschema::v2types.WebSysTransport: message-basedweb-sys::WebSocket→Linesadapter (no byte-stream shim possible in browsers), mirroring binary-reject/close/backpressure semantics ofwebsocket.rs.aether-acp-wasmfacade: thinwasm-bindgenWasmAcpClient(connect/session/prompt/cancel/event-subscribe) +packages/aether-acp-wasmTS wrapper reusing theAetherMessageshape; deliberately not extending the Node-onlyaether-sdk.wasm32-unknown-unknown+wasm-pack testjobs, 409/reconnect semantics,remote.mdxbrowser docs.Pushed to
aether/issue-527. See the run.