Adom Hydrogen
Public Made by Adomby adom
The whole Adom experience as one signed native app: your editor, your AI agent, and the full electronics design toolchain, running locally on your own machine.
Mirrored approvals never render: a Rust-emitted permission-request does not reach PermissionPrompt, though the same event emitted from the webview does
A Rust-emitted permission-request never reaches PermissionPrompt, so mirrored approvals render nothing
Chasing "ab prompted and nothing appeared in Hydrogen" (adom/adom-bridge#137) I found two independent faults. The first is fixed in 1.0.197. This is the second, and it is the one that actually swallows the prompt.
The evidence, in the order it rules things out
On ah 1.0.197, laptop and winvm both:
POST /permission/requestanswersdisplayed=true role=mirror, so the backend is not suppressing (the stale-flag bug is fixed and this is not it).- The event does reach the webview. I registered my own listener from the page and it received the payload intact:
plugin:event|listen {event:'permission-request', target:{kind:'Any'}}→{"event":"permission-request","payload":{"id":"test-evt-1","command":"echo probe",...},"id":51} - Nothing renders:
document.querySelector('.perm-backdrop')is null, no console error, nounhandledrejection, nowindow.onerror, across a reload. - The component is mounted and its listener is alive. Emitting the identical event from inside the webview renders it perfectly:
I.invoke('plugin:event|emit', {event:'permission-request', payload:{...}})→{"shown":true,"badge":"EXAMPLE: nothing will run","buttons":["Once","1 hour","24 hours","Bypass"]} - Rust-emitted events in general are fine.
POST /wake/simulate(Rustapp.emit("wake-status", …)) is received by the frontend and drives the post-wake reconcile:[resume] wake:simulated: workspace answering after 1s, reconciling views
So: same window, same event name, same listener. Emitted from the webview it renders; emitted from Rust it does not, while a raw listener with target: Any in that same window does receive the Rust emit.
Where I would look
PermissionPrompt.svelte subscribes with listen('permission-request', …) from @tauri-apps/api/event, which carries a default target. The mirror handler emits with Emitter::emit(&*app_handle, …) on the AppHandle held behind the control server's Arc<Mutex<…>>, taken with app.lock().await immediately before the emit. wake_heal emits on a plain AppHandle with no lock and works. The difference is either the event target the JS default subscribes to versus what an AppHandle emit delivers, or something about emitting while that mutex is held.
Why it matters
Every mechanism built around this prompt is intact and unreachable: the queue for simultaneous requests, the top-layer eviction that closes native <dialog> modals so an approval cannot hide behind Settings, the permission-dismiss retraction and the 3-second self-heal poll against ab's /permission/state. None of it runs, and both ends report success: ab is told the mirror was handled and ah logs it as displayed. A user simply never sees the prompt, which is what was reported on adom/adom-bridge#137.
This also blocks verifying the type-driven choice sets added in 1.0.196, since no mirrored prompt can be made to appear.
Seen on ah 1.0.197 (insiders) on AdomLapper and winvm, ab 2.1.18.