infinicode 2.8.70 → 2.8.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -594,6 +594,9 @@ button.act:disabled{opacity:0.5;cursor:default;}
594
594
  .rp-call-service .ready{font-family:var(--mono);font-size:.48rem;letter-spacing:.08em;text-transform:uppercase;color:var(--ok);}
595
595
  .rp-call-device{display:grid;gap:.22rem;margin-top:.45rem}.rp-call-device:first-child{margin-top:0}.rp-call-device label{font-family:var(--mono);font-size:.51rem;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
596
596
  .rp-call-device select{width:100%;min-width:0;font-family:var(--mono);font-size:.62rem;background:#0c0a07;border:1px solid var(--glass-border);color:var(--ink);border-radius:9px;padding:.42rem .5rem;}
597
+ .rp-call-device-note{margin-top:.55rem;padding:.52rem .58rem;border:1px solid var(--glass-border);border-radius:10px;background:rgba(0,0,0,.22);font-family:var(--mono);font-size:.54rem;line-height:1.45;color:var(--muted)}
598
+ .rp-call-device-note.ok{color:var(--ok);border-color:rgba(87,224,156,.28);background:rgba(28,64,50,.28)}.rp-call-device-note.bad{color:var(--bad);border-color:rgba(255,126,110,.34);background:rgba(64,24,20,.34)}.rp-call-device-note.warn{color:var(--warn);border-color:rgba(242,193,78,.3);background:rgba(64,50,20,.3)}
599
+ .rp-call-device-actions{display:grid;grid-template-columns:1fr 1fr;gap:.4rem;margin-top:.55rem}.rp-call-device-actions .rp-btn{width:100%}
597
600
  .rp-call-stage{display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;overflow:hidden;}
598
601
  .rp-call-stage:before{content:"";position:absolute;width:420px;height:420px;border:1px solid rgba(246,215,123,.08);border-radius:50%;box-shadow:0 0 0 42px rgba(246,215,123,.018),0 0 0 92px rgba(246,215,123,.012);}
599
602
  .rp-call-visual{position:relative;width:min(330px,80%);aspect-ratio:1;border-radius:50%;display:grid;place-items:center;background:radial-gradient(circle,rgba(246,215,123,.14),rgba(10,8,5,.58) 52%,rgba(0,0,0,.82) 72%);border:1px solid rgba(246,215,123,.24);box-shadow:0 0 70px rgba(201,150,46,.13),inset 0 0 48px rgba(246,215,123,.06);z-index:1;transition:box-shadow .3s,border-color .3s;}
@@ -888,11 +891,12 @@ button.act:disabled{opacity:0.5;cursor:default;}
888
891
  </div>
889
892
  </div>
890
893
  <div class="rp-call-card">
891
- <div class="rp-section-h" style="margin:0 0 .5rem">Browser devices <span class="meta" id="rp-call-device-status">permission on start</span></div>
894
+ <div class="rp-section-h" style="margin:0 0 .5rem">Browser devices <span class="meta" id="rp-call-device-status">permission required</span></div>
892
895
  <div class="rp-call-device"><label>Microphone</label><select id="rp-call-mic-device"><option value="">system default</option></select></div>
893
896
  <div class="rp-call-device"><label>Camera</label><select id="rp-call-cam-device"><option value="">system default</option></select></div>
894
897
  <div class="rp-call-device"><label>Speaker output</label><select id="rp-call-speaker-device"><option value="">system default</option></select></div>
895
- <button class="rp-btn" id="rp-call-refresh-devices" style="width:100%;margin-top:.55rem">Refresh browser devices</button>
898
+ <div class="rp-call-device-note" id="rp-call-device-note">Enable media access to reveal the actual microphone, camera, and speaker names available to this browser.</div>
899
+ <div class="rp-call-device-actions"><button class="rp-btn primary" id="rp-call-refresh-devices">Enable &amp; scan</button><button class="rp-btn" id="rp-call-test-mic">Test microphone</button></div>
896
900
  </div>
897
901
  </aside>
898
902
  <main class="rp-call-stage">
@@ -2934,18 +2938,46 @@ button.act:disabled{opacity:0.5;cursor:default;}
2934
2938
  wrap.appendChild(div); wrap.scrollTop=wrap.scrollHeight;
2935
2939
  rpVoiceCall.messages++; if($('rp-call-message-count'))$('rp-call-message-count').textContent=rpVoiceCall.messages+' message'+(rpVoiceCall.messages===1?'':'s');
2936
2940
  }
2941
+ var VOICE_DEVICE_PREFS_KEY='rp-voice-device-prefs-v1';
2942
+ function voiceDevicePrefs(){try{return JSON.parse(localStorage.getItem(VOICE_DEVICE_PREFS_KEY)||'{}')||{};}catch(_){return {};}}
2943
+ function saveVoiceDevicePrefs(){try{localStorage.setItem(VOICE_DEVICE_PREFS_KEY,JSON.stringify({audioinput:$('rp-call-mic-device').value||'',videoinput:$('rp-call-cam-device').value||'',audiooutput:$('rp-call-speaker-device').value||''}));}catch(_){}}
2944
+ function voiceDeviceMessage(text,state){var note=$('rp-call-device-note');if(note){note.textContent=text;note.className='rp-call-device-note '+(state||'');}}
2945
+ function voiceMediaSupportError(){
2946
+ if(!window.isSecureContext && location.hostname!=='localhost' && location.hostname!=='127.0.0.1') return 'Browser microphone access is blocked on insecure HTTP. Open this control center over HTTPS (or localhost), then scan again.';
2947
+ if(!navigator.mediaDevices) return 'This browser does not expose media devices. Use current Edge or Chrome over HTTPS.';
2948
+ if(!navigator.mediaDevices.getUserMedia) return 'Microphone capture is unavailable in this browser context.';
2949
+ return '';
2950
+ }
2937
2951
  function fillDeviceSelect(id,devices,kind){
2938
- var sel=$(id);if(!sel)return;var current=sel.value,rows=devices.filter(function(d){return d.kind===kind;});
2939
- sel.innerHTML='<option value="">system default</option>'+rows.map(function(d,i){return '<option value="'+esc(d.deviceId)+'">'+esc(d.label||kind+' '+(i+1))+'</option>';}).join('');if(current)sel.value=current;
2952
+ var sel=$(id);if(!sel)return 0;var prefs=voiceDevicePrefs(),current=sel.value||prefs[kind]||'',rows=devices.filter(function(d){return d.kind===kind;});
2953
+ var fallback=kind==='audioinput'?'System default microphone':kind==='videoinput'?'System default camera':'System default speaker';
2954
+ sel.innerHTML='<option value="">'+fallback+'</option>'+rows.filter(function(d){return d.deviceId&&d.deviceId!=='default';}).map(function(d,i){var label=d.label||((kind==='audioinput'?'Microphone ':kind==='videoinput'?'Camera ':'Speaker ')+(i+1));return '<option value="'+esc(d.deviceId)+'">'+esc(label)+'</option>';}).join('');
2955
+ if(current){sel.value=current;if(sel.value!==current)sel.value='';} return rows.length;
2940
2956
  }
2941
- function refreshBrowserDevices(requestPermission){
2942
- if(!navigator.mediaDevices||!navigator.mediaDevices.enumerateDevices){$('rp-call-device-status').textContent='unsupported';return Promise.resolve([]);}
2957
+ function refreshBrowserDevices(requestPermission,includeCamera){
2958
+ var unsupported=voiceMediaSupportError();
2959
+ if(unsupported){$('rp-call-device-status').textContent='blocked';voiceDeviceMessage(unsupported,'bad');return requestPermission?Promise.reject(new Error(unsupported)):Promise.resolve([]);}
2960
+ $('rp-call-device-status').textContent=requestPermission?'requesting access…':'scanning…';
2943
2961
  var permission=Promise.resolve();
2944
- if(requestPermission)permission=navigator.mediaDevices.getUserMedia({audio:true}).then(function(stream){stream.getTracks().forEach(function(t){t.stop();});}).catch(function(e){setVoiceEvent('Microphone',e.message||'permission denied');});
2945
- return permission.then(function(){return navigator.mediaDevices.enumerateDevices();}).then(function(devices){fillDeviceSelect('rp-call-mic-device',devices,'audioinput');fillDeviceSelect('rp-call-cam-device',devices,'videoinput');fillDeviceSelect('rp-call-speaker-device',devices,'audiooutput');$('rp-call-device-status').textContent=devices.length+' detected';return devices;});
2962
+ if(requestPermission){
2963
+ var selected=$('rp-call-mic-device').value, audio=selected?{deviceId:{exact:selected}}:true;
2964
+ permission=navigator.mediaDevices.getUserMedia({audio:audio}).then(function(stream){stream.getTracks().forEach(function(t){t.stop();});if(includeCamera)return navigator.mediaDevices.getUserMedia({video:true}).then(function(cam){cam.getTracks().forEach(function(t){t.stop();});}).catch(function(){return null;});});
2965
+ }
2966
+ return permission.then(function(){return navigator.mediaDevices.enumerateDevices();}).then(function(devices){
2967
+ var mic=fillDeviceSelect('rp-call-mic-device',devices,'audioinput'),cam=fillDeviceSelect('rp-call-cam-device',devices,'videoinput'),speaker=fillDeviceSelect('rp-call-speaker-device',devices,'audiooutput');
2968
+ saveVoiceDevicePrefs();$('rp-call-device-status').textContent=mic+' mic · '+cam+' cam · '+speaker+' out';
2969
+ voiceDeviceMessage('Ready: '+mic+' microphone'+(mic===1?'':'s')+', '+cam+' camera'+(cam===1?'':'s')+', and '+speaker+' speaker output'+(speaker===1?'':'s')+' detected. Device choices are saved in this browser.','ok');return devices;
2970
+ }).catch(function(e){var message=e&&e.name==='NotAllowedError'?'Media permission was denied. Allow microphone access in the browser address bar and scan again.':(e&&e.message||'Media device scan failed');$('rp-call-device-status').textContent='permission failed';voiceDeviceMessage(message,'bad');setVoiceEvent('Browser media',message);throw new Error(message);});
2971
+ }
2972
+ function switchVoiceDevice(kind,id){saveVoiceDevicePrefs();if(!rpVoiceCall.room||!id)return Promise.resolve();return rpVoiceCall.room.switchActiveDevice(kind,id).catch(function(e){setVoiceEvent('Device switch failed',e.message);voiceDeviceMessage('Could not switch device: '+e.message,'bad');});}
2973
+ function applyVoiceOutputDevice(){saveVoiceDevicePrefs();var id=$('rp-call-speaker-device').value;if(!id)return;var els=$('rp-call-audio').querySelectorAll('audio'),supported=false;for(var i=0;i<els.length;i++)if(typeof els[i].setSinkId==='function'){supported=true;els[i].setSinkId(id).catch(function(e){voiceDeviceMessage('Speaker selection failed: '+e.message,'bad');});}if(!supported&&els.length)voiceDeviceMessage('This browser cannot route call audio to a selected speaker. System default output is active.','warn');}
2974
+ function testVoiceMicrophone(){
2975
+ var btn=$('rp-call-test-mic');btn.disabled=true;btn.textContent='Listening…';
2976
+ refreshBrowserDevices(true,false).then(function(){var id=$('rp-call-mic-device').value,constraints=id?{deviceId:{exact:id}}:true;return navigator.mediaDevices.getUserMedia({audio:constraints});}).then(function(stream){
2977
+ var C=window.AudioContext||window.webkitAudioContext,ctx=new C(),src=ctx.createMediaStreamSource(stream),an=ctx.createAnalyser(),data=new Uint8Array(128),peak=0;an.fftSize=256;src.connect(an);var started=Date.now();
2978
+ return new Promise(function(resolve){function sample(){an.getByteTimeDomainData(data);var sum=0;for(var i=0;i<data.length;i++){var v=(data[i]-128)/128;sum+=v*v;}peak=Math.max(peak,Math.sqrt(sum/data.length));voiceDeviceMessage('Microphone test live · level '+Math.round(peak*300)+'%','ok');if(Date.now()-started<2500)requestAnimationFrame(sample);else{stream.getTracks().forEach(function(t){t.stop();});ctx.close().catch(function(){});resolve(peak);}}sample();});
2979
+ }).then(function(peak){voiceDeviceMessage(peak>.01?'Microphone test passed · signal detected.':'Microphone opened but no signal was detected. Check the selected input and gain.',peak>.01?'ok':'warn');}).catch(function(e){voiceDeviceMessage(e.message||'Microphone test failed','bad');}).finally(function(){btn.disabled=false;btn.textContent='Test microphone';});
2946
2980
  }
2947
- function switchVoiceDevice(kind,id){if(!rpVoiceCall.room||!id)return Promise.resolve();return rpVoiceCall.room.switchActiveDevice(kind,id).catch(function(e){setVoiceEvent('Device switch failed',e.message);});}
2948
- function applyVoiceOutputDevice(){var id=$('rp-call-speaker-device').value;if(!id)return;var els=$('rp-call-audio').querySelectorAll('audio');for(var i=0;i<els.length;i++)if(typeof els[i].setSinkId==='function')els[i].setSinkId(id).catch(function(){});}
2949
2981
  function startVoiceVisualizer(track){
2950
2982
  stopVoiceVisualizer();try{var C=window.AudioContext||window.webkitAudioContext;if(!C||!track||!track.mediaStreamTrack)return;var ctx=new C(),an=ctx.createAnalyser(),source=ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack]));an.fftSize=128;source.connect(an);rpVoiceCall.audioContext=ctx;rpVoiceCall.analyser=an;var data=new Uint8Array(an.frequencyBinCount),bars=$('rp-call-bars').querySelectorAll('i');
2951
2983
  function draw(){an.getByteFrequencyData(data);var sum=0;for(var x=0;x<data.length;x++)sum+=data[x];var avg=sum/data.length;for(var i=0;i<bars.length;i++){var idx=Math.floor(i*data.length/bars.length);bars[i].style.height=(12+Math.min(70,data[idx]*.28))+'px';}$('rp-call-visual').classList.toggle('speaking',avg>10);rpVoiceCall.audioRaf=requestAnimationFrame(draw);}draw();
@@ -2979,7 +3011,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
2979
3011
  if(!cid){setVoiceCallStatus('select a character first','');return;}
2980
3012
  if(rpVoiceCall.room)return;
2981
3013
  setVoiceCallStatus('requesting microphone...','busy');setVoiceAgentState('Opening channel','requesting browser media permission'); $('rp-call-start').disabled=true;
2982
- refreshBrowserDevices(true).then(function(){return rpAction('POST','/robopark/api/sessions/voice-call',{character_preset_id:cid,voice_stack_id:sid||null,client_name:getOperatorName()||'RoboPark Operator'});})
3014
+ refreshBrowserDevices(true,false).then(function(devices){if(!devices.some(function(d){return d.kind==='audioinput';}))throw new Error('No browser microphone was detected');return rpAction('POST','/robopark/api/sessions/voice-call',{character_preset_id:cid,voice_stack_id:sid||null,client_name:getOperatorName()||'RoboPark Operator'});})
2983
3015
  .then(function(call){
2984
3016
  if(!call)throw new Error('scheduler returned no call');
2985
3017
  rpVoiceCall.session=call.session_id; rpVoiceCall.eventToken=call.event_token; rpVoiceCall.seen={};rpVoiceCall.messages=0;rpVoiceCall.ending=false;
@@ -2999,22 +3031,36 @@ button.act:disabled{opacity:0.5;cursor:default;}
2999
3031
  if(LK.RoomEvent.ParticipantAttributesChanged)room.on(LK.RoomEvent.ParticipantAttributesChanged,function(changed,p){updateAgentFromParticipant(p);});
3000
3032
  room.on(LK.RoomEvent.ParticipantConnected,function(p){updateAgentFromParticipant(p);setVoiceEvent('Agent connected',p.name||p.identity||'ROBOVOICE worker');});
3001
3033
  room.on(LK.RoomEvent.Disconnected,function(){ if(!rpVoiceCall.ending) finishVoiceCall('connection_lost'); });
3002
- return room.connect(call.server_url,call.token).then(function(){var mic=$('rp-call-mic-device').value,opts=mic?{deviceId:mic}:undefined;return room.localParticipant.setMicrophoneEnabled(true,opts);});
3003
- }).then(function(){
3004
- setVoiceCallStatus('secure channel connected','live');setVoiceAgentState('Listening','speak naturally');setVoiceEvent('Connected','waiting for ROBOVOICE agent');rpVoiceCall.startedAt=Date.now();rpVoiceCall.timer=setInterval(updateVoiceTimer,1000);updateVoiceTimer();
3034
+ return room.connect(call.server_url,call.token).then(function(){
3035
+ var mic=$('rp-call-mic-device').value,opts=mic?{deviceId:mic}:undefined;
3036
+ setVoiceEvent('LiveKit connected','publishing '+(mic?'selected microphone':'system default microphone'));
3037
+ return room.localParticipant.setMicrophoneEnabled(true,opts).then(function(){return true;}).catch(function(e){
3038
+ var message=e&&e.message||'Browser microphone could not be published';
3039
+ rpVoiceCall.muted=true;
3040
+ voiceDeviceMessage('Voice channel is connected, but the microphone is blocked: '+message+'. Allow access, then press RETRY MIC.','bad');
3041
+ setVoiceEvent('Microphone blocked',message);
3042
+ if(window.console)console.error('RoboPark microphone publish failed',e);
3043
+ return false;
3044
+ });
3045
+ });
3046
+ }).then(function(micActive){
3047
+ setVoiceCallStatus(micActive?'secure channel connected':'channel connected - microphone blocked',micActive?'live':'busy');setVoiceAgentState(micActive?'Listening':'Microphone required',micActive?'speak naturally':'allow browser microphone access, then retry');if(micActive)setVoiceEvent('Connected','waiting for ROBOVOICE agent');rpVoiceCall.startedAt=Date.now();rpVoiceCall.timer=setInterval(updateVoiceTimer,1000);updateVoiceTimer();
3005
3048
  $('rp-call-mute').disabled=false;$('rp-call-camera').disabled=false;$('rp-call-screen').disabled=false;$('rp-call-end').disabled=false;$('rp-call-message').disabled=false;$('rp-call-send').disabled=false;
3049
+ $('rp-call-mute').textContent=micActive?'MIC':'RETRY MIC';$('rp-call-mute').classList.toggle('on',!!micActive);
3006
3050
  return fetch('/robopark/api/sessions/'+encodeURIComponent(rpVoiceCall.session)+'/joined'+QS,{method:'POST',headers:{'X-RoboPark-Session-Token':rpVoiceCall.eventToken}}).catch(function(){});
3007
3051
  });
3008
3052
  }).catch(function(e){
3053
+ if(window.console)console.error('RoboPark voice call failed',e);
3009
3054
  setVoiceCallStatus('call failed','');setVoiceAgentState('Unable to connect',e&&e.message||String(e));setVoiceEvent('Call failed',e&&e.message||String(e)); $('rp-call-start').disabled=false;
3010
- if(rpVoiceCall.session)rpAction('POST','/robopark/api/sessions/'+encodeURIComponent(rpVoiceCall.session)+'/end?reason=connection_failed');
3011
- if(rpVoiceCall.room){try{rpVoiceCall.room.disconnect();}catch(_){} rpVoiceCall.room=null;}
3055
+ var failedSession=rpVoiceCall.session,failedRoom=rpVoiceCall.room;rpVoiceCall.ending=true;rpVoiceCall.room=null;rpVoiceCall.session=null;rpVoiceCall.eventToken=null;
3056
+ if(failedSession)rpAction('POST','/robopark/api/sessions/'+encodeURIComponent(failedSession)+'/end?reason=connection_failed').catch(function(){});
3057
+ if(failedRoom){try{failedRoom.disconnect();}catch(_){}}
3058
+ setTimeout(function(){rpVoiceCall.ending=false;},300);
3012
3059
  });
