<!-- SAGA-STAGING · part 98 -->
t.owner : '?') + '\n' +
      'safety: ' + (sv ? sv.status + '/permit=' + sv.permit : '?') + '\n' +
      'lastReject: ' + (SD.lastRejection || 'none');
  }

  /* Connect to SSE stream for a session epoch */
  SD.connect = function(epoch){
    if(SD.sse){ SD.sse.close(); SD.sse = null; }
    SD.epoch = epoch;
    SD.active = true;
    SD.sessionInvalidated = false;
    SD.lastSeq = -1;
    SD.lastIntentAt = 0;
    SD.acceptedCount = 0;
    SD.rejectedCount = 0;
    SD.lastRejection = null;
    SD.deadManTripped = false;

    sdLog('Connecting SSE for epoch ' + epoch);
    var es = new EventSource('/api/solid-drive/stream?epoch=' + encodeURIComponent(epoch));
    SD.sse = es;

    es.addEventListener('intent', function(ev){
      try {
        var data = JSON.parse(ev.data);
        sdOnIntent(data);
      } catch(e){
        SD.lastRejection = 'sse_parse_error';
        SD.rejectedCount++;
        sdLog('REJECT: sse_parse_error');
      }
      sdUpdateDiag();
    });

    es.onerror = function(){
      sdLog('SSE error/disconnect');
      sdUpdateDiag();
    };

    sdUpdateDiag();
    setInterval(sdUpdateDiag, 500); // refresh diagnostics
  };

  /* Disconnect and release */
  SD.disconnect = function(){
    sdLog('Disconnecting');
    SD.active = false;
    if(SD.sse){ SD.sse.close(); SD.sse = null; }
    if(SD.deadManTimer){ clearTimeout(SD.deadManTimer); SD.deadManTimer = null; }
    try{
      var R = window.ACTOR_RUNTIME;
      if(R){
        R.submitIntent("ai", {moveX:0, moveZ:0});
        R.releaseAI();
        R.authority = "legacy";
      }
    }catch(e){}
    SD.epoch = null;
    sdUpdateDiag();
  };

  /* UI Panel */
  // SD panel hidden — controlled via Cockpit
  var panel = document.createElement('div');
  panel.id = 'sd-panel';
  panel.style.display = 'none';
  // Minimal hidden elements for SD logic (connect/disconnect/status)
  panel.innerHTML =
    '<div id="sd-status"></div>' +
    '<button id="sd-authorize"></button>' +
    '<button id="sd-takeback"></button>' +
    '<div id="sd-diag"></div>' +
    '<div id="sd-out"></div>';
  document.body.appendChild(panel);

  function sdSetStatus(connected, epoch){
    var s = document.getElementById('sd-status');
    var authBtn = document.getElementById('sd-authorize');
    var takeBtn = document.getElementById('sd-takeback');
    if(!s) return;
    if(connected){
      s.textContent = 'SOLID CONNECTED';
      s.style.background = '#1a4a1a';
      s.style.color = '#8f8';
      if(authBtn) authBtn.style.display = 'none';
      if(takeBtn) takeBtn.style.display = 'block';
    } else {
      s.textContent = 'NOT CONNECTED';
      s.style.background = '#222';
      s.style.color = '#888';
      if(authBtn) authBtn.style.display = 'block';
      if(takeBtn) takeBtn.style.display = 'none';
    }
  }

  document.getElementById('sd-authorize').onclick = function(){
    sdClear();
    sdLog('Creating session...');
    // Get CSRF token from page (same pattern as admin test page)
    var csrf = '';
    try {
      var m = document.cookie.match(/csrf=([^;]+)/);
      if(m) csrf = decodeURIComponent(m[1]);
    } catch(e){}
    fetch('/api/solid-drive/session', {
      method: 'POST',
      headers: {'Content-Type': 'application/json', 'x-csrf-token': csrf},
      body: '{}',
      credentials: 'same-origin'
    }).then(function(r){ return r.json(); }).then(function(j){
      if(j.ok && j.epoch){
        sdLog('Session created: ' + j.epoch.substring(0, 18) + '...');
        SD.connect(j.epoch);
        SD._sessionEpoch = j.epoch;
        sdSetStatus(true, j.epoch);
        sdLog('Bridge connected. Solid can now receive intents.');
      } else {
        sdLog('FAILED: ' + JSON.stringify(j));
        sdSetStatus(false);
      }
    }).catch(function(e){
      sdLog('ERROR: ' + e.message);
      sdSetStatus(false);
    });
  };

  document.getElementById('sd-takeback').onclick = function(){
    sdLog('Taking control back...');
    var epoch = SD._sessionEpoch || SD.epoch;
    // Disconnect bridge first (immediate local safety)
    SD.disconnect();
    if(window.AI_DRIVER) window.AI_DRIVER.activeAgent = null;
    sdSetStatus(false);
    // Atomic revoke: token invalidated server-side BEFORE session closes
    if(epoch){
      var csrf = '';
      try {
        var m = document.cookie.match(/csrf=([^;]+)/);
        if(m) csrf = decodeURIComponent(m[1]);
      } catch(e){}
      // Try agent revoke first, fall back to solid-drive close
      fetch('/api/agent-drive/revoke', {
        method: 'POST',
        headers: {'Content-Type': 'application/json', 'x-csrf-token': csrf},
        body: JSON.stringify({epoch: epoch}),
        credentials: 'same-origin'
      }).then(function(r){ return r.json(); }).then(function(j){
        if(j.ok){
          sdLog('Session revoked. Token destroyed.');
        } else {
          // Fall back to legacy close
          return fetch('/api/solid-drive/close', {
            method: 'POST',
        