main
John Lauer Keep Codex turns running across editor reloads; fix hidden-tab startup and composer fade in the optional package 4307d94 1mo ago
'use strict';
const assert = require('node:assert/strict');
const {watchRenderer} = require('../runtime/webview.cjs');
const realSetTimeout = global.setTimeout;
const realClearTimeout = global.clearTimeout;
const timers = new Map();
let id = 0;
global.setTimeout = callback => { timers.set(++id, callback); return id; };
global.clearTimeout = key => timers.delete(key);
try {
  let changed, disposed, failures = 0, ready = false;
  const panel = {visible: false, onDidChangeViewState(fn) { changed = fn; return {dispose() {}}; }};
  const guard = {
    start() { if (ready || this.timeout != null) return; this.timeout = setTimeout(() => failures++); },
    dispose() { ready = true; clearTimeout(this.timeout); this.timeout = undefined; }
  };
  watchRenderer({}, 'panel', {findPanelByWebview: () => panel}, guard, fn => { disposed = fn; return {dispose() {}}; });
  // A restored tab can stay hidden indefinitely: no startup timer exists.
  assert.equal(timers.size, 0);
  panel.visible = true; changed(); assert.equal(timers.size, 1);
  panel.visible = false; changed(); assert.equal(timers.size, 0);
  panel.visible = true; changed(); assert.equal(timers.size, 1);
  guard.dispose(); assert.equal(timers.size, 0);
  changed(); assert.equal(timers.size, 0);
  disposed(); assert.equal(failures, 0);
  let started = false;
  watchRenderer({}, 'sidebar', {}, {start() { started = true; }}, () => {});
  assert.equal(started, true);
  console.log('Passed: hidden/visible/hidden/ready/disposed lifecycle; sidebar unchanged.');
} finally { global.setTimeout = realSetTimeout; global.clearTimeout = realClearTimeout; }