3013
3060
  }
3014
3061
  function toggleVoiceMute(){
3015
- if(!rpVoiceCall.room)return; rpVoiceCall.muted=!rpVoiceCall.muted;
3016
- rpVoiceCall.room.localParticipant.setMicrophoneEnabled(!rpVoiceCall.muted);
3017
- $('rp-call-mute').textContent=rpVoiceCall.muted?'MIC OFF':'MIC';$('rp-call-mute').classList.toggle('on',!rpVoiceCall.muted);setVoiceCallStatus(rpVoiceCall.muted?'microphone muted':'secure channel connected','live');
3062
+ if(!rpVoiceCall.room)return;var enable=rpVoiceCall.muted,mic=$('rp-call-mic-device').value,opts=enable&&mic?{deviceId:mic}:undefined,btn=$('rp-call-mute');btn.disabled=true;
3063
+ rpVoiceCall.room.localParticipant.setMicrophoneEnabled(enable,opts).then(function(){rpVoiceCall.muted=!enable;btn.textContent=enable?'MIC':'MIC OFF';btn.classList.toggle('on',enable);setVoiceCallStatus(enable?'secure channel connected':'microphone muted','live');setVoiceAgentState(enable?'Listening':'Microphone muted',enable?'speak naturally':'the call remains connected');voiceDeviceMessage(enable?'Microphone published to the active call.':'Microphone muted; the voice channel remains connected.',enable?'ok':'warn');}).catch(function(e){rpVoiceCall.muted=true;btn.textContent='RETRY MIC';btn.classList.remove('on');setVoiceCallStatus('channel connected - microphone blocked','busy');voiceDeviceMessage('Microphone retry failed: '+(e&&e.message||String(e)),'bad');setVoiceEvent('Microphone blocked',e&&e.message||String(e));}).finally(function(){btn.disabled=false;});
3018
3064
  }
