@@ -81,7 +81,10 @@ function openDashboard(hash) {
8181
8282gearBtn . addEventListener ( 'click' , ( ) => openDashboard ( ) ) ;
8383
84- settingsLink . addEventListener ( 'click' , ( ) => openDashboard ( 'account' ) ) ;
84+ settingsLink . addEventListener ( 'click' , ( ) => {
85+ chrome . runtime . openOptionsPage ( ) ;
86+ window . close ( ) ;
87+ } ) ;
8588
8689// ------------------------------------------------------------------ auth
8790
@@ -752,6 +755,45 @@ cdpConfirmEnable.addEventListener('click', async () => {
752755 loadCdpMode ( ) ;
753756} ) ;
754757
758+ // ----------------------------------------------------------- version footer
759+
760+ function loadVersionFooter ( ) {
761+ const clientEl = document . getElementById ( 'version-client' ) ;
762+ const serverEl = document . getElementById ( 'version-server' ) ;
763+ if ( ! clientEl || ! serverEl ) return ;
764+
765+ // Client version from manifest + config.js build metadata
766+ const manifest = chrome . runtime . getManifest ( ) ;
767+ const commit = ( typeof ClawMarkConfig !== 'undefined' && ClawMarkConfig . COMMIT ) || '' ;
768+ const buildTime = ( typeof ClawMarkConfig !== 'undefined' && ClawMarkConfig . BUILD_TIME ) || '' ;
769+ let clientText = `v${ manifest . version } ` ;
770+ if ( commit ) clientText += ` (${ commit } )` ;
771+ clientEl . textContent = clientText ;
772+ if ( buildTime ) clientEl . title = `Built: ${ buildTime } ` ;
773+
774+ // Server version from /health
775+ serverEl . textContent = 'server: …' ;
776+ chrome . storage . sync . get ( [ 'serverUrl' ] , async ( result ) => {
777+ const serverUrl = ( result . serverUrl || ( typeof ClawMarkConfig !== 'undefined' && ClawMarkConfig . DEFAULT_SERVER ) || '' ) . replace ( / \/ + $ / , '' ) ;
778+ if ( ! serverUrl ) { serverEl . textContent = 'server: —' ; return ; }
779+ try {
780+ const ctrl = new AbortController ( ) ;
781+ const timer = setTimeout ( ( ) => ctrl . abort ( ) , 3000 ) ;
782+ const resp = await fetch ( `${ serverUrl } /health` , { signal : ctrl . signal } ) ;
783+ clearTimeout ( timer ) ;
784+ if ( ! resp . ok ) throw new Error ( 'not ok' ) ;
785+ const data = await resp . json ( ) ;
786+ let text = `server: v${ data . version || '?' } ` ;
787+ if ( data . commit ) text += ` (${ data . commit } )` ;
788+ serverEl . textContent = text ;
789+ if ( data . buildTime ) serverEl . title = `Server built: ${ data . buildTime } ` ;
790+ } catch {
791+ serverEl . textContent = 'server: offline' ;
792+ serverEl . style . color = '#a55' ;
793+ }
794+ } ) ;
795+ }
796+
755797// ------------------------------------------------------------------ init
756798
757799async function init ( ) {
@@ -761,6 +803,8 @@ async function init() {
761803 if ( isLoggedIn && masterToggle . checked ) {
762804 await loadCdpMode ( ) ;
763805 }
806+ // #2: Show version footer immediately (client part is sync)
807+ loadVersionFooter ( ) ;
764808
765809 // Phase 2: start network calls after the popup has painted
766810 // Use setTimeout(0) to yield to the renderer first
0 commit comments