Nyx Live: Your AI Guide to Sandblast.
Ask, tap, and explore Sandblast with Nyx.
Nyx visual standbyAvatar media is initializing. The stage remains locked and reserved for Nyx only.
Nyx statusReady to guide you
Nyx ConversationReady to explore
Suggested prompts
Lane-aware shortcuts
/* ===== NYX ROOT FIX v4 (BLOB + PLAYBACK) ===== */
window.__nyxAudioUnlocked = false;
window.__nyxSpeaking = false;
window.__nyxLastBlobUrl = null;
async function __nyxUnlock(){
if(window.__nyxAudioUnlocked) return true;
const ctx = new (window.AudioContext || window.webkitAudioContext)();
await ctx.resume();
window.__nyxAudioUnlocked = true;
console.log("[NYX] unlocked");
return true;
}
async function __nyxFetchAudio(url, opts){
const res = await fetch(url, opts);
console.log("[NYX] status", res.status);
const blob = await res.blob();
console.log("[NYX] blob size", blob.size, blob.type);
if(!blob || blob.size < 500){
throw new Error("INVALID_AUDIO_BLOB");
}
const blobUrl = URL.createObjectURL(blob);
// DO NOT REVOKE EARLY
window.__nyxLastBlobUrl = blobUrl;
return blobUrl;
}
async function __nyxPlayBlob(blobUrl){
await __nyxUnlock();
const audio = new Audio();
audio.src = blobUrl;
window.__nyxSpeaking = true;
audio.onended = ()=>{
window.__nyxSpeaking = false;
console.log("[NYX] ended");
};
audio.onerror = (e)=>{
window.__nyxSpeaking = false;
console.error("[NYX] audio error", e);
};
try{
await audio.play();
console.log("[NYX] playing");
}catch(e){
console.error("[NYX] play fail", e);
window.__nyxSpeaking = false;
}
}
// BLOCK BAD RESETS
const __origReset = window.resetAudioState || function(){};
window.resetAudioState = function(){
if(window.__nyxSpeaking){
console.warn("[NYX] reset blocked");
return;
}
return __origReset.apply(this, arguments);
};
console.log("[NYX] v4 ROOT FIX LOADED");