Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 15 additions & 2 deletions apps/desktop/tests/browser/support/process-runtime-host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
Expand Down
19 changes: 13 additions & 6 deletions apps/desktop/tests/browser/workflow-features-runtime.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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();
Expand Down
Loading