diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4d6fdb368..154cfe774 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1264,11 +1264,25 @@ jobs: with: node-version: 22.18.0 cache: npm - cache-dependency-path: apps/vscode/package-lock.json + cache-dependency-path: | + sdk/package-lock.json + sdk/typescript/package-lock.json + apps/vscode/package-lock.json + - uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0 + with: + go-version: 1.25.0 + cache-dependency-path: sdk/go/go.sum + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: 3.10.18 + - name: Generate and verify the pinned SDK bindings + run: | + ./sdk/scripts/install-codegen-tools + ./sdk/scripts/generate + git diff --exit-code -- sdk - name: Check and build the shared extension run: | cd sdk/typescript - npm ci --ignore-scripts npm run build cd ../../apps/vscode npm ci --ignore-scripts --legacy-peer-deps --install-links diff --git a/apps/desktop/tests/browser/support/process-runtime-host.ts b/apps/desktop/tests/browser/support/process-runtime-host.ts index f05010f82..a79104e5d 100644 --- a/apps/desktop/tests/browser/support/process-runtime-host.ts +++ b/apps/desktop/tests/browser/support/process-runtime-host.ts @@ -55,8 +55,21 @@ export async function processRuntimeHost( for await (const chunk of request) body += chunk.toString(); const parsed = JSON.parse(body); observations.push(parsed); - const call = pending; - pending = null; + // Scheduled tasks share this provider; only the explicit bridge turn may + // consume the armed response. A due task must not steal its tool call. + const input = "Execute the next isolated process acceptance case."; + let explicitTurn = false; + for (const message of parsed.messages ?? []) { + if (message.role !== "user") continue; + explicitTurn = false; + const parts = Array.isArray(message.content) + ? message.content + : [{ type: "text", text: message.content }]; + for (const part of parts) + if (part.type === "text" && part.text === input) explicitTurn = true; + } + const call = explicitTurn ? pending : null; + if (call) pending = null; const delta = call ? { tool_calls: [ diff --git a/apps/desktop/tests/browser/workflow-features-runtime.spec.ts b/apps/desktop/tests/browser/workflow-features-runtime.spec.ts index 7040ff50f..01b185cbd 100644 --- a/apps/desktop/tests/browser/workflow-features-runtime.spec.ts +++ b/apps/desktop/tests/browser/workflow-features-runtime.spec.ts @@ -22,6 +22,17 @@ async function choose(page: Page, name: string, option: string) { await page.getByRole("combobox", { name, exact: true }).click(); await page.getByRole("option", { name: option, exact: true }).click(); } +async function setTheme(page: Page, theme: "light" | "dark") { + await page.evaluate(async (theme) => { + document.documentElement.dataset.theme = theme; + await Promise.allSettled( + document + .getAnimations() + .filter((animation) => animation instanceof CSSTransition) + .map((animation) => animation.finished), + ); + }, theme); +} test("Workflows and Schedules use real manual runs, calendar tasks, model preferences, and exact uncertain-create reconciliation", async ({ page, @@ -389,18 +400,14 @@ test("Workflows and Schedules use real manual runs, calendar tasks, model prefer .fill( "Summarize consequential cybersecurity market developments with source links and actionable implications.", ); - await page.evaluate(() => { - document.documentElement.dataset.theme = "dark"; - }); + await setTheme(page, "dark"); await capture(page, "10-schedule-a-task-dark.png"); const taskAudit = await new AxeBuilder({ page }) .include(".workflow-dialog") .analyze(); expect(taskAudit.violations).toEqual([]); await page.getByRole("button", { name: "Cancel", exact: true }).click(); - await page.evaluate(() => { - document.documentElement.dataset.theme = "light"; - }); + await setTheme(page, "light"); const audit = await new AxeBuilder({ page }) .include(".workflow-surface") .analyze();