@ -7,7 +7,7 @@
@@ -7,7 +7,7 @@
connected : false ,
loopsLeft : 0 , loopsMax : 0 ,
dailyCount : 0 , dailyMax : 0 ,
resetCbs : [ ] , stopCbs : [ ] , saveCbs : [ ] , startCbs : [ ] , dotMode : null , transport : 'dom' , accLimit : 900000 , lastMetrics : null
resetCbs : [ ] , stopCbs : [ ] , saveCbs : [ ] , startCbs : [ ] , dotMode : null , transport : 'dom' , accLimit : 900000 , lastMetrics : null , forceInject : false
} ;
var el = { } ;
function byId ( id ) { return document . getElementById ( id ) ; }
@ -44,7 +44,7 @@
@@ -44,7 +44,7 @@
var row2 = mk ( 'div' , 'dshmem-row' ) ;
el . save = mk ( 'button' , 'dshmem-btn primary' , 'Save' ) ;
el . health = mk ( 'button' , 'dshmem-btn' , 'Health' ) ;
row2 . appendChild ( el . save ) ; row2 . appendChild ( el . health ) ; el . transportToggle = mk ( 'button' , 'dshmem-btn danger' , 'DOM' ) ; row2 . appendChild ( el . transportToggle ) ; var lblAcc = mk ( 'div' , 'dshmem-label' , 'Acc limit (100%)' ) ; set . appendChild ( lblAcc ) ; el . accLimit = mk ( 'input' , 'dshmem-input' ) ; el . accLimit . type = 'number' ; el . accLimit . autocomplete = 'off' ; el . accLimit . setAttribute ( 'autocomplete' , 'off' ) ; el . accLimit . autocomplete = 'off' ; el . accLimit . setAttribute ( 'autocomplete' , 'off' ) ; el . accLimit . placeholder = '900000' ; el . accLimit . value = '900000' ; set . appendChild ( el . accLimit ) ;
row2 . appendChild ( el . save ) ; row2 . appendChild ( el . health ) ; el . stg = mk ( 'button' , 'dshmem-btn stg' , 'STG' ) ; row2 . appendChild ( el . stg ) ; el . transportToggle = mk ( 'button' , 'dshmem-btn danger' , 'DOM' ) ; row2 . appendChild ( el . transportToggle ) ; var lblAcc = mk ( 'div' , 'dshmem-label' , 'Acc limit (100%)' ) ; set . appendChild ( lblAcc ) ; el . accLimit = mk ( 'input' , 'dshmem-input' ) ; el . accLimit . type = 'number' ; el . accLimit . autocomplete = 'off' ; el . accLimit . setAttribute ( 'autocomplete' , 'off' ) ; el . accLimit . autocomplete = 'off' ; el . accLimit . setAttribute ( 'autocomplete' , 'off' ) ; el . accLimit . placeholder = '900000' ; el . accLimit . value = '900000' ; set . appendChild ( el . accLimit ) ;
set . appendChild ( lbl ) ; set . appendChild ( el . token ) ; set . appendChild ( row2 ) ; set . style . display = 'none' ;
el . body . appendChild ( set ) ;
el . log = mk ( 'div' , 'dshmem-log' ) ;
@ -65,6 +65,7 @@
@@ -65,6 +65,7 @@
el . settingsToggle . addEventListener ( 'click' , function ( ) { var s = el . settings ; if ( s ) { s . style . display = s . style . display === 'none' ? '' : 'none' } } ) ; el . transportToggle . addEventListener ( 'click' , function ( ) { state . transport = state . transport === 'dom' ? 'sse' : 'dom' ; el . transportToggle . textContent = state . transport === 'dom' ? 'DOM' : 'SSE' ; try { chrome . storage . local . set ( { 'dshmem-transport' : state . transport } ) } catch ( e ) { } } ) ; el . reset . addEventListener ( 'click' , function ( ) { el . start . disabled = false ; state . resetCbs . forEach ( function ( cb ) { try { cb ( ) ; } catch ( e ) { } } ) ; } ) ;
el . stop . addEventListener ( 'click' , function ( ) { el . start . disabled = false ; state . stopCbs . forEach ( function ( cb ) { try { cb ( ) ; } catch ( e ) { } } ) ; } ) ; el . start . addEventListener ( 'click' , function ( ) { el . start . disabled = true ; state . startCbs . forEach ( function ( cb ) { try { cb ( ) ; } catch ( e ) { } } ) ; } ) ;
el . accLimit . addEventListener ( 'change' , function ( ) { var n = parseInt ( el . accLimit . value , 10 ) ; if ( ! n || n < 1000 ) n = 900000 ; state . accLimit = n ; try { chrome . storage . local . set ( { 'dshmem-acc-limit' : n } ) } catch ( e ) { } API . setMetrics ( state . lastMetrics ) ; } ) ; el . save . addEventListener ( 'click' , function ( ) { var v = el . token . value || '' ; if ( ! v ) { API . log ( 'token not changed (empty)' ) ; return ; } state . saveCbs . forEach ( function ( cb ) { try { cb ( v ) ; } catch ( e ) { } } ) ; } ) ;
el . stg . addEventListener ( 'click' , function ( ) { API . toggleForceInject ( ) ; } ) ;
el . health . addEventListener ( 'click' , function ( ) {
try { globalThis . DSH _BRIDGE . health ( ) . then ( function ( r ) {
if ( r && r . ok ) { API . setConnected ( true ) ; API . log ( 'health ok, bridge up' ) ; }
@ -76,6 +77,17 @@
@@ -76,6 +77,17 @@
setPhase : function ( p ) { state . phase = p ; if ( el . phase ) el . phase . textContent = p ; } ,
setConnected : function ( b ) { state . connected = ! ! b ; API . _applyDot ( ) ; } , setDot : function ( m ) { state . dotMode = ( m === 'ok' ) ? null : m ; API . _applyDot ( ) ; } , _applyDot : function ( ) { if ( ! el . dot ) return ; var md = state . dotMode || ( state . connected ? 'ok' : 'err' ) ; var cls = 'dshmem-dot' ; if ( md === 'ok' || md === 'err' || md === 'busy' || md === 'ok-busy' ) cls += ' ' + md ; el . dot . className = cls ; } ,
setStartEnabled : function ( b ) { if ( el . start ) el . start . disabled = ! b ; } , setStats : function ( ws , memN , skillN ) { if ( ! el . stats ) return ; el . stats . textContent = 'WS: ' + ( ws || '?' ) + ' mem: ' + ( memN || 0 ) + ' skills: ' + ( skillN || 0 ) ; } , setMetrics : function ( m ) { if ( ! el . metrics ) return ; if ( ! m ) { el . metrics . textContent = 'metrics: —' ; return ; } state . lastMetrics = m ; var _ _pct = 0 ; if ( state . accLimit > 0 ) _ _pct = Math . round ( ( m . accum || 0 ) * 100 / state . accLimit ) ; var _ _cls = 'dshmem-acc-ok' ; if ( _ _pct > 100 ) _ _cls = 'dshmem-acc-crit' ; else if ( _ _pct >= 80 ) _ _cls = 'dshmem-acc-err' ; else if ( _ _pct >= 40 ) _ _cls = 'dshmem-acc-warn' ; el . metrics . className = 'dshmem-stats ' + _ _cls ; el . metrics . textContent = 'acc: ' + m . accum + ' · turn: ' + m . delta + ' · msg: ' + m . chars + 'ch (~' + m . est _tok + 't) ctx ' + ( m . ctx _tok || 0 ) + 't ' + ( m . ctx _pct || 0 ) + 'pct' ; } ,
toggleForceInject : function ( ) {
state . forceInject = ! state . forceInject ;
try { chrome . storage . local . set ( { 'dshmem-force-inject' : state . forceInject } ) } catch ( e ) { }
API . _applyStg ( ) ;
API . log ( 'force inject: ' + ( state . forceInject ? 'ARMED - next send will inject' : 'off' ) ) ;
} ,
_applyStg : function ( ) {
if ( ! el . stg ) return ;
var cls = 'dshmem-btn stg' + ( state . forceInject ? ' armed' : '' ) ;
el . stg . className = cls ;
} ,
log : function ( m ) {
if ( ! el . log ) return ;
var t = new Date ( ) . toLocaleTimeString ( ) ;
@ -120,7 +132,9 @@
@@ -120,7 +132,9 @@
el . preview . onclick = function ( ) { cancelled = true ; clearInterval ( iv ) ; el . preview . style . display = 'none' ; el . preview . onclick = null ; if ( opt . onCancel ) opt . onCancel ( ) ; } ;
} ,
hidePreview : function ( ) { if ( el . preview ) el . preview . style . display = 'none' ; } ,
init : function ( ) { build ( ) ; wire ( ) ; try { chrome . storage . local . get ( 'dshmem-transport' , function ( v ) { if ( v && v [ 'dshmem-transport' ] ) { var tv = v [ 'dshmem-transport' ] ; if ( tv === 'msg' ) tv = 'dom' ; if ( tv === 'xhr' ) tv = 'sse' ; API . setTransport ( tv ) } } ) } catch ( e ) { } try { chrome . storage . local . get ( 'dshmem-acc-limit' , function ( v ) { var n = v && v [ 'dshmem-acc-limit' ] ? parseInt ( v [ 'dshmem-acc-limit' ] , 10 ) : 0 ; if ( n && n >= 1000 ) { state . accLimit = n ; if ( el . accLimit ) el . accLimit . value = String ( n ) ; API . setMetrics ( state . lastMetrics ) ; } } ) } catch ( e ) { } }
init : function ( ) { build ( ) ; wire ( ) ; try { chrome . storage . local . get ( 'dshmem-transport' , function ( v ) { if ( v && v [ 'dshmem-transport' ] ) { var tv = v [ 'dshmem-transport' ] ; if ( tv === 'msg' ) tv = 'dom' ; if ( tv === 'xhr' ) tv = 'sse' ; API . setTransport ( tv ) } } ) } catch ( e ) { } try { chrome . storage . local . get ( 'dshmem-acc-limit' , function ( v ) { var n = v && v [ 'dshmem-acc-limit' ] ? parseInt ( v [ 'dshmem-acc-limit' ] , 10 ) : 0 ; if ( n && n >= 1000 ) { state . accLimit = n ; if ( el . accLimit ) el . accLimit . value = String ( n ) ; API . setMetrics ( state . lastMetrics ) ; } } ) } catch ( e ) { }
try { chrome . storage . local . get ( 'dshmem-force-inject' , function ( v ) { state . forceInject = Boolean ( v && v [ 'dshmem-force-inject' ] ) ; API . _applyStg ( ) ; } ) } catch ( e ) { }
try { chrome . storage . onChanged . addListener ( function ( ch , area ) { if ( area !== 'local' ) return ; if ( ch [ 'dshmem-force-inject' ] ) { state . forceInject = Boolean ( ch [ 'dshmem-force-inject' ] . newValue ) ; API . _applyStg ( ) ; } } ) ; } catch ( e ) { } }
} ;
globalThis . DSHMEM = API ;
if ( document . readyState === 'loading' ) {