fix: expand workbench session rail in web probe

This commit is contained in:
Codex
2026-06-27 02:39:04 +00:00
parent 2107937b78
commit b4186fbd59
5 changed files with 118 additions and 14 deletions
@@ -1188,12 +1188,21 @@ async function workbenchReadinessSnapshot(targetPage) {
const style = window.getComputedStyle(element);
return rect.width > 0 && rect.height > 0 && style.visibility !== "hidden" && style.display !== "none";
};
const sessionCreate = document.querySelector("#session-create");
const sessionRail = document.querySelector("#session-sidebar");
const sessionCollapseToggle = document.querySelector("#session-collapse-toggle");
return {
url: window.location.href,
path: window.location.pathname,
readyState: document.readyState,
workbenchShellVisible: visible(document.querySelector("#workspace, .workbench-route")),
sessionCreateVisible: visible(document.querySelector("#session-create")),
sessionCreatePresent: Boolean(sessionCreate),
sessionCreateVisible: visible(sessionCreate),
sessionRailPresent: Boolean(sessionRail),
sessionRailCollapsed: sessionRail ? sessionRail.getAttribute("data-collapsed") === "true" || sessionRail.classList.contains("is-collapsed") : null,
sessionCollapseTogglePresent: Boolean(sessionCollapseToggle),
sessionCollapseToggleVisible: visible(sessionCollapseToggle),
sessionCollapseToggleExpanded: sessionCollapseToggle ? sessionCollapseToggle.getAttribute("aria-expanded") : null,
commandInputPresent: visible(document.querySelector("#command-input")),
activeTabPresent: visible(document.querySelector(".session-tab[data-active='true'], .session-tab[aria-selected='true']")),
warningPresent: visible(document.querySelector(".composer-warning")),
@@ -1280,6 +1289,37 @@ function requestFailureSummary(request) {
};
}
async function ensureSessionRailExpanded() {
const before = await workbenchReadinessSnapshot(page);
if (before?.sessionCreateVisible === true) {
return { ok: true, action: "already-visible", before, after: before, valuesRedacted: true };
}
const toggle = page.locator("#session-collapse-toggle").first();
const toggleVisible = await toggle.isVisible({ timeout: 2000 }).catch(() => false);
if (before?.sessionRailCollapsed !== true || !toggleVisible) {
return { ok: false, action: "not-expanded", reason: before?.sessionRailCollapsed === true ? "collapse-toggle-not-visible" : "session-rail-not-collapsed", before, after: before, valuesRedacted: true };
}
await toggle.click();
await page.waitForFunction(() => {
const visible = (element) => {
if (!element) return false;
const rect = element.getBoundingClientRect();
const style = window.getComputedStyle(element);
return rect.width > 0 && rect.height > 0 && style.visibility !== "hidden" && style.display !== "none";
};
const rail = document.querySelector("#session-sidebar");
return Boolean(visible(document.querySelector("#session-create")) || (rail && rail.getAttribute("data-collapsed") === "false"));
}, null, { timeout: 5000 }).catch(() => null);
const after = await workbenchReadinessSnapshot(page);
return {
ok: after?.sessionCreateVisible === true,
action: "expanded-session-rail",
before,
after,
valuesRedacted: true
};
}
async function clickAndWaitForAgentSessionCreate(create) {
let removeRequestFailedListener = () => {};
const requestFailedPromise = new Promise((resolve) => {
@@ -1316,9 +1356,17 @@ async function createSessionFromUi() {
const attempts = [];
let createResponse = null;
for (let attempt = 1; attempt <= 2; attempt += 1) {
const readinessBeforeClick = await workbenchReadinessSnapshot(page);
const railExpansion = await ensureSessionRailExpanded();
const readinessBeforeClick = railExpansion.after || await workbenchReadinessSnapshot(page);
const create = page.locator("#session-create").first();
await create.waitFor({ state: "visible", timeout: 15000 });
try {
await create.waitFor({ state: "visible", timeout: 15000 });
} catch (error) {
const readinessAfterWait = await workbenchReadinessSnapshot(page);
const createError = new Error("newSession session create button is not visible");
createError.details = { beforeUrl, afterUrl: currentPageUrl(), before, attempts, attempt, readinessBeforeClick, readinessAfterWait, railExpansion, waitError: errorSummary(error), pageId, valuesRedacted: true };
throw createError;
}
const createButtonState = await create.evaluate((element) => {
const rect = element.getBoundingClientRect();
const style = window.getComputedStyle(element);
@@ -1335,7 +1383,7 @@ async function createSessionFromUi() {
const outcome = await clickAndWaitForAgentSessionCreate(create);
if (outcome?.kind === "response") {
createResponse = outcome.response;
attempts.push({ attempt, outcome: "response", readinessBeforeClick, createButtonState, valuesRedacted: true });
attempts.push({ attempt, outcome: "response", readinessBeforeClick, railExpansion, createButtonState, valuesRedacted: true });
break;
}
const afterAttempt = await workbenchSessionSnapshot();
@@ -1343,6 +1391,7 @@ async function createSessionFromUi() {
attempt,
outcome: outcome?.kind || "unknown",
readinessBeforeClick,
railExpansion,
createButtonState,
waitError: outcome?.waitError || null,
requestFailure: outcome?.requestFailure || null,