A voice-to-text tool for vibe coders: talk to your agents instead of typing to them. Paste links, code and notes into the box while you talk; everything you say is added to the end, ready to copy into a chat.
Bluetooth headsets: Rudder switches them to their stable voice mode (CVSD), because the higher-quality mode (mSBC) kept dropping the mic after a few words.
',4)])])):it("",!0),M("section",bc,[M("button",{class:Ht(["mic",{on:w.value}]),disabled:E.value||c.value!=="ready","aria-pressed":w.value,"aria-label":w.value?"Stop recording":"Start recording",onClick:Te},[M("span",yc,ee(w.value?"β ":"β"),1),ft(" "+ee(w.value?"Stop":"Record"),1)],10,vc),M("div",xc,[M("div",{class:"fill",style:gn({width:(F.value*100).toFixed(0)+"%"})},null,4)]),M("label",wc,[p[10]||(p[10]=M("span",null,"Language",-1)),ms(M("select",{"onUpdate:modelValue":p[1]||(p[1]=D=>V.value=D),disabled:w.value,onChange:o},[(ue(),pe(Pe,null,Pi(i,([D,De])=>M("option",{key:D,value:D},ee(De),9,Cc)),64))],40,Sc),[[Cr,V.value]])])]),M("section",Tc,[M("label",Ac,[p[11]||(p[11]=M("span",null,"Microphone",-1)),ms(M("select",{"onUpdate:modelValue":p[2]||(p[2]=D=>fe.value=D),disabled:w.value||He.value,onChange:p[3]||(p[3]=D=>{o(),be.value=null})},[M("option",Rc,"System default"+ee(q.value?" β "+q.value.label:""),1),(ue(!0),pe(Pe,null,Pi(Me.value,D=>(ue(),pe("option",{key:D.id,value:D.id},ee(ce(D)),9,Oc))),128))],40,Ec),[[Cr,fe.value]])]),M("button",{class:"small",disabled:He.value||w.value||c.value==="offline",onClick:lt},ee(He.value?"Testingβ¦ speak now":"Test mic"),9,Pc),M("button",{class:"small ghost",title:"Look for microphones again","aria-label":"Look for microphones again",disabled:w.value,onClick:Ct},"β»",8,Mc)]),be.value?(ue(),pe("p",{key:1,class:"notice","data-kind":be.value.ok?be.value.peak<.01?"warn":"ok":"error"},ee(be.value.ok?"β ":"β ")+ee(be.value.verdict),9,Ic)):it("",!0),K.value&&K.value.muted?(ue(),pe("p",kc,"β"+ee(K.value.label)+"β is muted in your system sound settings β Rudder won't hear anything until it's unmuted.",1)):it("",!0),Xe.value?(ue(),pe("p",Nc,ee(Xe.value),1)):!Me.value.length&&c.value!=="offline"?(ue(),pe("p",Dc,"No microphone found. Connect a headset or turn on your computer's microphone in Sound settings.")):it("",!0),Ie.value.length?(ue(),pe("p",Fc,"Also available but switched off in Sound settings: "+ee(Ie.value.join(", "))+". Turn it on there to use it here.",1)):it("",!0),U.value?(ue(),pe("p",{key:6,class:"notice","data-kind":P.value},ee(U.value),9,jc)):c.value==="offline"?(ue(),pe("p",Vc,[p[12]||(p[12]=ft(" The local speech engine isn't reachable at ",-1)),M("code",null,ee(s.value),1),p[13]||(p[13]=ft(". In the Plugin Studio it starts with ",-1)),p[14]||(p[14]=M("code",null,"bun run dev",-1)),p[15]||(p[15]=ft(" once built: ",-1)),p[16]||(p[16]=M("code",null,"cd backend/rudder-engine && go build -o ../bin/rudder-engine .",-1))])):it("",!0),M("section",Lc,[ms(M("textarea",{ref_key:"box",ref:J,"onUpdate:modelValue":p[4]||(p[4]=D=>A.value=D),class:"draft",spellcheck:"true","aria-label":"Your text. Type or paste here; everything Rudder hears is added to the end.",placeholder:"Type or paste here β and press Record (Ctrl+Shift+Space) to talk. Your words stream into the end of this box as you speak.",onInput:x,onKeydown:S},null,544),[[oc,A.value]]),M("p",Hc,[w.value?(ue(),pe(Pe,{key:0},[p[17]||(p[17]=M("span",{class:"tag"},"listening",-1)),p[18]||(p[18]=ft(" words appear at the end of the box as you speak β keep typing or pasting anywhere",-1))],64)):it("",!0)])]),M("footer",Uc,[M("button",{disabled:!A.value.trim(),onClick:p[5]||(p[5]=D=>dt(A.value,"all"))},ee(Z.value==="all"?"Copied β":"Copy all"),9,$c),M("button",{disabled:!A.value.trim()||w.value,onClick:Kn},"Clear",8,Bc),M("span",Kc,ee(Ae.value)+" "+ee(Ae.value===1?"word":"words"),1),p[19]||(p[19]=M("span",{class:"spacer"},null,-1)),M("button",{class:"ghost","aria-expanded":me.value,onClick:p[6]||(p[6]=D=>me.value=!me.value)},"π Debug",8,Wc)]),me.value?(ue(),pe("section",zc,[M("dl",null,[p[20]||(p[20]=M("dt",null,"API",-1)),M("dd",null,[M("code",null,ee(s.value),1)]),p[21]||(p[21]=M("dt",null,"Runtime",-1)),M("dd",null,ee(f.value||"β"),1),p[22]||(p[22]=M("dt",null,"Model",-1)),M("dd",null,ee(g.value||"β"),1),p[23]||(p[23]=M("dt",null,"Engine",-1)),M("dd",null,[ft(ee(c.value),1),d.value?(ue(),pe("span",Jc," β "+ee(d.value),1)):it("",!0)])]),M("button",{onClick:zn},ee(Z.value==="debug"?"Copied β":"Copy debug report for an agent"),1)])):it("",!0)],2))}}),[["styles",[dc]]]));typeof customElements<"u"&&(customElements.get("rudder-voice")||customElements.define("rudder-voice",Gc))})(); +`).replace(be,"XX:XX:XX:XX:XX:XX");dt(D,"debug")}function Mr(y){y.ctrlKey&&y.shiftKey&&y.code==="Space"&&(y.preventDefault(),Te())}Ai(()=>{B(),Ct(),window.addEventListener("keydown",Mr)}),Ri(()=>{clearTimeout(jt);try{ne==null||ne.close()}catch{}window.removeEventListener("keydown",Mr)});const qc=xt(()=>({connecting:"Connectingβ¦",starting:"Loading speech modelβ¦ (about 20 s the first time)",ready:w.value?"Listening":"Ready",error:"Engine error",offline:"Engine offline"})[c.value]||c.value);return(y,p)=>(ue(),pe("div",{class:Ht(["rudder",{rec:w.value}])},[M("header",pc,[p[8]||(p[8]=M("div",{class:"brand"},[M("span",{class:"logo","aria-hidden":"true"},"β"),M("div",null,[M("h1",null,"Rudder"),M("p",{class:"sub"},"Voice-to-text for vibe coders Β· private Β· runs on this computer Β· no internet")])],-1)),M("button",{class:"info-btn","aria-expanded":_e.value,title:"What is Rudder?","aria-label":"What is Rudder?",onClick:p[0]||(p[0]=D=>_e.value=!_e.value)},"β",8,gc),M("div",{class:"status","data-state":c.value,role:"status"},[p[7]||(p[7]=M("span",{class:"dot","aria-hidden":"true"},null,-1)),ft(ee(qc.value),1)],8,mc)]),_e.value?(ue(),pe("section",_c,[...p[9]||(p[9]=[yl('A voice-to-text tool for vibe coders: talk to your agents instead of typing to them. Paste links, code and notes into the box while you talk; everything you say is added to the end, ready to copy into a chat.
Bluetooth headsets: Rudder switches them to their stable voice mode (CVSD), because the higher-quality mode (mSBC) kept dropping the mic after a few words.
',4)])])):it("",!0),M("section",vc,[M("button",{class:Ht(["mic",{on:w.value}]),disabled:A.value||c.value!=="ready","aria-pressed":w.value,"aria-label":w.value?"Stop recording":"Start recording",onClick:Te},[M("span",yc,ee(w.value?"β ":"β"),1),ft(" "+ee(w.value?"Stop":"Record"),1)],10,bc),M("div",xc,[M("div",{class:"fill",style:gn({width:(F.value*100).toFixed(0)+"%"})},null,4)]),M("label",wc,[p[10]||(p[10]=M("span",null,"Language",-1)),ms(M("select",{"onUpdate:modelValue":p[1]||(p[1]=D=>V.value=D),disabled:w.value,onChange:o},[(ue(),pe(Pe,null,Pi(i,([D,De])=>M("option",{key:D,value:D},ee(De),9,Cc)),64))],40,Sc),[[Cr,V.value]])])]),M("section",Tc,[M("label",Ec,[p[11]||(p[11]=M("span",null,"Microphone",-1)),ms(M("select",{"onUpdate:modelValue":p[2]||(p[2]=D=>fe.value=D),disabled:w.value||He.value,onChange:p[3]||(p[3]=D=>{o(),ve.value=null})},[M("option",Rc,"System default"+ee(q.value?" β "+q.value.label:""),1),(ue(!0),pe(Pe,null,Pi(Me.value,D=>(ue(),pe("option",{key:D.id,value:D.id},ee(ce(D)),9,Oc))),128))],40,Ac),[[Cr,fe.value]])]),M("button",{class:"small",disabled:He.value||w.value||c.value==="offline",onClick:lt},ee(He.value?"Testingβ¦ speak now":"Test mic"),9,Pc),M("button",{class:"small ghost",title:"Look for microphones again","aria-label":"Look for microphones again",disabled:w.value,onClick:Ct},"β»",8,Mc)]),ve.value?(ue(),pe("p",{key:1,class:"notice","data-kind":ve.value.ok?ve.value.peak<.01?"warn":"ok":"error"},ee(ve.value.ok?"β ":"β ")+ee(ve.value.verdict),9,Ic)):it("",!0),K.value&&K.value.muted?(ue(),pe("p",kc,"β"+ee(K.value.label)+"β is muted in your system sound settings β Rudder won't hear anything until it's unmuted.",1)):it("",!0),Xe.value?(ue(),pe("p",Nc,ee(Xe.value),1)):!Me.value.length&&c.value!=="offline"?(ue(),pe("p",Dc,"No microphone found. Connect a headset or turn on your computer's microphone in Sound settings.")):it("",!0),Ie.value.length?(ue(),pe("p",Fc,"Also available but switched off in Sound settings: "+ee(Ie.value.join(", "))+". Turn it on there to use it here.",1)):it("",!0),U.value?(ue(),pe("p",{key:6,class:"notice","data-kind":P.value},ee(U.value),9,jc)):c.value==="offline"?(ue(),pe("p",Vc,[p[12]||(p[12]=ft(" The local speech engine isn't reachable at ",-1)),M("code",null,ee(s.value),1),p[13]||(p[13]=ft(". In the Plugin Studio it starts with ",-1)),p[14]||(p[14]=M("code",null,"bun run dev",-1)),p[15]||(p[15]=ft(" once built: ",-1)),p[16]||(p[16]=M("code",null,"cd backend/rudder-engine && go build -o ../bin/rudder-engine .",-1))])):it("",!0),M("section",Lc,[ms(M("textarea",{ref_key:"box",ref:J,"onUpdate:modelValue":p[4]||(p[4]=D=>E.value=D),class:"draft",spellcheck:"true","aria-label":"Your text. Type or paste here; everything Rudder hears is added to the end.",placeholder:"Type or paste here β and press Record (Ctrl+Shift+Space) to talk. Your words stream into the end of this box as you speak.",onInput:x,onKeydown:S},null,544),[[oc,E.value]]),M("p",Hc,[w.value?(ue(),pe(Pe,{key:0},[p[17]||(p[17]=M("span",{class:"tag"},"listening",-1)),p[18]||(p[18]=ft(" words appear at the end of the box as you speak β keep typing or pasting anywhere",-1))],64)):it("",!0)])]),M("footer",Uc,[M("button",{disabled:!E.value.trim(),onClick:p[5]||(p[5]=D=>dt(E.value,"all"))},ee(Z.value==="all"?"Copied β":"Copy all"),9,$c),M("button",{disabled:!E.value.trim()||w.value,onClick:Kn},"Clear",8,Bc),M("span",Kc,ee(Ee.value)+" "+ee(Ee.value===1?"word":"words"),1),p[19]||(p[19]=M("span",{class:"spacer"},null,-1)),M("button",{class:"ghost","aria-expanded":me.value,onClick:p[6]||(p[6]=D=>me.value=!me.value)},"π Debug",8,Wc)]),me.value?(ue(),pe("section",zc,[M("dl",null,[p[20]||(p[20]=M("dt",null,"API",-1)),M("dd",null,[M("code",null,ee(s.value),1)]),p[21]||(p[21]=M("dt",null,"Runtime",-1)),M("dd",null,ee(f.value||"β"),1),p[22]||(p[22]=M("dt",null,"Model",-1)),M("dd",null,ee(g.value||"β"),1),p[23]||(p[23]=M("dt",null,"Engine",-1)),M("dd",null,[ft(ee(c.value),1),d.value?(ue(),pe("span",Jc," β "+ee(d.value),1)):it("",!0)])]),M("button",{onClick:zn},ee(Z.value==="debug"?"Copied β":"Copy debug report for an agent"),1)])):it("",!0)],2))}}),[["styles",[dc]]]));typeof customElements<"u"&&(customElements.get("rudder-voice")||customElements.define("rudder-voice",Gc))})(); diff --git a/public/dx-maps/rudder-voice/rudder-voice/index.html b/public/dx-maps/rudder-voice/rudder-voice/index.html index bfeb6b430..179f8a43d 100644 --- a/public/dx-maps/rudder-voice/rudder-voice/index.html +++ b/public/dx-maps/rudder-voice/rudder-voice/index.html @@ -32,7 +32,7 @@ - +