3019
3065
  function finishVoiceCall(reason){
3020
3066
  if(rpVoiceCall.ending)return; rpVoiceCall.ending=true; var session=rpVoiceCall.session, room=rpVoiceCall.room;
@@ -3026,7 +3072,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
3026
3072
  var cs=$('rp-call-character-select'),ss=$('rp-call-stack-select'),start=$('rp-call-start'),mute=$('rp-call-mute'),end=$('rp-call-end');
3027
3073
  if(cs)cs.addEventListener('change',paintVoiceCallCharacter); if(start)start.addEventListener('click',startVoiceCall);
3028
3074
  if(ss)ss.addEventListener('change',paintVoiceCallStack);if(mute)mute.addEventListener('click',toggleVoiceMute);if(end)end.addEventListener('click',function(){finishVoiceCall('operator');});
3029
- $('rp-call-camera').addEventListener('click',toggleVoiceCamera);$('rp-call-screen').addEventListener('click',toggleVoiceScreen);$('rp-call-refresh-devices').addEventListener('click',function(){refreshBrowserDevices(true);});
3075
+ $('rp-call-camera').addEventListener('click',toggleVoiceCamera);$('rp-call-screen').addEventListener('click',toggleVoiceScreen);$('rp-call-refresh-devices').addEventListener('click',function(){refreshBrowserDevices(true,true).catch(function(){});});$('rp-call-test-mic').addEventListener('click',testVoiceMicrophone);
3030
3076
  $('rp-call-edit-character').addEventListener('click',function(){var id=$('rp-call-character-select').value;if(id)openCharacterManager(id);else showOut('Choose a character to edit');});
3031
3077
  $('rp-call-new-character').addEventListener('click',function(){openCharacterManager();});
3032
3078
  $('rp-call-edit-stack').addEventListener('click',function(){var s=selectedVoiceStack();if(s)openVoiceStackManager(s.id);else showOut('Choose a voice stack to edit');});
@@ -3036,6 +3082,7 @@ button.act:disabled{opacity:0.5;cursor:default;}
3036
3082
  $('rp-call-chat-toggle').addEventListener('click',toggleTranscript);$('rp-call-collapse').addEventListener('click',toggleTranscript);
3037
3083
  $('rp-call-compose').addEventListener('submit',function(e){e.preventDefault();var input=$('rp-call-message'),text=input.value.trim();if(!text)return;$('rp-call-send').disabled=true;sendVoiceMessage(text).then(function(){input.value='';}).catch(function(err){setVoiceEvent('Message failed',err.message);}).finally(function(){$('rp-call-send').disabled=!rpVoiceCall.room;});});
3038
3084
  refreshBrowserDevices(false);
3085
+ if(navigator.mediaDevices&&navigator.mediaDevices.addEventListener)navigator.mediaDevices.addEventListener('devicechange',function(){refreshBrowserDevices(false).catch(function(){});});
3039
3086
  })();
3040
3087
 
3041
3088
  var rpHistoryFilter = { robot: '', endReason: '', range: '7d', search: '' };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinicode",
3
- "version": "2.8.70",
3
+ "version": "2.8.72",
4
4
  "description": "OpenKernel — provider-agnostic AI execution kernel. Native coding agent + mission-driven execution runtime.",
5
5
  "type": "module",
6
6
  "main": "./dist/kernel/index.js",