notepat: web → AC-Notepat (M4L) bridge via session-server fanout master
Browsers can't open raw UDP, so we publish notepat events over both WebSocket and geckos to session-server, which already broadcasts `notepat:midi` to AC-Notepat subscribers (the Max-for-Live device). - session-server/session.mjs: handlers for `notepat:midi:publish` and `notepat:midi:heartbeat` on the WS side; matching geckos handlers. Both upsert the source and call broadcastNotepatMidiEvent. - notepat.mjs: opt-in via `?amxd=1|publish|on` (or jweb~/acFORCE_DAW auto-on). Boot captures handle()+per-tab machineId, fires an initial heartbeat, and `sim()` ticks the heartbeat each frame. Note start/ stop hooks wrap the relay-button + drum branch fire-and-forget. Inbound relay flushes are wrapped in amxdSuppressPublish=true to prevent feedback loops. Test: restart session-server, open Ableton w/ AC-Notepat armed, then visit https://notepat.com/?amxd=1 — console should show the bridge banner and keys should fly into Live. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>