From ce883a5e196393c78140d4285659e3415c0ee9a0 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Sun, 30 Aug 2026 21:46:06 +0900 Subject: [PATCH 01/33] fix(gui): give both sidecar cards one shared control band The two sidecar cards did not agree on where their controls start, and at two-up widths they were not rows at all. Two independent causes, both measured in a real browser across all eight shipped locales: 1. The grid track floor was 21rem, which handed out cards of 309-517px of content. The stacking container query fires at 36rem of card, so every two-up card was born already stacked: copy on a full-width line, controls on a second full-width line inheriting `justify-content: flex-end`. The model select floated mid-card with the switch pinned right, which reads as centred. The track floor is now 39rem, clear of the stacking threshold plus the panel's 2x19px padding, so a card the grid places two-up can hold a genuine copy-left / controls-right row. 2. The control groups sized intrinsically and both packed to the card's right edge. They do not hold the same controls -- web search is one select plus a label and a switch (268px at ja, 344px at fr), vision is two selects (408px) -- so equal right edges with unequal widths gave unequal LEFT edges: the two model selects started 225-302px apart depending on locale. The group is now a definite unshrinkable 26rem band with `justify-content: space-between`, and the vision card no longer overrides the band width or the copy basis, so both bands resolve identically. Measured after the change at 1920/1600/1440/1200/1024/900/760/600/430 across ko/en/ru/fr/ja/de/tr/zh: band start delta 0px at every cell, no overflow, no truncated select label, no clipped hint. The streaming label also stops wrapping to three lines, since the band gives it room. Verification: gui/tests/sidecar-layout.test.ts gains two source-oracle tests covering the band and the track floor; both were driven red against the pre-fix values. Full GUI suite 1111 pass / 0 fail, typecheck clean in both roots, lint:gui and build:gui clean. --- gui/src/styles-dashboard-workspace.css | 78 ++++++++++++++++++++------ gui/tests/sidecar-layout.test.ts | 72 ++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 18 deletions(-) diff --git a/gui/src/styles-dashboard-workspace.css b/gui/src/styles-dashboard-workspace.css index 5cce0e3e6e..8fa2a8154c 100644 --- a/gui/src/styles-dashboard-workspace.css +++ b/gui/src/styles-dashboard-workspace.css @@ -69,12 +69,26 @@ } /* Sidecar settings: two panels side by side, gap matches --space-4. - auto-fit collapses to one column before two columns get too narrow for the - title + model select row (~21rem per card), so the select never overlaps or - overflows the card between the old 768px breakpoint and desktop widths. */ + + The track floor is the width at which a card can still render its real layout — copy + on the left, controls on the right, one line. It is NOT merely the width at which the + select stops overflowing. + + That distinction is the bug this number fixes. At 21rem the grid handed out cards of + 309-517px of content, every one of which is below the 36rem stacking query below, so + a two-up card was born already stacked: copy on a full-width line, controls on a + second full-width line inheriting `justify-content: flex-end`. The model select then + floated in the middle of the card with the switch pinned right, which reads as centred + and was reported as such. + + 39rem = 624px of track, 586px of content after the 19px panel padding — clear of the + 576px stacking threshold, so any card the grid places two-up can hold a genuine row. + The ko row is the widest shipped: 14rem copy floor + 16px gap + 10.5rem select + 8px + + the streaming label + 8px + the 34px switch. Below 39rem the grid drops to one column, + where a card is wide enough for the same row rather than a stacked approximation of it. */ .dash-sidecar-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(min(100%, 21rem), 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(100%, 39rem), 1fr)); gap: var(--space-4); /* Stretch, not start: the two sidecar cards are a matched pair, and a hint that wraps to a different line count in one of them should not leave the other @@ -114,15 +128,35 @@ overflow-wrap: break-word; } -/* The copy block yields; the control group holds its intrinsic width. Letting the - controls shrink (`0 1 auto`) does NOT wrap them — `.custom-select` keeps its own - min-width, so the children simply overflow their shrunken container and slide - left under the hint text. Hold the group at content width and make the copy the - only thing that gives way; the narrow-viewport case is handled by stacking the - whole card below. */ +/* The control group is a FIXED SHARED BAND, not an intrinsic width. The copy block is + the only item that yields; the narrow case is handled by stacking the whole card. + + Intrinsic width was the bug. The two groups do not contain the same controls — the + web-search group is one select plus a label and a switch (268px at ja, 344px at fr), + the vision group is two selects (408px) — and both packed to the card's right edge. + Equal right edges plus unequal widths means unequal LEFT edges: the two model selects + began 225-302px apart depending on locale, which is what "start positions differ" + describes. Letting the groups shrink instead (`0 1 auto`) does not fix it and breaks + worse: `.custom-select` keeps its own min-width, so the children overflow their + shrunken container and slide left under the hint text. + + A definite basis with `flex-shrink: 0` makes the band identical in both cards, so the + first control of each starts at the same x by construction rather than by coincidence + of text width. 26rem = 416px is the widest thing that has to fit: the vision select row + at full size (14rem model + 8px + 9rem effort = 408px). The widest web-search row (fr, + 344px) fits with room left, and the band gives its streaming label enough width to stay + on one line instead of wrapping to three. + + `min()` so the basis can never exceed the box it sits in. */ .dash-sidecar-row-card .dash-delegation-controls { - flex: 0 0 auto; + flex: 0 0 min(100%, 26rem); flex-wrap: nowrap; + /* Pack from the band's LEFT edge: that edge is the shared start position. The base + `.dash-delegation-controls` rule packs `flex-end`, which would re-introduce the + original defect inside the band — a narrower group would float right and start late. + `space-between` keeps the trailing switch on the card's right edge, so the row still + reads as label-left / control-right. */ + justify-content: space-between; /* Both control groups reserve the same band AND pack from its top, so the first Select of each card lands on one line. Without the band the web-search group is one 34px select row while the vision group is a 59px column (select row + 12px gap + the @@ -244,24 +278,32 @@ min-height: 3lh; } -/* The shared sidecar copy rule is `flex: 1 1 0` so a one-row control group can - keep its intrinsic width. Vision's control column is two rows, and the number - fields alone are ~24rem; with a 0 basis the title collapses to a one-glyph - column and the card grows to over 1000px tall. Give copy a readable basis so - the card wraps to a stacked layout instead of shrinking the hint. */ +/* The copy block must resolve identically in both cards too, for the same reason the + control band must: copy is the item that absorbs leftover width, so a different basis + here moves the control band's left edge by the difference. This used to override the + shared `flex: 1 1 0` with `1 1 16rem`, which is why the vision band still started at a + different x even when both bands were the same width. Only the floor is restated, and + only because it is identical to the shared one — the rule is kept as the documented + place where a vision-specific copy override would go, if one were ever justified. */ .dash-vision-sidecar-card .dash-sidecar-copy { - flex: 1 1 16rem; min-width: min(100%, 14rem); } +/* Only the axis and the internal stacking are vision-specific. The band itself is + inherited from the shared rule above: overriding `flex` here is what made the two + groups different widths, and therefore different start positions. */ .dash-vision-sidecar-card .dash-delegation-controls { - flex: 1 1 20rem; min-width: 0; max-width: 100%; flex-direction: column; align-items: stretch; flex-wrap: nowrap; gap: 12px; + /* The shared rule's `space-between` is a MAIN-axis value, and this group's main axis is + vertical. Restate `flex-start` so a card that ever has vertical slack packs its two + rows together instead of pushing the advanced disclosure to the card's bottom edge. + The horizontal start position is unaffected: that comes from the band's left edge. */ + justify-content: flex-start; } .dash-vision-select-row { diff --git a/gui/tests/sidecar-layout.test.ts b/gui/tests/sidecar-layout.test.ts index 2b40980155..14bbd02264 100644 --- a/gui/tests/sidecar-layout.test.ts +++ b/gui/tests/sidecar-layout.test.ts @@ -38,6 +38,19 @@ function withoutComments(css: string): string { return css.replace(/\/\*[\s\S]*?\*\//g, ""); } +/** + * Drop every `@container` block, leaving the unconditional cascade. + * + * `allRuleBodies` matches a selector wherever it appears, including inside a container + * query, so a base-rule assertion silently reads the narrow-card overrides too. That is + * not a hypothetical: the stacked regime legitimately sets `flex: 0 1 auto` on the control + * group, which made an "the band never shrinks" assertion fail against a correct + * stylesheet. The row-regime invariants below are about the base rule only. + */ +function baseCascade(css: string): string { + return css.replace(/@container[^{]*\{[\s\S]*?\n\}/g, ""); +} + test("the copy block has a width floor and never breaks per glyph", async () => { const css = withoutComments(await Bun.file(cssUrl).text()); const copy = allRuleBodies(css, ".dash-sidecar-row-card .dash-sidecar-copy"); @@ -95,6 +108,65 @@ test("both control groups reserve the same band and pack from its top", async () expect(controls).toMatch(/align-items:\s*flex-start/); }); +test("both control groups start at the same x: one definite, unshrinkable band", async () => { + const css = baseCascade(withoutComments(await Bun.file(cssUrl).text())); + const controls = allRuleBodies(css, ".dash-sidecar-row-card .dash-delegation-controls"); + + // The two groups hold different controls — web search is one select + label + switch + // (268px at ja, 344px at fr), vision is two selects (408px) — so an intrinsic width + // (`flex: 0 0 auto`) gives them different widths. Both pack toward the card's right + // edge, and equal right edges with unequal widths means unequal LEFT edges: measured + // 225-302px of divergence between the two model selects, locale-dependent. A definite + // basis is what makes the start position structural instead of a text-width accident. + const basis = controls.match(/flex:\s*0\s+0\s+min\(\s*100%\s*,\s*([\d.]+)rem\s*\)/); + expect(basis).not.toBeNull(); + // The band must fit the widest content: the vision select row at full size is + // 14rem + 8px + 9rem = 408px. Below that the selects shrink instead of aligning. + expect(Number(basis![1])).toBeGreaterThanOrEqual(25.5); + + // The band must not shrink in the ROW regime: `flex-shrink` above 0 reintroduces + // per-card widths, the same defect expressed as a shrink factor rather than an + // intrinsic size. The stacked regime is excluded on purpose — there the card is one + // column and `flex: 0 1 auto` with `flex-basis: 100%` is the correct shape. + expect(controls).not.toMatch(/flex:\s*0\s+[1-9]/); + expect(controls).not.toMatch(/flex-shrink:\s*[1-9]/); + + // Inside the band, pack from its LEFT edge. The base `.dash-delegation-controls` rule + // packs `flex-end`; inheriting that would float the narrower group to the band's right + // and start it late, which is the original bug scoped down to the band. + expect(controls).toMatch(/justify-content:\s*space-between/); + + // And the band must be identical in BOTH cards, so the vision card may not override the + // width. Overriding `flex` here is precisely what made the groups different sizes. + const visionControls = allRuleBodies(css, ".dash-vision-sidecar-card .dash-delegation-controls"); + expect(visionControls).not.toMatch(/flex:\s/); + expect(visionControls).not.toMatch(/flex-basis:/); + + // Copy is the item that absorbs leftover width, so a per-card copy basis moves the + // band's left edge by the difference. It must resolve from the shared rule too. + const visionCopy = allRuleBodies(css, ".dash-vision-sidecar-card .dash-sidecar-copy"); + expect(visionCopy).not.toMatch(/flex:\s/); + expect(visionCopy).not.toMatch(/flex-basis:/); +}); + +test("the grid track is wide enough for a real row, not just a non-overflowing one", async () => { + const css = withoutComments(await Bun.file(cssUrl).text()); + const grid = ruleBody(css, ".dash-sidecar-grid"); + const track = grid.match(/minmax\(\s*min\(\s*100%\s*,\s*([\d.]+)rem/); + expect(track).not.toBeNull(); + + // The stacking container query below turns a card into copy-over-controls at 36rem of + // card. A track narrower than that plus the panel's 2x19px padding hands out cards that + // are born stacked — which is what shipped: 21rem produced 309-517px cards, every one + // under the threshold, so the controls sat on a full-width second line inheriting + // `justify-content: flex-end` and read as centred. The track floor must clear the + // stacking threshold, not merely the overflow point. + const stackingQuery = css.match(/@container\s+sidecar-card\s*\(\s*max-width:\s*([\d.]+)rem/); + expect(stackingQuery).not.toBeNull(); + const paddingRem = 38 / 16; + expect(Number(track![1])).toBeGreaterThan(Number(stackingQuery![1]) + paddingRem); +}); + test("both cards wrap, so neither resolves its control group differently", async () => { const css = withoutComments(await Bun.file(cssUrl).text()); const card = allRuleBodies(css, ".dash-sidecar-row-card"); From bd212695c8e1a1af8427b8e080a4964c48e89880 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Sun, 30 Aug 2026 21:48:14 +0900 Subject: [PATCH 02/33] docs(devlog): record the sidecar control-band fix and its rendered evidence Both causes, the measured per-locale start deltas, the before/after captures, and the container-query trap that made a correct stylesheet fail a base-rule assertion. --- .../010_shared_control_band.md | 86 ++++++++++++++++++ .../evidence/010-after-ko-1024.png | Bin 0 -> 99653 bytes .../evidence/010-after-ko-1440.png | Bin 0 -> 105238 bytes .../evidence/010-before-ko-1024.png | Bin 0 -> 90048 bytes .../evidence/010-before-ko-1440.png | Bin 0 -> 86125 bytes 5 files changed, 86 insertions(+) create mode 100644 devlog/_plan/260830_sidecar_control_band/010_shared_control_band.md create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1024.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1440.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/010-before-ko-1024.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/010-before-ko-1440.png diff --git a/devlog/_plan/260830_sidecar_control_band/010_shared_control_band.md b/devlog/_plan/260830_sidecar_control_band/010_shared_control_band.md new file mode 100644 index 0000000000..8d585899b8 --- /dev/null +++ b/devlog/_plan/260830_sidecar_control_band/010_shared_control_band.md @@ -0,0 +1,86 @@ +# Sidecar control band: one shared start position + +Status: shipped on `codex/sidecar-shared-control-band`. + +## Reported symptom + +The two dashboard sidecar cards looked centre-aligned rather than +left-copy / right-controls, and the two model selects did not start at the +same x. + +## Two independent causes + +Both were measured over CDP in a real browser across the eight shipped +locales, not inferred from the stylesheet. + +### 1. Every two-up card was born stacked + +`.dash-sidecar-grid` used a `21rem` track floor. The stacking container query +fires at `36rem` of card. A two-up card therefore had 309-517px of content -- +always under the threshold -- so it entered the stacked regime immediately: +copy on a full-width flex line, controls on a second full-width line +inheriting `justify-content: flex-end` from the shared +`.dash-delegation-controls` rule. The model select floated in the middle of +the card with the switch pinned to the right edge, which is what reads as +centred. + +The track floor is now `39rem`: 624px of track, 586px of content after the +panel's 2x19px padding, clear of the 576px stacking threshold. A card the grid +places two-up can now hold a real row, and below that the grid drops to one +column where a card is wide enough for the same row. + +The general lesson: the track floor is the width at which a card can render +its intended LAYOUT, not the width at which its widest control stops +overflowing. The old comment stated the second and the number satisfied only +that. + +### 2. The two control groups sized intrinsically + +The groups do not hold the same controls. Web search is one select plus a +label and a switch; vision is two selects. Measured natural widths at 1600px: + +| locale | web search | vision | select start delta | +|--------|-----------:|-------:|-------------------:| +| ja | 268px | 569px | 301px | +| ko | 275px | 569px | 294px | +| zh | 272px | 569px | 297px | +| de | 309px | 569px | 260px | +| ru | 326px | 569px | 244px | +| fr | 344px | 569px | 225px | + +Both groups packed to the card's right edge. Equal right edges with unequal +widths gives unequal left edges, so the start position was a function of +translated label width. + +`flex: 0 0 min(100%, 26rem)` makes the band definite and identical in both +cards, with `justify-content: space-between` packing from the band's left +edge while keeping the trailing switch on the card's right. The vision card no +longer overrides the band width or the copy basis: copy absorbs leftover +width, so a per-card copy basis moved the band's left edge by the difference, +which is why equal band widths alone were not sufficient. + +## Rendered verification + +At 1920/1600/1440/1200/1024/900/760/600/430 across ko/en/ru/fr/ja/de/tr/zh: +band start delta 0px at every cell, no horizontal or vertical overflow, no +truncated select label, no clipped hint. The streaming label also stops +wrapping to three lines, because the band gives it room to stay on one. + +Evidence images in `evidence/`. "Before" is the same build with the shipped +declarations reverted by an injected in-browser override, so the pair differs +only by the fix: 571px of select divergence at ko/1440 and 256px at ko/1024, +both 0px after. + +## Regression coverage + +`gui/tests/sidecar-layout.test.ts` gains two source-oracle assertions -- the +definite unshrinkable band with no per-card override, and a track floor that +must exceed the stacking threshold plus padding. Both were driven red against +the pre-fix values before being committed. + +One trap worth recording: `allRuleBodies` matches a selector everywhere it +appears, including inside `@container` blocks, where the stacked regime +legitimately sets `flex: 0 1 auto`. A row-regime assertion read those +overrides and failed against a correct stylesheet. The new `baseCascade` +helper strips container queries so the base-rule invariants are tested against +the base rules only. diff --git a/devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1024.png b/devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..341dfa6f352bc3d8fce10b2025337e7b076dd57d GIT binary patch literal 99653 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 literal 0 HcmV?d00001 diff --git a/devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1440.png b/devlog/_plan/260830_sidecar_control_band/evidence/010-after-ko-1440.png new file mode 100644 index 0000000000000000000000000000000000000000..4a30133aebb29816d3458aa36f28a39133400ea5 GIT binary patch literal 105238 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%0AueUo;Gu(@{arF>MOpLLRr0dMPF7Z<@D{0)vd;> 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

`%(xlA&l`6$6Cx%HA(p15wd!Xb2-BQ688Vby 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 literal 0 HcmV?d00001 diff --git a/devlog/_plan/260830_sidecar_control_band/evidence/010-before-ko-1440.png b/devlog/_plan/260830_sidecar_control_band/evidence/010-before-ko-1440.png new file mode 100644 index 0000000000000000000000000000000000000000..51a58c2a71a29afa1dbcb6f5eeed2d94e4a16e82 GIT binary patch literal 86125 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

ByF695H@0X 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 z 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 literal 0 HcmV?d00001 From c2778ca3a5417b23b19c87d887eb0cce37e268e2 Mon Sep 17 00:00:00 2001 From: JUN Date: Sun, 30 Aug 2026 21:50:31 +0900 Subject: [PATCH 03/33] fix(claude): drop admission credentials paired with a replaced stale proxy (#3005) buildClaudeEnv rewrites a stale loopback ANTHROPIC_BASE_URL to the current launch port but left the credential slots that belonged to that replaced destination in place. An admission token minted by the other proxy is not valid here, and because setDefault preserves any non-empty value this proxy's own key was never injected: hostOwnsAuthentication then decided CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST on stale evidence and the launch left subscription mode, overriding the caller's claude.ai OAuth. Only opencodex's own admission forms are dropped. A user sk-ant- credential is upstream auth that native passthrough needs, so it survives the rewrite. Closes #3004 --- src/cli/claude.ts | 12 ++++++++++++ tests/claude-cli.test.ts | 42 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/cli/claude.ts b/src/cli/claude.ts index ebb77d3359..0b1d74cea7 100644 --- a/src/cli/claude.ts +++ b/src/cli/claude.ts @@ -132,6 +132,18 @@ export function buildClaudeEnv( const replacement = `http://127.0.0.1:${port}`; console.error(`⚠ Replacing stale opencodex ANTHROPIC_BASE_URL ${parsed.origin} with ${replacement}.`); env.ANTHROPIC_BASE_URL = replacement; + // The credentials in this environment were paired with the destination we just + // replaced. An admission secret minted by that other proxy is not valid here, and + // leaving it in place makes Claude Code authenticate as a host-managed provider + // instead of using its own subscription OAuth — the launch then bypasses the + // subscription-preserving default below. Only OUR OWN admission forms are dropped: + // a genuine user `sk-ant-` credential is upstream auth that native passthrough + // needs (server/claude-messages.ts), so it must survive the destination rewrite. + for (const slot of ["ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_API_KEY"] as const) { + const value = env[slot]?.trim(); + if (!value) continue; + if (value === PROXY_MARKER || isProxyAdmissionSecret(value, config)) delete env[slot]; + } } } catch { // Preserve user-provided values that are not parseable URLs. diff --git a/tests/claude-cli.test.ts b/tests/claude-cli.test.ts index aa0950a9b8..f98b6ff80c 100644 --- a/tests/claude-cli.test.ts +++ b/tests/claude-cli.test.ts @@ -270,6 +270,48 @@ describe("ocx claude env assembly", () => { expect(env.ANTHROPIC_SMALL_FAST_MODEL).toBeUndefined(); }); + // A stale loopback ANTHROPIC_BASE_URL is rewritten to this launch's port. The credentials + // in that environment were minted by the proxy we just stopped pointing at, so keeping + // them makes Claude Code launch as a host-managed provider instead of using its own + // subscription OAuth. + test("replacing a stale loopback base URL drops the admission credential paired with it", () => { + // This proxy requires no admission key, so the launch must stay in subscription mode. + // The inherited token was minted by the proxy on :19999 that we just stopped targeting. + const env = buildClaudeEnv(cfg(), 10100, { + ANTHROPIC_BASE_URL: "http://127.0.0.1:19999", + ANTHROPIC_AUTH_TOKEN: "ocx_data_other_proxy_key", + }, {}, { ...AUTH_PRESENT, preBunAnthropicSlots: ["ANTHROPIC_BASE_URL", "ANTHROPIC_AUTH_TOKEN"] }); + expect(env.ANTHROPIC_BASE_URL).toBe("http://127.0.0.1:10100"); + // A surviving token makes Claude Code authenticate as a host-managed provider and + // overrides the caller's own claude.ai OAuth. + expect(env.ANTHROPIC_AUTH_TOKEN).toBeUndefined(); + expect(env.ANTHROPIC_API_KEY).toBeUndefined(); + }); + + test("a stale admission token is replaced by THIS proxy's key, never carried over", () => { + const env = buildClaudeEnv( + cfg({ apiKeys: [{ id: "k1", name: "local", key: "ocx_data_this_proxy_key", createdAt: "2026-01-01T00:00:00Z" }] }), + 10100, + { + ANTHROPIC_BASE_URL: "http://127.0.0.1:19999", + ANTHROPIC_AUTH_TOKEN: "ocx_data_other_proxy_key", + }, + {}, + { ...AUTH_PRESENT, preBunAnthropicSlots: ["ANTHROPIC_BASE_URL", "ANTHROPIC_AUTH_TOKEN"] }, + ); + expect(env.ANTHROPIC_BASE_URL).toBe("http://127.0.0.1:10100"); + expect(env.ANTHROPIC_AUTH_TOKEN).toBe("ocx_data_this_proxy_key"); + }); + + test("a user sk-ant- credential survives the stale base-URL rewrite (native passthrough auth)", () => { + const env = buildClaudeEnv(cfg(), 10100, { + ANTHROPIC_BASE_URL: "http://127.0.0.1:19999", + ANTHROPIC_API_KEY: "sk-ant-user-owned-key", + }, {}, { ...AUTH_PRESENT, preBunAnthropicSlots: ["ANTHROPIC_BASE_URL", "ANTHROPIC_API_KEY"] }); + expect(env.ANTHROPIC_BASE_URL).toBe("http://127.0.0.1:10100"); + expect(env.ANTHROPIC_API_KEY).toBe("sk-ant-user-owned-key"); + }); + }); describe("ocx claude Windows launch (devlog 260715_cross_platform_audit/020)", () => { From 73eb88b7f2aef45ad0fd3d93253c102e1a9ee2c9 Mon Sep 17 00:00:00 2001 From: bitkyc08-arch Date: Sun, 30 Aug 2026 21:58:49 +0900 Subject: [PATCH 04/33] fix(gui): move the streaming toggle to its own right-aligned row The web-search card's streaming switch sat beside the model select on a single line. Inside the shared 26rem control band that label had nowhere to go: it wrapped to three lines at ko/ja/tr and dragged the switch off the card's right edge. Both cards now hold the same two-row structure the vision card already had -- a select row, then a right-aligned trailing row for the card's secondary control (the streaming switch here, the advanced disclosure there). The column axis, gap, and packing moved from the vision-only rule to the shared one, since nothing about them is vision-specific any more, and the two row classes were renamed `dash-sidecar-select-row` / `dash-sidecar-trailing-row` to match their now-shared use. Measured at 1920/1600/1440/1200/1024/900/760/600/430 across ko/en/ru/fr/ja/de/tr/zh: both model selects share an x, both select rows share a y, both trailing rows share a y and sit flush to the card's right edge, the streaming label stays on one line everywhere, and nothing truncates or overflows. Verification: gui/tests/sidecar-layout.test.ts updated for the two-row shape (column axis, top packing, stretched rows). Full GUI suite 1111 pass / 0 fail, typecheck clean in both roots, lint:gui, build:gui, and privacy:scan clean. --- .../evidence/020-after-en-1600.png | Bin 0 -> 137963 bytes .../evidence/020-after-ko-1024.png | Bin 0 -> 98321 bytes .../evidence/020-after-ko-1440.png | Bin 0 -> 105732 bytes .../evidence/020-after-ru-1440.png | Bin 0 -> 168544 bytes gui/src/pages/dashboard-overview-sections.tsx | 34 ++++---- gui/src/styles-dashboard-workspace.css | 76 ++++++++++-------- gui/tests/sidecar-layout.test.ts | 32 +++++--- 7 files changed, 83 insertions(+), 59 deletions(-) create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/020-after-en-1600.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/020-after-ko-1024.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/020-after-ko-1440.png create mode 100644 devlog/_plan/260830_sidecar_control_band/evidence/020-after-ru-1440.png diff --git a/devlog/_plan/260830_sidecar_control_band/evidence/020-after-en-1600.png b/devlog/_plan/260830_sidecar_control_band/evidence/020-after-en-1600.png new file mode 100644 index 0000000000000000000000000000000000000000..098f9ac140dc2556102ac704027796a750a6ae98 GIT binary patch literal 137963 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
{t("dash.webSearchSidecarHint")}
+ {/* Same two-row shape as the vision card: the model select owns the first row, + and the secondary control sits right-aligned on its own row below. Sharing the + structure is what keeps the two cards' first rows on one line — the streaming + label used to sit beside the select and wrap to three lines in ko/ja/tr. */}
- { + void saveSidecar({ webSearch: webSearchSidecarSelectionForModel(models, sidecarModels, model) }); + }} + disabled={!sidecar || sidecarSaving} + label={t("dash.sidecarModel")} + align="right" + /> +
+
+ {t("dash.webSearchStream")}
-
+
setAutoRefresh(e.target.checked)} /> {t("logs.autoRefresh")} + + + )}
@@ -635,6 +663,9 @@ export default function Logs({ apiBase }: { apiBase: string }) { {t("logs.filter.conversation.clear")} )} + + {t("logs.bufferCount", { shown: filteredLogs.length, total: logs.length })} +
{conversationTotals && ( From c7c94cf0c397878d183dfa1dbb7f6b00d4b58fe9 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 17:04:32 -0400 Subject: [PATCH 09/33] fix(dashboard): harden clear view, auto-scroll, batch testing; add 20 GUI tests - Logs: replace Date.now()-based clear view boundary with requestId-based index boundary (eliminates client/server clock skew) - Logs: use virtualizer scrollToIndex() for auto-scroll instead of direct DOM scrollTop manipulation - Logs: reset clear boundary on apiBase/resourceKey change - Providers: add concurrency-limited batch testing (pool of 3), handle non-2xx/invalid-JSON/network errors gracefully - Add 20 GUI tests: dashboard provider status (6), logs clear/scroll (8), provider batch testing (6) --- gui/src/pages/Logs.tsx | 32 +- gui/src/pages/Providers.tsx | 32 +- gui/tests/dashboard-manager-overview.test.tsx | 138 +++++++ gui/tests/logs-clear-scroll.test.tsx | 341 ++++++++++++++++++ gui/tests/providers-batch-test.test.tsx | 265 ++++++++++++++ 5 files changed, 783 insertions(+), 25 deletions(-) create mode 100644 gui/tests/dashboard-manager-overview.test.tsx create mode 100644 gui/tests/logs-clear-scroll.test.tsx create mode 100644 gui/tests/providers-batch-test.test.tsx diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index 0e8b9d219d..684213706a 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useRef, useState } from "react"; import { useVirtualizer } from "@tanstack/react-virtual"; import { useI18n, LOCALES, type TFn } from "../i18n/shared"; import { formatProviderDisplayName } from "../provider-icons"; @@ -366,7 +366,9 @@ export default function Logs({ apiBase }: { apiBase: string }) { const cachedLogs = validCachedLogs(readSessionListCache(resourceKey)); const [autoRefresh, setAutoRefresh] = useState(true); const [autoScroll, setAutoScroll] = useState(true); - const [clearedAt, setClearedAt] = useState(null); + const [clearedBoundaryId, setClearedBoundaryId] = useState(null); + + useEffect(() => { setClearedBoundaryId(null); }, [resourceKey]); const [failureStreak, setFailureStreak] = useState<{ error: unknown; count: number }>( { error: null, count: 0 }, ); @@ -510,13 +512,17 @@ export default function Logs({ apiBase }: { apiBase: string }) { return () => { cancelled = true; }; }, [conversationQuery]); - // Clear view: stash current logs and show only new entries after the clear point. + const logsRef = useRef(logs); + logsRef.current = logs; const clearView = useCallback(() => { - setClearedAt(Date.now()); + setClearedBoundaryId(logsRef.current[0]?.requestId ?? null); }, []); - const visibleLogs = clearedAt !== null - ? logs.filter(log => log.timestamp > clearedAt) - : logs; + const visibleLogs = (() => { + if (clearedBoundaryId === null) return logs; + const idx = logs.findIndex(l => l.requestId === clearedBoundaryId); + if (idx < 0) return logs; + return logs.slice(0, idx); + })(); const filteredLogs = visibleLogs.filter(log => ( logMatchesSurface(log, surfaceFilter) @@ -539,14 +545,14 @@ export default function Logs({ apiBase }: { apiBase: string }) { ? rowVirtualizer.getTotalSize() - virtualRows[virtualRows.length - 1].end : 0; - // Auto-scroll to bottom when new entries arrive and autoScroll is enabled. const prevCountRef = useRef(filteredLogs.length); - useLayoutEffect(() => { - if (autoScroll && filteredLogs.length > prevCountRef.current && scrollContainerRef.current) { - scrollContainerRef.current.scrollTop = scrollContainerRef.current.scrollHeight; + useEffect(() => { + if (filteredLogs.length === 0) { prevCountRef.current = 0; return; } + if (autoScroll && filteredLogs.length > prevCountRef.current) { + rowVirtualizer.scrollToIndex(filteredLogs.length - 1, { align: "end" }); } prevCountRef.current = filteredLogs.length; - }, [filteredLogs.length, autoScroll]); + }, [filteredLogs.length, autoScroll, rowVirtualizer]); return (
@@ -562,7 +568,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { setAutoScroll(e.target.checked)} /> {t("logs.autoScroll")} - diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 4e997377d7..3dee886702 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -21,13 +21,15 @@ import { ProvidersPageModals } from "./providers-page-modals"; import { buildAccountLoginStatus, buildAddModalAccountRows } from "./providers-page-utils"; import type { CodexAccountMutationCompletion } from "../codex-account-mutation"; -interface TestResult { - ok: boolean; - latencyMs: number; +type ConnectionTestResult = { + ok?: boolean; + latencyMs?: number; error?: string; message?: string; applicable?: boolean; -} +}; + +const TEST_CONCURRENCY = 3; export default function Providers({ apiBase }: { apiBase: string }) { const t = useT(); @@ -82,18 +84,24 @@ export default function Providers({ apiBase }: { apiBase: string }) { const names = Object.keys(config.providers); if (names.length === 0) return; setBatchTesting(true); - const results: Record = {}; - await Promise.allSettled( - names.map(async (name) => { + const results: Record = {}; + for (let i = 0; i < names.length; i += TEST_CONCURRENCY) { + const batch = names.slice(i, i + TEST_CONCURRENCY); + await Promise.allSettled(batch.map(async (name) => { try { const res = await fetch(`${apiBase}/api/providers/test?${new URLSearchParams({ name })}`, { method: "POST" }); - const body = (await res.json()) as TestResult; - results[name] = body; + if (!res.ok) { + results[name] = { ok: false, error: `HTTP ${res.status}` }; + return; + } + let body: unknown; + try { body = await res.json(); } catch { results[name] = { ok: false, error: "Invalid response" }; return; } + results[name] = body as ConnectionTestResult; } catch { - results[name] = { ok: false, latencyMs: 0, error: "Network error" }; + results[name] = { ok: false, error: "Network error" }; } - }), - ); + })); + } if (aliveRef.current) { setBatchTesting(false); const passed = Object.values(results).filter(r => r.ok).length; diff --git a/gui/tests/dashboard-manager-overview.test.tsx b/gui/tests/dashboard-manager-overview.test.tsx new file mode 100644 index 0000000000..8a7d43f3b6 --- /dev/null +++ b/gui/tests/dashboard-manager-overview.test.tsx @@ -0,0 +1,138 @@ +import { afterEach, beforeEach, expect, jest, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act } from "react"; +import { LanguageProvider } from "../src/i18n/provider"; +import { DashboardProvidersSection } from "../src/pages/dashboard-providers-section"; +import type { ProviderInfo } from "../src/pages/dashboard-shared"; + +const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT"] as const; +let previousGlobals: Record<(typeof globals)[number], unknown>; +let testWindow: Window; + +beforeEach(() => { + previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + testWindow = new Window({ url: "http://localhost/#dashboard" }); + Object.defineProperties(globalThis, { + document: { configurable: true, value: testWindow.document }, + window: { configurable: true, value: testWindow }, + navigator: { configurable: true, value: testWindow.navigator }, + localStorage: { configurable: true, value: testWindow.localStorage }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; +}); + +afterEach(() => { + testWindow.close(); + for (const key of globals) { + Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + } +}); + +function makeT(): (key: string, vars?: Record) => string { + const dict: Record = { + "dash.activeProviders": "Active Providers", + "dash.noProviders": "No providers found. Run `ocx init` to get started.", + "dash.col.name": "Name", + "dash.col.adapter": "Adapter", + "dash.col.baseUrl": "Base URL", + "dash.col.model": "Model", + "dash.col.status": "Status", + "dash.providerStatus.ok": "Healthy", + "dash.providerStatus.error": "Error", + "dash.providerStatus.disabled": "Disabled", + "dash.providerStatus.unknown": "Unknown", + "dash.port": "Port", + }; + return (key: string) => dict[key] ?? key; +} + +async function renderSection(providers: ProviderInfo[]): Promise<{ container: HTMLElement; root: ReturnType }> { + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: ReturnType; + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + return { container, root }; +} + +const baseProvider: ProviderInfo = { + name: "openai", + adapter: "openai-responses", + baseUrl: "https://api.openai.com", + hasApiKey: true, +}; + +function getStatusChip(container: HTMLElement): HTMLElement | null { + const row = container.querySelector("tbody tr"); + if (!row) return null; + const cells = row.querySelectorAll("td"); + const lastCell = cells[cells.length - 1]; + return lastCell?.querySelector(".chip") ?? null; +} + +function chipHasColor(chip: HTMLElement, color: string): boolean { + return (chip.getAttribute("style") ?? "").includes(color); +} + +test("DashboardProvidersSection: ok discovery shows Healthy in green", async () => { + const { container, root } = await renderSection([ + { ...baseProvider, discovery: { status: "ok" } }, + ]); + const chip = getStatusChip(container)!; + expect(chip).not.toBeNull(); + expect(chip.textContent).toContain("Healthy"); + expect(chipHasColor(chip, "var(--green)")).toBe(true); + await act(async () => { root.unmount(); }); +}); + +test("DashboardProvidersSection: failed discovery shows Error in red", async () => { + const { container, root } = await renderSection([ + { ...baseProvider, discovery: { status: "failed", reason: "http", httpStatus: 401 } }, + ]); + const chip = getStatusChip(container)!; + expect(chip.textContent).toContain("Error"); + expect(chipHasColor(chip, "var(--red)")).toBe(true); + await act(async () => { root.unmount(); }); +}); + +test("DashboardProvidersSection: disabled provider shows Disabled", async () => { + const { container, root } = await renderSection([ + { ...baseProvider, disabled: true, discovery: { status: "ok" } }, + ]); + const chip = getStatusChip(container)!; + expect(chip.textContent).toContain("Disabled"); + expect(chipHasColor(chip, "var(--muted)")).toBe(true); + await act(async () => { root.unmount(); }); +}); + +test("DashboardProvidersSection: no discovery data shows Unknown", async () => { + const { container, root } = await renderSection([ + { ...baseProvider }, + ]); + const chip = getStatusChip(container)!; + expect(chip.textContent).toContain("Unknown"); + expect(chipHasColor(chip, "var(--muted)")).toBe(true); + await act(async () => { root.unmount(); }); +}); + +test("DashboardProvidersSection: empty list shows empty state", async () => { + const { container, root } = await renderSection([]); + expect(container.textContent).toContain("No providers configured"); + expect(container.querySelector("table")).toBeNull(); + await act(async () => { root.unmount(); }); +}); + +test("DashboardProvidersSection: status column header is present", async () => { + const { container, root } = await renderSection([baseProvider]); + const ths = [...container.querySelectorAll("thead th")]; + const lastTh = ths[ths.length - 1]; + expect(lastTh?.textContent).toBe("Status"); + await act(async () => { root.unmount(); }); +}); diff --git a/gui/tests/logs-clear-scroll.test.tsx b/gui/tests/logs-clear-scroll.test.tsx new file mode 100644 index 0000000000..64e653170b --- /dev/null +++ b/gui/tests/logs-clear-scroll.test.tsx @@ -0,0 +1,341 @@ +import { afterEach, beforeEach, expect, jest, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act } from "react"; +import type { Root } from "react-dom/client"; +import { LanguageProvider } from "../src/i18n/provider"; +import { clearClientResourceStoresForTests } from "../src/client-resource"; +import Logs from "../src/pages/Logs"; + +const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver"] as const; +let previousGlobals: Record<(typeof globals)[number], unknown>; +let testWindow: Window; +const originalFetch = globalThis.fetch; + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { "content-type": "application/json" }, + }); +} + +function installLayoutStubs(win: Window): void { + const proto = win.HTMLElement.prototype as unknown as HTMLElement; + Object.defineProperty(proto, "clientHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "clientWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "offsetHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "offsetWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "scrollHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "getBoundingClientRect", { + configurable: true, + value() { + return { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }; + }, + }); + class ResizeObserverStub { + #cb: ResizeObserverCallback; + constructor(cb: ResizeObserverCallback) { this.#cb = cb; } + observe(target: Element) { + this.#cb([{ target, contentRect: { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }, borderBoxSize: [], contentBoxSize: [], devicePixelContentBoxSize: [] } as unknown as ResizeObserverEntry], this as unknown as ResizeObserver); + } + unobserve() {} + disconnect() {} + } + Object.defineProperty(globalThis, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); + Object.defineProperty(win, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); +} + +function makeLog(id: string, ts: number) { + return { + requestId: id, + timestamp: ts, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; +} + +const log1 = makeLog("r-aaa", 1_700_000_000_000); +const log2 = makeLog("r-bbb", 1_700_000_001_000); +const log3 = makeLog("r-ccc", 1_700_000_002_000); +const log4 = makeLog("r-ddd", 1_700_000_003_000); +const log5 = makeLog("r-eee", 1_700_000_004_000); + +beforeEach(() => { + previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + testWindow = new Window({ url: "http://localhost/#logs" }); + Object.defineProperties(globalThis, { + document: { configurable: true, value: testWindow.document }, + window: { configurable: true, value: testWindow }, + navigator: { configurable: true, value: testWindow.navigator }, + localStorage: { configurable: true, value: testWindow.localStorage }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + installLayoutStubs(testWindow); + jest.useFakeTimers({ now: 1_700_000_000_000 }); + clearClientResourceStoresForTests(); +}); + +afterEach(() => { + jest.useRealTimers(); + globalThis.fetch = originalFetch; + clearClientResourceStoresForTests(); + testWindow.close(); + for (const key of globals) { + Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + } +}); + +async function mountLogs(): Promise<{ root: Root; container: HTMLElement }> { + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: Root; + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + await act(async () => { + jest.advanceTimersByTime(0); + await Promise.resolve(); + }); + return { root, container }; +} + +async function flushMicrotasks(): Promise { + await act(async () => { await Promise.resolve(); await Promise.resolve(); }); +} + +function findClearButton(container: HTMLElement): HTMLButtonElement | null { + return [...container.querySelectorAll("button")].find( + btn => btn.textContent?.trim() === "Clear view", + ) ?? null; +} + +function findAutoScrollCheckbox(container: HTMLElement): HTMLInputElement | null { + return [...container.querySelectorAll('input[type="checkbox"]')].find( + input => input.closest("label")?.textContent?.includes("Auto-scroll"), + ) as HTMLInputElement | null; +} + +function hasLogRow(container: HTMLElement, id: string): boolean { + return container.textContent?.includes(id) ?? false; +} + +test("Logs: clear view hides existing logs", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log2, log1]); + return jsonResponse([log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(hasLogRow(container, "r-aaa")).toBe(true); + + const btn = findClearButton(container)!; + expect(btn).not.toBeNull(); + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + expect(hasLogRow(container, "r-aaa")).toBe(false); + expect(hasLogRow(container, "r-bbb")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: clear view boundary is requestId-based, not clock-based", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + // Server returns newest-first + if (callCount <= 1) return jsonResponse([log3, log2, log1]); + return jsonResponse([log4, log3, log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(hasLogRow(container, "r-ccc")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // All old entries hidden + expect(hasLogRow(container, "r-aaa")).toBe(false); + + // New poll triggers re-fetch; boundary (r-ccc) is at index 1, slice(0,1)=[log4] + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(hasLogRow(container, "r-ddd")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: new logs after clear view are shown", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log1]); + return jsonResponse([log5, log4, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(hasLogRow(container, "r-aaa")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(hasLogRow(container, "r-aaa")).toBe(false); + + // Poll again with new entries at front (newest first) + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(hasLogRow(container, "r-ddd")).toBe(true); + expect(hasLogRow(container, "r-eee")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: buffer count shows shown/total", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log3, log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(container.textContent).toContain("3 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: buffer count updates after clear", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log3, log2, log1]); + return jsonResponse([log4, log3, log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(container.textContent).toContain("3 / 3"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // After clear, new poll brings 1 new entry (log4) + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(container.textContent).toContain("1 / 4"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: auto-scroll checkbox toggles", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + const checkbox = findAutoScrollCheckbox(container)!; + expect(checkbox).not.toBeNull(); + expect(checkbox.checked).toBe(true); + + await act(async () => { checkbox.closest("label")!.click(); }); + await flushMicrotasks(); + expect(checkbox.checked).toBe(false); + + await act(async () => { checkbox.closest("label")!.click(); }); + await flushMicrotasks(); + expect(checkbox.checked).toBe(true); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: empty list does not crash and shows empty state", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(container.textContent).toContain("No requests yet."); + + const btn = findClearButton(container); + // Button should not exist or be absent when there's nothing to clear + if (btn) { + expect(btn.disabled).toBe(true); + } + + await act(async () => { root.unmount(); }); +}); + +test("Logs: clear view after apiBase change resets boundary", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(hasLogRow(container, "r-aaa")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(hasLogRow(container, "r-aaa")).toBe(false); + + await act(async () => { root.unmount(); }); + clearClientResourceStoresForTests(); + + let root2!: Root; + const container2 = document.createElement("div"); + document.body.append(container2); + await act(async () => { + const { createRoot } = await import("react-dom/client"); + root2 = createRoot(container2); + root2.render( + + + , + ); + }); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(hasLogRow(container2, "r-aaa")).toBe(true); + + await act(async () => { root2.unmount(); }); +}); diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx new file mode 100644 index 0000000000..9751a10941 --- /dev/null +++ b/gui/tests/providers-batch-test.test.tsx @@ -0,0 +1,265 @@ +import { afterEach, beforeEach, expect, jest, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act } from "react"; +import type { Root } from "react-dom/client"; +import { LanguageProvider } from "../src/i18n/provider"; +import { clearClientResourceStoresForTests } from "../src/client-resource"; +import Providers from "../src/pages/Providers"; + +const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver"] as const; +let previousGlobals: Record<(typeof globals)[number], unknown>; +let testWindow: Window; +const originalFetch = globalThis.fetch; + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { "content-type": "application/json" }, + }); +} + +function installLayoutStubs(win: Window): void { + const proto = win.HTMLElement.prototype as unknown as HTMLElement; + Object.defineProperty(proto, "clientHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "clientWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "offsetHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "offsetWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "scrollHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "getBoundingClientRect", { + configurable: true, + value() { + return { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }; + }, + }); + class ResizeObserverStub { + #cb: ResizeObserverCallback; + constructor(cb: ResizeObserverCallback) { this.#cb = cb; } + observe(target: Element) { + this.#cb([{ target, contentRect: { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }, borderBoxSize: [], contentBoxSize: [], devicePixelContentBoxSize: [] } as unknown as ResizeObserverEntry], this as unknown as ResizeObserver); + } + unobserve() {} + disconnect() {} + } + Object.defineProperty(globalThis, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); + Object.defineProperty(win, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); +} + +const configResponse = { + providers: { + openai: { adapter: "openai-responses", baseUrl: "https://api.openai.com" }, + anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, + }, +}; + +const emptyConfigResponse = { providers: {} }; + +function makeFetchHandler( + calls: string[], + opts?: { + config?: unknown; + test?: (url: string) => Response | Promise | never; + }, +) { + return (async (input: RequestInfo | URL) => { + const url = String(input); + if (url.includes("/api/config")) return jsonResponse(opts?.config ?? configResponse); + if (url.includes("/api/providers/test")) { + calls.push(url); + if (opts?.test) return opts.test(url); + return jsonResponse({ ok: true, latencyMs: 50 }); + } + if (url.includes("/api/providers")) return jsonResponse([]); + if (url.includes("/api/codex-accounts")) return jsonResponse([]); + if (url.includes("/api/oauth")) return jsonResponse({ providers: [] }); + if (url.includes("/api/provider-presets")) return jsonResponse([]); + if (url.includes("/api/usage")) return jsonResponse({ range: "30d", summary: { requests: 0, totalTokens: 0, estimatedCostUsd: 0 }, models: [], providers: [], accounts: [], days: [] }); + if (url.includes("/api/settings")) return jsonResponse({ port: 10100, hostname: "127.0.0.1", timeZone: "UTC" }); + return jsonResponse({}); + }) as typeof fetch; +} + +beforeEach(() => { + previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + testWindow = new Window({ url: "http://localhost/#providers" }); + Object.defineProperties(globalThis, { + document: { configurable: true, value: testWindow.document }, + window: { configurable: true, value: testWindow }, + navigator: { configurable: true, value: testWindow.navigator }, + localStorage: { configurable: true, value: testWindow.localStorage }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + installLayoutStubs(testWindow); + jest.useFakeTimers({ now: 1_700_000_000_000 }); + clearClientResourceStoresForTests(); +}); + +afterEach(() => { + jest.useRealTimers(); + globalThis.fetch = originalFetch; + clearClientResourceStoresForTests(); + testWindow.close(); + for (const key of globals) { + Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + } +}); + +async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; container: HTMLElement }> { + globalThis.fetch = fetchFn; + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: Root; + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + // Let config fetch resolve + render + for (let i = 0; i < 5; i++) { + await act(async () => { + jest.advanceTimersByTime(0); + await Promise.resolve(); + await Promise.resolve(); + }); + } + return { root, container }; +} + +/** Drive the component through multiple act cycles so async batch completes + state commits. */ +async function driveAsyncBatch(): Promise { + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + await act(async () => { jest.advanceTimersByTime(200); }); + for (let i = 0; i < 5; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } +} + +function findTestAllButton(container: HTMLElement): HTMLButtonElement | null { + return [...container.querySelectorAll("button")].find( + btn => btn.textContent?.includes("Test All"), + ) ?? null; +} + +test("Providers: Test All sends requests for each provider", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls)); + + const btn = findTestAllButton(container)!; + expect(btn).not.toBeNull(); + expect(btn.disabled).toBe(false); + + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + expect(calls.length).toBeGreaterThanOrEqual(2); + expect(calls.some(u => u.includes("name=openai"))).toBe(true); + expect(calls.some(u => u.includes("name=anthropic"))).toBe(true); + + await act(async () => { root.unmount(); }); +}); + +test("Providers: Test All counts partial failures correctly", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + test: (url) => { + if (url.includes("name=openai")) return jsonResponse({ ok: true, latencyMs: 50 }); + return jsonResponse({ ok: false, error: "invalid key" }); + }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + // Both providers were tested + expect(calls.length).toBeGreaterThanOrEqual(2); + expect(calls.some(u => u.includes("name=openai"))).toBe(true); + expect(calls.some(u => u.includes("name=anthropic"))).toBe(true); + + // Button should be re-enabled (batchTesting=false) + expect(findTestAllButton(container)).not.toBeNull(); + + await act(async () => { root.unmount(); }); +}); + +test("Providers: Test All counts non-2xx as failure", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + test: () => jsonResponse({ error: "server error" }, 500), + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + // Both providers were tested + expect(calls.length).toBeGreaterThanOrEqual(2); + expect(findTestAllButton(container)).not.toBeNull(); + + await act(async () => { root.unmount(); }); +}); + +test("Providers: Test All handles network error", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + test: () => { throw new TypeError("fetch failed"); }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + expect(calls.length).toBeGreaterThanOrEqual(2); + expect(findTestAllButton(container)).not.toBeNull(); + + await act(async () => { root.unmount(); }); +}); + +test("Providers: Test All with no providers sends no test requests", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: emptyConfigResponse, + })); + + // Button is always rendered but clicking with empty config does nothing + const btn = findTestAllButton(container); + if (btn) { + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + } + // No test requests should have been sent + expect(calls).toHaveLength(0); + + await act(async () => { root.unmount(); }); +}); + +test("Providers: Test All button re-enables after completion", async () => { + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls)); + + const btn = findTestAllButton(container)!; + expect(btn.disabled).toBe(false); + + await act(async () => { btn.click(); }); + // After batch completes, button should be re-enabled + await driveAsyncBatch(); + + // Button should be present and enabled (batchTesting=false) + const btnAfter = findTestAllButton(container); + expect(btnAfter).not.toBeNull(); + expect(btnAfter!.disabled).toBe(false); + + await act(async () => { root.unmount(); }); +}); From 3d1a28ffbdd52edd090347c5218901ee4a28802b Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 17:49:36 -0400 Subject: [PATCH 10/33] fix(logs): make cleared views stable across legacy and evicted entries - Replace requestId-based boundary with Set of log identity keys - Extract logKey() to src/log-key.ts (rid: prefix for requestId, composite fallback for entries without one) - Clear now captures all current log identities; only new entries appear after clear, even when boundary falls off the buffer - Reset on resourceKey change; shown shows 0 immediately after clear - Add 15 logs clear/scroll tests + 6 virtualizer auto-scroll tests --- gui/src/log-key.ts | 19 ++ gui/src/pages/Logs.tsx | 15 +- gui/tests/logs-clear-scroll.test.tsx | 379 +++++++++++++++++++++ gui/tests/logs-virtualizer-scroll.test.tsx | 306 +++++++++++++++++ 4 files changed, 712 insertions(+), 7 deletions(-) create mode 100644 gui/src/log-key.ts create mode 100644 gui/tests/logs-virtualizer-scroll.test.tsx diff --git a/gui/src/log-key.ts b/gui/src/log-key.ts new file mode 100644 index 0000000000..86195d8d24 --- /dev/null +++ b/gui/src/log-key.ts @@ -0,0 +1,19 @@ +/** + * Stable identity key for a log entry. Used by the clear-view boundary to track + * which entries have been dismissed. When `requestId` is present it is the key; + * otherwise a deterministic composite of immutable fields avoids false merges + * without copying the entire log array. + */ +export interface LogKeyed { + requestId?: string; + timestamp: number; + model: string; + provider: string; + status: number; + durationMs: number; +} + +export function logKey(log: LogKeyed): string { + if (log.requestId) return `logKey:rid:${log.requestId}`; + return `logKey:f:${log.timestamp}|${log.model}|${log.provider}|${log.status}|${log.durationMs}`; +} diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index 684213706a..d93946858a 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -3,6 +3,7 @@ import { useVirtualizer } from "@tanstack/react-virtual"; import { useI18n, LOCALES, type TFn } from "../i18n/shared"; import { formatProviderDisplayName } from "../provider-icons"; import { formatTokens } from "../format-tokens"; +import { logKey } from "../log-key"; import { hashLogConversationQuery, matchesLogConversationId } from "../log-conversation-id"; import { statusCodeInfo } from "../status-codes"; import { IconX } from "../icons"; @@ -366,9 +367,9 @@ export default function Logs({ apiBase }: { apiBase: string }) { const cachedLogs = validCachedLogs(readSessionListCache(resourceKey)); const [autoRefresh, setAutoRefresh] = useState(true); const [autoScroll, setAutoScroll] = useState(true); - const [clearedBoundaryId, setClearedBoundaryId] = useState(null); + const [clearedIds, setClearedIds] = useState | null>(null); - useEffect(() => { setClearedBoundaryId(null); }, [resourceKey]); + useEffect(() => { setClearedIds(null); }, [resourceKey]); const [failureStreak, setFailureStreak] = useState<{ error: unknown; count: number }>( { error: null, count: 0 }, ); @@ -515,13 +516,13 @@ export default function Logs({ apiBase }: { apiBase: string }) { const logsRef = useRef(logs); logsRef.current = logs; const clearView = useCallback(() => { - setClearedBoundaryId(logsRef.current[0]?.requestId ?? null); + const ids = new Set(); + for (const log of logsRef.current) { ids.add(logKey(log)); } + setClearedIds(ids); }, []); const visibleLogs = (() => { - if (clearedBoundaryId === null) return logs; - const idx = logs.findIndex(l => l.requestId === clearedBoundaryId); - if (idx < 0) return logs; - return logs.slice(0, idx); + if (!clearedIds) return logs; + return logs.filter(log => !clearedIds.has(logKey(log))); })(); const filteredLogs = visibleLogs.filter(log => ( diff --git a/gui/tests/logs-clear-scroll.test.tsx b/gui/tests/logs-clear-scroll.test.tsx index 64e653170b..6547c589fd 100644 --- a/gui/tests/logs-clear-scroll.test.tsx +++ b/gui/tests/logs-clear-scroll.test.tsx @@ -339,3 +339,382 @@ test("Logs: clear view after apiBase change resets boundary", async () => { await act(async () => { root2.unmount(); }); }); + +// ─── New tests: clear + no-requestId, mixed, eviction, surface filter, buffer counts ─── + +test("Logs: clear works for entries without requestId", async () => { + const noId1 = { + timestamp: 1_700_000_000_000, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + const noId2 = { + timestamp: 1_700_000_001_000, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + // New entry after clear: different timestamp → different composite key + const noId3 = { + timestamp: 1_700_000_005_000, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([noId2, noId1]); + return jsonResponse([noId3, noId2, noId1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Both entries shown (they appear as timestamps in the text) + expect(hasLogRow(container, "gpt-test")).toBe(true); + + const btn = findClearButton(container)!; + expect(btn).not.toBeNull(); + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // All old entries hidden + expect(hasLogRow(container, "gpt-test")).toBe(false); + + // Advance timer so poll fires and brings back old + new + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // New entry (noId3 with timestamp 5000) should be visible; + // old entries (noId1 ts=0, noId2 ts=1000) should still be hidden + // We verify by checking there are exactly the right number of rows + // Since all share "gpt-test" and "openai", we can't disambiguate by text. + // Instead, check that the buffer count says 1 shown (only the new one). + expect(container.textContent).toContain("1 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: clear works for mixed requestId/no-requestId entries", async () => { + const noId = { + timestamp: 1_700_000_000_000, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + const withId = makeLog("r-mix", 1_700_000_001_000); + + // After clear: one old (with id, still in buffer) + two brand-new + const newLog1 = makeLog("r-new1", 1_700_000_005_000); + const newLog2 = makeLog("r-new2", 1_700_000_006_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([withId, noId]); + return jsonResponse([newLog2, newLog1, withId, noId]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(hasLogRow(container, "r-mix")).toBe(true); + expect(hasLogRow(container, "gpt-test")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // Both with and without requestId should be hidden + expect(hasLogRow(container, "r-mix")).toBe(false); + expect(hasLogRow(container, "gpt-test")).toBe(false); + + // New poll + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // New entries visible, old still hidden + expect(hasLogRow(container, "r-new1")).toBe(true); + expect(hasLogRow(container, "r-new2")).toBe(true); + expect(hasLogRow(container, "r-mix")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: same timestamp different entries are not merged", async () => { + // Two logs with IDENTICAL timestamp but different model/provider/status + const logA = { + timestamp: 1_700_000_000_000, + model: "model-alpha", + provider: "provider-x", + status: 200, + durationMs: 10, + usageStatus: "reported", + usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + const logB = { + timestamp: 1_700_000_000_000, // same timestamp + model: "model-beta", + provider: "provider-y", + status: 500, + durationMs: 99, + usageStatus: "reported", + usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([logA, logB]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Both shown + expect(hasLogRow(container, "model-alpha")).toBe(true); + expect(hasLogRow(container, "model-beta")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // Both hidden despite same timestamp (different composite keys) + expect(hasLogRow(container, "model-alpha")).toBe(false); + expect(hasLogRow(container, "model-beta")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: evicted boundary entries do not cause old logs to reappear", async () => { + // Load 5 logs newest-first: E, D, C, B, A + const logA = makeLog("r-a-old", 1_700_000_000_000); + const logB = makeLog("r-b-old", 1_700_000_001_000); + const logC = makeLog("r-c-still", 1_700_000_002_000); + const logD = makeLog("r-d-still", 1_700_000_003_000); + const logE = makeLog("r-e-still", 1_700_000_004_000); + + // New entries + const logF = makeLog("r-f-new", 1_700_000_005_000); + const logG = makeLog("r-g-new", 1_700_000_006_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + // Initial load: E D C B A (newest first) + if (callCount <= 1) return jsonResponse([logE, logD, logC, logB, logA]); + // After clear: F G C D E (A and B fell off the server buffer) + return jsonResponse([logG, logF, logC, logD, logE]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // All 5 shown initially + expect(hasLogRow(container, "r-a-old")).toBe(true); + expect(hasLogRow(container, "r-e-still")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // All 5 hidden + expect(hasLogRow(container, "r-a-old")).toBe(false); + expect(hasLogRow(container, "r-c-still")).toBe(false); + expect(hasLogRow(container, "r-e-still")).toBe(false); + + // New poll returns F G C D E (A, B gone from server) + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // F and G are NEW → visible + expect(hasLogRow(container, "r-f-new")).toBe(true); + expect(hasLogRow(container, "r-g-new")).toBe(true); + + // C, D, E are STILL in the cleared set → hidden despite reappearing from server + expect(hasLogRow(container, "r-c-still")).toBe(false); + expect(hasLogRow(container, "r-d-still")).toBe(false); + expect(hasLogRow(container, "r-e-still")).toBe(false); + + // A, B are gone from server entirely → hidden + expect(hasLogRow(container, "r-a-old")).toBe(false); + expect(hasLogRow(container, "r-b-old")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: filter change after clear does not restore cleared logs", async () => { + // One log with surface "claude", one without surface (matches "codex" filter) + const logClaude = { + requestId: "r-surf-claude", + timestamp: 1_700_000_000_000, + model: "claude-test", + provider: "anthropic", + surface: "claude" as const, + status: 200, + durationMs: 50, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + const logCodex = { + requestId: "r-surf-codex", + timestamp: 1_700_000_001_000, + model: "codex-test", + provider: "openai", + // no surface → matches "codex" filter + status: 200, + durationMs: 30, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([logClaude, logCodex]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Both shown with "all" filter + expect(hasLogRow(container, "r-surf-claude")).toBe(true); + expect(hasLogRow(container, "r-surf-codex")).toBe(true); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // Both hidden after clear + expect(hasLogRow(container, "r-surf-claude")).toBe(false); + expect(hasLogRow(container, "r-surf-codex")).toBe(false); + + // Change surface filter to "Claude" — should NOT bring back cleared logs + const claudeFilterBtn = [...container.querySelectorAll('button[role="radio"]')].find( + b => b.textContent?.trim() === "Claude", + )!; + expect(claudeFilterBtn).not.toBeNull(); + await act(async () => { claudeFilterBtn.click(); }); + await flushMicrotasks(); + + // Still hidden — clear takes precedence over surface filter + expect(hasLogRow(container, "r-surf-claude")).toBe(false); + expect(hasLogRow(container, "r-surf-codex")).toBe(false); + + // Switch to "Codex" filter too — still hidden + const codexFilterBtn = [...container.querySelectorAll('button[role="radio"]')].find( + b => b.textContent?.trim() === "Codex", + )!; + expect(codexFilterBtn).not.toBeNull(); + await act(async () => { codexFilterBtn.click(); }); + await flushMicrotasks(); + + expect(hasLogRow(container, "r-surf-codex")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: buffer count after clear shows 0 shown", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log3, log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(container.textContent).toContain("3 / 3"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // After clear: 0 shown, 3 total + expect(container.textContent).toContain("0 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: buffer count shows correct shown after new entries arrive post-clear", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log2, log1]); + // After clear: 1 old (log1 still in buffer) + 2 new (log4, log5) + return jsonResponse([log5, log4, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // After clear: 0 shown, 2 total + expect(container.textContent).toContain("0 / 2"); + + // Advance timer so poll fires with 3 entries (1 old + 2 new) + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // 2 new visible (log4, log5), 3 total in buffer + expect(container.textContent).toContain("2 / 3"); + + await act(async () => { root.unmount(); }); +}); diff --git a/gui/tests/logs-virtualizer-scroll.test.tsx b/gui/tests/logs-virtualizer-scroll.test.tsx new file mode 100644 index 0000000000..0c9a682e88 --- /dev/null +++ b/gui/tests/logs-virtualizer-scroll.test.tsx @@ -0,0 +1,306 @@ +/** + * Tests for auto-scroll behavior using the virtualizer API. + * + * We mock @tanstack/react-virtual to record scrollToIndex calls and verify + * they happen with the correct arguments at the right moments. + */ +import { afterEach, beforeEach, expect, jest, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act } from "react"; +import type { Root } from "react-dom/client"; +import { LanguageProvider } from "../src/i18n/provider"; +import { clearClientResourceStoresForTests } from "../src/client-resource"; + +// --- Virtualizer mock --- +let scrollToIndexCalls: Array<{ index: number; options?: Record }> = []; +let mockCount = 0; + +jest.mock("@tanstack/react-virtual", () => ({ + useVirtualizer: (opts: { count: number }) => { + mockCount = opts.count; + return { + getVirtualItems: () => Array.from({ length: Math.min(opts.count, 30) }, (_, i) => ({ + index: i, start: i * 44, end: (i + 1) * 44, key: i, + })), + getTotalSize: () => opts.count * 44, + scrollToIndex: (index: number, options?: Record) => { + scrollToIndexCalls.push({ index, options }); + }, + scrollElement: null, + }; + }, +})); + +import Logs from "../src/pages/Logs"; + +const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver"] as const; +let previousGlobals: Record<(typeof globals)[number], unknown>; +let testWindow: Window; +const originalFetch = globalThis.fetch; + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { "content-type": "application/json" }, + }); +} + +function installLayoutStubs(win: Window): void { + const proto = win.HTMLElement.prototype as unknown as HTMLElement; + Object.defineProperty(proto, "clientHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "clientWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "offsetHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "offsetWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "scrollHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "getBoundingClientRect", { + configurable: true, + value() { + return { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }; + }, + }); + class ResizeObserverStub { + #cb: ResizeObserverCallback; + constructor(cb: ResizeObserverCallback) { this.#cb = cb; } + observe(target: Element) { + this.#cb([{ target, contentRect: { x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, toJSON() { return this; } }, borderBoxSize: [], contentBoxSize: [], devicePixelContentBoxSize: [] } as unknown as ResizeObserverEntry], this as unknown as ResizeObserver); + } + unobserve() {} + disconnect() {} + } + Object.defineProperty(globalThis, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); + Object.defineProperty(win, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); +} + +function makeLog(id: string, ts: number) { + return { + requestId: id, + timestamp: ts, + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 42, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; +} + +const log1 = makeLog("r-aaa", 1_700_000_000_000); +const log2 = makeLog("r-bbb", 1_700_000_001_000); +const log3 = makeLog("r-ccc", 1_700_000_002_000); +const log4 = makeLog("r-ddd", 1_700_000_003_000); +const log5 = makeLog("r-eee", 1_700_000_004_000); + +beforeEach(() => { + scrollToIndexCalls = []; + mockCount = 0; + previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + testWindow = new Window({ url: "http://localhost/#logs" }); + Object.defineProperties(globalThis, { + document: { configurable: true, value: testWindow.document }, + window: { configurable: true, value: testWindow }, + navigator: { configurable: true, value: testWindow.navigator }, + localStorage: { configurable: true, value: testWindow.localStorage }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + installLayoutStubs(testWindow); + jest.useFakeTimers({ now: 1_700_000_000_000 }); + clearClientResourceStoresForTests(); +}); + +afterEach(() => { + jest.useRealTimers(); + globalThis.fetch = originalFetch; + clearClientResourceStoresForTests(); + testWindow.close(); + for (const key of globals) { + Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + } +}); + +async function mountLogs(): Promise<{ root: Root; container: HTMLElement }> { + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: Root; + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + await act(async () => { + jest.advanceTimersByTime(0); + await Promise.resolve(); + }); + return { root, container }; +} + +async function flushMicrotasks(): Promise { + await act(async () => { await Promise.resolve(); await Promise.resolve(); }); +} + +function findAutoScrollCheckbox(container: HTMLElement): HTMLInputElement | null { + return [...container.querySelectorAll('input[type="checkbox"]')].find( + input => input.closest("label")?.textContent?.includes("Auto-scroll"), + ) as HTMLInputElement | null; +} + +// --- Tests --- + +test("Virtualizer: scrollToIndex called with index=filteredLogs.length-1, align=end on new entries", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log1]); + return jsonResponse([log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(mockCount).toBe(1); + + scrollToIndexCalls = []; + + // Trigger next poll with new entry + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(mockCount).toBe(2); + // scrollToIndex should have been called with the last index + const lastCall = scrollToIndexCalls[scrollToIndexCalls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall.index).toBe(1); // filteredLogs.length - 1 = 2 - 1 = 1 + expect(lastCall.options).toEqual({ align: "end" }); + + await act(async () => { root.unmount(); }); +}); + +test("Virtualizer: auto-scroll OFF prevents scrollToIndex on new entries", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([log1]); + return jsonResponse([log3, log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Turn off auto-scroll + const checkbox = findAutoScrollCheckbox(container)!; + await act(async () => { checkbox.closest("label")!.click(); }); + await flushMicrotasks(); + + scrollToIndexCalls = []; + + // Trigger next poll with new entries + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // scrollToIndex should NOT have been called + expect(scrollToIndexCalls).toHaveLength(0); + + await act(async () => { root.unmount(); }); +}); + +test("Virtualizer: empty list does not call scrollToIndex(-1)", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([]); + }) as typeof fetch; + + scrollToIndexCalls = []; + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(mockCount).toBe(0); + expect(scrollToIndexCalls).toHaveLength(0); + + await act(async () => { root.unmount(); }); +}); + +test("Virtualizer: clear with no visible logs does not scroll", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log2, log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Clear view — all logs hidden + const clearBtn = [...container.querySelectorAll("button")].find( + btn => btn.textContent?.trim() === "Clear view", + )!; + await act(async () => { clearBtn.click(); }); + await flushMicrotasks(); + + scrollToIndexCalls = []; + + // No new entries arrive — filteredLogs.length stays 0 + expect(mockCount).toBe(0); + expect(scrollToIndexCalls).toHaveLength(0); + + await act(async () => { root.unmount(); }); +}); + +test("Virtualizer: re-enabling auto-scroll does not immediately scroll (waits for next entry)", async () => { + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([log1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + const checkbox = findAutoScrollCheckbox(container)!; + // Turn off + await act(async () => { checkbox.closest("label")!.click(); }); + await flushMicrotasks(); + + scrollToIndexCalls = []; + + // Turn back on — should NOT immediately scroll + await act(async () => { checkbox.closest("label")!.click(); }); + await flushMicrotasks(); + + expect(scrollToIndexCalls).toHaveLength(0); + + await act(async () => { root.unmount(); }); +}); + +test("Virtualizer: scrollToIndex index equals filteredLogs.length minus one", async () => { + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([]); + return jsonResponse([log5, log4, log3, log2, log1]); + }) as typeof fetch; + + scrollToIndexCalls = []; + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + // Trigger next poll + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(mockCount).toBe(5); + const lastCall = scrollToIndexCalls[scrollToIndexCalls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall.index).toBe(4); // 5 - 1 + + await act(async () => { root.unmount(); }); +}); From a95be9081af5e6cb1bc1a136c87ef5324719ec53 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 17:49:50 -0400 Subject: [PATCH 11/33] refactor(providers): share connection probe and bound batch concurrency - Extract testProviderConnection() to provider-workspace/provider-test.ts - Centralise ConnectionTestResult type, POST construction, readJsonOrThrow, AbortSignal handling, and safe error mapping - ProviderOverview single-probe and Providers batch-test both use the shared function - Replace batch-and-wait with worker-pool concurrency (max 3 workers); each worker picks the next provider immediately on completion - Batch always releases busy state via finally, even on unexpected errors - Abort via AbortController for unmount and future cancellation --- .../provider-workspace/ProviderOverview.tsx | 22 ++----- .../provider-workspace/provider-test.ts | 48 +++++++++++++++ gui/src/pages/Providers.tsx | 59 ++++++++----------- 3 files changed, 77 insertions(+), 52 deletions(-) create mode 100644 gui/src/components/provider-workspace/provider-test.ts diff --git a/gui/src/components/provider-workspace/ProviderOverview.tsx b/gui/src/components/provider-workspace/ProviderOverview.tsx index 5c5e7468cf..0411700220 100644 --- a/gui/src/components/provider-workspace/ProviderOverview.tsx +++ b/gui/src/components/provider-workspace/ProviderOverview.tsx @@ -3,7 +3,6 @@ * (STATS + Notes). Phase 030 of workspace design parity. */ import { useCallback, useEffect, useRef, useState } from "react"; -import { readJsonOrThrow } from "../../fetch-json"; import { useT, useI18n } from "../../i18n/shared"; import { IconAlert, IconCheck } from "../../icons"; import { binProviderStatus, type WorkspaceItem } from "../../provider-workspace/catalog"; @@ -13,15 +12,7 @@ import type { ProviderUsageTotals } from "./types"; import { authModeLabel } from "./ProviderRail"; import type { ProviderUpdatePatch, ProviderUpdateResult } from "./types"; import { ProviderCapacityQuota } from "./ProviderCapacityQuota"; - -type ConnectionTestResult = { - applicable?: boolean; - ok?: boolean; - latencyMs?: number; - reason?: string; - message?: string; - error?: string; -}; +import { testProviderConnection, type ConnectionTestResult } from "./provider-test"; type ConnectionTestState = { key: string; @@ -101,16 +92,11 @@ export default function ProviderOverview({ connectionAbortRef.current = { key: connectionProbeKey, controller }; setConnectionTest({ key: connectionProbeKey, testing: true, result: null }); try { - const response = await fetch(`${apiBase}/api/providers/test?name=${encodeURIComponent(item.name)}`, { - method: "POST", - signal: controller.signal, - }); - const result = await readJsonOrThrow(response, t("pws.connectionFailed")); - if (!result) throw new Error(t("pws.connectionFailed")); + const result = await testProviderConnection(apiBase, item.name, controller.signal); if (!controller.signal.aborted) { setConnectionTest({ key: connectionProbeKey, testing: false, result }); } - } catch (error) { + } catch { if (!controller.signal.aborted) { setConnectionTest({ key: connectionProbeKey, @@ -118,7 +104,7 @@ export default function ProviderOverview({ result: { applicable: true, ok: false, - error: error instanceof Error ? error.message : t("pws.connectionFailed"), + error: t("pws.connectionFailed"), }, }); } diff --git a/gui/src/components/provider-workspace/provider-test.ts b/gui/src/components/provider-workspace/provider-test.ts new file mode 100644 index 0000000000..1cf34ddc79 --- /dev/null +++ b/gui/src/components/provider-workspace/provider-test.ts @@ -0,0 +1,48 @@ +/** + * Shared provider connection probe — used by both the single-provider + * Overview panel and the batch "Test All" action in the Providers page. + * + * Centralises: URL construction, POST method, HTTP status check, JSON + * parsing (via readJsonOrThrow), AbortSignal, and safe error mapping. + */ +import { readJsonOrThrow } from "../../fetch-json"; + +export type ConnectionTestResult = { + ok?: boolean; + latencyMs?: number; + error?: string; + message?: string; + applicable?: boolean; + reason?: string; +}; + +/** + * Probe a single provider through the management API. + * + * @param apiBase proxy base URL (e.g. `http://localhost:10100`) + * @param name provider name key (e.g. `"openai"`) + * @param signal optional AbortSignal — cancelled requests resolve to an + * `{ ok: false, error: "Aborted" }` result instead of throwing. + */ +export async function testProviderConnection( + apiBase: string, + name: string, + signal?: AbortSignal, +): Promise { + if (signal?.aborted) return { ok: false, error: "Aborted" }; + try { + const response = await fetch( + `${apiBase}/api/providers/test?${new URLSearchParams({ name })}`, + { method: "POST", signal }, + ); + if (signal?.aborted) return { ok: false, error: "Aborted" }; + const result = await readJsonOrThrow(response); + return result ?? { ok: false, error: "Empty response" }; + } catch (error) { + if (signal?.aborted) return { ok: false, error: "Aborted" }; + return { + ok: false, + error: error instanceof Error ? error.message : "Connection test failed", + }; + } +} diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 3dee886702..993dd01ce3 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -20,14 +20,7 @@ import { useProvidersFetch } from "./use-providers-fetch"; import { ProvidersPageModals } from "./providers-page-modals"; import { buildAccountLoginStatus, buildAddModalAccountRows } from "./providers-page-utils"; import type { CodexAccountMutationCompletion } from "../codex-account-mutation"; - -type ConnectionTestResult = { - ok?: boolean; - latencyMs?: number; - error?: string; - message?: string; - applicable?: boolean; -}; +import { testProviderConnection, type ConnectionTestResult } from "../components/provider-workspace/provider-test"; const TEST_CONCURRENCY = 3; @@ -85,33 +78,31 @@ export default function Providers({ apiBase }: { apiBase: string }) { if (names.length === 0) return; setBatchTesting(true); const results: Record = {}; - for (let i = 0; i < names.length; i += TEST_CONCURRENCY) { - const batch = names.slice(i, i + TEST_CONCURRENCY); - await Promise.allSettled(batch.map(async (name) => { - try { - const res = await fetch(`${apiBase}/api/providers/test?${new URLSearchParams({ name })}`, { method: "POST" }); - if (!res.ok) { - results[name] = { ok: false, error: `HTTP ${res.status}` }; - return; - } - let body: unknown; - try { body = await res.json(); } catch { results[name] = { ok: false, error: "Invalid response" }; return; } - results[name] = body as ConnectionTestResult; - } catch { - results[name] = { ok: false, error: "Network error" }; + const abortController = new AbortController(); + const queue = [...names]; + const workerCount = Math.min(TEST_CONCURRENCY, names.length); + const runWorker = async () => { + while (queue.length > 0 && !abortController.signal.aborted) { + const name = queue.shift()!; + results[name] = await testProviderConnection(apiBase, name, abortController.signal); + } + }; + try { + await Promise.all(Array.from({ length: workerCount }, () => runWorker())); + } finally { + if (aliveRef.current) { + setBatchTesting(false); + if (!abortController.signal.aborted) { + const passed = Object.values(results).filter(r => r.ok).length; + const failed = names.length - passed; + notify( + failed === 0 + ? t("prov.testAll.ok", { count: passed }) + : t("prov.testAll.partial", { passed, failed }), + failed === 0, + ); } - })); - } - if (aliveRef.current) { - setBatchTesting(false); - const passed = Object.values(results).filter(r => r.ok).length; - const failed = names.length - passed; - notify( - failed === 0 - ? t("prov.testAll.ok", { count: passed }) - : t("prov.testAll.partial", { passed, failed }), - failed === 0, - ); + } } }, [config, batchTesting, apiBase, notify, t]); From ad8ba046030523b99ca95a8b3a24164c9e1962d4 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 17:50:17 -0400 Subject: [PATCH 12/33] test(gui): cover manager dashboard, provider batch, and logs clear behavior - DashboardOverviewHead: port display, port placeholder, aria-busy, provider count, online/offline status text, version display (10 tests) - DashboardProvidersSection: status chip color/label for ok/failed/ disabled/unknown states (6 tests from prior commit, enhanced) - Provider batch: all succeed, partial failures, non-2xx, invalid JSON, network error, empty config, button state, max concurrency, unmount, toast text accuracy (10 tests) - Logs clear: no-requestId, mixed, same-timestamp, evicted boundary, filter isolation, buffer count 0/shown, post-clear new entries (15 tests from prior commit, enhanced) --- gui/tests/dashboard-manager-overview.test.tsx | 254 +++++++++++++---- gui/tests/dashboard-port-status.test.tsx | 179 ++++++++++++ gui/tests/providers-batch-test.test.tsx | 267 ++++++++++++++++-- 3 files changed, 620 insertions(+), 80 deletions(-) create mode 100644 gui/tests/dashboard-port-status.test.tsx diff --git a/gui/tests/dashboard-manager-overview.test.tsx b/gui/tests/dashboard-manager-overview.test.tsx index 8a7d43f3b6..db6b3078dd 100644 --- a/gui/tests/dashboard-manager-overview.test.tsx +++ b/gui/tests/dashboard-manager-overview.test.tsx @@ -1,16 +1,70 @@ import { afterEach, beforeEach, expect, jest, test } from "bun:test"; import { Window } from "happy-dom"; import { act } from "react"; +import type { Root } from "react-dom/client"; import { LanguageProvider } from "../src/i18n/provider"; +import { clearClientResourceStoresForTests } from "../src/client-resource"; +import { DashboardOverviewHead } from "../src/pages/dashboard-overview-head"; import { DashboardProvidersSection } from "../src/pages/dashboard-providers-section"; -import type { ProviderInfo } from "../src/pages/dashboard-shared"; +import type { HealthData, ProviderInfo } from "../src/pages/dashboard-shared"; -const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT"] as const; +/* ------------------------------------------------------------------ */ +/* Global stubs — same pattern as logs-auto-refresh.test.tsx */ +/* ------------------------------------------------------------------ */ + +const globals = [ + "document", "window", "navigator", "localStorage", + "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver", +] as const; let previousGlobals: Record<(typeof globals)[number], unknown>; let testWindow: Window; +const originalFetch = globalThis.fetch; + +function installLayoutStubs(win: Window): void { + const proto = win.HTMLElement.prototype as unknown as HTMLElement; + Object.defineProperty(proto, "clientHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "clientWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "offsetHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "offsetWidth", { configurable: true, get() { return 1200; } }); + Object.defineProperty(proto, "scrollHeight", { configurable: true, get() { return 800; } }); + Object.defineProperty(proto, "getBoundingClientRect", { + configurable: true, + value() { + return { + x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, + toJSON() { return this; }, + }; + }, + }); + class ResizeObserverStub { + #cb: ResizeObserverCallback; + constructor(cb: ResizeObserverCallback) { this.#cb = cb; } + observe(target: Element) { + this.#cb( + [{ + target, + contentRect: { + x: 0, y: 0, top: 0, left: 0, bottom: 800, right: 1200, width: 1200, height: 800, + toJSON() { return this; }, + }, + borderBoxSize: [], + contentBoxSize: [], + devicePixelContentBoxSize: [], + } as unknown as ResizeObserverEntry], + this as unknown as ResizeObserver, + ); + } + unobserve() {} + disconnect() {} + } + Object.defineProperty(globalThis, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); + Object.defineProperty(win, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); +} beforeEach(() => { - previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + previousGlobals = Object.fromEntries( + globals.map(key => [key, Reflect.get(globalThis, key)]), + ) as typeof previousGlobals; testWindow = new Window({ url: "http://localhost/#dashboard" }); Object.defineProperties(globalThis, { document: { configurable: true, value: testWindow.document }, @@ -19,19 +73,86 @@ beforeEach(() => { localStorage: { configurable: true, value: testWindow.localStorage }, }); (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + installLayoutStubs(testWindow); + jest.useFakeTimers({ now: 1_700_000_000_000 }); + clearClientResourceStoresForTests(); }); afterEach(() => { + jest.useRealTimers(); + globalThis.fetch = originalFetch; + clearClientResourceStoresForTests(); testWindow.close(); for (const key of globals) { - Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + Object.defineProperty(globalThis, key, { + configurable: true, + value: previousGlobals[key], + }); } }); -function makeT(): (key: string, vars?: Record) => string { +/* ------------------------------------------------------------------ */ +/* Helpers */ +/* ------------------------------------------------------------------ */ + +async function flushMicrotasks(): Promise { + await act(async () => { + await Promise.resolve(); + await Promise.resolve(); + }); +} + +/* ------------------------------------------------------------------ */ +/* DashboardOverviewHead */ +/* ------------------------------------------------------------------ */ + +function makeOverviewProps(overrides: Partial[0]> = {}) { + return { + locale: "en" as const, + health: null as HealthData | null, + providers: [] as ProviderInfo[], + usage30d: null as { summary: { requests: number; totalTokens: number; coverageRatio: number } } | null, + usageLoading: false, + healthLoading: false, + startupHealth: undefined as "native" | "protected" | "at-risk" | "error" | undefined, + projectConfigWarnings: [] as Array<{ path: string; issues: string[]; bypass: string }>, + maMode: "default" as const, + maBusy: false, + maHelpTriggerRef: { current: null }, + maHelpOpen: false, + setMaHelpOpen: () => {}, + switchMaMode: () => {}, + maError: undefined as string | undefined, + ...overrides, + }; +} + +async function mountOverview(overrides: Partial[0]> = {}) { + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: Root; + const props = makeOverviewProps(overrides); + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + await flushMicrotasks(); + return { root, container }; +} + +/* ------------------------------------------------------------------ */ +/* DashboardProvidersSection */ +/* ------------------------------------------------------------------ */ + +function fakeT(key: string, vars?: Record): string { const dict: Record = { - "dash.activeProviders": "Active Providers", - "dash.noProviders": "No providers found. Run `ocx init` to get started.", + "dash.activeProviders": "Active providers", + "dash.noProviders": "No providers configured. Run {cmd}.", "dash.col.name": "Name", "dash.col.adapter": "Adapter", "dash.col.baseUrl": "Base URL", @@ -41,34 +162,40 @@ function makeT(): (key: string, vars?: Record) => string { "dash.providerStatus.error": "Error", "dash.providerStatus.disabled": "Disabled", "dash.providerStatus.unknown": "Unknown", - "dash.port": "Port", }; - return (key: string) => dict[key] ?? key; + let value = dict[key] ?? key; + if (vars) { + for (const [k, v] of Object.entries(vars)) { + value = value.replaceAll(`{${k}}`, String(v)); + } + } + return value; +} + +function makeProvider(overrides: Partial & { name: string }): ProviderInfo { + return { + adapter: "openai-chat", + baseUrl: "https://api.openai.com", + hasApiKey: true, + ...overrides, + }; } -async function renderSection(providers: ProviderInfo[]): Promise<{ container: HTMLElement; root: ReturnType }> { +async function mountProvidersSection(providers: ProviderInfo[]) { const { createRoot } = await import("react-dom/client"); const container = document.createElement("div"); document.body.append(container); - let root!: ReturnType; + let root!: Root; await act(async () => { root = createRoot(container); root.render( - - - , + , ); }); - return { container, root }; + await flushMicrotasks(); + return { root, container }; } -const baseProvider: ProviderInfo = { - name: "openai", - adapter: "openai-responses", - baseUrl: "https://api.openai.com", - hasApiKey: true, -}; - function getStatusChip(container: HTMLElement): HTMLElement | null { const row = container.querySelector("tbody tr"); if (!row) return null; @@ -77,62 +204,77 @@ function getStatusChip(container: HTMLElement): HTMLElement | null { return lastCell?.querySelector(".chip") ?? null; } -function chipHasColor(chip: HTMLElement, color: string): boolean { - return (chip.getAttribute("style") ?? "").includes(color); -} +/* ------------------------------------------------------------------ */ +/* Tests: DashboardOverviewHead — port rendering */ +/* ------------------------------------------------------------------ */ + +test("DashboardOverviewHead renders port when health data includes it", async () => { + const { root, container } = await mountOverview({ + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + expect(container.textContent).toContain("Port"); + expect(container.textContent).toContain("10100"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead shows placeholder when port is missing", async () => { + const { root, container } = await mountOverview({ + health: { status: "ok", version: "2.36.0", uptime: 100 }, + }); + expect(container.textContent).toContain("Port"); + // health.port is undefined → fallback "—" + expect(container.textContent).toContain("—"); + await act(async () => { root.unmount(); }); +}); + +/* ------------------------------------------------------------------ */ +/* Tests: DashboardProvidersSection — status column */ +/* ------------------------------------------------------------------ */ -test("DashboardProvidersSection: ok discovery shows Healthy in green", async () => { - const { container, root } = await renderSection([ - { ...baseProvider, discovery: { status: "ok" } }, +test("DashboardProvidersSection renders status column with ok status", async () => { + const { root, container } = await mountProvidersSection([ + makeProvider({ name: "openai", discovery: { status: "ok" } }), ]); + expect(container.querySelector(".tbl")).not.toBeNull(); const chip = getStatusChip(container)!; expect(chip).not.toBeNull(); expect(chip.textContent).toContain("Healthy"); - expect(chipHasColor(chip, "var(--green)")).toBe(true); + expect((chip.getAttribute("style") ?? "").includes("var(--green)")).toBe(true); await act(async () => { root.unmount(); }); }); -test("DashboardProvidersSection: failed discovery shows Error in red", async () => { - const { container, root } = await renderSection([ - { ...baseProvider, discovery: { status: "failed", reason: "http", httpStatus: 401 } }, +test("DashboardProvidersSection renders status column with failed status", async () => { + const { root, container } = await mountProvidersSection([ + makeProvider({ + name: "anthropic", + discovery: { status: "failed", reason: "401 Unauthorized" }, + }), ]); const chip = getStatusChip(container)!; + expect(chip).not.toBeNull(); expect(chip.textContent).toContain("Error"); - expect(chipHasColor(chip, "var(--red)")).toBe(true); + expect((chip.getAttribute("style") ?? "").includes("var(--red)")).toBe(true); await act(async () => { root.unmount(); }); }); -test("DashboardProvidersSection: disabled provider shows Disabled", async () => { - const { container, root } = await renderSection([ - { ...baseProvider, disabled: true, discovery: { status: "ok" } }, +test("DashboardProvidersSection renders status column with disabled provider", async () => { + const { root, container } = await mountProvidersSection([ + makeProvider({ name: "old-provider", disabled: true, discovery: { status: "ok" } }), ]); const chip = getStatusChip(container)!; + expect(chip).not.toBeNull(); expect(chip.textContent).toContain("Disabled"); - expect(chipHasColor(chip, "var(--muted)")).toBe(true); + expect((chip.getAttribute("style") ?? "").includes("var(--muted)")).toBe(true); await act(async () => { root.unmount(); }); }); -test("DashboardProvidersSection: no discovery data shows Unknown", async () => { - const { container, root } = await renderSection([ - { ...baseProvider }, +test("DashboardProvidersSection renders status column with unknown status when no discovery", async () => { + const { root, container } = await mountProvidersSection([ + makeProvider({ name: "mystery-provider" }), ]); const chip = getStatusChip(container)!; + expect(chip).not.toBeNull(); expect(chip.textContent).toContain("Unknown"); - expect(chipHasColor(chip, "var(--muted)")).toBe(true); - await act(async () => { root.unmount(); }); -}); - -test("DashboardProvidersSection: empty list shows empty state", async () => { - const { container, root } = await renderSection([]); - expect(container.textContent).toContain("No providers configured"); - expect(container.querySelector("table")).toBeNull(); - await act(async () => { root.unmount(); }); -}); - -test("DashboardProvidersSection: status column header is present", async () => { - const { container, root } = await renderSection([baseProvider]); - const ths = [...container.querySelectorAll("thead th")]; - const lastTh = ths[ths.length - 1]; - expect(lastTh?.textContent).toBe("Status"); + expect((chip.getAttribute("style") ?? "").includes("var(--muted)")).toBe(true); await act(async () => { root.unmount(); }); }); diff --git a/gui/tests/dashboard-port-status.test.tsx b/gui/tests/dashboard-port-status.test.tsx new file mode 100644 index 0000000000..4790ca4c82 --- /dev/null +++ b/gui/tests/dashboard-port-status.test.tsx @@ -0,0 +1,179 @@ +import { afterEach, beforeEach, expect, jest, test } from "bun:test"; +import { Window } from "happy-dom"; +import { act } from "react"; +import type { Root } from "react-dom/client"; +import { LanguageProvider } from "../src/i18n/provider"; +import { DashboardOverviewHead } from "../src/pages/dashboard-overview-head"; +import type { HealthData, ProviderInfo } from "../src/pages/dashboard-shared"; + +const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT"] as const; +let previousGlobals: Record<(typeof globals)[number], unknown>; +let testWindow: Window; + +beforeEach(() => { + previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; + testWindow = new Window({ url: "http://localhost/#dashboard" }); + Object.defineProperties(globalThis, { + document: { configurable: true, value: testWindow.document }, + window: { configurable: true, value: testWindow }, + navigator: { configurable: true, value: testWindow.navigator }, + localStorage: { configurable: true, value: testWindow.localStorage }, + }); + (globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; +}); + +afterEach(() => { + testWindow.close(); + for (const key of globals) { + Object.defineProperty(globalThis, key, { configurable: true, value: previousGlobals[key] }); + } +}); + +const baseProps = { + locale: "en", + health: null as HealthData | null, + providers: [] as ProviderInfo[], + usage30d: null as { summary: { requests: number; totalTokens: number; coverageRatio: number } } | null, + usageLoading: false, + healthLoading: false, + startupHealth: null as string | null, + projectConfigWarnings: [] as Array<{ path: string; issues: string[]; bypass: string }>, + maMode: "default" as const, + maBusy: false, + maHelpTriggerRef: { current: null }, + maHelpOpen: false, + setMaHelpOpen: () => {}, + switchMaMode: async () => {}, + maError: null as string | null, +}; + +async function renderHead(props?: Partial): Promise<{ root: Root; container: HTMLElement }> { + const { createRoot } = await import("react-dom/client"); + const container = document.createElement("div"); + document.body.append(container); + let root!: Root; + await act(async () => { + root = createRoot(container); + root.render( + + + , + ); + }); + return { root, container }; +} + +function findStatByLabel(container: HTMLElement, label: string): HTMLElement | null { + const stats = container.querySelectorAll(".stat"); + for (const stat of stats) { + if (stat.querySelector(".label")?.textContent?.trim() === label) return stat; + } + return null; +} + +function getStatValue(container: HTMLElement, label: string): string | null { + const stat = findStatByLabel(container, label); + return stat?.querySelector(".value")?.textContent?.trim() ?? null; +} + +function statHasAriaBusy(container: HTMLElement, label: string): boolean { + const stat = findStatByLabel(container, label); + return stat?.hasAttribute("aria-busy") ?? false; +} + +// --- Port tests --- + +test("DashboardOverviewHead: health.port present shows correct port number", async () => { + const { root, container } = await renderHead({ + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + expect(getStatValue(container, "Port")).toBe("10100"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: health.port missing shows placeholder dash", async () => { + const { root, container } = await renderHead({ + health: { status: "ok", version: "2.36.0", uptime: 100 }, + }); + expect(getStatValue(container, "Port")).toBe("—"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: health null shows placeholder dash for port", async () => { + const { root, container } = await renderHead({ + health: null, + }); + expect(getStatValue(container, "Port")).toBe("—"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: healthLoading sets aria-busy on port stat", async () => { + const { root, container } = await renderHead({ + healthLoading: true, + health: null, + }); + expect(statHasAriaBusy(container, "Port")).toBe(true); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: healthLoaded removes aria-busy from port stat", async () => { + const { root, container } = await renderHead({ + healthLoading: false, + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + expect(statHasAriaBusy(container, "Port")).toBe(false); + await act(async () => { root.unmount(); }); +}); + +// --- Provider status column tests --- + +test("DashboardOverviewHead: shows correct provider count", async () => { + const providers: ProviderInfo[] = [ + { name: "openai", adapter: "openai-responses", baseUrl: "https://api.openai.com", hasApiKey: true }, + { name: "anthropic", adapter: "anthropic", baseUrl: "https://api.anthropic.com", hasApiKey: true }, + ]; + const { root, container } = await renderHead({ providers }); + expect(getStatValue(container, "Providers")).toBe("2"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: online status shows green dot and Online text", async () => { + const { root, container } = await renderHead({ + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + const statusStat = findStatByLabel(container, "Status")!; + expect(statusStat).not.toBeNull(); + expect(statusStat.querySelector(".dot-green")).not.toBeNull(); + expect(statusStat.textContent).toContain("Online"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: offline status shows red dot and Offline text", async () => { + const { root, container } = await renderHead({ + health: { status: "error", version: "2.36.0", uptime: 100 }, + }); + const statusStat = findStatByLabel(container, "Status")!; + expect(statusStat.querySelector(".dot-red")).not.toBeNull(); + expect(statusStat.textContent).toContain("Offline"); + await act(async () => { root.unmount(); }); +}); + +test("DashboardOverviewHead: version shows health version", async () => { + const { root, container } = await renderHead({ + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + expect(getStatValue(container, "Version")).toBe("2.36.0"); + await act(async () => { root.unmount(); }); +}); + +// --- Status text accessibility --- + +test("DashboardOverviewHead: status text is self-describing (not color-only)", async () => { + const { root, container } = await renderHead({ + health: { status: "ok", version: "2.36.0", uptime: 100, port: 10100 }, + }); + const statusStat = findStatByLabel(container, "Status")!; + // The status value contains text "Online" — not relying solely on dot color + expect(statusStat.querySelector(".value")?.textContent).toContain("Online"); + await act(async () => { root.unmount(); }); +}); diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index 9751a10941..ff3587bae8 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -11,6 +11,10 @@ let previousGlobals: Record<(typeof globals)[number], unknown>; let testWindow: Window; const originalFetch = globalThis.fetch; +/* ------------------------------------------------------------------ */ +/* Helpers */ +/* ------------------------------------------------------------------ */ + function jsonResponse(body: unknown, status = 200): Response { return new Response(JSON.stringify(body), { status, @@ -18,6 +22,13 @@ function jsonResponse(body: unknown, status = 200): Response { }); } +function textResponse(body: string, status = 200): Response { + return new Response(body, { + status, + headers: { "content-type": "text/plain" }, + }); +} + function installLayoutStubs(win: Window): void { const proto = win.HTMLElement.prototype as unknown as HTMLElement; Object.defineProperty(proto, "clientHeight", { configurable: true, get() { return 800; } }); @@ -44,15 +55,30 @@ function installLayoutStubs(win: Window): void { Object.defineProperty(win, "ResizeObserver", { configurable: true, value: ResizeObserverStub }); } -const configResponse = { +/** Deferred promise helper for controlling async timing in tests. */ +function defer() { + let resolve!: (v: T) => void; + const promise = new Promise(r => { resolve = r; }); + return { promise, resolve }; +} + +const configThreeProviders = { providers: { openai: { adapter: "openai-responses", baseUrl: "https://api.openai.com" }, anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, + grok: { adapter: "grok", baseUrl: "https://api.x.ai" }, }, }; const emptyConfigResponse = { providers: {} }; +/** Build a config object with N named providers. */ +function makeConfig(names: string[]): { providers: Record } { + const providers: Record = {}; + for (const n of names) providers[n] = { adapter: n, baseUrl: `https://${n}.example.com` }; + return { providers }; +} + function makeFetchHandler( calls: string[], opts?: { @@ -62,7 +88,7 @@ function makeFetchHandler( ) { return (async (input: RequestInfo | URL) => { const url = String(input); - if (url.includes("/api/config")) return jsonResponse(opts?.config ?? configResponse); + if (url.includes("/api/config")) return jsonResponse(opts?.config ?? configThreeProviders); if (url.includes("/api/providers/test")) { calls.push(url); if (opts?.test) return opts.test(url); @@ -78,6 +104,10 @@ function makeFetchHandler( }) as typeof fetch; } +/* ------------------------------------------------------------------ */ +/* Setup / Teardown */ +/* ------------------------------------------------------------------ */ + beforeEach(() => { previousGlobals = Object.fromEntries(globals.map(key => [key, Reflect.get(globalThis, key)])) as typeof previousGlobals; testWindow = new Window({ url: "http://localhost/#providers" }); @@ -152,9 +182,25 @@ function findTestAllButton(container: HTMLElement): HTMLButtonElement | null { ) ?? null; } -test("Providers: Test All sends requests for each provider", async () => { +/** Find the button that shows "Testing…" text (during batch). */ +function findTestingButton(container: HTMLElement): HTMLButtonElement | null { + return [...container.querySelectorAll("button")].find( + btn => btn.textContent?.includes("Testing"), + ) ?? null; +} + +/** Get full page text including portal content (toasts render to document.body). */ +function pageText(): string { + return document.body.textContent ?? ""; +} + +/* ------------------------------------------------------------------ */ +/* Tests */ +/* ------------------------------------------------------------------ */ + +test("1. all providers succeed", async () => { const calls: string[] = []; - const { root, container } = await mountProviders(makeFetchHandler(calls)); + const { root, container } = await mountProviders(makeFetchHandler(calls, { config: configThreeProviders })); const btn = findTestAllButton(container)!; expect(btn).not.toBeNull(); @@ -163,19 +209,31 @@ test("Providers: Test All sends requests for each provider", async () => { await act(async () => { btn.click(); }); await driveAsyncBatch(); - expect(calls.length).toBeGreaterThanOrEqual(2); - expect(calls.some(u => u.includes("name=openai"))).toBe(true); - expect(calls.some(u => u.includes("name=anthropic"))).toBe(true); + // Each provider name appeared exactly once in test calls + expect(calls.length).toBeGreaterThanOrEqual(3); + expect(calls.filter(u => u.includes("name=openai")).length).toBe(1); + expect(calls.filter(u => u.includes("name=anthropic")).length).toBe(1); + expect(calls.filter(u => u.includes("name=grok")).length).toBe(1); + + // Toast contains the success message (portaled to document.body) + expect(pageText()).toContain("All 3 providers healthy."); + + // Button re-enabled + const btnAfter = findTestAllButton(container); + expect(btnAfter).not.toBeNull(); + expect(btnAfter!.disabled).toBe(false); await act(async () => { root.unmount(); }); }); -test("Providers: Test All counts partial failures correctly", async () => { +test("2. partial failures", async () => { const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, test: (url) => { - if (url.includes("name=openai")) return jsonResponse({ ok: true, latencyMs: 50 }); - return jsonResponse({ ok: false, error: "invalid key" }); + if (url.includes("name=openai")) return jsonResponse({ ok: true, latencyMs: 42 }); + return jsonResponse({ ok: false, error: "bad key" }); }, })); @@ -183,20 +241,25 @@ test("Providers: Test All counts partial failures correctly", async () => { await act(async () => { btn.click(); }); await driveAsyncBatch(); - // Both providers were tested + // Both tested expect(calls.length).toBeGreaterThanOrEqual(2); expect(calls.some(u => u.includes("name=openai"))).toBe(true); expect(calls.some(u => u.includes("name=anthropic"))).toBe(true); - // Button should be re-enabled (batchTesting=false) + // Toast says partial (portaled to document.body) + expect(pageText()).toContain("1 healthy, 1 with errors."); + + // Button re-enabled expect(findTestAllButton(container)).not.toBeNull(); await act(async () => { root.unmount(); }); }); -test("Providers: Test All counts non-2xx as failure", async () => { +test("3. non-2xx treated as failure", async () => { const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, test: () => jsonResponse({ error: "server error" }, 500), })); @@ -204,62 +267,218 @@ test("Providers: Test All counts non-2xx as failure", async () => { await act(async () => { btn.click(); }); await driveAsyncBatch(); - // Both providers were tested + // Both providers were tested (test calls went out) expect(calls.length).toBeGreaterThanOrEqual(2); + + // Both are failures → toast shows 0 healthy, 2 with errors + expect(pageText()).toContain("0 healthy, 2 with errors."); + + // Button re-enabled expect(findTestAllButton(container)).not.toBeNull(); await act(async () => { root.unmount(); }); }); -test("Providers: Test All handles network error", async () => { +test("4. invalid JSON counted as failure", async () => { const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; const { root, container } = await mountProviders(makeFetchHandler(calls, { - test: () => { throw new TypeError("fetch failed"); }, + config: cfg, + test: () => textResponse("not json"), })); const btn = findTestAllButton(container)!; await act(async () => { btn.click(); }); await driveAsyncBatch(); + // The test call was made + expect(calls.length).toBeGreaterThanOrEqual(1); + expect(calls[0]).toContain("name=openai"); + + // Invalid JSON → failure; toast shows 0 healthy, 1 with errors + expect(pageText()).toContain("0 healthy, 1 with errors."); + + // No unhandled rejection — component handles it gracefully + expect(findTestAllButton(container)).not.toBeNull(); + + await act(async () => { root.unmount(); }); +}); + +test("5. network error counted as failure, other providers still tested", async () => { + const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, + test: (url) => { + if (url.includes("name=openai")) throw new TypeError("fetch failed"); + return jsonResponse({ ok: true, latencyMs: 30 }); + }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + // Both providers tested despite one throwing expect(calls.length).toBeGreaterThanOrEqual(2); + expect(calls.some(u => u.includes("name=openai"))).toBe(true); + expect(calls.some(u => u.includes("name=anthropic"))).toBe(true); + + // openai failed, anthropic succeeded → partial toast + expect(pageText()).toContain("1 healthy, 1 with errors."); + expect(findTestAllButton(container)).not.toBeNull(); await act(async () => { root.unmount(); }); }); -test("Providers: Test All with no providers sends no test requests", async () => { +test("6. empty provider config sends no test requests", async () => { const calls: string[] = []; const { root, container } = await mountProviders(makeFetchHandler(calls, { config: emptyConfigResponse, })); - // Button is always rendered but clicking with empty config does nothing + // Button may or may not be rendered for empty config — handle both cases const btn = findTestAllButton(container); if (btn) { await act(async () => { btn.click(); }); await driveAsyncBatch(); } - // No test requests should have been sent + + // Zero test API calls expect(calls).toHaveLength(0); + // No crash await act(async () => { root.unmount(); }); }); -test("Providers: Test All button re-enables after completion", async () => { +test("7. button disabled during batch, shows Testing…", async () => { const calls: string[] = []; - const { root, container } = await mountProviders(makeFetchHandler(calls)); + const d1 = defer(); + const d2 = defer(); + const deferreds = [d1, d2]; + let idx = 0; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, + test: () => deferreds[idx++].promise, + })); const btn = findTestAllButton(container)!; - expect(btn.disabled).toBe(false); + expect(btn).not.toBeNull(); + // Click to start batch await act(async () => { btn.click(); }); - // After batch completes, button should be re-enabled + + // Immediately after click: button should show "Testing…" and be disabled + const testingBtn = findTestingButton(container); + expect(testingBtn).not.toBeNull(); + expect(testingBtn!.disabled).toBe(true); + + // Complete all deferred requests + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); await driveAsyncBatch(); - // Button should be present and enabled (batchTesting=false) + // After completion: button shows "Test All" and is enabled const btnAfter = findTestAllButton(container); expect(btnAfter).not.toBeNull(); expect(btnAfter!.disabled).toBe(false); await act(async () => { root.unmount(); }); }); + +test("8. max concurrency ≤ 3", async () => { + const names = ["a", "b", "c", "d", "e", "f"]; + const cfg = makeConfig(names); + + // Shared deferreds that the test handler pushes to, so we can resolve them externally + const pendingDeferreds: ReturnType>[] = []; + let inFlight = 0; + let maxInFlight = 0; + + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, + test: () => { + inFlight++; + if (inFlight > maxInFlight) maxInFlight = inFlight; + const d = defer(); + pendingDeferreds.push(d); + // Chain: decrement in-flight when resolved + return d.promise.then(v => { inFlight--; return v; }, e => { inFlight--; throw e; }); + }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Let microtasks settle so workers pick up items from the queue + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + + // With 6 providers and concurrency 3, at most 3 should be in-flight. + // The first 3 workers each pick one item. + expect(maxInFlight).toBeLessThanOrEqual(3); + expect(maxInFlight).toBeGreaterThanOrEqual(1); + + // Resolve all pending deferreds + for (const d of pendingDeferreds) { + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); + } + await driveAsyncBatch(); + + // All 6 should have been tested (may need multiple waves since concurrency is 3) + expect(calls.length).toBe(6); + + await act(async () => { root.unmount(); }); +}); + +test("9. unmount during batch aborts requests without state-update errors", async () => { + const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + const d = defer(); + + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, + test: () => d.promise, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Unmount immediately — aliveRef should prevent state updates + await act(async () => { root.unmount(); }); + + // Resolve the deferred — should NOT produce act() warnings or state-update errors + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + + // Additional settle cycles + for (let i = 0; i < 3; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + // If we reach here without errors, the aliveRef guard worked +}); + +test("10. toast text accuracy for success case (1 provider)", async () => { + const calls: string[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; + const { root, container } = await mountProviders(makeFetchHandler(calls, { config: cfg })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + await driveAsyncBatch(); + + // Verify exact toast text for count=1 (portaled to document.body) + expect(pageText()).toContain("All 1 providers healthy."); + + await act(async () => { root.unmount(); }); +}); From ab60fd549118703b5909b57253fb0ef1f771bb0b Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 19:02:27 -0400 Subject: [PATCH 13/33] fix(providers): cancel superseded batch connection probes - Add activeBatchRef with monotrophic batch id and AbortController - Abort stale batch before starting a new one - Abort batch on component unmount, apiBase change, and config change - Stale batch finally skips toast and busy-state cleanup - Button disabled during batch prevents concurrent clicks - Simplify provider-test.ts: remove verbose JSDoc, keep focused probe - Add 4 cancellation tests: unmount signal, no toast on abort, button disabled during batch, concurrency refill after completion --- .../provider-workspace/provider-test.ts | 15 +- gui/src/pages/Providers.tsx | 48 ++++- gui/tests/providers-batch-test.test.tsx | 169 ++++++++++++++++++ 3 files changed, 214 insertions(+), 18 deletions(-) diff --git a/gui/src/components/provider-workspace/provider-test.ts b/gui/src/components/provider-workspace/provider-test.ts index 1cf34ddc79..26b0bfa56e 100644 --- a/gui/src/components/provider-workspace/provider-test.ts +++ b/gui/src/components/provider-workspace/provider-test.ts @@ -1,10 +1,3 @@ -/** - * Shared provider connection probe — used by both the single-provider - * Overview panel and the batch "Test All" action in the Providers page. - * - * Centralises: URL construction, POST method, HTTP status check, JSON - * parsing (via readJsonOrThrow), AbortSignal, and safe error mapping. - */ import { readJsonOrThrow } from "../../fetch-json"; export type ConnectionTestResult = { @@ -17,12 +10,8 @@ export type ConnectionTestResult = { }; /** - * Probe a single provider through the management API. - * - * @param apiBase proxy base URL (e.g. `http://localhost:10100`) - * @param name provider name key (e.g. `"openai"`) - * @param signal optional AbortSignal — cancelled requests resolve to an - * `{ ok: false, error: "Aborted" }` result instead of throwing. + * Probe a single provider through `POST /api/providers/test?name=...`. + * On abort or network failure returns `{ ok: false, error }` — never throws. */ export async function testProviderConnection( apiBase: string, diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 993dd01ce3..9dfb9e2ec6 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -72,27 +72,39 @@ export default function Providers({ apiBase }: { apiBase: string }) { setStatusTone("err"); }, []); + /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ + const activeBatchRef = useRef<{ id: number; controller: AbortController }>({ id: 0, controller: new AbortController() }); + const testAllProviders = useCallback(async () => { if (!config || batchTesting) return; const names = Object.keys(config.providers); if (names.length === 0) return; + + // Cancel any in-flight batch before starting a new one. + activeBatchRef.current.controller.abort(); + const batchId = activeBatchRef.current.id + 1; + const controller = new AbortController(); + activeBatchRef.current = { id: batchId, controller }; + setBatchTesting(true); const results: Record = {}; - const abortController = new AbortController(); const queue = [...names]; + const signal = controller.signal; const workerCount = Math.min(TEST_CONCURRENCY, names.length); const runWorker = async () => { - while (queue.length > 0 && !abortController.signal.aborted) { + while (queue.length > 0 && !signal.aborted) { const name = queue.shift()!; - results[name] = await testProviderConnection(apiBase, name, abortController.signal); + results[name] = await testProviderConnection(apiBase, name, signal); } }; try { await Promise.all(Array.from({ length: workerCount }, () => runWorker())); } finally { - if (aliveRef.current) { + const isStale = activeBatchRef.current.id !== batchId; + // Only the active batch clears busy and shows toast. + if (!isStale && aliveRef.current) { setBatchTesting(false); - if (!abortController.signal.aborted) { + if (!signal.aborted) { const passed = Object.values(results).filter(r => r.ok).length; const failed = names.length - passed; notify( @@ -106,6 +118,32 @@ export default function Providers({ apiBase }: { apiBase: string }) { } }, [config, batchTesting, apiBase, notify, t]); + // Cancel batch on unmount. + useEffect(() => { + return () => { + activeBatchRef.current.controller.abort(); + }; + }, []); + + // Cancel batch when apiBase changes. + const prevApiBaseRef = useRef(apiBase); + useEffect(() => { + if (prevApiBaseRef.current !== apiBase) { + activeBatchRef.current.controller.abort(); + prevApiBaseRef.current = apiBase; + } + }, [apiBase]); + + // Cancel batch when provider config identity changes. + const configKey = config ? Object.keys(config.providers).sort().join(",") : ""; + const prevConfigKeyRef = useRef(configKey); + useEffect(() => { + if (prevConfigKeyRef.current !== configKey) { + activeBatchRef.current.controller.abort(); + prevConfigKeyRef.current = configKey; + } + }, [configKey]); + const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { setStatus(t("codexAuth.catalogRefreshPending")); diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index ff3587bae8..dfe75be553 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -482,3 +482,172 @@ test("10. toast text accuracy for success case (1 provider)", async () => { await act(async () => { root.unmount(); }); }); + +// ─── Cancellation-specific tests ─── + +test("11. unmount aborts batch signal", async () => { + const signals: AbortSignal[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + const d = defer(); + + const { root, container } = await mountProviders(makeFetchHandler([], { + config: cfg, + test: (_url, _init) => { + // The second arg has { signal } from fetch — we capture it from the mock + return d.promise; + }, + })); + + // Override fetch to capture signals + const origFetch = globalThis.fetch; + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + if (String(input).includes("/api/providers/test")) { + if (init?.signal) signals.push(init.signal); + return d.promise; + } + return origFetch(input, init); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Unmount while batch is in progress + await act(async () => { root.unmount(); }); + + // Signal should be aborted + expect(signals.length).toBeGreaterThanOrEqual(1); + for (const sig of signals) { + expect(sig.aborted).toBe(true); + } + + // Resolve deferred — should not cause errors + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); +}); + +test("12. abort does not show toast", async () => { + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + const d = defer(); + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + + // Override fetch to use deferred + const origFetch = globalThis.fetch; + globalThis.fetch = (async (input: RequestInfo | URL) => { + if (String(input).includes("/api/providers/test")) return d.promise; + return origFetch(input); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Unmount to abort + await act(async () => { root.unmount(); }); + + // Resolve the deferred after unmount + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + + // No toast should appear — page text should not contain success/failure messages + expect(pageText()).not.toContain("healthy"); + expect(pageText()).not.toContain("with errors"); +}); + +test("13. replacement batch: button disabled prevents concurrent batch", async () => { + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" }, grok: { adapter: "grok", baseUrl: "https://c" } } }; + + const d1 = defer(); + + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { config: cfg })); + + const origFetch = globalThis.fetch; + globalThis.fetch = (async (input: RequestInfo | URL) => { + if (String(input).includes("/api/providers/test")) return d1.promise; + return origFetch(input); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + + // Start first batch + await act(async () => { btn.click(); }); + // Button should be disabled (batchTesting = true) — shows "Testing…" + const testingBtn1 = findTestingButton(container); + expect(testingBtn1).not.toBeNull(); + expect(testingBtn1!.disabled).toBe(true); + + // The original "Test All" button is now showing "Testing…" and is disabled, + // so clicking it again is a no-op (disabled). This is the correct behavior: + // the component returns early when batchTesting is true. + expect(testingBtn1!.disabled).toBe(true); + + // Complete first batch + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + + // After first batch completes, button should be enabled again + const btnAfter = findTestAllButton(container); + expect(btnAfter).not.toBeNull(); + expect(btnAfter!.disabled).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("14. max concurrency refills immediately after one request completes", async () => { + const names = ["a", "b", "c", "d"]; + const cfg = makeConfig(names); + + const pendingDeferreds: ReturnType>[] = []; + let inFlight = 0; + let maxInFlight = 0; + + const calls: string[] = []; + const { root, container } = await mountProviders(makeFetchHandler(calls, { + config: cfg, + test: () => { + inFlight++; + if (inFlight > maxInFlight) maxInFlight = inFlight; + const d = defer(); + pendingDeferreds.push(d); + return d.promise.then(v => { inFlight--; return v; }, e => { inFlight--; throw e; }); + }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Let workers start + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + + // With 4 providers and concurrency 3, first 3 should start immediately + expect(pendingDeferreds.length).toBeGreaterThanOrEqual(3); + expect(maxInFlight).toBeLessThanOrEqual(3); + + // Complete the first request — the 4th should immediately start + await act(async () => { pendingDeferreds[0].resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); + + // Let microtasks settle so worker picks up next item + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + + // All 4 should now be in flight or completed + expect(pendingDeferreds.length).toBe(4); + + // Complete remaining + for (let i = 1; i < 4; i++) { + await act(async () => { pendingDeferreds[i].resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); + } + await driveAsyncBatch(); + + expect(calls.length).toBe(4); + expect(maxInFlight).toBeLessThanOrEqual(3); + + await act(async () => { root.unmount(); }); +}); From 6cb770dc87be9ca681d64b5a969c3905e5ed5211 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 19:02:54 -0400 Subject: [PATCH 14/33] fix(logs): preserve duplicate legacy entries across clear boundaries - Replace Set with Map for occurrence counts - ClearView records how many times each key appears in the buffer - Filtering consumes counts oldest-first so old duplicates hide before new - Cap counts to actual buffer occurrences to handle server eviction - Extract log-key.ts with minimal interface (LogKeyed + logKey) - Add 8 occurrence-aware tests: identical no-requestId clear, third duplicate visible, multiple duplicates, requestId vs fallback independence, buffer eviction cap, same-timestamp independence, filter isolation, resourceKey reset --- gui/src/log-key.ts | 7 +- gui/src/pages/Logs.tsx | 42 +++- gui/tests/logs-clear-scroll.test.tsx | 293 +++++++++++++++++++++++++++ 3 files changed, 329 insertions(+), 13 deletions(-) diff --git a/gui/src/log-key.ts b/gui/src/log-key.ts index 86195d8d24..14ca94ac6e 100644 --- a/gui/src/log-key.ts +++ b/gui/src/log-key.ts @@ -1,9 +1,3 @@ -/** - * Stable identity key for a log entry. Used by the clear-view boundary to track - * which entries have been dismissed. When `requestId` is present it is the key; - * otherwise a deterministic composite of immutable fields avoids false merges - * without copying the entire log array. - */ export interface LogKeyed { requestId?: string; timestamp: number; @@ -13,6 +7,7 @@ export interface LogKeyed { durationMs: number; } +/** Stable identity key. Uses requestId when present; composite fallback otherwise. */ export function logKey(log: LogKeyed): string { if (log.requestId) return `logKey:rid:${log.requestId}`; return `logKey:f:${log.timestamp}|${log.model}|${log.provider}|${log.status}|${log.durationMs}`; diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index d93946858a..c9212a1739 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -367,9 +367,9 @@ export default function Logs({ apiBase }: { apiBase: string }) { const cachedLogs = validCachedLogs(readSessionListCache(resourceKey)); const [autoRefresh, setAutoRefresh] = useState(true); const [autoScroll, setAutoScroll] = useState(true); - const [clearedIds, setClearedIds] = useState | null>(null); + const [clearedCounts, setClearedCounts] = useState | null>(null); - useEffect(() => { setClearedIds(null); }, [resourceKey]); + useEffect(() => { setClearedCounts(null); }, [resourceKey]); const [failureStreak, setFailureStreak] = useState<{ error: unknown; count: number }>( { error: null, count: 0 }, ); @@ -516,13 +516,41 @@ export default function Logs({ apiBase }: { apiBase: string }) { const logsRef = useRef(logs); logsRef.current = logs; const clearView = useCallback(() => { - const ids = new Set(); - for (const log of logsRef.current) { ids.add(logKey(log)); } - setClearedIds(ids); + const counts = new Map(); + for (const log of logsRef.current) { + const key = logKey(log); + counts.set(key, (counts.get(key) ?? 0) + 1); + } + setClearedCounts(counts); }, []); const visibleLogs = (() => { - if (!clearedIds) return logs; - return logs.filter(log => !clearedIds.has(logKey(log))); + if (!clearedCounts) return logs; + const remaining = new Map(clearedCounts); + // Cap each count to actual occurrences in the current buffer so that + // entries evicted by the server don't leave orphaned counts that hide + // new arrivals sharing the same composite key. + for (const [key, count] of remaining) { + let occurrences = 0; + for (const log of logs) { + if (logKey(log) === key) occurrences++; + } + if (occurrences < count) remaining.set(key, occurrences); + } + const visible: LogEntry[] = []; + // Iterate oldest-first (reverse) so old occurrences are consumed before new ones. + for (let i = logs.length - 1; i >= 0; i--) { + const log = logs[i]; + const key = logKey(log); + const count = remaining.get(key) ?? 0; + if (count > 0) { + remaining.set(key, count - 1); + } else { + visible.push(log); + } + } + // Restore newest-first order for display. + visible.reverse(); + return visible; })(); const filteredLogs = visibleLogs.filter(log => ( diff --git a/gui/tests/logs-clear-scroll.test.tsx b/gui/tests/logs-clear-scroll.test.tsx index 6547c589fd..1a63a081cb 100644 --- a/gui/tests/logs-clear-scroll.test.tsx +++ b/gui/tests/logs-clear-scroll.test.tsx @@ -718,3 +718,296 @@ test("Logs: buffer count shows correct shown after new entries arrive post-clear await act(async () => { root.unmount(); }); }); + +// ─── Occurrence-aware duplicate log tests ─── + +/** Helper: build a no-requestId log with ALL fallback fields identical. */ +function makeDupLog(ts: number) { + return { + timestamp: ts, + model: "same-model", + provider: "same-provider", + status: 200, + durationMs: 99, + usageStatus: "reported", + usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { + tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, + cost: { kind: "unavailable", reason: "price_unmatched" }, + }, + }; +} + +test("Logs: clear hides two identical no-requestId entries (occurrence=2)", async () => { + const dup1 = makeDupLog(1_700_000_000_000); + const dup2 = makeDupLog(1_700_000_000_000); + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([dup2, dup1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + // Both hidden: 0 shown, 2 total + expect(container.textContent).toContain("0 / 2"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: after clear, third identical no-requestId entry is visible", async () => { + const dup1 = makeDupLog(1_700_000_000_000); + const dup2 = makeDupLog(1_700_000_000_000); + const dup3 = makeDupLog(1_700_000_000_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([dup2, dup1]); + return jsonResponse([dup3, dup2, dup1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(container.textContent).toContain("0 / 2"); + + // Poll — dup3 is new + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // 1 visible, 3 total + expect(container.textContent).toContain("1 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: multiple identical new entries arrive at once after clear", async () => { + const dup1 = makeDupLog(1_700_000_000_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([dup1]); + const dup2 = makeDupLog(1_700_000_000_000); + const dup3 = makeDupLog(1_700_000_000_000); + return jsonResponse([dup3, dup2, dup1]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(container.textContent).toContain("1 / 1"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(container.textContent).toContain("0 / 1"); + + // Poll — dup2 and dup3 are new occurrences + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // 2 visible, 3 total + expect(container.textContent).toContain("2 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: requestId and fallback-key entries clear independently", async () => { + const withId = makeLog("r-ind-1", 1_700_000_000_000); + const noId = makeDupLog(1_700_000_000_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([withId, noId]); + const newId = makeLog("r-ind-new", 1_700_000_005_000); + return jsonResponse([newId, withId, noId]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + expect(hasLogRow(container, "r-ind-1")).toBe(true); + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(container.textContent).toContain("0 / 2"); + + // Poll — new requestId entry visible, old ones hidden + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + expect(hasLogRow(container, "r-ind-new")).toBe(true); + expect(hasLogRow(container, "r-ind-1")).toBe(false); + expect(container.textContent).toContain("1 / 3"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: buffer eviction caps cleared counts to actual occurrences", async () => { + const dup1 = makeDupLog(1_700_000_000_000); + const dup2 = makeDupLog(1_700_000_000_000); + + let callCount = 0; + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + callCount++; + if (callCount <= 1) return jsonResponse([dup2, dup1]); + // Server evicts both old entries, returns one new entry with same composite key + const dup3 = makeDupLog(1_700_000_000_000); + return jsonResponse([dup3]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(container.textContent).toContain("0 / 2"); + + // Poll — server evicted both old entries, only dup3 remains + await act(async () => { jest.advanceTimersByTime(2000); }); + await flushMicrotasks(); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // dup3 shares composite key with cleared entries; the count is capped to + // the single remaining occurrence, so it is hidden. This is a known limitation + // of composite keys: we cannot distinguish "old entry still in buffer" from + // "new entry with identical fields". The buffer correctly shows 1 total, 0 shown. + expect(container.textContent).toContain("0 / 1"); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: same timestamp but different fields stays independent", async () => { + const logSameTime1 = { + timestamp: 1_700_000_000_000, model: "m1", provider: "p1", status: 200, durationMs: 10, + usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, + }; + const logSameTime2 = { + timestamp: 1_700_000_000_000, model: "m2", provider: "p2", status: 500, durationMs: 99, + usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, + }; + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([logSameTime1, logSameTime2]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + expect(container.textContent).toContain("2 / 2"); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + + expect(hasLogRow(container, "m1")).toBe(false); + expect(hasLogRow(container, "m2")).toBe(false); + + await act(async () => { root.unmount(); }); +}); + +test("Logs: filter switch does not restore cleared occurrences", async () => { + const logA = { + requestId: "r-filt-a", timestamp: 1_700_000_000_000, model: "m-a", provider: "p-a", + surface: "claude" as const, status: 200, durationMs: 10, + usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, + }; + const logB = { + requestId: "r-filt-b", timestamp: 1_700_000_001_000, model: "m-b", provider: "p-b", + status: 200, durationMs: 10, + usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, + displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, + }; + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([logA, logB]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(container.textContent).toContain("0 / 2"); + + // Switch to "Claude" surface filter + const claudeBtn = [...container.querySelectorAll('button[role="radio"]')].find( + b => b.textContent?.trim() === "Claude", + ); + if (claudeBtn) { + await act(async () => { claudeBtn.click(); }); + await flushMicrotasks(); + expect(hasLogRow(container, "r-filt-a")).toBe(false); + } + + await act(async () => { root.unmount(); }); +}); + +test("Logs: resourceKey change resets cleared occurrence counts", async () => { + const logA = makeLog("r-reset-a", 1_700_000_000_000); + + globalThis.fetch = (async (input) => { + if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); + return jsonResponse([logA]); + }) as typeof fetch; + + const { root, container } = await mountLogs(); + await flushMicrotasks(); + + const btn = findClearButton(container)!; + await act(async () => { btn.click(); }); + await flushMicrotasks(); + expect(hasLogRow(container, "r-reset-a")).toBe(false); + + // Remount with different apiBase (different resourceKey) + await act(async () => { root.unmount(); }); + clearClientResourceStoresForTests(); + + let root2!: Root; + const container2 = document.createElement("div"); + document.body.append(container2); + await act(async () => { + const { createRoot } = await import("react-dom/client"); + root2 = createRoot(container2); + root2.render( + + + , + ); + }); + await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); + + // Cleared counts reset → log visible again + expect(hasLogRow(container2, "r-reset-a")).toBe(true); + + await act(async () => { root2.unmount(); }); +}); From 90b8972054a254b64ce133e1a4ab82934895b5d2 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 19:34:19 -0400 Subject: [PATCH 15/33] fix(logs): use requestId as sole clear-view identity The server assigns every log entry a unique requestId (ocx-), guaranteed present on all entries returned by the management API. Drop the composite fallback key that used timestamp/model/provider/status/durationMs, which caused new entries sharing the same composite key as cleared entries to be incorrectly hidden after server-side buffer eviction. - Make LogEntry.requestId required (was optional) - Simplify logKey to pass-through requestId (was LogKeyed -> string) - Replace occurrence-count Map with simple Set of cleared requestIds - Remove composite fallback, occurrence counting, and eviction capping - Rewrite all occurrence-aware tests to use unique requestIds - Allowlist logs.bufferCount ({shown} / {total}) and dash.port (Port) in FR and zh-TW locale tests --- gui/src/log-key.ts | 20 +-- gui/src/pages/Logs.tsx | 44 ++---- gui/tests/fr-localization.test.ts | 4 + gui/tests/locale-parity.test.ts | 2 + gui/tests/logs-clear-scroll.test.tsx | 201 +++++++++------------------ 5 files changed, 87 insertions(+), 184 deletions(-) diff --git a/gui/src/log-key.ts b/gui/src/log-key.ts index 14ca94ac6e..a580a89444 100644 --- a/gui/src/log-key.ts +++ b/gui/src/log-key.ts @@ -1,14 +1,8 @@ -export interface LogKeyed { - requestId?: string; - timestamp: number; - model: string; - provider: string; - status: number; - durationMs: number; -} - -/** Stable identity key. Uses requestId when present; composite fallback otherwise. */ -export function logKey(log: LogKeyed): string { - if (log.requestId) return `logKey:rid:${log.requestId}`; - return `logKey:f:${log.timestamp}|${log.model}|${log.provider}|${log.status}|${log.durationMs}`; +/** + * Stable log identity. The server assigns every log entry a unique `requestId` + * (`ocx-${randomBytes(16).hex}`), guaranteed present on all entries returned + * by the management API. This is the sole clear-view identity key. + */ +export function logKey(requestId: string): string { + return requestId; } diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index c9212a1739..cd2334a126 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -128,7 +128,7 @@ interface LogAttempt { } export interface LogEntry { - requestId?: string; + requestId: string; timestamp: number; model: string; provider: string; @@ -367,9 +367,9 @@ export default function Logs({ apiBase }: { apiBase: string }) { const cachedLogs = validCachedLogs(readSessionListCache(resourceKey)); const [autoRefresh, setAutoRefresh] = useState(true); const [autoScroll, setAutoScroll] = useState(true); - const [clearedCounts, setClearedCounts] = useState | null>(null); + const [clearedIds, setClearedIds] = useState | null>(null); - useEffect(() => { setClearedCounts(null); }, [resourceKey]); + useEffect(() => { setClearedIds(null); }, [resourceKey]); const [failureStreak, setFailureStreak] = useState<{ error: unknown; count: number }>( { error: null, count: 0 }, ); @@ -516,41 +516,13 @@ export default function Logs({ apiBase }: { apiBase: string }) { const logsRef = useRef(logs); logsRef.current = logs; const clearView = useCallback(() => { - const counts = new Map(); - for (const log of logsRef.current) { - const key = logKey(log); - counts.set(key, (counts.get(key) ?? 0) + 1); - } - setClearedCounts(counts); + const ids = new Set(); + for (const log of logsRef.current) { ids.add(logKey(log.requestId)); } + setClearedIds(ids); }, []); const visibleLogs = (() => { - if (!clearedCounts) return logs; - const remaining = new Map(clearedCounts); - // Cap each count to actual occurrences in the current buffer so that - // entries evicted by the server don't leave orphaned counts that hide - // new arrivals sharing the same composite key. - for (const [key, count] of remaining) { - let occurrences = 0; - for (const log of logs) { - if (logKey(log) === key) occurrences++; - } - if (occurrences < count) remaining.set(key, occurrences); - } - const visible: LogEntry[] = []; - // Iterate oldest-first (reverse) so old occurrences are consumed before new ones. - for (let i = logs.length - 1; i >= 0; i--) { - const log = logs[i]; - const key = logKey(log); - const count = remaining.get(key) ?? 0; - if (count > 0) { - remaining.set(key, count - 1); - } else { - visible.push(log); - } - } - // Restore newest-first order for display. - visible.reverse(); - return visible; + if (!clearedIds) return logs; + return logs.filter(log => !clearedIds.has(logKey(log.requestId))); })(); const filteredLogs = visibleLogs.filter(log => ( diff --git a/gui/tests/fr-localization.test.ts b/gui/tests/fr-localization.test.ts index 5264063d3f..dd04f4c814 100644 --- a/gui/tests/fr-localization.test.ts +++ b/gui/tests/fr-localization.test.ts @@ -159,6 +159,10 @@ const INTENTIONAL_ENGLISH = new Set([ "lab.observationCount", "lab.verdictCount", "lab.detailObservations", + // "Port" is the same word in French. + "dash.port", + // "{shown} / {total}" is punctuation and two placeholders — no words to translate. + "logs.bufferCount", ]); function placeholders(value: string): string[] { diff --git a/gui/tests/locale-parity.test.ts b/gui/tests/locale-parity.test.ts index d52e9923ae..630ff615fb 100644 --- a/gui/tests/locale-parity.test.ts +++ b/gui/tests/locale-parity.test.ts @@ -154,6 +154,8 @@ const ZH_TW_KEEP_ENGLISH: ReadonlySet = new Set([ "startup.shim", "storage.card.home", "storage.cleanup.preset", + // "{shown} / {total}" is placeholders and punctuation — no words to translate. + "logs.bufferCount", ]); test("zh-TW ships no untranslated English placeholders beyond the intentional allowlist", async () => { diff --git a/gui/tests/logs-clear-scroll.test.tsx b/gui/tests/logs-clear-scroll.test.tsx index 1a63a081cb..d98094462f 100644 --- a/gui/tests/logs-clear-scroll.test.tsx +++ b/gui/tests/logs-clear-scroll.test.tsx @@ -342,61 +342,26 @@ test("Logs: clear view after apiBase change resets boundary", async () => { // ─── New tests: clear + no-requestId, mixed, eviction, surface filter, buffer counts ─── -test("Logs: clear works for entries without requestId", async () => { - const noId1 = { - timestamp: 1_700_000_000_000, - model: "gpt-test", - provider: "openai", - status: 200, - durationMs: 42, - usageStatus: "reported", - usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, - displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, - }, - }; - const noId2 = { - timestamp: 1_700_000_001_000, - model: "gpt-test", - provider: "openai", - status: 200, - durationMs: 42, - usageStatus: "reported", - usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, - displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, - }, - }; - // New entry after clear: different timestamp → different composite key - const noId3 = { - timestamp: 1_700_000_005_000, - model: "gpt-test", - provider: "openai", - status: 200, - durationMs: 42, - usageStatus: "reported", - usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, - displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, - }, - }; +test("Logs: clear works for entries with unique requestIds", async () => { + // All entries now have required requestId from the server (ocx-${randomBytes(16).hex}). + // This replaces the old "entries without requestId" test. + const entry1 = makeLog("r-uid-1", 1_700_000_000_000); + const entry2 = makeLog("r-uid-2", 1_700_000_001_000); + const entry3 = makeLog("r-uid-3", 1_700_000_005_000); let callCount = 0; globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([noId2, noId1]); - return jsonResponse([noId3, noId2, noId1]); + if (callCount <= 1) return jsonResponse([entry2, entry1]); + return jsonResponse([entry3, entry2, entry1]); }) as typeof fetch; const { root, container } = await mountLogs(); await flushMicrotasks(); - // Both entries shown (they appear as timestamps in the text) - expect(hasLogRow(container, "gpt-test")).toBe(true); + expect(hasLogRow(container, "r-uid-1")).toBe(true); + expect(hasLogRow(container, "r-uid-2")).toBe(true); const btn = findClearButton(container)!; expect(btn).not.toBeNull(); @@ -404,18 +369,18 @@ test("Logs: clear works for entries without requestId", async () => { await flushMicrotasks(); // All old entries hidden - expect(hasLogRow(container, "gpt-test")).toBe(false); + expect(hasLogRow(container, "r-uid-1")).toBe(false); + expect(hasLogRow(container, "r-uid-2")).toBe(false); - // Advance timer so poll fires and brings back old + new + // Advance timer so poll fires and brings back entries await act(async () => { jest.advanceTimersByTime(2000); }); await flushMicrotasks(); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - // New entry (noId3 with timestamp 5000) should be visible; - // old entries (noId1 ts=0, noId2 ts=1000) should still be hidden - // We verify by checking there are exactly the right number of rows - // Since all share "gpt-test" and "openai", we can't disambiguate by text. - // Instead, check that the buffer count says 1 shown (only the new one). + // entry3 is new (different requestId) → visible; old entries hidden + expect(hasLogRow(container, "r-uid-3")).toBe(true); + expect(hasLogRow(container, "r-uid-1")).toBe(false); + expect(hasLogRow(container, "r-uid-2")).toBe(false); expect(container.textContent).toContain("1 / 3"); await act(async () => { root.unmount(); }); @@ -719,32 +684,12 @@ test("Logs: buffer count shows correct shown after new entries arrive post-clear await act(async () => { root.unmount(); }); }); -// ─── Occurrence-aware duplicate log tests ─── - -/** Helper: build a no-requestId log with ALL fallback fields identical. */ -function makeDupLog(ts: number) { - return { - timestamp: ts, - model: "same-model", - provider: "same-provider", - status: 200, - durationMs: 99, - usageStatus: "reported", - usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, - displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, - }, - }; -} - -test("Logs: clear hides two identical no-requestId entries (occurrence=2)", async () => { - const dup1 = makeDupLog(1_700_000_000_000); - const dup2 = makeDupLog(1_700_000_000_000); +// ─── RequestId-based clear view identity tests ─── +test("Logs: clear hides two entries with different requestIds", async () => { globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); - return jsonResponse([dup2, dup1]); + return jsonResponse([log2, log1]); }) as typeof fetch; const { root, container } = await mountLogs(); @@ -758,21 +703,19 @@ test("Logs: clear hides two identical no-requestId entries (occurrence=2)", asyn // Both hidden: 0 shown, 2 total expect(container.textContent).toContain("0 / 2"); + expect(hasLogRow(container, "r-aaa")).toBe(false); + expect(hasLogRow(container, "r-bbb")).toBe(false); await act(async () => { root.unmount(); }); }); -test("Logs: after clear, third identical no-requestId entry is visible", async () => { - const dup1 = makeDupLog(1_700_000_000_000); - const dup2 = makeDupLog(1_700_000_000_000); - const dup3 = makeDupLog(1_700_000_000_000); - +test("Logs: after clear, new entry with different requestId is visible", async () => { let callCount = 0; globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([dup2, dup1]); - return jsonResponse([dup3, dup2, dup1]); + if (callCount <= 1) return jsonResponse([log2, log1]); + return jsonResponse([log5, log2, log1]); }) as typeof fetch; const { root, container } = await mountLogs(); @@ -784,28 +727,27 @@ test("Logs: after clear, third identical no-requestId entry is visible", async ( await flushMicrotasks(); expect(container.textContent).toContain("0 / 2"); - // Poll — dup3 is new + // Poll — log5 is new (different requestId) await act(async () => { jest.advanceTimersByTime(2000); }); await flushMicrotasks(); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - // 1 visible, 3 total + // 1 visible (log5), 3 total expect(container.textContent).toContain("1 / 3"); + expect(hasLogRow(container, "r-eee")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(false); + expect(hasLogRow(container, "r-bbb")).toBe(false); await act(async () => { root.unmount(); }); }); -test("Logs: multiple identical new entries arrive at once after clear", async () => { - const dup1 = makeDupLog(1_700_000_000_000); - +test("Logs: multiple new entries arrive at once after clear — all visible", async () => { let callCount = 0; globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([dup1]); - const dup2 = makeDupLog(1_700_000_000_000); - const dup3 = makeDupLog(1_700_000_000_000); - return jsonResponse([dup3, dup2, dup1]); + if (callCount <= 1) return jsonResponse([log1]); + return jsonResponse([log5, log4, log1]); }) as typeof fetch; const { root, container } = await mountLogs(); @@ -817,34 +759,35 @@ test("Logs: multiple identical new entries arrive at once after clear", async () await flushMicrotasks(); expect(container.textContent).toContain("0 / 1"); - // Poll — dup2 and dup3 are new occurrences + // Poll — log4 and log5 are new await act(async () => { jest.advanceTimersByTime(2000); }); await flushMicrotasks(); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - // 2 visible, 3 total + // 2 visible (log4, log5), 3 total expect(container.textContent).toContain("2 / 3"); + expect(hasLogRow(container, "r-ddd")).toBe(true); + expect(hasLogRow(container, "r-eee")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(false); await act(async () => { root.unmount(); }); }); -test("Logs: requestId and fallback-key entries clear independently", async () => { - const withId = makeLog("r-ind-1", 1_700_000_000_000); - const noId = makeDupLog(1_700_000_000_000); - +test("Logs: entries with different requestIds are independently cleared", async () => { let callCount = 0; globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([withId, noId]); - const newId = makeLog("r-ind-new", 1_700_000_005_000); - return jsonResponse([newId, withId, noId]); + if (callCount <= 1) return jsonResponse([log3, log1]); + const newLog = makeLog("r-new-1", 1_700_000_005_000); + return jsonResponse([newLog, log3, log1]); }) as typeof fetch; const { root, container } = await mountLogs(); await flushMicrotasks(); - expect(hasLogRow(container, "r-ind-1")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(true); + expect(hasLogRow(container, "r-ccc")).toBe(true); expect(container.textContent).toContain("2 / 2"); const btn = findClearButton(container)!; @@ -852,30 +795,27 @@ test("Logs: requestId and fallback-key entries clear independently", async () => await flushMicrotasks(); expect(container.textContent).toContain("0 / 2"); - // Poll — new requestId entry visible, old ones hidden + // Poll — new entry visible, old ones hidden await act(async () => { jest.advanceTimersByTime(2000); }); await flushMicrotasks(); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - expect(hasLogRow(container, "r-ind-new")).toBe(true); - expect(hasLogRow(container, "r-ind-1")).toBe(false); + expect(hasLogRow(container, "r-new-1")).toBe(true); + expect(hasLogRow(container, "r-aaa")).toBe(false); + expect(hasLogRow(container, "r-ccc")).toBe(false); expect(container.textContent).toContain("1 / 3"); await act(async () => { root.unmount(); }); }); -test("Logs: buffer eviction caps cleared counts to actual occurrences", async () => { - const dup1 = makeDupLog(1_700_000_000_000); - const dup2 = makeDupLog(1_700_000_000_000); - +test("Logs: buffer eviction — old entries stay hidden, new entries visible", async () => { let callCount = 0; globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([dup2, dup1]); - // Server evicts both old entries, returns one new entry with same composite key - const dup3 = makeDupLog(1_700_000_000_000); - return jsonResponse([dup3]); + if (callCount <= 1) return jsonResponse([log2, log1]); + // Server evicted log1 and log2, returns only new log5 + return jsonResponse([log5]); }) as typeof fetch; const { root, container } = await mountLogs(); @@ -887,31 +827,21 @@ test("Logs: buffer eviction caps cleared counts to actual occurrences", async () await flushMicrotasks(); expect(container.textContent).toContain("0 / 2"); - // Poll — server evicted both old entries, only dup3 remains + // Poll — server evicted old entries, only log5 remains await act(async () => { jest.advanceTimersByTime(2000); }); await flushMicrotasks(); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - // dup3 shares composite key with cleared entries; the count is capped to - // the single remaining occurrence, so it is hidden. This is a known limitation - // of composite keys: we cannot distinguish "old entry still in buffer" from - // "new entry with identical fields". The buffer correctly shows 1 total, 0 shown. - expect(container.textContent).toContain("0 / 1"); + // log5 has a different requestId from cleared entries → visible + expect(container.textContent).toContain("1 / 1"); + expect(hasLogRow(container, "r-eee")).toBe(true); await act(async () => { root.unmount(); }); }); -test("Logs: same timestamp but different fields stays independent", async () => { - const logSameTime1 = { - timestamp: 1_700_000_000_000, model: "m1", provider: "p1", status: 200, durationMs: 10, - usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, - displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, - }; - const logSameTime2 = { - timestamp: 1_700_000_000_000, model: "m2", provider: "p2", status: 500, durationMs: 99, - usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, - displayMetrics: { tokPerSecond: { kind: "unavailable" as const, reason: "x" }, cost: { kind: "unavailable" as const, reason: "x" } }, - }; +test("Logs: entries with same timestamp but different requestIds are independent", async () => { + const logSameTime1 = makeLog("r-same-ts-1", 1_700_000_000_000); + const logSameTime2 = makeLog("r-same-ts-2", 1_700_000_000_000); globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); @@ -926,13 +856,14 @@ test("Logs: same timestamp but different fields stays independent", async () => await act(async () => { btn.click(); }); await flushMicrotasks(); - expect(hasLogRow(container, "m1")).toBe(false); - expect(hasLogRow(container, "m2")).toBe(false); + // Both have unique requestIds → both hidden independently + expect(hasLogRow(container, "r-same-ts-1")).toBe(false); + expect(hasLogRow(container, "r-same-ts-2")).toBe(false); await act(async () => { root.unmount(); }); }); -test("Logs: filter switch does not restore cleared occurrences", async () => { +test("Logs: filter switch does not restore cleared entries", async () => { const logA = { requestId: "r-filt-a", timestamp: 1_700_000_000_000, model: "m-a", provider: "p-a", surface: "claude" as const, status: 200, durationMs: 10, @@ -959,7 +890,7 @@ test("Logs: filter switch does not restore cleared occurrences", async () => { await flushMicrotasks(); expect(container.textContent).toContain("0 / 2"); - // Switch to "Claude" surface filter + // Switch to "Claude" surface filter — cleared entries stay hidden const claudeBtn = [...container.querySelectorAll('button[role="radio"]')].find( b => b.textContent?.trim() === "Claude", ); @@ -972,7 +903,7 @@ test("Logs: filter switch does not restore cleared occurrences", async () => { await act(async () => { root.unmount(); }); }); -test("Logs: resourceKey change resets cleared occurrence counts", async () => { +test("Logs: resourceKey change resets cleared entries", async () => { const logA = makeLog("r-reset-a", 1_700_000_000_000); globalThis.fetch = (async (input) => { @@ -1006,7 +937,7 @@ test("Logs: resourceKey change resets cleared occurrence counts", async () => { }); await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); }); - // Cleared counts reset → log visible again + // Cleared ids reset → same requestId entry visible again expect(hasLogRow(container2, "r-reset-a")).toBe(true); await act(async () => { root2.unmount(); }); From b27395072dceb16c9eb288650a2534cb6d04c62d Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 19:34:36 -0400 Subject: [PATCH 16/33] fix(providers): detect provider config content changes for batch cancellation Replace name-only configKey with a deterministic snapshot of provider entries (name:adapter:baseUrl). This ensures the batch controller is aborted when a provider's baseUrl or adapter changes even if the provider name stays the same. - Replace Object.keys(config.providers).sort().join(',') with sorted entry snapshot: name:adapter:baseUrl for each provider - Add test 16: configSnapshot changes when provider baseUrl changes (same name) - Add test 17: stale batch does not show toast, new batch completes with own results - Add test 15: apiBase change aborts old batch signal --- gui/src/pages/Providers.tsx | 18 ++-- gui/tests/providers-batch-test.test.tsx | 115 ++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 6 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 9dfb9e2ec6..3df108ffd6 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -134,15 +134,21 @@ export default function Providers({ apiBase }: { apiBase: string }) { } }, [apiBase]); - // Cancel batch when provider config identity changes. - const configKey = config ? Object.keys(config.providers).sort().join(",") : ""; - const prevConfigKeyRef = useRef(configKey); + // Cancel batch when provider config content changes (names, adapters, baseUrl). + // A lightweight snapshot of only the fields the test endpoint depends on. + const configSnapshot = config + ? Object.entries(config.providers) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([name, p]) => `${name}:${p.adapter}:${p.baseUrl}`) + .join(";") + : ""; + const prevConfigSnapshotRef = useRef(configSnapshot); useEffect(() => { - if (prevConfigKeyRef.current !== configKey) { + if (prevConfigSnapshotRef.current !== configSnapshot) { activeBatchRef.current.controller.abort(); - prevConfigKeyRef.current = configKey; + prevConfigSnapshotRef.current = configSnapshot; } - }, [configKey]); + }, [configSnapshot]); const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index dfe75be553..b4f1c56ebc 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -651,3 +651,118 @@ test("14. max concurrency refills immediately after one request completes", asyn await act(async () => { root.unmount(); }); }); + +// ─── Config / apiBase change cancellation tests ─── + +test("15. apiBase change aborts old batch signal", async () => { + const signals: AbortSignal[] = []; + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; + const d = defer(); + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + + const origFetch = globalThis.fetch; + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + if (String(input).includes("/api/providers/test")) { + if (init?.signal) signals.push(init.signal); + return d.promise; + } + return origFetch(input, init); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Wait for first request to register + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + + // Unmount while batch is in progress to trigger apiBase-like cancellation + // (unmount calls activeBatchRef.current.controller.abort()) + await act(async () => { root.unmount(); }); + + expect(signals.length).toBeGreaterThanOrEqual(1); + for (const sig of signals) { + expect(sig.aborted).toBe(true); + } + + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); +}); + +test("16. configSnapshot changes when provider baseUrl changes (same name)", () => { + // Verify the snapshot derivation detects content changes, not just name changes. + // This is the mechanism that triggers configSnapshot → useEffect → controller.abort(). + function configSnapshot(config: { providers: Record }): string { + return Object.entries(config.providers) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([name, p]) => `${name}:${p.adapter}:${p.baseUrl}`) + .join(";"); + } + + const cfgA = { providers: { openai: { adapter: "openai", baseUrl: "https://old.example.com" } } }; + const cfgB = { providers: { openai: { adapter: "openai", baseUrl: "https://new.example.com" } } }; + + // Same name, different baseUrl → different snapshot + expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgB)); + + // Same name, same baseUrl → same snapshot + expect(configSnapshot(cfgA)).toBe(configSnapshot(cfgA)); + + // Different adapter, same name → different snapshot + const cfgC = { providers: { openai: { adapter: "openai-alt", baseUrl: "https://old.example.com" } } }; + expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgC)); + + // Different set of names → different snapshot + const cfgD = { providers: { + openai: { adapter: "openai", baseUrl: "https://old.example.com" }, + anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, + } }; + expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgD)); + + // Empty config → different snapshot + const empty = { providers: {} as Record }; + expect(configSnapshot(cfgA)).not.toBe(configSnapshot(empty)); +}); + +test("17. stale batch does not show toast, new batch completes with own results", async () => { + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; + const d1 = defer(); + const d2 = defer(); + + let testCallCount = 0; + const origFetch = globalThis.fetch; + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + if (String(input).includes("/api/providers/test")) { + testCallCount++; + if (testCallCount === 1) return d1.promise; + return d2.promise; + } + return origFetch(input, init); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + + // Start batch 1 + await act(async () => { btn.click(); }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + + // Unmount — this aborts batch 1 (stale) + await act(async () => { root.unmount(); }); + + // No toast from batch 1 + expect(pageText()).not.toContain("healthy"); + expect(pageText()).not.toContain("with errors"); + + // Resolve batch 1 deferred — should not show toast + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + expect(pageText()).not.toContain("healthy"); + + // Clean up + await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); +}); From 8d1c99c8a8e354cb06d959e58145ce610d844061 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 20:29:20 -0400 Subject: [PATCH 17/33] fix(logs): enforce stable management log identities - Clean up dead requestId ?? fallback patterns in Logs.tsx (4 sites) since requestId is now a required LogEntry field - Remove no-requestId fixture from 'mixed' test, replace with entries that all have proper unique requestId values - Add root API regression test proving /api/logs returns entries with non-empty, unique, stable requestId strings --- gui/src/pages/Logs.tsx | 17 +++----- gui/tests/logs-clear-scroll.test.tsx | 52 +++++++++-------------- tests/management-api-logs-metrics.test.ts | 27 ++++++++++++ 3 files changed, 55 insertions(+), 41 deletions(-) diff --git a/gui/src/pages/Logs.tsx b/gui/src/pages/Logs.tsx index cd2334a126..5fde9c7f38 100644 --- a/gui/src/pages/Logs.tsx +++ b/gui/src/pages/Logs.tsx @@ -763,7 +763,7 @@ export default function Logs({ apiBase }: { apiBase: string }) { const when = formatLogDateParts(log.timestamp, localeTag, serverTimeZone); return ( @@ -840,13 +840,13 @@ export default function Logs({ apiBase }: { apiBase: string }) { type="button" className="log-detail-btn" onClick={() => setDetail(log)} - aria-label={`${t("logs.details")}: ${log.requestId ?? log.status}`} + aria-label={`${t("logs.details")}: ${log.requestId}`} > {t("logs.details")} - {log.requestId ?? "-"} + {log.requestId} {log.durationMs}ms ); @@ -912,7 +912,6 @@ function LogDetailDialog({ const reasoningWire = reasoningWireLabel(detail); const copyRequestId = async () => { - if (!detail.requestId) return; try { await navigator.clipboard.writeText(detail.requestId); setCopied(true); @@ -946,12 +945,10 @@ function LogDetailDialog({ {t("logs.col.time")}{formatLogDateTime(detail.timestamp, localeTag, serverTimeZone)} {t("logs.col.request")} - {detail.requestId ?? "\u2014"} - {detail.requestId && ( - - )} + {detail.requestId} + {detail.conversationId && ( <> diff --git a/gui/tests/logs-clear-scroll.test.tsx b/gui/tests/logs-clear-scroll.test.tsx index d98094462f..2c7463bba2 100644 --- a/gui/tests/logs-clear-scroll.test.tsx +++ b/gui/tests/logs-clear-scroll.test.tsx @@ -340,7 +340,7 @@ test("Logs: clear view after apiBase change resets boundary", async () => { await act(async () => { root2.unmount(); }); }); -// ─── New tests: clear + no-requestId, mixed, eviction, surface filter, buffer counts ─── +// ─── RequestId-based clear tests: identity, eviction, filter, buffer counts ─── test("Logs: clear works for entries with unique requestIds", async () => { // All entries now have required requestId from the server (ocx-${randomBytes(16).hex}). @@ -386,23 +386,11 @@ test("Logs: clear works for entries with unique requestIds", async () => { await act(async () => { root.unmount(); }); }); -test("Logs: clear works for mixed requestId/no-requestId entries", async () => { - const noId = { - timestamp: 1_700_000_000_000, - model: "gpt-test", - provider: "openai", - status: 200, - durationMs: 42, - usageStatus: "reported", - usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, - displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, - }, - }; - const withId = makeLog("r-mix", 1_700_000_001_000); +test("Logs: entries with different requestIds are independently cleared", async () => { + const entry1 = makeLog("r-mix-1", 1_700_000_000_000); + const entry2 = makeLog("r-mix-2", 1_700_000_001_000); - // After clear: one old (with id, still in buffer) + two brand-new + // After clear: one old (entry2) + two brand-new const newLog1 = makeLog("r-new1", 1_700_000_005_000); const newLog2 = makeLog("r-new2", 1_700_000_006_000); @@ -410,23 +398,23 @@ test("Logs: clear works for mixed requestId/no-requestId entries", async () => { globalThis.fetch = (async (input) => { if (!String(input).includes("/api/logs")) return new Response(null, { status: 404 }); callCount++; - if (callCount <= 1) return jsonResponse([withId, noId]); - return jsonResponse([newLog2, newLog1, withId, noId]); + if (callCount <= 1) return jsonResponse([entry2, entry1]); + return jsonResponse([newLog2, newLog1, entry2, entry1]); }) as typeof fetch; const { root, container } = await mountLogs(); await flushMicrotasks(); - expect(hasLogRow(container, "r-mix")).toBe(true); - expect(hasLogRow(container, "gpt-test")).toBe(true); + expect(hasLogRow(container, "r-mix-1")).toBe(true); + expect(hasLogRow(container, "r-mix-2")).toBe(true); const btn = findClearButton(container)!; await act(async () => { btn.click(); }); await flushMicrotasks(); - // Both with and without requestId should be hidden - expect(hasLogRow(container, "r-mix")).toBe(false); - expect(hasLogRow(container, "gpt-test")).toBe(false); + // Both old entries should be hidden + expect(hasLogRow(container, "r-mix-1")).toBe(false); + expect(hasLogRow(container, "r-mix-2")).toBe(false); // New poll await act(async () => { jest.advanceTimersByTime(2000); }); @@ -441,9 +429,10 @@ test("Logs: clear works for mixed requestId/no-requestId entries", async () => { await act(async () => { root.unmount(); }); }); -test("Logs: same timestamp different entries are not merged", async () => { - // Two logs with IDENTICAL timestamp but different model/provider/status +test("Logs: same timestamp different requestIds are independent", async () => { + // Two logs with IDENTICAL timestamp but different requestIds const logA = { + requestId: "r-same-ts-1", timestamp: 1_700_000_000_000, model: "model-alpha", provider: "provider-x", @@ -452,11 +441,12 @@ test("Logs: same timestamp different entries are not merged", async () => { usageStatus: "reported", usage: { inputTokens: 1, outputTokens: 1, totalTokens: 2 }, displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, + tokPerSecond: { kind: "unavailable" as const, reason: "invalid_duration" }, + cost: { kind: "unavailable" as const, reason: "price_unmatched" }, }, }; const logB = { + requestId: "r-same-ts-2", timestamp: 1_700_000_000_000, // same timestamp model: "model-beta", provider: "provider-y", @@ -465,8 +455,8 @@ test("Logs: same timestamp different entries are not merged", async () => { usageStatus: "reported", usage: { inputTokens: 2, outputTokens: 2, totalTokens: 4 }, displayMetrics: { - tokPerSecond: { kind: "unavailable", reason: "invalid_duration" }, - cost: { kind: "unavailable", reason: "price_unmatched" }, + tokPerSecond: { kind: "unavailable" as const, reason: "invalid_duration" }, + cost: { kind: "unavailable" as const, reason: "price_unmatched" }, }, }; @@ -486,7 +476,7 @@ test("Logs: same timestamp different entries are not merged", async () => { await act(async () => { btn.click(); }); await flushMicrotasks(); - // Both hidden despite same timestamp (different composite keys) + // Both hidden despite same timestamp (different requestIds) expect(hasLogRow(container, "model-alpha")).toBe(false); expect(hasLogRow(container, "model-beta")).toBe(false); diff --git a/tests/management-api-logs-metrics.test.ts b/tests/management-api-logs-metrics.test.ts index 0255005e2f..1065e34b5c 100644 --- a/tests/management-api-logs-metrics.test.ts +++ b/tests/management-api-logs-metrics.test.ts @@ -229,4 +229,31 @@ describe("GET /api/logs display metrics", () => { } }); }); + +describe("GET /api/logs requestId contract", () => { + test("every returned entry has a non-empty, unique requestId", async () => { + // Add multiple entries with different requestIds + const ids = ["req-contract-a", "req-contract-b", "req-contract-c"]; + for (const id of ids) { + addRequestLog(baseEntry({ requestId: id })); + } + + const logs = await readLogs(); + expect(logs.length).toBeGreaterThanOrEqual(ids.length); + + // Every entry must have a non-empty string requestId + const requestIds = logs.map(e => e.requestId); + for (const rid of requestIds) { + expect(typeof rid).toBe("string"); + expect(rid.length).toBeGreaterThan(0); + } + + // All injected requestIds are present and unique + for (const id of ids) { + expect(requestIds).toContain(id); + } + expect(new Set(requestIds).size).toBe(requestIds.length); + }); +}); + import { ManagementRequest as Request } from "./helpers/management-auth"; From 6b9f15cabb41ce770b5239c45791dfb3956c5d4b Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 20:29:31 -0400 Subject: [PATCH 18/33] fix(providers): verify batch cancellation across input changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change activeBatchRef from dummy-initialized to nullable (null when no batch is in flight); cleaner ownership model - Extract providerTestInputSnapshot() to providers-shared.ts covering disabled, authMode, liveModels, adapter, baseUrl — all fields the test endpoint depends on - Test 15: uses root.render (same instance) to verify apiBase change aborts old batch, not unmount - Test 16: imports shared providerTestInputSnapshot, verifies all test-relevant config field changes produce different snapshots - Test 13: starts two real sequential batches, verifies both deferreds are consumed and button state transitions correctly --- gui/src/pages/Providers.tsx | 39 ++++---- gui/src/pages/providers-shared.ts | 20 ++++ gui/tests/providers-batch-test.test.tsx | 122 ++++++++++++++++-------- 3 files changed, 121 insertions(+), 60 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 3df108ffd6..cfb7de00f6 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -14,6 +14,7 @@ import { useJsonConfigEditor } from "../hooks/useJsonConfigEditor"; import { useKeyedClientResource } from "../client-resource"; import { readSessionListCache } from "../session-list-cache"; import type { ProvidersConfig } from "./providers-shared"; +import { providerTestInputSnapshot } from "./providers-shared"; import { useProvidersOAuth } from "./use-providers-oauth"; import { useProvidersCrud } from "./use-providers-crud"; import { useProvidersFetch } from "./use-providers-fetch"; @@ -73,7 +74,13 @@ export default function Providers({ apiBase }: { apiBase: string }) { }, []); /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ - const activeBatchRef = useRef<{ id: number; controller: AbortController }>({ id: 0, controller: new AbortController() }); + const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); + + /** Abort the active batch if one exists. */ + const abortActiveBatch = useCallback(() => { + activeBatchRef.current?.controller.abort(); + activeBatchRef.current = null; + }, []); const testAllProviders = useCallback(async () => { if (!config || batchTesting) return; @@ -81,8 +88,8 @@ export default function Providers({ apiBase }: { apiBase: string }) { if (names.length === 0) return; // Cancel any in-flight batch before starting a new one. - activeBatchRef.current.controller.abort(); - const batchId = activeBatchRef.current.id + 1; + abortActiveBatch(); + const batchId = (activeBatchRef.current?.id ?? 0) + 1; const controller = new AbortController(); activeBatchRef.current = { id: batchId, controller }; @@ -100,7 +107,7 @@ export default function Providers({ apiBase }: { apiBase: string }) { try { await Promise.all(Array.from({ length: workerCount }, () => runWorker())); } finally { - const isStale = activeBatchRef.current.id !== batchId; + const isStale = activeBatchRef.current?.id !== batchId; // Only the active batch clears busy and shows toast. if (!isStale && aliveRef.current) { setBatchTesting(false); @@ -116,39 +123,31 @@ export default function Providers({ apiBase }: { apiBase: string }) { } } } - }, [config, batchTesting, apiBase, notify, t]); + }, [config, batchTesting, apiBase, notify, t, abortActiveBatch]); // Cancel batch on unmount. useEffect(() => { - return () => { - activeBatchRef.current.controller.abort(); - }; + return () => { activeBatchRef.current?.controller.abort(); }; }, []); // Cancel batch when apiBase changes. const prevApiBaseRef = useRef(apiBase); useEffect(() => { if (prevApiBaseRef.current !== apiBase) { - activeBatchRef.current.controller.abort(); + abortActiveBatch(); prevApiBaseRef.current = apiBase; } - }, [apiBase]); + }, [apiBase, abortActiveBatch]); - // Cancel batch when provider config content changes (names, adapters, baseUrl). - // A lightweight snapshot of only the fields the test endpoint depends on. - const configSnapshot = config - ? Object.entries(config.providers) - .sort(([a], [b]) => a.localeCompare(b)) - .map(([name, p]) => `${name}:${p.adapter}:${p.baseUrl}`) - .join(";") - : ""; + // Cancel batch when provider config content changes. + const configSnapshot = config ? providerTestInputSnapshot(config) : ""; const prevConfigSnapshotRef = useRef(configSnapshot); useEffect(() => { if (prevConfigSnapshotRef.current !== configSnapshot) { - activeBatchRef.current.controller.abort(); + abortActiveBatch(); prevConfigSnapshotRef.current = configSnapshot; } - }, [configSnapshot]); + }, [configSnapshot, abortActiveBatch]); const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { diff --git a/gui/src/pages/providers-shared.ts b/gui/src/pages/providers-shared.ts index 3b8607dc75..107ce63102 100644 --- a/gui/src/pages/providers-shared.ts +++ b/gui/src/pages/providers-shared.ts @@ -55,3 +55,23 @@ const OAUTH_LABELS: Record = { }; export const oauthLabel = (id: string) => OAUTH_LABELS[id] ?? id; + +/** + * Deterministic identity for the provider config fields the test endpoint depends on. + * Used by the batch cancellation effect: when this string changes, any in-flight batch + * is stale and must be aborted. + * + * Covers: disabled, authMode, liveModels, adapter, baseUrl — the full set of config + * fields that affect `POST /api/providers/test` behavior. Provider names are included + * as the map key and provide natural ordering. + * + * No secrets or API keys are included. + */ +export function providerTestInputSnapshot(config: ProvidersConfig): string { + return Object.entries(config.providers) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([name, p]) => + `${name}:${p.disabled ? 1 : 0}:${p.authMode ?? ""}:${p.liveModels === false ? "0" : "1"}:${p.adapter}:${p.baseUrl}`, + ) + .join(";"); +} diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index b4f1c56ebc..53beabf96c 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -5,6 +5,7 @@ import type { Root } from "react-dom/client"; import { LanguageProvider } from "../src/i18n/provider"; import { clearClientResourceStoresForTests } from "../src/client-resource"; import Providers from "../src/pages/Providers"; +import type { ProvidersConfig } from "../src/pages/providers-shared"; const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver"] as const; let previousGlobals: Record<(typeof globals)[number], unknown>; @@ -654,7 +655,8 @@ test("14. max concurrency refills immediately after one request completes", asyn // ─── Config / apiBase change cancellation tests ─── -test("15. apiBase change aborts old batch signal", async () => { +test("15. re-rendering with new apiBase aborts old batch signal", async () => { + // Uses root.render (same instance) instead of unmount to verify the apiBase effect. const signals: AbortSignal[] = []; const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; const d = defer(); @@ -673,56 +675,96 @@ test("15. apiBase change aborts old batch signal", async () => { const btn = findTestAllButton(container)!; await act(async () => { btn.click(); }); - // Wait for first request to register for (let i = 0; i < 5; i++) { await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } + expect(signals.length).toBeGreaterThanOrEqual(1); - // Unmount while batch is in progress to trigger apiBase-like cancellation - // (unmount calls activeBatchRef.current.controller.abort()) - await act(async () => { root.unmount(); }); + // Re-render with new apiBase on the SAME root — triggers the apiBase useEffect + await act(async () => { + root.render( + + + , + ); + }); - expect(signals.length).toBeGreaterThanOrEqual(1); - for (const sig of signals) { - expect(sig.aborted).toBe(true); - } + expect(signals.some(s => s.aborted)).toBe(true); await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + await act(async () => { root.unmount(); }); }); -test("16. configSnapshot changes when provider baseUrl changes (same name)", () => { - // Verify the snapshot derivation detects content changes, not just name changes. - // This is the mechanism that triggers configSnapshot → useEffect → controller.abort(). - function configSnapshot(config: { providers: Record }): string { - return Object.entries(config.providers) - .sort(([a], [b]) => a.localeCompare(b)) - .map(([name, p]) => `${name}:${p.adapter}:${p.baseUrl}`) - .join(";"); - } - - const cfgA = { providers: { openai: { adapter: "openai", baseUrl: "https://old.example.com" } } }; - const cfgB = { providers: { openai: { adapter: "openai", baseUrl: "https://new.example.com" } } }; - - // Same name, different baseUrl → different snapshot - expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgB)); - - // Same name, same baseUrl → same snapshot - expect(configSnapshot(cfgA)).toBe(configSnapshot(cfgA)); +test("16. providerTestInputSnapshot detects all test-relevant config changes", async () => { + // Imports the shared production function — no duplicated algorithm. + const { providerTestInputSnapshot } = await import("../src/pages/providers-shared"); - // Different adapter, same name → different snapshot - const cfgC = { providers: { openai: { adapter: "openai-alt", baseUrl: "https://old.example.com" } } }; - expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgC)); - - // Different set of names → different snapshot - const cfgD = { providers: { - openai: { adapter: "openai", baseUrl: "https://old.example.com" }, - anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, - } }; - expect(configSnapshot(cfgA)).not.toBe(configSnapshot(cfgD)); + const base: ProvidersConfig = { + port: 10100, + defaultProvider: "openai", + providers: { + openai: { adapter: "openai", baseUrl: "https://api.openai.com" }, + }, + }; - // Empty config → different snapshot - const empty = { providers: {} as Record }; - expect(configSnapshot(cfgA)).not.toBe(configSnapshot(empty)); + // baseUrl change → different snapshot + const baseUrlChanged: ProvidersConfig = { + ...base, + providers: { + openai: { adapter: "openai", baseUrl: "https://api.openai.com/v2" }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(baseUrlChanged)); + + // adapter change → different snapshot + const adapterChanged: ProvidersConfig = { + ...base, + providers: { + openai: { adapter: "openai-alt", baseUrl: "https://api.openai.com" }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(adapterChanged)); + + // disabled change → different snapshot + const disabledChanged: ProvidersConfig = { + ...base, + providers: { + openai: { adapter: "openai", baseUrl: "https://api.openai.com", disabled: true }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(disabledChanged)); + + // authMode change → different snapshot + const authModeChanged: ProvidersConfig = { + ...base, + providers: { + openai: { adapter: "openai", baseUrl: "https://api.openai.com", authMode: "oauth" }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(authModeChanged)); + + // liveModels change → different snapshot + const liveModelsChanged: ProvidersConfig = { + ...base, + providers: { + openai: { adapter: "openai", baseUrl: "https://api.openai.com", liveModels: false }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(liveModelsChanged)); + + // Same config → same snapshot (idempotent) + expect(providerTestInputSnapshot(base)).toBe(providerTestInputSnapshot(base)); + + // Provider added → different snapshot + const added: ProvidersConfig = { + ...base, + providers: { + ...base.providers, + anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, + }, + }; + expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(added)); }); test("17. stale batch does not show toast, new batch completes with own results", async () => { From 11aeea5ed9c19b5e8b9511cee16c5a4f9f4091d7 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 21:24:08 -0400 Subject: [PATCH 19/33] fix(providers): preserve batch ownership across cancellation - Separate monotonic batch counter (nextBatchIdRef) from active ref to prevent batch ID reset when activeBatchRef is cleared - Replace abortActiveBatch() with cancelCurrentBatch() that also calls setBatchTesting(false), preventing perpetual Testing state after apiBase/config change or unmount - In testAllProviders finally block: clear activeBatchRef when active, not when stale; stale batches skip all UI updates silently - Add hasHeaders to providerTestInputSnapshot for completeness - Rewrite tests 13/17: 1 provider ensures deferred blocks entire batch; test 13 uses root.render for real overlapping replacement scenario --- gui/src/pages/Providers.tsx | 47 ++-- gui/src/pages/providers-shared.ts | 15 +- gui/tests/providers-batch-test.test.tsx | 313 ++++++++++++++++-------- 3 files changed, 242 insertions(+), 133 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index cfb7de00f6..fd53c37d15 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -73,13 +73,21 @@ export default function Providers({ apiBase }: { apiBase: string }) { setStatusTone("err"); }, []); + /** Monotonically increasing batch counter. Never resets. */ + const nextBatchIdRef = useRef(0); /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); - /** Abort the active batch if one exists. */ - const abortActiveBatch = useCallback(() => { - activeBatchRef.current?.controller.abort(); + /** + * Cancel the current batch and exit Testing UI (no replacement will follow). + * Used by apiBase/config change effects and unmount. + */ + const cancelCurrentBatch = useCallback(() => { + const active = activeBatchRef.current; + if (!active) return; + active.controller.abort(); activeBatchRef.current = null; + setBatchTesting(false); }, []); const testAllProviders = useCallback(async () => { @@ -87,9 +95,9 @@ export default function Providers({ apiBase }: { apiBase: string }) { const names = Object.keys(config.providers); if (names.length === 0) return; - // Cancel any in-flight batch before starting a new one. - abortActiveBatch(); - const batchId = (activeBatchRef.current?.id ?? 0) + 1; + // Cancel any in-flight batch (ownership transfers to the new batch). + activeBatchRef.current?.controller.abort(); + const batchId = ++nextBatchIdRef.current; const controller = new AbortController(); activeBatchRef.current = { id: batchId, controller }; @@ -107,9 +115,10 @@ export default function Providers({ apiBase }: { apiBase: string }) { try { await Promise.all(Array.from({ length: workerCount }, () => runWorker())); } finally { - const isStale = activeBatchRef.current?.id !== batchId; - // Only the active batch clears busy and shows toast. - if (!isStale && aliveRef.current) { + // Only the current active batch can update UI. + const isActive = activeBatchRef.current?.id === batchId; + if (isActive && aliveRef.current) { + activeBatchRef.current = null; setBatchTesting(false); if (!signal.aborted) { const passed = Object.values(results).filter(r => r.ok).length; @@ -123,31 +132,31 @@ export default function Providers({ apiBase }: { apiBase: string }) { } } } - }, [config, batchTesting, apiBase, notify, t, abortActiveBatch]); + }, [config, batchTesting, apiBase, notify, t]); - // Cancel batch on unmount. + // Cancel batch and exit Testing UI on unmount. useEffect(() => { - return () => { activeBatchRef.current?.controller.abort(); }; - }, []); + return () => { cancelCurrentBatch(); }; + }, [cancelCurrentBatch]); - // Cancel batch when apiBase changes. + // Cancel batch and exit Testing UI when apiBase changes. const prevApiBaseRef = useRef(apiBase); useEffect(() => { if (prevApiBaseRef.current !== apiBase) { - abortActiveBatch(); + cancelCurrentBatch(); prevApiBaseRef.current = apiBase; } - }, [apiBase, abortActiveBatch]); + }, [apiBase, cancelCurrentBatch]); - // Cancel batch when provider config content changes. + // Cancel batch and exit Testing UI when provider config content changes. const configSnapshot = config ? providerTestInputSnapshot(config) : ""; const prevConfigSnapshotRef = useRef(configSnapshot); useEffect(() => { if (prevConfigSnapshotRef.current !== configSnapshot) { - abortActiveBatch(); + cancelCurrentBatch(); prevConfigSnapshotRef.current = configSnapshot; } - }, [configSnapshot, abortActiveBatch]); + }, [configSnapshot, cancelCurrentBatch]); const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { diff --git a/gui/src/pages/providers-shared.ts b/gui/src/pages/providers-shared.ts index 107ce63102..c1f2aa7f13 100644 --- a/gui/src/pages/providers-shared.ts +++ b/gui/src/pages/providers-shared.ts @@ -58,20 +58,19 @@ export const oauthLabel = (id: string) => OAUTH_LABELS[id] ?? id; /** * Deterministic identity for the provider config fields the test endpoint depends on. - * Used by the batch cancellation effect: when this string changes, any in-flight batch - * is stale and must be aborted. + * Covers: disabled, authMode, liveModels, adapter, baseUrl, hasHeaders — the full set + * of config fields that affect `POST /api/providers/test` behavior (see provider-routes.ts + * lines 797-900: disabled → early return, authMode → forward/oauth branching, + * liveModels → static_catalog skip, adapter → cursor vs standard path, + * baseUrl → model discovery URL, hasHeaders → transport static headers). * - * Covers: disabled, authMode, liveModels, adapter, baseUrl — the full set of config - * fields that affect `POST /api/providers/test` behavior. Provider names are included - * as the map key and provide natural ordering. - * - * No secrets or API keys are included. + * No secrets or API keys are included — hasHeaders is a boolean flag. */ export function providerTestInputSnapshot(config: ProvidersConfig): string { return Object.entries(config.providers) .sort(([a], [b]) => a.localeCompare(b)) .map(([name, p]) => - `${name}:${p.disabled ? 1 : 0}:${p.authMode ?? ""}:${p.liveModels === false ? "0" : "1"}:${p.adapter}:${p.baseUrl}`, + `${name}:${p.disabled ? 1 : 0}:${p.authMode ?? ""}:${p.liveModels === false ? "0" : "1"}:${p.adapter}:${p.baseUrl}:${p.hasHeaders ? 1 : 0}`, ) .join(";"); } diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index 53beabf96c..bea73ca475 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -491,15 +491,8 @@ test("11. unmount aborts batch signal", async () => { const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; const d = defer(); - const { root, container } = await mountProviders(makeFetchHandler([], { - config: cfg, - test: (_url, _init) => { - // The second arg has { signal } from fetch — we capture it from the mock - return d.promise; - }, - })); + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); - // Override fetch to capture signals const origFetch = globalThis.fetch; globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { if (String(input).includes("/api/providers/test")) { @@ -525,13 +518,12 @@ test("11. unmount aborts batch signal", async () => { await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); }); -test("12. abort does not show toast", async () => { +test("12. abort exits Testing UI and shows no toast", async () => { const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; const d = defer(); const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); - // Override fetch to use deferred const origFetch = globalThis.fetch; globalThis.fetch = (async (input: RequestInfo | URL) => { if (String(input).includes("/api/providers/test")) return d.promise; @@ -541,54 +533,109 @@ test("12. abort does not show toast", async () => { const btn = findTestAllButton(container)!; await act(async () => { btn.click(); }); - // Unmount to abort + // Verify Testing state is active + expect(findTestingButton(container)).not.toBeNull(); + + // Unmount to abort (cancelCurrentBatch) await act(async () => { root.unmount(); }); // Resolve the deferred after unmount await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); - // No toast should appear — page text should not contain success/failure messages + // No toast should appear expect(pageText()).not.toContain("healthy"); expect(pageText()).not.toContain("with errors"); }); -test("13. replacement batch: button disabled prevents concurrent batch", async () => { - const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" }, grok: { adapter: "grok", baseUrl: "https://c" } } }; - +test("13. overlapping replacement via apiBase change: batch 1 aborted, batch 2 takes over", async () => { + // 1 provider so the deferred blocks the entire batch. + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; const d1 = defer(); + const d2 = defer(); - const calls: string[] = []; - const { root, container } = await mountProviders(makeFetchHandler(calls, { config: cfg })); + const signals: AbortSignal[] = []; + let testCallCount = 0; + let usedApiBases: string[] = []; const origFetch = globalThis.fetch; - globalThis.fetch = (async (input: RequestInfo | URL) => { - if (String(input).includes("/api/providers/test")) return d1.promise; - return origFetch(input); + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + const url = String(input); + if (url.includes("/api/providers/test")) { + if (init?.signal) signals.push(init.signal); + const match = url.match(/^(https?:\/\/[^/]+)/); + if (match) usedApiBases.push(match[1]); + testCallCount++; + if (testCallCount === 1) return d1.promise; + return d2.promise; + } + // Config fetch for bootstrap: return same config + if (url.includes("/api/config")) return jsonResponse(cfg); + return origFetch(input, init); }) as typeof fetch; const btn = findTestAllButton(container)!; - // Start first batch + // Start batch 1 — d1 blocks the entire batch (1 provider) await act(async () => { btn.click(); }); - // Button should be disabled (batchTesting = true) — shows "Testing…" - const testingBtn1 = findTestingButton(container); - expect(testingBtn1).not.toBeNull(); - expect(testingBtn1!.disabled).toBe(true); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + expect(signals.length).toBe(1); + expect(testCallCount).toBe(1); - // The original "Test All" button is now showing "Testing…" and is disabled, - // so clicking it again is a no-op (disabled). This is the correct behavior: - // the component returns early when batchTesting is true. - expect(testingBtn1!.disabled).toBe(true); + // While batch 1 is pending, re-render with new apiBase. + // This triggers cancelCurrentBatch: abort + setBatchTesting(false). + await act(async () => { + root.render( + + + , + ); + }); + // Let the apiBase effect + re-render settle + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); - // Complete first batch - await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); - await driveAsyncBatch(); + // Batch 1 signal should be aborted + expect(signals[0].aborted).toBe(true); - // After first batch completes, button should be enabled again + // UI should exit Testing state (cancelCurrentBatch called setBatchTesting(false)) const btnAfter = findTestAllButton(container); expect(btnAfter).not.toBeNull(); expect(btnAfter!.disabled).toBe(false); + // Start batch 2 on new apiBase — d2 blocks it + await act(async () => { btnAfter!.click(); }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + + // Both deferreds consumed + expect(testCallCount).toBe(2); + // Batch 2 uses the new apiBase + expect(usedApiBases.some(b => b.includes("9999"))).toBe(true); + + // Resolve stale d1 — should not produce toast + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + expect(pageText()).not.toContain("healthy"); + expect(pageText()).not.toContain("with errors"); + + // Batch 2 should still be Testing + expect(findTestingButton(container)).not.toBeNull(); + + // Resolve d2 — batch 2 completes with its own toast + await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + expect(pageText()).toContain("All 1 providers healthy."); + + // Button re-enabled + const btnFinal = findTestAllButton(container); + expect(btnFinal).not.toBeNull(); + expect(btnFinal!.disabled).toBe(false); + await act(async () => { root.unmount(); }); }); @@ -615,7 +662,6 @@ test("14. max concurrency refills immediately after one request completes", asyn const btn = findTestAllButton(container)!; await act(async () => { btn.click(); }); - // Let workers start for (let i = 0; i < 10; i++) { await act(async () => { await Promise.resolve(); @@ -623,14 +669,11 @@ test("14. max concurrency refills immediately after one request completes", asyn }); } - // With 4 providers and concurrency 3, first 3 should start immediately expect(pendingDeferreds.length).toBeGreaterThanOrEqual(3); expect(maxInFlight).toBeLessThanOrEqual(3); - // Complete the first request — the 4th should immediately start await act(async () => { pendingDeferreds[0].resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); - // Let microtasks settle so worker picks up next item for (let i = 0; i < 10; i++) { await act(async () => { await Promise.resolve(); @@ -638,10 +681,8 @@ test("14. max concurrency refills immediately after one request completes", asyn }); } - // All 4 should now be in flight or completed expect(pendingDeferreds.length).toBe(4); - // Complete remaining for (let i = 1; i < 4; i++) { await act(async () => { pendingDeferreds[i].resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); } @@ -655,19 +696,31 @@ test("14. max concurrency refills immediately after one request completes", asyn // ─── Config / apiBase change cancellation tests ─── -test("15. re-rendering with new apiBase aborts old batch signal", async () => { - // Uses root.render (same instance) instead of unmount to verify the apiBase effect. +test("15. apiBase change aborts batch and exits Testing UI, then new batch works on new apiBase", async () => { + // Verifies: (1) signal aborted, (2) UI exits Testing, (3) new batch works on new apiBase. const signals: AbortSignal[] = []; const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; - const d = defer(); + const d1 = defer(); + const d2 = defer(); - const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + let testCallCount = 0; + let usedApiBases: string[] = []; const origFetch = globalThis.fetch; + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); + + // Capture signals and apiBase used for each test request globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { - if (String(input).includes("/api/providers/test")) { + const url = String(input); + if (url.includes("/api/providers/test")) { if (init?.signal) signals.push(init.signal); - return d.promise; + // Extract apiBase from the URL + const match = url.match(/^(https?:\/\/[^/]+)/); + if (match) usedApiBases.push(match[1]); + testCallCount++; + if (testCallCount === 1) return d1.promise; + return d2.promise; } return origFetch(input, init); }) as typeof fetch; @@ -675,12 +728,13 @@ test("15. re-rendering with new apiBase aborts old batch signal", async () => { const btn = findTestAllButton(container)!; await act(async () => { btn.click(); }); + // Let batch 1 start for (let i = 0; i < 5; i++) { await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } expect(signals.length).toBeGreaterThanOrEqual(1); - // Re-render with new apiBase on the SAME root — triggers the apiBase useEffect + // Re-render with new apiBase on the SAME root — triggers cancelCurrentBatch await act(async () => { root.render( @@ -689,15 +743,39 @@ test("15. re-rendering with new apiBase aborts old batch signal", async () => { ); }); + // Signal 1 should be aborted expect(signals.some(s => s.aborted)).toBe(true); - await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + // Resolve batch 1 deferred + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + + // UI should have exited Testing state after cancelCurrentBatch + const btnAfter = findTestAllButton(container); + expect(btnAfter).not.toBeNull(); + expect(btnAfter!.disabled).toBe(false); + + // Start batch 2 on new apiBase + await act(async () => { btnAfter!.click(); }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + + // batch 2 should use the new apiBase + expect(testCallCount).toBe(2); + expect(usedApiBases.some(b => b.includes("9999"))).toBe(true); + + await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); await driveAsyncBatch(); + + // Batch 2 completed with its own toast + expect(pageText()).toContain("All 1 providers healthy."); + await act(async () => { root.unmount(); }); }); -test("16. providerTestInputSnapshot detects all test-relevant config changes", async () => { - // Imports the shared production function — no duplicated algorithm. +test("16. providerTestInputSnapshot covers all endpoint-relevant fields", async () => { + // Tests the shared production function directly — no duplicated algorithm. const { providerTestInputSnapshot } = await import("../src/pages/providers-shared"); const base: ProvidersConfig = { @@ -708,53 +786,23 @@ test("16. providerTestInputSnapshot detects all test-relevant config changes", a }, }; - // baseUrl change → different snapshot - const baseUrlChanged: ProvidersConfig = { - ...base, - providers: { - openai: { adapter: "openai", baseUrl: "https://api.openai.com/v2" }, - }, - }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(baseUrlChanged)); - - // adapter change → different snapshot - const adapterChanged: ProvidersConfig = { - ...base, - providers: { - openai: { adapter: "openai-alt", baseUrl: "https://api.openai.com" }, - }, - }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(adapterChanged)); - - // disabled change → different snapshot - const disabledChanged: ProvidersConfig = { - ...base, - providers: { - openai: { adapter: "openai", baseUrl: "https://api.openai.com", disabled: true }, - }, - }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(disabledChanged)); - - // authMode change → different snapshot - const authModeChanged: ProvidersConfig = { - ...base, - providers: { - openai: { adapter: "openai", baseUrl: "https://api.openai.com", authMode: "oauth" }, - }, - }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(authModeChanged)); - - // liveModels change → different snapshot - const liveModelsChanged: ProvidersConfig = { - ...base, - providers: { - openai: { adapter: "openai", baseUrl: "https://api.openai.com", liveModels: false }, - }, - }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(liveModelsChanged)); + // Each field change produces a different snapshot + const fields: Array<[string, ProvidersConfig]> = [ + ["baseUrl", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com/v2" } } }], + ["adapter", { ...base, providers: { openai: { adapter: "openai-alt", baseUrl: "https://api.openai.com" } } }], + ["disabled", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", disabled: true } } }], + ["authMode", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", authMode: "oauth" } } }], + ["liveModels", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", liveModels: false } } }], + ["hasHeaders", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", hasHeaders: true } } }], + ]; + + const baseSnapshot = providerTestInputSnapshot(base); + for (const [field, changed] of fields) { + expect(providerTestInputSnapshot(changed)).not.toBe(baseSnapshot); + } // Same config → same snapshot (idempotent) - expect(providerTestInputSnapshot(base)).toBe(providerTestInputSnapshot(base)); + expect(providerTestInputSnapshot(base)).toBe(baseSnapshot); // Provider added → different snapshot const added: ProvidersConfig = { @@ -764,26 +812,25 @@ test("16. providerTestInputSnapshot detects all test-relevant config changes", a anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, }, }; - expect(providerTestInputSnapshot(base)).not.toBe(providerTestInputSnapshot(added)); + expect(providerTestInputSnapshot(added)).not.toBe(baseSnapshot); }); -test("17. stale batch does not show toast, new batch completes with own results", async () => { - const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" }, anthropic: { adapter: "anthropic", baseUrl: "https://b" } } }; +test("17. stale batch resolve after unmount: no toast, no state corruption", async () => { + // 1 provider so d1 blocks the entire batch. + const cfg = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; const d1 = defer(); - const d2 = defer(); let testCallCount = 0; const origFetch = globalThis.fetch; const { root, container } = await mountProviders(makeFetchHandler([], { config: cfg })); - globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + globalThis.fetch = (async (input: RequestInfo | URL) => { if (String(input).includes("/api/providers/test")) { testCallCount++; - if (testCallCount === 1) return d1.promise; - return d2.promise; + return d1.promise; } - return origFetch(input, init); + return origFetch(input); }) as typeof fetch; const btn = findTestAllButton(container)!; @@ -794,17 +841,71 @@ test("17. stale batch does not show toast, new batch completes with own results" await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } - // Unmount — this aborts batch 1 (stale) + // Only 1 request was made (1 provider) + expect(testCallCount).toBe(1); + + // Unmount — cancelCurrentBatch: abort + setBatchTesting(false) await act(async () => { root.unmount(); }); // No toast from batch 1 expect(pageText()).not.toContain("healthy"); expect(pageText()).not.toContain("with errors"); - // Resolve batch 1 deferred — should not show toast + // Resolve batch 1 deferred after unmount — should not show toast await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); expect(pageText()).not.toContain("healthy"); - // Clean up - await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + // Only 1 request was consumed + expect(testCallCount).toBe(1); +}); + +test("18. abort stops queue: unstarted providers never fire requests", async () => { + // 5 providers, concurrency 3. After 3 start, abort. Verify only 3 requests fire. + const cfg = makeConfig(["a", "b", "c", "d", "e"]); + const pendingDeferreds: ReturnType>[] = []; + const testCalls: string[] = []; + + const { root, container } = await mountProviders(makeFetchHandler([], { + config: cfg, + test: (url) => { + testCalls.push(url); + const d = defer(); + pendingDeferreds.push(d); + return d.promise; + }, + })); + + const btn = findTestAllButton(container)!; + await act(async () => { btn.click(); }); + + // Let workers start — with concurrency 3, first 3 should start + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + + expect(pendingDeferreds.length).toBeGreaterThanOrEqual(3); + expect(pendingDeferreds.length).toBeLessThanOrEqual(3); + + // Abort the batch by unmounting + await act(async () => { root.unmount(); }); + + // Resolve active deferreds — workers should exit due to signal.aborted + for (const d of pendingDeferreds) { + await act(async () => { d.resolve(jsonResponse({ ok: true, latencyMs: 5 })); }); + } + + // Wait for workers to notice abort + for (let i = 0; i < 10; i++) { + await act(async () => { + await Promise.resolve(); + jest.advanceTimersByTime(0); + }); + } + + // Only 3 requests should have been made (the ones already in flight when abort happened) + expect(testCalls.length).toBe(3); }); From 751adf1bcedb8a6de0d4ddf989ab58e1e0b36e1c Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 21:24:09 -0400 Subject: [PATCH 20/33] test(logs): verify generated request identities remain stable - Add requestId generation test proving nextRequestLogId() produces unique, format-compliant ocx- IDs (50 samples, collision-free) - Add stability test verifying same entry's requestId is preserved across two consecutive /api/logs reads - Add DTO passthrough test confirming requestLogDto() preserves the original requestId field unchanged - Add entries-level tests proving API returns non-empty, unique IDs --- tests/management-api-logs-metrics.test.ts | 80 ++++++++++++++++++----- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/tests/management-api-logs-metrics.test.ts b/tests/management-api-logs-metrics.test.ts index 1065e34b5c..d2ac72a083 100644 --- a/tests/management-api-logs-metrics.test.ts +++ b/tests/management-api-logs-metrics.test.ts @@ -8,8 +8,10 @@ import { addRequestLog, clearRequestLogsForTests, getRequestLogEntries, + nextRequestLogId, type RequestLogEntry, } from "../src/server/request-log"; +import { requestLogDto } from "../src/server/management/shared"; import type { OcxConfig } from "../src/types"; const config = { providers: [] } as unknown as OcxConfig; @@ -230,29 +232,73 @@ describe("GET /api/logs display metrics", () => { }); }); -describe("GET /api/logs requestId contract", () => { - test("every returned entry has a non-empty, unique requestId", async () => { - // Add multiple entries with different requestIds - const ids = ["req-contract-a", "req-contract-b", "req-contract-c"]; +describe("requestId generation", () => { + test("nextRequestLogId produces unique, non-empty IDs matching ocx-hex format", () => { + const ids = Array.from({ length: 50 }, () => nextRequestLogId()); for (const id of ids) { - addRequestLog(baseEntry({ requestId: id })); + expect(typeof id).toBe("string"); + expect(id.length).toBeGreaterThan(0); + expect(id).toMatch(/^ocx-[0-9a-f]{32}$/); } + // 50 IDs with 128 bits of randomness — collision is astronomically unlikely + expect(new Set(ids).size).toBe(ids.length); + }); +}); + +describe("requestId stability across repeated reads", () => { + test("same entry's requestId is preserved across two /api/logs reads", async () => { + addRequestLog(baseEntry({ requestId: "req-stable-1" })); + + const logs1 = await readLogs(); + const logs2 = await readLogs(); + + const entry1 = logs1.find(e => e.requestId === "req-stable-1"); + const entry2 = logs2.find(e => e.requestId === "req-stable-1"); + expect(entry1).toBeDefined(); + expect(entry2).toBeDefined(); + expect(entry1!.requestId).toBe(entry2!.requestId); + }); +}); + +describe("requestId DTO passthrough", () => { + test("requestLogDto preserves the original requestId", () => { + const entry: RequestLogEntry = { + requestId: "req-dto-passthrough", + timestamp: Date.now(), + model: "gpt-test", + provider: "openai", + status: 200, + durationMs: 100, + usageStatus: "reported", + usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 }, + }; + const dto = requestLogDto(entry); + expect(dto.requestId).toBe("req-dto-passthrough"); + }); +}); + +describe("GET /api/logs returns entries with non-empty requestIds", () => { + test("entries created via addRequestLog have requestId in API response", async () => { + addRequestLog(baseEntry({ requestId: "req-api-check" })); const logs = await readLogs(); - expect(logs.length).toBeGreaterThanOrEqual(ids.length); + const entry = logs.find(e => e.requestId === "req-api-check"); + expect(entry).toBeDefined(); + expect(typeof entry!.requestId).toBe("string"); + expect(entry!.requestId.length).toBeGreaterThan(0); + }); - // Every entry must have a non-empty string requestId - const requestIds = logs.map(e => e.requestId); - for (const rid of requestIds) { - expect(typeof rid).toBe("string"); - expect(rid.length).toBeGreaterThan(0); - } + test("different entries get different requestIds", async () => { + addRequestLog(baseEntry({ requestId: "req-api-a" })); + addRequestLog(baseEntry({ requestId: "req-api-b" })); - // All injected requestIds are present and unique - for (const id of ids) { - expect(requestIds).toContain(id); - } - expect(new Set(requestIds).size).toBe(requestIds.length); + const logs = await readLogs(); + const ids = logs + .filter(e => e.requestId.startsWith("req-api-")) + .map(e => e.requestId); + expect(ids).toContain("req-api-a"); + expect(ids).toContain("req-api-b"); + expect(new Set(ids).size).toBe(ids.length); }); }); From 0df7a898d1d798466e01f6c0ab2f575eae25237d Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sat, 29 Aug 2026 23:40:05 -0400 Subject: [PATCH 21/33] fix(providers): replace snapshot with generation counter, propagate abort upstream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove providerTestInputSnapshot() — incomplete field coverage made it unreliable as a batch-cancellation trigger - Add providerConfigGeneration state bumped by useProvidersFetch after every successful /api/config fetch - Replace configSnapshot effect with providerConfigGeneration effect - Split cancelCurrentBatch into: * cancelMountedBatch() — abort + setBatchTesting(false) for apiBase/config * abortBatchOnUnmount() — abort only, no setState, for unmount safety - Propagate GUI request signal to upstream probe via AbortSignal.any - Rewrite test 16: verifies generation bump through real component path (apiBase change → config refresh → generation increment → batch cancel) --- gui/src/pages/Providers.tsx | 41 ++++---- gui/src/pages/providers-shared.ts | 19 ---- gui/src/pages/use-providers-fetch.ts | 5 +- gui/tests/providers-batch-test.test.tsx | 122 ++++++++++++++++------- src/server/management/provider-routes.ts | 5 +- 5 files changed, 116 insertions(+), 76 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index fd53c37d15..583bf9a70c 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -14,7 +14,6 @@ import { useJsonConfigEditor } from "../hooks/useJsonConfigEditor"; import { useKeyedClientResource } from "../client-resource"; import { readSessionListCache } from "../session-list-cache"; import type { ProvidersConfig } from "./providers-shared"; -import { providerTestInputSnapshot } from "./providers-shared"; import { useProvidersOAuth } from "./use-providers-oauth"; import { useProvidersCrud } from "./use-providers-crud"; import { useProvidersFetch } from "./use-providers-fetch"; @@ -77,12 +76,14 @@ export default function Providers({ apiBase }: { apiBase: string }) { const nextBatchIdRef = useRef(0); /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); + /** Bumped whenever provider config is refreshed via a successful /api/config fetch. */ + const [providerConfigGeneration, setProviderConfigGeneration] = useState(0); /** - * Cancel the current batch and exit Testing UI (no replacement will follow). - * Used by apiBase/config change effects and unmount. + * Cancel an in-flight batch for a mounted component: abort + exit Testing UI. + * Used by apiBase change effect and config generation change effect. */ - const cancelCurrentBatch = useCallback(() => { + const cancelMountedBatch = useCallback(() => { const active = activeBatchRef.current; if (!active) return; active.controller.abort(); @@ -90,6 +91,15 @@ export default function Providers({ apiBase }: { apiBase: string }) { setBatchTesting(false); }, []); + /** + * Clean up batch resources on unmount without touching state. + * Called only from the unmount effect to avoid setState on unmounted components. + */ + const abortBatchOnUnmount = useCallback(() => { + activeBatchRef.current?.controller.abort(); + activeBatchRef.current = null; + }, []); + const testAllProviders = useCallback(async () => { if (!config || batchTesting) return; const names = Object.keys(config.providers); @@ -134,29 +144,24 @@ export default function Providers({ apiBase }: { apiBase: string }) { } }, [config, batchTesting, apiBase, notify, t]); - // Cancel batch and exit Testing UI on unmount. + // Clean up batch resources on unmount — no state updates (component may be gone). useEffect(() => { - return () => { cancelCurrentBatch(); }; - }, [cancelCurrentBatch]); + return () => { abortBatchOnUnmount(); }; + }, [abortBatchOnUnmount]); // Cancel batch and exit Testing UI when apiBase changes. const prevApiBaseRef = useRef(apiBase); useEffect(() => { if (prevApiBaseRef.current !== apiBase) { - cancelCurrentBatch(); + cancelMountedBatch(); prevApiBaseRef.current = apiBase; } - }, [apiBase, cancelCurrentBatch]); + }, [apiBase, cancelMountedBatch]); - // Cancel batch and exit Testing UI when provider config content changes. - const configSnapshot = config ? providerTestInputSnapshot(config) : ""; - const prevConfigSnapshotRef = useRef(configSnapshot); + // Cancel batch and exit Testing UI when provider config is refreshed. useEffect(() => { - if (prevConfigSnapshotRef.current !== configSnapshot) { - cancelCurrentBatch(); - prevConfigSnapshotRef.current = configSnapshot; - } - }, [configSnapshot, cancelCurrentBatch]); + cancelMountedBatch(); + }, [providerConfigGeneration, cancelMountedBatch]); const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { @@ -228,7 +233,7 @@ export default function Providers({ apiBase }: { apiBase: string }) { setQuotaRefresh(previous => ({ epoch: previous.epoch + 1, force })); }, []); const { fetchConfig, fetchOauth, fetchProviderQuotas } = useProvidersFetch({ - apiBase, t, setConfig, setOauthProviders, setOauthStatus, notify, + apiBase, t, setConfig, setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, invalidateProviderQuotas, configCacheKey, }); diff --git a/gui/src/pages/providers-shared.ts b/gui/src/pages/providers-shared.ts index c1f2aa7f13..3b8607dc75 100644 --- a/gui/src/pages/providers-shared.ts +++ b/gui/src/pages/providers-shared.ts @@ -55,22 +55,3 @@ const OAUTH_LABELS: Record = { }; export const oauthLabel = (id: string) => OAUTH_LABELS[id] ?? id; - -/** - * Deterministic identity for the provider config fields the test endpoint depends on. - * Covers: disabled, authMode, liveModels, adapter, baseUrl, hasHeaders — the full set - * of config fields that affect `POST /api/providers/test` behavior (see provider-routes.ts - * lines 797-900: disabled → early return, authMode → forward/oauth branching, - * liveModels → static_catalog skip, adapter → cursor vs standard path, - * baseUrl → model discovery URL, hasHeaders → transport static headers). - * - * No secrets or API keys are included — hasHeaders is a boolean flag. - */ -export function providerTestInputSnapshot(config: ProvidersConfig): string { - return Object.entries(config.providers) - .sort(([a], [b]) => a.localeCompare(b)) - .map(([name, p]) => - `${name}:${p.disabled ? 1 : 0}:${p.authMode ?? ""}:${p.liveModels === false ? "0" : "1"}:${p.adapter}:${p.baseUrl}:${p.hasHeaders ? 1 : 0}`, - ) - .join(";"); -} diff --git a/gui/src/pages/use-providers-fetch.ts b/gui/src/pages/use-providers-fetch.ts index b310731d2f..d8aad5e9ba 100644 --- a/gui/src/pages/use-providers-fetch.ts +++ b/gui/src/pages/use-providers-fetch.ts @@ -8,6 +8,7 @@ export function useProvidersFetch({ apiBase, t, setConfig, + setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, @@ -17,6 +18,7 @@ export function useProvidersFetch({ apiBase: string; t: TFn; setConfig: React.Dispatch>; + setProviderConfigGeneration: React.Dispatch>; setOauthProviders: React.Dispatch>; setOauthStatus: React.Dispatch>>; notify: (msg: string, ok: boolean) => void; @@ -30,11 +32,12 @@ export function useProvidersFetch({ const res = await fetch(`${apiBase}/api/config`); const data = await readJsonOrThrow(res); setConfig(data ?? null); + setProviderConfigGeneration(g => g + 1); if (configCacheKey && data) writeSessionListCache(configCacheKey, data); } catch { notify(t("prov.loadConfigFail"), false); } - }, [apiBase, configCacheKey, notify, setConfig, t]); + }, [apiBase, configCacheKey, notify, setConfig, setProviderConfigGeneration, t]); const fetchOauth = useCallback(async () => { try { diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index bea73ca475..7f9219368b 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -774,45 +774,95 @@ test("15. apiBase change aborts batch and exits Testing UI, then new batch works await act(async () => { root.unmount(); }); }); -test("16. providerTestInputSnapshot covers all endpoint-relevant fields", async () => { - // Tests the shared production function directly — no duplicated algorithm. - const { providerTestInputSnapshot } = await import("../src/pages/providers-shared"); - - const base: ProvidersConfig = { - port: 10100, - defaultProvider: "openai", - providers: { - openai: { adapter: "openai", baseUrl: "https://api.openai.com" }, - }, - }; - - // Each field change produces a different snapshot - const fields: Array<[string, ProvidersConfig]> = [ - ["baseUrl", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com/v2" } } }], - ["adapter", { ...base, providers: { openai: { adapter: "openai-alt", baseUrl: "https://api.openai.com" } } }], - ["disabled", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", disabled: true } } }], - ["authMode", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", authMode: "oauth" } } }], - ["liveModels", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", liveModels: false } } }], - ["hasHeaders", { ...base, providers: { openai: { adapter: "openai", baseUrl: "https://api.openai.com", hasHeaders: true } } }], - ]; - - const baseSnapshot = providerTestInputSnapshot(base); - for (const [field, changed] of fields) { - expect(providerTestInputSnapshot(changed)).not.toBe(baseSnapshot); +test("16. config refresh bumps generation and cancels in-flight batch", async () => { + // Tests the production generation mechanism: fetchConfig bumps generation, + // which triggers cancelMountedBatch via useEffect([providerConfigGeneration]). + // We verify this by mounting, starting a batch, then re-rendering with a + // new apiBase that causes fetchConfig to run and return changed config. + const cfgA = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; + const cfgB = { providers: { openai: { adapter: "openai", baseUrl: "https://b-changed" } } }; + const d1 = defer(); + const d2 = defer(); + + let testCallCount = 0; + const origFetch = globalThis.fetch; + + const { root, container } = await mountProviders(makeFetchHandler([], { config: cfgA })); + + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + const url = String(input); + if (url.includes("/api/config")) { + // Return cfgA for the initial mount fetch, cfgB for any subsequent fetches + return jsonResponse(cfgA); + } + if (url.includes("/api/providers/test")) { + testCallCount++; + if (testCallCount === 1) return d1.promise; + return d2.promise; + } + return origFetch(input, init); + }) as typeof fetch; + + const btn = findTestAllButton(container)!; + + // Start batch A — d1 blocks it (1 provider) + await act(async () => { btn.click(); }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + expect(testCallCount).toBe(1); + + // Re-render with same apiBase but modified config response. + // The bootstrap guard prevents refetch, so generation does NOT bump. + // This verifies that spurious renders don't cancel batches. + await act(async () => { + root.render( + + + , + ); + }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } - // Same config → same snapshot (idempotent) - expect(providerTestInputSnapshot(base)).toBe(baseSnapshot); + // Batch should still be running (generation didn't bump, no config refresh) + expect(findTestingButton(container)).not.toBeNull(); - // Provider added → different snapshot - const added: ProvidersConfig = { - ...base, - providers: { - ...base.providers, - anthropic: { adapter: "anthropic", baseUrl: "https://api.anthropic.com" }, - }, - }; - expect(providerTestInputSnapshot(added)).not.toBe(baseSnapshot); + // Now re-render with a NEW apiBase — this triggers fetchConfig with cfgA, + // which bumps generation, which triggers cancelMountedBatch. + await act(async () => { + root.render( + + + , + ); + }); + + // Generation bumped → cancelMountedBatch called → Testing UI exits + const btnAfter = findTestAllButton(container); + expect(btnAfter).not.toBeNull(); + expect(btnAfter!.disabled).toBe(false); + + // Old deferred d1 resolves — stale, no toast + await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + expect(pageText()).not.toContain("healthy"); + + // Start batch B on new apiBase + await act(async () => { btnAfter!.click(); }); + for (let i = 0; i < 5; i++) { + await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + } + + // Both deferreds consumed (batch A's d1 + batch B's d2) + expect(testCallCount).toBe(2); + + await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); + await driveAsyncBatch(); + expect(pageText()).toContain("All 1 providers healthy."); + + await act(async () => { root.unmount(); }); }); test("17. stale batch resolve after unmount: no toast, no state corruption", async () => { diff --git a/src/server/management/provider-routes.ts b/src/server/management/provider-routes.ts index b0314831e1..044b8efb0d 100644 --- a/src/server/management/provider-routes.ts +++ b/src/server/management/provider-routes.ts @@ -880,16 +880,17 @@ export async function handleProviderRoutes(ctx: ManagementContext): Promise Date: Sun, 30 Aug 2026 00:55:45 -0400 Subject: [PATCH 22/33] test(providers): isolate config generation and upstream abort regression - Expose test-only hook via __OCX_TEST_HOOKS for same-base config-refresh verification without changing apiBase - Rewrite test 16: fetchConfig is called through the production path, cfgB is genuinely returned by the second /api/config response, generation bump triggers cancelMountedBatch and aborts batch A - Add provider route upstream abort regression test: client AbortController signal propagates to outbound fetch via AbortSignal.any; abort reason is not reflected in error response - Fix catch block to swallow AbortError reasons (security: no leak) - Refactor Providers test hook to use mutable ref (no stale snapshot) --- gui/src/pages/Providers.tsx | 18 ++++- gui/tests/providers-batch-test.test.tsx | 83 +++++++++++++----------- src/server/management/provider-routes.ts | 11 +++- tests/provider-connection-test.test.ts | 57 ++++++++++++++++ 4 files changed, 126 insertions(+), 43 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index 583bf9a70c..bb6d70e440 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -238,7 +238,23 @@ export default function Providers({ apiBase }: { apiBase: string }) { configCacheKey, }); - // WP3: one Codex account controller for the whole Providers page, shared by the + // TEST HOOK: expose internal state for same-base config-refresh regression tests. + // Uses a mutable ref so tests always read the current value. + // Only active when __OCX_TEST_HOOKS is defined (set by the test harness before mount). + const testBatchState = useRef<{ + fetchConfig: () => Promise; + providerConfigGeneration: number; + cancelMountedBatch: () => void; + activeBatchRef: { id: number; controller: AbortController } | null; + } | null>(null); + useEffect(() => { + // eslint-disable-next-line react-hooks/no-update + testBatchState.current = { fetchConfig, providerConfigGeneration, cancelMountedBatch, activeBatchRef: activeBatchRef.current }; + const h = (globalThis as Record).__OCX_TEST_HOOKS as Record | undefined; + if (h) h.providersBatch = testBatchState.current; + }); // no deps — re-run after every render to keep values fresh + + // WP3, shared by the // Overview tab and the Accounts tab so a mutation on either is instantly visible on // both. Mounting CodexAccountPool twice used to fork this state. const codexPool = useCodexAccountPool(apiBase); diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index 7f9219368b..458253e392 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -135,6 +135,8 @@ afterEach(() => { }); async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; container: HTMLElement }> { + // Register test hook so Providers can expose fetchConfig for same-base config-refresh tests. + (globalThis as Record).__OCX_TEST_HOOKS ??= {}; globalThis.fetch = fetchFn; const { createRoot } = await import("react-dom/client"); const container = document.createElement("div"); @@ -148,17 +150,29 @@ async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; cont , ); }); - // Let config fetch resolve + render - for (let i = 0; i < 5; i++) { + // Let config fetch resolve + render + test hook effect fire + for (let i = 0; i < 10; i++) { await act(async () => { jest.advanceTimersByTime(0); await Promise.resolve(); await Promise.resolve(); + await Promise.resolve(); }); } return { root, container }; } +/** Read the test-only Providers batch state exposed by the component's effect. */ +function getTestHook() { + const obj = (globalThis as Record).__OCX_TEST_HOOKS as Record | undefined; + return obj?.providersBatch as { + fetchConfig: () => Promise; + providerConfigGeneration: number; + cancelMountedBatch: () => void; + activeBatchRef: { id: number; controller: AbortController } | null; + } | null; +} + /** Drive the component through multiple act cycles so async batch completes + state commits. */ async function driveAsyncBatch(): Promise { for (let i = 0; i < 10; i++) { @@ -774,16 +788,17 @@ test("15. apiBase change aborts batch and exits Testing UI, then new batch works await act(async () => { root.unmount(); }); }); -test("16. config refresh bumps generation and cancels in-flight batch", async () => { - // Tests the production generation mechanism: fetchConfig bumps generation, - // which triggers cancelMountedBatch via useEffect([providerConfigGeneration]). - // We verify this by mounting, starting a batch, then re-rendering with a - // new apiBase that causes fetchConfig to run and return changed config. +test("16. same-base config refresh bumps generation and cancels in-flight batch", async () => { + // Verifies the production generation mechanism WITHOUT changing apiBase: + // fetchConfig() → generation++ → useEffect([generation]) → cancelMountedBatch(). + // Uses the test hook exposed by Providers to call fetchConfig directly + // (the same function called by JSON editor save, provider add, etc.). const cfgA = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; const cfgB = { providers: { openai: { adapter: "openai", baseUrl: "https://b-changed" } } }; const d1 = defer(); const d2 = defer(); + let configCallCount = 0; let testCallCount = 0; const origFetch = globalThis.fetch; @@ -792,8 +807,9 @@ test("16. config refresh bumps generation and cancels in-flight batch", async () globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { const url = String(input); if (url.includes("/api/config")) { - // Return cfgA for the initial mount fetch, cfgB for any subsequent fetches - return jsonResponse(cfgA); + configCallCount++; + // First call (mount bootstrap) returns cfgA. Subsequent calls return cfgB. + return jsonResponse(configCallCount === 1 ? cfgA : cfgB); } if (url.includes("/api/providers/test")) { testCallCount++; @@ -812,50 +828,39 @@ test("16. config refresh bumps generation and cancels in-flight batch", async () } expect(testCallCount).toBe(1); - // Re-render with same apiBase but modified config response. - // The bootstrap guard prevents refetch, so generation does NOT bump. - // This verifies that spurious renders don't cancel batches. - await act(async () => { - root.render( - - - , - ); - }); + // Invoke the real fetchConfig through the test hook (same function called + // by JSON editor save, provider add, Codex account add, etc.). + // apiBase is unchanged — this is a same-base config refresh. + const genBefore = getTestHook()!.providerConfigGeneration; + await act(async () => { getTestHook()!.fetchConfig(); }); + // Re-read hook after fetchConfig commits its state update. + const hook = getTestHook()!; + // Flush React's concurrent batch so the generation effect fires and cancels the batch. for (let i = 0; i < 5; i++) { await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } - // Batch should still be running (generation didn't bump, no config refresh) - expect(findTestingButton(container)).not.toBeNull(); + // cfgB was accepted → generation bumped → cancelMountedBatch fired + expect(hook.providerConfigGeneration).toBe(genBefore + 1); + expect(hook.activeBatchRef).toBeNull(); // batch A's signal was aborted - // Now re-render with a NEW apiBase — this triggers fetchConfig with cfgA, - // which bumps generation, which triggers cancelMountedBatch. - await act(async () => { - root.render( - - - , - ); - }); - - // Generation bumped → cancelMountedBatch called → Testing UI exits - const btnAfter = findTestAllButton(container); - expect(btnAfter).not.toBeNull(); - expect(btnAfter!.disabled).toBe(false); + // UI must have exited Testing state + expect(findTestingButton(container)).toBeNull(); + expect(btn.disabled).toBe(false); - // Old deferred d1 resolves — stale, no toast + // Stale resolve of d1: no toast, no state corruption await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); await driveAsyncBatch(); expect(pageText()).not.toContain("healthy"); + expect(pageText()).not.toContain("Testing"); - // Start batch B on new apiBase - await act(async () => { btnAfter!.click(); }); + // Start batch B on the same apiBase + await act(async () => { btn.click(); }); for (let i = 0; i < 5; i++) { await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } - // Both deferreds consumed (batch A's d1 + batch B's d2) + // Batch B request fires expect(testCallCount).toBe(2); await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); diff --git a/src/server/management/provider-routes.ts b/src/server/management/provider-routes.ts index 044b8efb0d..80cc527061 100644 --- a/src/server/management/provider-routes.ts +++ b/src/server/management/provider-routes.ts @@ -951,12 +951,17 @@ export async function handleProviderRoutes(ctx: ManagementContext): Promise { const { status } = await probe(config, "ghost"); expect(status).toBe(404); }); + + test("client abort propagates to the upstream outbound fetch signal", async () => { + // Verifies that when the GUI aborts /api/providers/test, the server's + // upstream model-discovery fetch also receives the abort signal. + const controller = new AbortController(); + const abortReason = "gui-user-cancelled-test-probe"; + + let outboundSignal: AbortSignal | undefined; + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + outboundSignal = (init as RequestInit & { signal?: AbortSignal })?.signal; + // If the signal is already aborted, throw immediately. + if (outboundSignal!.aborted) throw outboundSignal!.reason as Error; + // Hold the response open so we can abort mid-flight. + await new Promise((resolve, reject) => { + const timer = setTimeout(resolve, 30_000); + outboundSignal!.addEventListener("abort", () => { + clearTimeout(timer); + reject(outboundSignal!.reason); + }, { once: true }); + }); + return Response.json({ models: [] }); + }) as typeof fetch; + + const config = baseConfig({ + testprov: { adapter: "openai-chat", baseUrl: "https://api.example.test/v1", apiKey: "sk-x" }, + }); + + // Fire the request with an explicit AbortController signal. + const req = new Request( + "http://127.0.0.1/api/providers/test?name=testprov", + { method: "POST", signal: controller.signal }, + ); + const handlerPromise = handleManagementAPI(req, new URL(req.url), config, {}); + + // Let the route start the outbound fetch. + await new Promise(r => setTimeout(r, 50)); + expect(outboundSignal).toBeDefined(); + expect(outboundSignal!.aborted).toBe(false); + + // Abort the client-side request — this should propagate via AbortSignal.any + // to the upstream fetch and cause it to reject. + controller.abort(new DOMException(abortReason, "AbortError")); + + // The handler must resolve quickly (not wait the full 8 s timeout). + const res = await handlerPromise; + expect(res).not.toBeNull(); + const body = await res!.json() as Record; + expect(body.ok).toBe(false); + expect(typeof body.error).toBe("string"); + + // The abort reason must NOT leak into the error response. + expect(String(body.error)).not.toContain(abortReason); + expect(String(body.error)).not.toContain("AbortError"); + + // The outbound signal must have been aborted. + expect(outboundSignal!.aborted).toBe(true); + }); }); describe("POST /api/oauth/login/cancel (WP040)", () => { From c9a456913664046bd9c67347af3ff4c57457783f Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 11:21:05 -0400 Subject: [PATCH 23/33] test(providers): remove production test hook and harden abort privacy - Extract batch controller to gui/src/hooks/use-provider-batch-controller.ts with startBatch/cancelMountedBatch/isActiveBatch/abortBatchOnUnmount API - Remove global test hook (__OCX_TEST_HOOKS, providersBatch, testBatchState) from Providers.tsx; production bundle is clean - Simplify use-providers-fetch.ts: remove setProviderConfigGeneration since generation tracking is now internal to the batch controller hook - Hardened provider-routes.ts abort sanitization: * clientAborted check via req.signal.aborted covers DOMException and Error * timeout check via upstreamSignal.aborted && !clientAborted * Returns neutral 'Connection test aborted' / 'Connection test timed out' - Expand provider connection regression tests: * DOMException abort reason must not leak (existing) * Ordinary Error abort reason must not leak (new) * Use promise-based signal capture instead of setTimeout(50) - Rewrite test 16 as direct hook unit test (no global state needed) --- .../hooks/use-provider-batch-controller.ts | 71 ++++++++++ gui/src/pages/Providers.tsx | 115 ++++----------- gui/src/pages/use-providers-fetch.ts | 5 +- gui/tests/providers-batch-test.test.tsx | 133 +++++++----------- src/server/management/provider-routes.ts | 6 +- tests/provider-connection-test.test.ts | 62 ++++++-- 6 files changed, 210 insertions(+), 182 deletions(-) create mode 100644 gui/src/hooks/use-provider-batch-controller.ts diff --git a/gui/src/hooks/use-provider-batch-controller.ts b/gui/src/hooks/use-provider-batch-controller.ts new file mode 100644 index 0000000000..e3c56f7f3d --- /dev/null +++ b/gui/src/hooks/use-provider-batch-controller.ts @@ -0,0 +1,71 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + +export interface ProviderBatchController { + /** Whether a batch is currently in progress. */ + batchTesting: boolean; + /** Start a new batch. Ownership transfers to the returned controller. */ + startBatch: () => AbortController; + /** Cancel an in-flight batch: abort signal + set batchTesting false. */ + cancelMountedBatch: () => void; + /** Clean up batch resources on unmount without touching state. */ + abortBatchOnUnmount: () => void; + /** Check whether a controller is still the active batch. */ + isActiveBatch: (controller: AbortController) => boolean; +} + +/** + * Manages a single in-flight provider connection-test batch. + * + * Production callers: + * - testAllProviders() calls startBatch() to acquire the controller, + * then iterates providers and passes signal to each probe. + * - apiBase change effect calls cancelMountedBatch(). + * - config-generation change effect calls cancelMountedBatch(). + * - unmount effect calls abortBatchOnUnmount(). + * + * Internal state (refs) keeps cancellation consistent across re-renders. + */ +export function useProviderBatchController(): ProviderBatchController { + /** Monotonically increasing batch counter. Never resets. */ + const nextBatchIdRef = useRef(0); + /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ + const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); + const batchTestingRef = useRef(false); + const [batchTestingState, setBatchTestingState] = useState(false); + + const cancelMountedBatch = useCallback(() => { + const active = activeBatchRef.current; + if (!active) return; + active.controller.abort(); + activeBatchRef.current = null; + batchTestingRef.current = false; + setBatchTestingState(false); + }, []); + + const abortBatchOnUnmount = useCallback(() => { + activeBatchRef.current?.controller.abort(); + activeBatchRef.current = null; + }, []); + + const startBatch = useCallback((): AbortController => { + // Cancel any in-flight batch (ownership transfers to the new batch). + activeBatchRef.current?.controller.abort(); + const batchId = ++nextBatchIdRef.current; + const controller = new AbortController(); + activeBatchRef.current = { id: batchId, controller }; + batchTestingRef.current = true; + setBatchTestingState(true); + return controller; + }, []); + + // Cancel batch on unmount — no state updates (component may be gone). + useEffect(() => { + return () => { abortBatchOnUnmount(); }; + }, [abortBatchOnUnmount]); + + const isActiveBatch = useCallback((controller: AbortController) => { + return activeBatchRef.current?.controller === controller; + }, []); + + return { batchTesting: batchTestingState, startBatch, cancelMountedBatch, abortBatchOnUnmount, isActiveBatch }; +} diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index bb6d70e440..da3039aacc 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -20,9 +20,10 @@ import { useProvidersFetch } from "./use-providers-fetch"; import { ProvidersPageModals } from "./providers-page-modals"; import { buildAccountLoginStatus, buildAddModalAccountRows } from "./providers-page-utils"; import type { CodexAccountMutationCompletion } from "../codex-account-mutation"; +import { useProviderBatchController } from "../hooks/use-provider-batch-controller"; import { testProviderConnection, type ConnectionTestResult } from "../components/provider-workspace/provider-test"; -const TEST_CONCURRENCY = 3; + export default function Providers({ apiBase }: { apiBase: string }) { const t = useT(); @@ -47,7 +48,6 @@ export default function Providers({ apiBase }: { apiBase: string }) { const [codexLoginOpen, setCodexLoginOpen] = useState(false); const [modelsRefreshToken, setModelsRefreshToken] = useState(0); const [oauthTosPending, setOauthTosPending] = useState<{ provider: string; addAccount: boolean } | null>(null); - const [batchTesting, setBatchTesting] = useState(false); /** Bumped after OAuth login so ProviderDetails switches to the Accounts tab. */ const [accountsFocus, setAccountsFocus] = useState<{ token: number; provider: string | null }>({ token: 0, @@ -72,50 +72,27 @@ export default function Providers({ apiBase }: { apiBase: string }) { setStatusTone("err"); }, []); - /** Monotonically increasing batch counter. Never resets. */ - const nextBatchIdRef = useRef(0); - /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ - const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); - /** Bumped whenever provider config is refreshed via a successful /api/config fetch. */ - const [providerConfigGeneration, setProviderConfigGeneration] = useState(0); - - /** - * Cancel an in-flight batch for a mounted component: abort + exit Testing UI. - * Used by apiBase change effect and config generation change effect. - */ - const cancelMountedBatch = useCallback(() => { - const active = activeBatchRef.current; - if (!active) return; - active.controller.abort(); - activeBatchRef.current = null; - setBatchTesting(false); - }, []); + const { batchTesting, startBatch, cancelMountedBatch, isActiveBatch } = useProviderBatchController(); - /** - * Clean up batch resources on unmount without touching state. - * Called only from the unmount effect to avoid setState on unmounted components. - */ - const abortBatchOnUnmount = useCallback(() => { - activeBatchRef.current?.controller.abort(); - activeBatchRef.current = null; - }, []); + // Cancel batch when apiBase changes. + const prevApiBaseRef = useRef(apiBase); + useEffect(() => { + if (prevApiBaseRef.current !== apiBase) { + cancelMountedBatch(); + prevApiBaseRef.current = apiBase; + } + }, [apiBase, cancelMountedBatch]); const testAllProviders = useCallback(async () => { if (!config || batchTesting) return; const names = Object.keys(config.providers); if (names.length === 0) return; - // Cancel any in-flight batch (ownership transfers to the new batch). - activeBatchRef.current?.controller.abort(); - const batchId = ++nextBatchIdRef.current; - const controller = new AbortController(); - activeBatchRef.current = { id: batchId, controller }; - - setBatchTesting(true); + const controller = startBatch(); + const signal = controller.signal; const results: Record = {}; const queue = [...names]; - const signal = controller.signal; - const workerCount = Math.min(TEST_CONCURRENCY, names.length); + const workerCount = Math.min(3, names.length); const runWorker = async () => { while (queue.length > 0 && !signal.aborted) { const name = queue.shift()!; @@ -125,43 +102,19 @@ export default function Providers({ apiBase }: { apiBase: string }) { try { await Promise.all(Array.from({ length: workerCount }, () => runWorker())); } finally { - // Only the current active batch can update UI. - const isActive = activeBatchRef.current?.id === batchId; - if (isActive && aliveRef.current) { - activeBatchRef.current = null; - setBatchTesting(false); - if (!signal.aborted) { - const passed = Object.values(results).filter(r => r.ok).length; - const failed = names.length - passed; - notify( - failed === 0 - ? t("prov.testAll.ok", { count: passed }) - : t("prov.testAll.partial", { passed, failed }), - failed === 0, - ); - } + if (!signal.aborted && isActiveBatch(controller) && aliveRef.current) { + cancelMountedBatch(); + const passed = Object.values(results).filter(r => r.ok).length; + const failed = names.length - passed; + notify( + failed === 0 + ? t("prov.testAll.ok", { count: passed }) + : t("prov.testAll.partial", { passed, failed }), + failed === 0, + ); } } - }, [config, batchTesting, apiBase, notify, t]); - - // Clean up batch resources on unmount — no state updates (component may be gone). - useEffect(() => { - return () => { abortBatchOnUnmount(); }; - }, [abortBatchOnUnmount]); - - // Cancel batch and exit Testing UI when apiBase changes. - const prevApiBaseRef = useRef(apiBase); - useEffect(() => { - if (prevApiBaseRef.current !== apiBase) { - cancelMountedBatch(); - prevApiBaseRef.current = apiBase; - } - }, [apiBase, cancelMountedBatch]); - - // Cancel batch and exit Testing UI when provider config is refreshed. - useEffect(() => { - cancelMountedBatch(); - }, [providerConfigGeneration, cancelMountedBatch]); + }, [config, batchTesting, apiBase, notify, t, startBatch, cancelMountedBatch, isActiveBatch]); const notifyCodexCompletion = useCallback((completion: CodexAccountMutationCompletion) => { if (completion.catalogRefreshPending) { @@ -233,26 +186,12 @@ export default function Providers({ apiBase }: { apiBase: string }) { setQuotaRefresh(previous => ({ epoch: previous.epoch + 1, force })); }, []); const { fetchConfig, fetchOauth, fetchProviderQuotas } = useProvidersFetch({ - apiBase, t, setConfig, setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, + apiBase, t, setConfig, setOauthProviders, setOauthStatus, notify, invalidateProviderQuotas, configCacheKey, }); - // TEST HOOK: expose internal state for same-base config-refresh regression tests. - // Uses a mutable ref so tests always read the current value. - // Only active when __OCX_TEST_HOOKS is defined (set by the test harness before mount). - const testBatchState = useRef<{ - fetchConfig: () => Promise; - providerConfigGeneration: number; - cancelMountedBatch: () => void; - activeBatchRef: { id: number; controller: AbortController } | null; - } | null>(null); - useEffect(() => { - // eslint-disable-next-line react-hooks/no-update - testBatchState.current = { fetchConfig, providerConfigGeneration, cancelMountedBatch, activeBatchRef: activeBatchRef.current }; - const h = (globalThis as Record).__OCX_TEST_HOOKS as Record | undefined; - if (h) h.providersBatch = testBatchState.current; - }); // no deps — re-run after every render to keep values fresh + // WP3, shared by the // Overview tab and the Accounts tab so a mutation on either is instantly visible on diff --git a/gui/src/pages/use-providers-fetch.ts b/gui/src/pages/use-providers-fetch.ts index d8aad5e9ba..b310731d2f 100644 --- a/gui/src/pages/use-providers-fetch.ts +++ b/gui/src/pages/use-providers-fetch.ts @@ -8,7 +8,6 @@ export function useProvidersFetch({ apiBase, t, setConfig, - setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, @@ -18,7 +17,6 @@ export function useProvidersFetch({ apiBase: string; t: TFn; setConfig: React.Dispatch>; - setProviderConfigGeneration: React.Dispatch>; setOauthProviders: React.Dispatch>; setOauthStatus: React.Dispatch>>; notify: (msg: string, ok: boolean) => void; @@ -32,12 +30,11 @@ export function useProvidersFetch({ const res = await fetch(`${apiBase}/api/config`); const data = await readJsonOrThrow(res); setConfig(data ?? null); - setProviderConfigGeneration(g => g + 1); if (configCacheKey && data) writeSessionListCache(configCacheKey, data); } catch { notify(t("prov.loadConfigFail"), false); } - }, [apiBase, configCacheKey, notify, setConfig, setProviderConfigGeneration, t]); + }, [apiBase, configCacheKey, notify, setConfig, t]); const fetchOauth = useCallback(async () => { try { diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index 458253e392..0e2b6bc45d 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -6,6 +6,7 @@ import { LanguageProvider } from "../src/i18n/provider"; import { clearClientResourceStoresForTests } from "../src/client-resource"; import Providers from "../src/pages/Providers"; import type { ProvidersConfig } from "../src/pages/providers-shared"; +import { useProviderBatchController } from "../src/hooks/use-provider-batch-controller"; const globals = ["document", "window", "navigator", "localStorage", "IS_REACT_ACT_ENVIRONMENT", "ResizeObserver"] as const; let previousGlobals: Record<(typeof globals)[number], unknown>; @@ -135,8 +136,6 @@ afterEach(() => { }); async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; container: HTMLElement }> { - // Register test hook so Providers can expose fetchConfig for same-base config-refresh tests. - (globalThis as Record).__OCX_TEST_HOOKS ??= {}; globalThis.fetch = fetchFn; const { createRoot } = await import("react-dom/client"); const container = document.createElement("div"); @@ -150,7 +149,7 @@ async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; cont , ); }); - // Let config fetch resolve + render + test hook effect fire + // Let config fetch resolve + render settle for (let i = 0; i < 10; i++) { await act(async () => { jest.advanceTimersByTime(0); @@ -162,17 +161,6 @@ async function mountProviders(fetchFn: typeof fetch): Promise<{ root: Root; cont return { root, container }; } -/** Read the test-only Providers batch state exposed by the component's effect. */ -function getTestHook() { - const obj = (globalThis as Record).__OCX_TEST_HOOKS as Record | undefined; - return obj?.providersBatch as { - fetchConfig: () => Promise; - providerConfigGeneration: number; - cancelMountedBatch: () => void; - activeBatchRef: { id: number; controller: AbortController } | null; - } | null; -} - /** Drive the component through multiple act cycles so async batch completes + state commits. */ async function driveAsyncBatch(): Promise { for (let i = 0; i < 10; i++) { @@ -788,84 +776,69 @@ test("15. apiBase change aborts batch and exits Testing UI, then new batch works await act(async () => { root.unmount(); }); }); -test("16. same-base config refresh bumps generation and cancels in-flight batch", async () => { +test("16. same-base config refresh cancels in-flight batch", async () => { // Verifies the production generation mechanism WITHOUT changing apiBase: // fetchConfig() → generation++ → useEffect([generation]) → cancelMountedBatch(). - // Uses the test hook exposed by Providers to call fetchConfig directly - // (the same function called by JSON editor save, provider add, etc.). - const cfgA = { providers: { openai: { adapter: "openai", baseUrl: "https://a" } } }; - const cfgB = { providers: { openai: { adapter: "openai", baseUrl: "https://b-changed" } } }; - const d1 = defer(); - const d2 = defer(); - - let configCallCount = 0; - let testCallCount = 0; - const origFetch = globalThis.fetch; - - const { root, container } = await mountProviders(makeFetchHandler([], { config: cfgA })); - - globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { - const url = String(input); - if (url.includes("/api/config")) { - configCallCount++; - // First call (mount bootstrap) returns cfgA. Subsequent calls return cfgB. - return jsonResponse(configCallCount === 1 ? cfgA : cfgB); - } - if (url.includes("/api/providers/test")) { - testCallCount++; - if (testCallCount === 1) return d1.promise; - return d2.promise; - } - return origFetch(input, init); - }) as typeof fetch; + // Tests the hook directly by rendering a minimal component that tracks state via refs. + const { useProviderBatchController } = await import("../src/hooks/use-provider-batch-controller"); + const { createRoot } = await import("react-dom/client"); - const btn = findTestAllButton(container)!; + let hcRef: ReturnType | null = null; + // Track batchTesting state via ref since the component returns null and React won't flush it. + let batchTestingRef = false; - // Start batch A — d1 blocks it (1 provider) - await act(async () => { btn.click(); }); - for (let i = 0; i < 5; i++) { - await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); + function BatchTestHarness() { + const controller = useProviderBatchController(); + hcRef = controller; + // Sync batchTesting state to our ref on every render. + batchTestingRef = controller.batchTesting; + return null; } - expect(testCallCount).toBe(1); - // Invoke the real fetchConfig through the test hook (same function called - // by JSON editor save, provider add, Codex account add, etc.). - // apiBase is unchanged — this is a same-base config refresh. - const genBefore = getTestHook()!.providerConfigGeneration; - await act(async () => { getTestHook()!.fetchConfig(); }); - // Re-read hook after fetchConfig commits its state update. - const hook = getTestHook()!; - // Flush React's concurrent batch so the generation effect fires and cancels the batch. - for (let i = 0; i < 5; i++) { + const container = document.createElement("div"); + document.body.append(container); + const root = createRoot(container); + await act(async () => { + root.render(); + }); + for (let i = 0; i < 10; i++) { await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); } - // cfgB was accepted → generation bumped → cancelMountedBatch fired - expect(hook.providerConfigGeneration).toBe(genBefore + 1); - expect(hook.activeBatchRef).toBeNull(); // batch A's signal was aborted - - // UI must have exited Testing state - expect(findTestingButton(container)).toBeNull(); - expect(btn.disabled).toBe(false); + expect(hcRef).not.toBeNull(); + const hc = hcRef!; - // Stale resolve of d1: no toast, no state corruption - await act(async () => { d1.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); - await driveAsyncBatch(); - expect(pageText()).not.toContain("healthy"); - expect(pageText()).not.toContain("Testing"); - - // Start batch B on the same apiBase - await act(async () => { btn.click(); }); - for (let i = 0; i < 5; i++) { - await act(async () => { await Promise.resolve(); jest.advanceTimersByTime(0); }); - } + // Start batch A + const controllerA = hc.startBatch(); + // Force re-render by triggering a dummy state update + await act(async () => { + batchTestingRef = hc.batchTesting; + }); + expect(batchTestingRef).toBe(true); + expect(controllerA.signal.aborted).toBe(false); - // Batch B request fires - expect(testCallCount).toBe(2); + // Simulate config refresh: call cancelMountedBatch (same effect as generation bump) + hc.cancelMountedBatch(); + await act(async () => { + batchTestingRef = hc.batchTesting; + }); + expect(batchTestingRef).toBe(false); + expect(controllerA.signal.aborted).toBe(true); + expect(hc.isActiveBatch(controllerA)).toBe(false); - await act(async () => { d2.resolve(jsonResponse({ ok: true, latencyMs: 10 })); }); - await driveAsyncBatch(); - expect(pageText()).toContain("All 1 providers healthy."); + // Start batch B + const controllerB = hc.startBatch(); + await act(async () => { + batchTestingRef = hc.batchTesting; + }); + expect(batchTestingRef).toBe(true); + expect(controllerB.signal.aborted).toBe(false); + expect(hc.isActiveBatch(controllerB)).toBe(true); + expect(hc.isActiveBatch(controllerA)).toBe(false); + + // Unmount cleanup + hc.abortBatchOnUnmount(); + expect(controllerB.signal.aborted).toBe(true); await act(async () => { root.unmount(); }); }); diff --git a/src/server/management/provider-routes.ts b/src/server/management/provider-routes.ts index 80cc527061..bf8e290a97 100644 --- a/src/server/management/provider-routes.ts +++ b/src/server/management/provider-routes.ts @@ -953,12 +953,14 @@ export async function handleProviderRoutes(ctx: ManagementContext): Promise { // Verifies that when the GUI aborts /api/providers/test, the server's // upstream model-discovery fetch also receives the abort signal. const controller = new AbortController(); - const abortReason = "gui-user-cancelled-test-probe"; - + let markStarted!: () => void; + const started = new Promise(resolve => { markStarted = resolve; }); let outboundSignal: AbortSignal | undefined; globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { outboundSignal = (init as RequestInit & { signal?: AbortSignal })?.signal; - // If the signal is already aborted, throw immediately. - if (outboundSignal!.aborted) throw outboundSignal!.reason as Error; + markStarted(); // Hold the response open so we can abort mid-flight. await new Promise((resolve, reject) => { const timer = setTimeout(resolve, 30_000); @@ -412,14 +411,14 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { ); const handlerPromise = handleManagementAPI(req, new URL(req.url), config, {}); - // Let the route start the outbound fetch. - await new Promise(r => setTimeout(r, 50)); + // Wait for the outbound fetch to start. + await started; expect(outboundSignal).toBeDefined(); expect(outboundSignal!.aborted).toBe(false); // Abort the client-side request — this should propagate via AbortSignal.any // to the upstream fetch and cause it to reject. - controller.abort(new DOMException(abortReason, "AbortError")); + controller.abort(new DOMException("private-dom-detail", "AbortError")); // The handler must resolve quickly (not wait the full 8 s timeout). const res = await handlerPromise; @@ -429,12 +428,59 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { expect(typeof body.error).toBe("string"); // The abort reason must NOT leak into the error response. - expect(String(body.error)).not.toContain(abortReason); + expect(String(body.error)).not.toContain("private-dom-detail"); expect(String(body.error)).not.toContain("AbortError"); // The outbound signal must have been aborted. expect(outboundSignal!.aborted).toBe(true); }); + + test("client abort with ordinary Error does not leak the reason", async () => { + // Verifies that client-side abort with a plain Error (not DOMException) + // also does not leak the abort reason into the response. + let markStarted!: () => void; + const started = new Promise(resolve => { markStarted = resolve; }); + let outboundSignal: AbortSignal | undefined; + globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + outboundSignal = (init as RequestInit & { signal?: AbortSignal })?.signal; + markStarted(); + await new Promise((resolve, reject) => { + const timer = setTimeout(resolve, 30_000); + outboundSignal!.addEventListener("abort", () => { + clearTimeout(timer); + reject(outboundSignal!.reason); + }, { once: true }); + }); + return Response.json({ models: [] }); + }) as typeof fetch; + + const config = baseConfig({ + testprov: { adapter: "openai-chat", baseUrl: "https://api.example.test/v1", apiKey: "sk-x" }, + }); + + const controller = new AbortController(); + const req = new Request( + "http://127.0.0.1/api/providers/test?name=testprov", + { method: "POST", signal: controller.signal }, + ); + const handlerPromise = handleManagementAPI(req, new URL(req.url), config, {}); + + await started; + expect(outboundSignal).toBeDefined(); + expect(outboundSignal!.aborted).toBe(false); + + // Abort with an ordinary Error containing private details. + controller.abort(new Error("private-error-detail")); + + const res = await handlerPromise; + expect(res).not.toBeNull(); + const body = await res!.json() as Record; + expect(body.ok).toBe(false); + expect(String(body.error)).not.toContain("private-error-detail"); + expect(String(body.error)).not.toContain("stack"); + expect(String(body.error)).not.toContain("Error"); + expect(outboundSignal!.aborted).toBe(true); + }); }); describe("POST /api/oauth/login/cancel (WP040)", () => { From f5a625cf3fb1e4ee9e6dbab3bee226ee6ba90a5c Mon Sep 17 00:00:00 2001 From: JUN Date: Mon, 31 Aug 2026 00:31:14 +0900 Subject: [PATCH 24/33] fix(kiro): advertise the completion tool as terminal so finished turns stop calling tools (#3012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(kiro): advertise the completion tool as terminal so finished turns stop calling tools The private completion tool is enumerated by the shared tool-catalog nudge next to ordinary tools, and that nudge tells every listed name to "count a tool call only after its tool result returns". Nothing returns a result for this one: a valid call becomes the turn's terminal. Nothing in either injected surface said so, so the model read one more deferrable work tool. Measured on a live 2.36.0 proxy: the completion tool was chosen in 25 of 4069 required-mode attempts. Across 1116 Kiro turns of client rollouts, 626 ended through the completion channel while 28 ended with answer-shaped commentary and no completion call at all - finished answers opening with "Done." or "완료", delivered as mid-task commentary, which by the proxy's own contract does not end the turn. Three of those are followed by 4, 10, and 12 further tool calls after the closing summary was already on screen. Both injected surfaces now carry the distinction: the schema description, which travels with the tool object the model is choosing between, and the prose contract, which must not contradict it. The mid-task rules are unchanged - commentary still does not end the turn and the model must still keep using tools before completing; only what may follow the completion call is constrained. Ruled out first: a replayed post-answer tool call (532 rollouts scanned, zero) and a broken delivered-answer local terminal (live closed-turn replays with and without an echoed phase both answered locally with zero upstream requests). Verified: bun run typecheck; 197 pass / 0 fail across tests/kiro-adapter.test.ts, tests/kiro-stream.test.ts, tests/tool-catalog-nudge.test.ts. The new regression test was driven red against the old description first. * docs(devlog): drop absolute home paths from the Kiro measurement table privacy:scan flags a remote absolute home path in a public devlog directory. The host identities that matter are the hostname, PID, and version, so the checkout column carries a neutral form instead. --- .../000_research.md | 139 ++++++++++++++++++ .../010_wp2_terminal_completion_contract.md | 71 +++++++++ src/adapters/kiro-constants.ts | 2 +- src/adapters/kiro.ts | 8 +- tests/kiro-adapter.test.ts | 37 +++++ 5 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 devlog/_plan/260830_kiro_post_answer_tool_calls/000_research.md create mode 100644 devlog/_plan/260830_kiro_post_answer_tool_calls/010_wp2_terminal_completion_contract.md diff --git a/devlog/_plan/260830_kiro_post_answer_tool_calls/000_research.md b/devlog/_plan/260830_kiro_post_answer_tool_calls/000_research.md new file mode 100644 index 0000000000..09d299304d --- /dev/null +++ b/devlog/_plan/260830_kiro_post_answer_tool_calls/000_research.md @@ -0,0 +1,139 @@ +# Kiro post-final-answer tool calls — measurement and root cause + +Reported symptom, twice: routed through Kiro, the agent keeps issuing tool calls +after its final response has already been delivered. + +## Hosts measured + +| Host | Proxy | Version | Checkout | Kiro attempt rows | +| --- | --- | --- | --- | --- | +| local (this machine) | PID 99470, port 10100 | 2.36.0 | primary source checkout | 4080 | +| `macmini-cf` | PID 96671, port 10100 | 2.35.0 | `~/opencodex` | 0 | + +`macmini-cf` carries no Kiro attempt diagnostics at all, so every behavioral +row below comes from the local 2.36.0 proxy. The remote host is one release +behind and is not the reporting surface. + +## What the attempt rows say + +`ocx:kiro:attempt_complete` over the local log, bucketed: + +| Count | mode | sawText | sawRealTool | completionCalls | stopReason | +| --- | --- | --- | --- | --- | --- | +| 2643 | required | true | true | 0 | TOOL_USE | +| 1400 | required | false | true | 0 | TOOL_USE | +| 23 | required | true | false | 1 | TOOL_USE | +| 10 | disabled | true | false | 0 | END_TURN | +| 2 | required | false | false | 1 | TOOL_USE | +| 1 | required | true | false | 0 | END_TURN | +| 1 | text_fallback | false | false | 1 | TOOL_USE | + +4069 of 4080 attempts ran in `required` mode and every one of them ended with +upstream `stopReason: TOOL_USE`. Only 25 attempts ever called the private +completion tool. The model overwhelmingly prefers another tool call to the +completion channel. + +## What is NOT the cause + +Two candidate mechanisms were ruled out with evidence rather than reading. + +Replayed history is not the cause. 532 client rollouts under +`~/.codex/sessions/2026/08/{29,30}` were scanned for a `final_answer` message +followed by a tool call with no intervening user turn. What actually follows a +recorded `final_answer`: END 478, user message 131, developer message 5, tool +call 0. The client never replays a post-answer tool call. + +The delivered-answer local terminal is not broken. Two live probes against the +running proxy replayed a closed turn — once with `phase: "final_answer"` +echoed, once without it, matching real Codex traffic — and both returned +`output: []` with `end_turn: true` and added zero upstream Kiro requests. +The guard added in `b557a8140`/`68eaf45d8` works. + +It has simply never been needed: `~/.opencodex/usage.jsonl` holds 25042 Kiro +rows with zero `localTerminalReason` and zero `locallyAnswered`. Real turns +never arrive already closed, because the client ends the turn itself. So the +defect lives inside a live turn, not across turns. + +## Rejected first hypothesis + +The first diagnosis was that the model calls the completion tool, waits for a +tool result that never arrives, and then calls another tool. An independent +read-only audit refuted it with the parser: `flushOpen` consumes a valid +completion call and records `completionAnswer` without emitting any tool-call +event, the stream end yields the answer as `final_answer` followed by +`done(endTurn: true)`, and `parseKiroStream` returns without another request. +A completion call therefore terminates locally inside one inference; there is +no later inference in which the model could "keep going". Mixed +completion-plus-real-tool output in one inference also fails closed before any +answer is delivered. + +That refutation is correct, and it narrows the defect rather than dissolving it: +the problem is not what happens AFTER a completion call, it is that the model +mostly never makes one. + +## Root cause + +The private completion tool is advertised to the model as an ordinary tool. + +A source probe (`buildKiroPayload` with an `exec`/`wait` catalog) renders the +wire tool names as `["exec","wait","codex_kiro_final_answer"]` and injects: + +> Valid tool names for this turn are exactly \`exec\`, \`wait\`, +> \`codex_kiro_final_answer\`. These listed names are the complete top-level +> tool-call surface for this turn. + +That sentence comes from the shared, provider-agnostic nudge in +`src/adapters/tool-catalog-nudge.ts`, which knows nothing about completion +semantics. It cannot distinguish the proxy's private terminal channel from +`exec`, and the same nudge closes with: + +> Count a tool call only after its tool result returns. + +`KIRO_COMPLETION_INSTRUCTIONS` is the only text that describes the completion +tool, and it never contradicts that: + +> When tools are available, ordinary assistant text is mid-task commentary and +> does not end the turn. Continue using tools after progress updates. When the +> task is fully complete and no more tool calls are needed, call +> `codex_kiro_final_answer` exactly once with the complete user-facing final +> answer in `answer`. Do not provide the final answer as ordinary assistant +> text. + +Every sentence there is about WHEN to call it. Nothing marks it as different in +kind from `exec`, and nothing states what happens after. So the model holds a +contract in which the terminal channel is one more ordinary tool it may defer +while it keeps working — and the generic nudge's "count a tool call only after +its tool result returns" applies to it as uniformly as to everything else. + +The failure that follows is one of SELECTION, not sequencing. Across 4069 +required-mode attempts the completion tool was chosen 25 times: 0.6%. The model +keeps emitting finished prose as commentary and calling ordinary tools instead +of completing through the channel built for it. + +That is what the user sees. Measured over 1116 Kiro turns in the same two days +of client rollouts: 626 turns ended through the completion channel, 462 ended +on a tool call, and 28 ended with answer-shaped commentary prose and no +completion call at all. Those 28 are answers the model had already finished +writing — they open with "Done.", "완료", "머지까지 끝났습니다", "All ten items are +done" — delivered as mid-task commentary, which by the proxy's own contract +"does not end the turn". Three of them are followed by 4, 10, and 12 further +tool calls after the closing summary was already on screen. + +The missing terminal distinction is the leading mechanism behind that measured +selection failure: the terminal channel is advertised as an ordinary, deferrable +tool, and nothing tells the model that this is the one call that ends the turn. +It is a defect in the proxy's own injected text, not a client bug and not a +stream-parsing bug. Causality is not claimed as proven — establishing it +requires a live post-change comparison of the same selection rate, which this +unit records as the follow-up measurement rather than asserting up front. + +## Fix direction + +State terminal semantics where the model reads them: calling the completion +tool ENDS the turn, returns no tool result, and nothing may follow it. The +completion tool's own schema description is the load-bearing site — it travels +with the tool the nudge enumerates — with the prose contract kept consistent. + +Removing the tool from the enumeration is not an option: the nudge states that +names mentioned only in instructions are not callable, so an unlisted +completion tool would be a tool the model is told not to call. diff --git a/devlog/_plan/260830_kiro_post_answer_tool_calls/010_wp2_terminal_completion_contract.md b/devlog/_plan/260830_kiro_post_answer_tool_calls/010_wp2_terminal_completion_contract.md new file mode 100644 index 0000000000..313d49c110 --- /dev/null +++ b/devlog/_plan/260830_kiro_post_answer_tool_calls/010_wp2_terminal_completion_contract.md @@ -0,0 +1,71 @@ +# wp2 — make the completion tool's terminal semantics explicit + +## Change + +Two injected surfaces describe the private completion tool. Both need the same +fact, and the schema description is the one that travels with the tool the +nudge enumerates. + +`src/adapters/kiro.ts`, `kiroCompletionTool()` description: mark the tool as a +terminal channel rather than an ordinary work tool, make completing an +obligation rather than a permitted option, and state that the call ends the +turn, returns no tool result, and admits nothing after it. This sits directly on +the tool object the model is choosing between, so it is read in the same place +the model decides whether to call `exec` again. + +Exact target string: + +> Terminal completion channel, not an ordinary work tool. When the task is fully +> complete and no more work or tool calls are needed, you must call this tool +> exactly once instead of providing the final answer as ordinary assistant text. +> Put the complete user-facing final answer in \`answer\`. The call is complete +> when issued: it ends the turn, returns no tool result, and no text or tool call +> may follow it. + +`src/adapters/kiro-constants.ts`, `KIRO_COMPLETION_INSTRUCTIONS`: keep the +existing commentary-vs-completion rules verbatim and append the terminal clause, +so the prose contract cannot contradict the schema. + +Exact appended string: + +> This completion tool is not an ordinary work tool. When the task is complete, +> call it instead of emitting answer-shaped ordinary assistant text. The call is +> terminal and is the exception to generic tool-result counting: it is complete +> when issued, ends the turn, returns no tool result, and no text or tool call +> may follow it. + +## What must not change + +The commentary rule stays. "Ordinary assistant text is mid-task commentary and +does not end the turn" and "continue using tools after progress updates" are +the behavior that keeps a mid-task turn alive; the new wording constrains only +what happens after the completion call itself. A model must still be free to +call ten more tools before it completes — the fix is that after completing, it +must stop. + +The tool stays in the wire catalog and in the nudge enumeration. The nudge +states that instruction-only names are not callable, so delisting the +completion tool would advertise a tool the model is told to refuse. + +No change to `src/router.ts`, `src/server/lifecycle.ts`, or +`src/server/responses/core.ts`: the Lab core boundary is unrelated to this +defect and `tests/core-lab-boundary.test.ts` guards it. + +## Regression test + +`tests/kiro-adapter.test.ts` gets a focused case asserting the rendered wire +payload carries terminal semantics on BOTH injected surfaces: the completion +tool's schema description and the injected prose contract. Driven red before +the fix. + +What this test proves and does not prove: it proves the contract reaches the +model on both surfaces, which is the deliverable. It does not prove the model's +selection rate improves — that is a live behavioral property measured from +attempt diagnostics (`completionCalls` per required-mode attempt), recorded in +`000_research.md` at 25/4069 before the change. The change is prompt hardening +against a measured selection failure, not a parser fix. + +## Verification + +`bun run typecheck` plus the focused Kiro suites. The full local suite is +excluded by explicit user instruction for this unit; CI covers it on the PR. diff --git a/src/adapters/kiro-constants.ts b/src/adapters/kiro-constants.ts index a4e52472cd..ee44d1d3a8 100644 --- a/src/adapters/kiro-constants.ts +++ b/src/adapters/kiro-constants.ts @@ -35,7 +35,7 @@ export const KIRO_ANSWER_DELIVERED_MESSAGE = "The previous final answer was delivered to the user and that task is closed. No new request has been made yet. Do not repeat, revise, or continue that work; wait for the user's next instruction."; export const KIRO_COMPLETION_INSTRUCTIONS = - `When tools are available, ordinary assistant text is mid-task commentary and does not end the turn. Continue using tools after progress updates. When the task is fully complete and no more tool calls are needed, call ${KIRO_COMPLETION_TOOL_NAME} exactly once with the complete user-facing final answer in \`answer\`. Do not provide the final answer as ordinary assistant text.`; + `When tools are available, ordinary assistant text is mid-task commentary and does not end the turn. Continue using tools after progress updates. When the task is fully complete and no more tool calls are needed, call ${KIRO_COMPLETION_TOOL_NAME} exactly once with the complete user-facing final answer in \`answer\`. Do not provide the final answer as ordinary assistant text. This completion tool is not an ordinary work tool. When the task is complete, call it instead of emitting answer-shaped ordinary assistant text. The call is terminal and is the exception to generic tool-result counting: it is complete when issued, ends the turn, returns no tool result, and no text or tool call may follow it.`; export type KiroCompletionMode = "disabled" | "required" | "text_fallback"; diff --git a/src/adapters/kiro.ts b/src/adapters/kiro.ts index d405dfb7dd..b234a82cbb 100644 --- a/src/adapters/kiro.ts +++ b/src/adapters/kiro.ts @@ -469,7 +469,13 @@ function kiroCompletionTool(): Record { return { toolSpecification: { name: KIRO_COMPLETION_TOOL_NAME, - description: "Finish the task and return the complete user-facing final answer. Call only when no more work or tool calls are needed.", + // The shared tool-catalog nudge enumerates this name next to ordinary tools and tells every + // listed name to count a call only after its tool result returns. Nothing returns a result + // here: a valid call becomes the turn's terminal. Left undescribed, the model reads one more + // deferrable work tool and keeps calling tools with a finished answer already written as + // commentary. So the description states the distinction, the obligation, and the terminality + // where the model is actually choosing between tools. + description: "Terminal completion channel, not an ordinary work tool. When the task is fully complete and no more work or tool calls are needed, you must call this tool exactly once instead of providing the final answer as ordinary assistant text. Put the complete user-facing final answer in `answer`. The call is complete when issued: it ends the turn, returns no tool result, and no text or tool call may follow it.", inputSchema: { json: { type: "object", diff --git a/tests/kiro-adapter.test.ts b/tests/kiro-adapter.test.ts index 2ae9bc3bf7..5770dbf818 100644 --- a/tests/kiro-adapter.test.ts +++ b/tests/kiro-adapter.test.ts @@ -544,6 +544,43 @@ describe("kiro adapter — buildRequest", () => { expect(JSON.stringify(disabled)).not.toContain("codex_kiro_final_answer"); }); + // The private completion tool is enumerated by the shared tool-catalog nudge alongside ordinary + // tools, and that nudge tells every listed name to "count a tool call only after its tool result + // returns". Nothing returns a result for this one: the adapter converts the call into the turn's + // terminal. Without an explicit terminal statement the model reads a deferrable ordinary tool and + // keeps working instead of completing, which is measurable as a selection failure (25 completion + // calls across 4069 required-mode attempts) and shows up as finished answers delivered as + // commentary with more tool calls after them. + // + // Both injected surfaces have to carry it. The schema description travels with the tool object the + // model is choosing between; the prose contract must not contradict it. + test("the completion tool is advertised as terminal on both injected surfaces", async () => { + const state = JSON.parse((await createKiroAdapter(provider).buildRequest( + parsedWith([{ role: "user", content: "hi" }], [bashTool]), + )).body).conversationState; + const current = state.currentMessage.userInputMessage; + const firstUser = state.history?.find((entry: { userInputMessage?: unknown }) => entry.userInputMessage)?.userInputMessage + ?? current; + const completion = current.userInputMessageContext.tools + .find((tool: { toolSpecification: { name: string } }) => tool.toolSpecification.name === "codex_kiro_final_answer"); + + const description: string = completion.toolSpecification.description; + expect(description).toContain("not an ordinary work tool"); + expect(description).toContain("ends the turn"); + expect(description).toContain("returns no tool result"); + expect(description).toContain("no text or tool call may follow it"); + + const injected: string = firstUser.content; + expect(injected).toContain("This completion tool is not an ordinary work tool."); + expect(injected).toContain("exception to generic tool-result counting"); + expect(injected).toContain("ends the turn, returns no tool result, and no text or tool call may follow it"); + + // The mid-task contract must survive: commentary still does not end the turn, and the model must + // still keep using tools before it completes. Only what happens AFTER the call is constrained. + expect(injected).toContain("ordinary assistant text is mid-task commentary"); + expect(injected).toContain("Continue using tools after progress updates."); + }); + test("namespaced (MCP) tools advertise + replay the full wire name", async () => { const adapter = createKiroAdapter(provider); // Tool spec advertised to Kiro must carry the full namespaced name so the bridge's toolNsMap From 6f75616f0b829d427adf910922919801551ee7f7 Mon Sep 17 00:00:00 2001 From: JUN Date: Mon, 31 Aug 2026 00:35:49 +0900 Subject: [PATCH 25/33] docs(devlog): close out the Kiro terminal completion contract unit (#3014) Records the terminal outcome, the merge of #3012 as f5a625cf3, why the one CI failure is pre-existing on dev, and what was done with each review finding - including a truncation guard that was implemented, measured unreachable, and reverted rather than shipped with a test that could not detect its own removal. The follow-up is the post-change selection-rate comparison; the pre-change number is 25 completion calls across 4069 required-mode attempts. --- .../020_close_out.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md diff --git a/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md b/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md new file mode 100644 index 0000000000..a0a39f283b --- /dev/null +++ b/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md @@ -0,0 +1,68 @@ +# Close-out — terminal completion contract shipped + +Terminal outcome: **DONE**. + +## What shipped + +PR #3012, merged to `dev` at 2026-08-30T15:31:15Z as `f5a625cf3`. Two injected +surfaces now state that the private completion tool is terminal: + +- `kiroCompletionTool()` schema description in `src/adapters/kiro.ts`, which + travels with the tool object the model chooses between. +- `KIRO_COMPLETION_INSTRUCTIONS` in `src/adapters/kiro-constants.ts`, so the + prose contract cannot contradict the schema. + +The mid-task rules are untouched: commentary still does not end the turn, and +the model must still keep using tools before completing. Only what may follow +the completion call is constrained. `tests/kiro-adapter.test.ts` pins both +surfaces and asserts the two commentary sentences survive. + +## Verification + +`bun run typecheck` clean. 197 pass / 0 fail across `kiro-adapter`, +`kiro-stream`, and `tool-catalog-nudge`. `privacy:scan` passes. The regression +test was driven red against the old description first. + +CI on the merged head: 20 checks green. The single failure, on both +`test 2/4` and `macos`, was `release version line > the in-tree version is +never behind a released one` — reproduced identically on a pristine +`origin/dev` worktree at `df8b3882f` with none of this unit's commits, and +owned by PR #3006. A release-version bump does not belong in an unrelated bug +fix. + +## Review findings and what was done with them + +Three findings, all answered on the PR. + +A P1 privacy finding was correct: the measurement table carried a remote +absolute home path into a public devlog directory, which `privacy:scan` rejects. +Fixed in `da9b4989c`; the hostname, PID, and version carry the evidence without +an account identifier. + +A truncation-ordering finding was plausible and turned out to be unreachable. +The completion contract is charged last against +`MAX_KIRO_INJECTED_INSTRUCTION_CHARS` (16384), so in principle a large enough +injected context could slice it mid-clause. Measured: the omission notice tops +out at 922 characters under a hostile 60-tool probe, the nudge ceiling is about +5540 under the 48-tool and 64-character caps, and the contract is 696 — roughly +9900 characters of headroom. The caller's system prompt is not charged to this +budget at all, so no caller input can crowd the contract out. + +A reservation guard plus a budget-exhaustion test were implemented first, then +reverted: the test passed with the guard removed, because the only available +lever for inflating the budget was the uncharged system prompt. A guard for an +unreachable path whose test cannot detect its own removal is worse than the +documented measurement, so the measurement is what stayed. If a future addition +starts charging caller-sized text to this budget, the numbers above are the +starting point. + +A duplicate-`.find` finding was a false positive: one call rendered across two +lines. Applying the proposed fix would have deleted the only lookup. + +## Follow-up + +Causality is not claimed as proven. The pre-change selection rate is recorded at +25 completion calls across 4069 required-mode attempts; the follow-up is the +same measurement on traffic served by a proxy running `f5a625cf3` or later. +Both hosts were on older builds at measurement time (local 2.36.0, `macmini-cf` +2.35.0), so a restart onto current `dev` is the precondition for that comparison. From 1031b6fffaa2988ff50e24f0c2ae3112bf0e3b4e Mon Sep 17 00:00:00 2001 From: JUN Date: Mon, 31 Aug 2026 00:39:19 +0900 Subject: [PATCH 26/33] docs(devlog): record the landed-state verification and merge trail (#3016) --- .../020_close_out.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md b/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md index a0a39f283b..503f955cef 100644 --- a/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md +++ b/devlog/_plan/260830_kiro_post_answer_tool_calls/020_close_out.md @@ -66,3 +66,16 @@ Causality is not claimed as proven. The pre-change selection rate is recorded at same measurement on traffic served by a proxy running `f5a625cf3` or later. Both hosts were on older builds at measurement time (local 2.36.0, `macmini-cf` 2.35.0), so a restart onto current `dev` is the precondition for that comparison. + +## Landed-state verification + +Checked against `origin/dev` after both merges (`6f75616f0`), reading the files +out of the remote ref rather than the working tree: + +- `src/adapters/kiro.ts` contains the terminal schema description. +- `src/adapters/kiro-constants.ts` contains the appended terminal clause. +- `tests/kiro-adapter.test.ts` contains the both-surfaces regression test. +- This unit's close-out record is present. + +Merge trail: `f5a625cf3` (#3012, the contract change) and `6f75616f0` +(#3014, this record). From 870a2adb6eaccc9da9ea9832a596e1b2650ab1ea Mon Sep 17 00:00:00 2001 From: JUN Date: Mon, 31 Aug 2026 01:15:28 +0900 Subject: [PATCH 27/33] fix(release): repair dev version line and open future bumps as PRs (#3013) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs(devlog): plan the dev version-line bump PR after four audit rounds dev's package.json is 2.36.0 while tag v2.36.0 names c7d8407d2 on main, so tests/release-version-line.test.ts fails on dev and on every PR against it. The same defect has been repaired by hand four times (32529c2b2, e4a85d134, 076ad3036, befcac3e1) because nothing in scripts/release.ts or release.yml advances dev after a publish. Records the cause, the rejected options, and the shipped design: a separate release-triggered workflow that opens a version-bump PR against dev, plus a pure decision script that imports compareReleaseTags from release-notes.ts so scripts/release.ts stays untouched. Three audit rounds failed this plan before it passed, and each FAIL changed the design rather than the prose: a printed notice was rejected because the existing test is already louder than a printout; the first workflow could not have run (release events resolve from the default branch) or imported its comparator (module-scope process.exit); and the +minor bump rule contradicted befcac3e1, which moved dev to 2.36.0 on a preview-first publish. All four verdicts are recorded in the unit. * fix(release): move dev's version line past the published 2.36.0 dev carried 2.36.0 while tag v2.36.0 names c7d8407d2 on main, so the tree claimed an already-published version from a different commit: release version line > the in-tree version is never behind a released one package.json version 2.36.0 equals release tag v2.36.0, but this commit is not the one that tag names. The tree claims an already-published version: publishing is refused as a duplicate. That failed test 2/4 and macos on dev itself (run 33312566315) and therefore on every PR opened against it, including #3007, whose own diff was two GUI files. 2.37.0 rather than 2.36.1 follows the precedent of all four prior repairs: dev carries the next stable version and the preview train adds its own suffix at release time. Freeness was verified live rather than assumed - no v2.37* tag, npm view @bitkyc08/opencodex@2.37.0 is E404, gh release view v2.37.0 is not found - and compareReleaseTags ranks v2.37.0 ahead of the highest tag v2.36.0. Note the highest tag is v2.36.0, not the later-dated v2.36.0-preview.20260830: sorting all 218 tags with the repository's own comparator puts a stable release above its own prerelease, which is why the failure message names v2.36.0. Verification: tests/release-version-line.test.ts goes 2 pass/1 fail -> 3 pass/0 fail. 260 pass / 0 fail across release-version-line, release-helper, release-notes, cli-version-skew, and service - the five suites that read package.json or assert on versions. test:changed selects nothing here because package.json is read as data, not imported, so those files were run explicitly. * feat(release): open the dev version bump as a PR when a release publishes dev's version line goes stale the moment a release publishes, because scripts/release.ts runs only on main/preview and release.yml ends at "Create GitHub release". Nothing advances dev, so release-version-line.test.ts fails on dev and on every PR opened against it. That was repaired by hand four times (32529c2b2, e4a85d134, 076ad3036, befcac3e1). The second of those ADDED the detector and two more repairs followed it, so more visibility was never the missing piece. What this ships: - scripts/bump-dev-version.ts decides the version. Pure: no git, no network, so it is unit-testable and the credentials stay in the workflow. - .github/workflows/dev-version-bump.yml opens the PR on release: published. permissions {} at the top; the one job takes contents: write to push an unprotected codex/dev-version-* branch and pull-requests: write to open the PR. It never writes to dev and never uses the release deploy key, so release.yml and its review surface are untouched. The rule is not "increment the released minor" — that contradicts befcac3e1, which moved dev to 2.36.0 when v2.36.0-preview.20260829 published, because the stable 2.36.0 had not shipped. It keys off the published version's SHAPE: a prerelease of X.Y.Z means dev carries X.Y.Z; a stable X.Y.Z means dev moves to X.(Y+1).0. Freeness is not guessed either — the workflow runs release-version-line.test.ts against the rewritten tree and opens no PR if the candidate collides. Deliberate limits, stated rather than implied: a release event resolves the workflow from the DEFAULT branch, so this only fires once promoted to main; there is no workflow_dispatch, because a branch-selected manual run would execute that branch's body with contents: write; and a GITHUB_TOKEN PR does not start pull_request workflows, so the bump PR arrives without CI and a human merges it. This prepares the repair; it does not perform it. Verification: tests/bump-dev-version.test.ts 8 pass / 0 fail. Two real bugs were caught by those tests before commit — an ahead-check against the candidate instead of the released version, which would have downgraded a legitimate 2.37.0-preview.1 line, and a double "vv" prefix when handed the release tag_name the workflow actually passes. Each new rule was driven red: naive +minor fails 2 tests, the candidate-based guard fails 1, dropping the prefix normalisation fails 1. actionlint clean; every run block passes bash -n; the parsed YAML was asserted for permissions, trigger, and step list. * docs(devlog): record how the dev bump workflow differed from its plan Three deviations forced by the tree, not chosen: the composite setup-project-bun action instead of a hand-pinned setup-bun SHA, a local shape parse because parseReleaseTag is not exported, and a v-prefix normaliser because the workflow passes release.tag_name while package.json holds a bare version. Also records the ahead-check defect the tests caught: comparing dev against the candidate rather than the released version would have downgraded a legitimate 2.37.0-preview.1 line. * fix(release): check for an open bump PR, not just the branch A security review of the workflow found the idempotency guard incomplete. It checked only whether codex/dev-version- existed as a branch, so an open bump PR whose head branch had been deleted left the check passing: the job would recreate the branch and then fail on gh pr create with "already exists", turning a successful release red for a repair that was already queued. Now checks for an open PR against dev first, then the branch. GH_TOKEN is already in scope for that step, so no new permission is needed. Also records the two residual gaps the review accepted rather than fixed: the GITHUB_OUTPUT write truncates rather than appends (equivalent today, not append-safe later), and no test exercises that output path. * fix(release): reuse an orphaned bump branch and write package.json atomically Two review findings from the maintainer on #3013. An existing branch was treated as terminal success: if a prior run pushed the branch and then failed at pull-request creation, every rerun exited 0 with no pull request, leaving the repair permanently unqueued. The job now fetches the branch, asserts it carries exactly the one-line package.json bump to the expected version, fails closed on anything else, and resumes pull-request creation. The rewrite used a direct write of package.json. scripts/AGENTS.md requires atomic replacement for package metadata, and this script is also the manual recovery path, so an interrupt mid-write would strand an uninstallable checkout. It now writes a sibling temp file, renames it into place, and removes the temp on failure. Two regressions cover it: no debris after a successful rewrite, and a byte-identical original when the write fails. * test(release): skip the unwritable-target case on Windows The read-only-directory test proves the atomic write fails closed, but chmod 0500 is not access control on Windows: the temp write would succeed there and the test would go red for a reason unrelated to the behavior under test. This file is a general suite member, so the Windows shards run it. Guarded with the same process.platform === win32 skip that tests/codex-native-residue.test.ts already uses for its EACCES case. The POSIX runners keep the coverage. --- .github/workflows/dev-version-bump.yml | 170 +++++++++++++++ MAINTAINERS.md | 15 ++ .../000_cause_and_roadmap.md | 134 ++++++++++++ .../010_version_repair.md | 55 +++++ .../020_post_release_bump.md | 202 +++++++++++++++++ .../030_ship.md | 73 +++++++ package.json | 2 +- scripts/bump-dev-version.ts | 205 ++++++++++++++++++ tests/bump-dev-version.test.ts | 163 ++++++++++++++ 9 files changed, 1018 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/dev-version-bump.yml create mode 100644 devlog/_plan/260830_dev_version_line_bump_pr/000_cause_and_roadmap.md create mode 100644 devlog/_plan/260830_dev_version_line_bump_pr/010_version_repair.md create mode 100644 devlog/_plan/260830_dev_version_line_bump_pr/020_post_release_bump.md create mode 100644 devlog/_plan/260830_dev_version_line_bump_pr/030_ship.md create mode 100644 scripts/bump-dev-version.ts create mode 100644 tests/bump-dev-version.test.ts diff --git a/.github/workflows/dev-version-bump.yml b/.github/workflows/dev-version-bump.yml new file mode 100644 index 0000000000..45ecd4ae3f --- /dev/null +++ b/.github/workflows/dev-version-bump.yml @@ -0,0 +1,170 @@ +name: Dev version bump + +# When a release publishes, open a pull request that moves `dev` past the published +# version. Without this, `dev` keeps carrying a version that is at or behind a released +# one, and `tests/release-version-line.test.ts` fails on `dev` and on every pull request +# opened against it - inherited red a contributor cannot fix from their own diff. +# +# That has been repaired by hand four times: 32529c2b2, e4a85d134, 076ad3036, befcac3e1. +# The second of those ADDED the detector and two more repairs followed it, so more +# visibility was never the missing piece; a prepared change was. +# +# WHAT THIS DOES NOT DO. It does not push to `dev`. It opens a pull request and a human +# merges it, because ruleset `Protect dev` requires an approving review and code-owner +# sign-off that a bot cannot supply. Until that merge the red persists. This converts a +# forgotten chore into a queued, reviewable change - not into an automatic repair. +# +# A `release` event resolves this workflow file from the repository DEFAULT branch +# (`main`), not from `dev` - the same trap documented in cleanup-closed-pr-branches.yml. +# So merging this file to `dev` installs it but arms nothing; it first fires after an +# ordinary dev -> main promotion carries it there. +# +# There is deliberately no `workflow_dispatch`: a branch-selected manual run executes +# THAT branch body with `contents: write`. Re-drive a missed run by running +# `bun scripts/bump-dev-version.ts package.json` locally and opening the pull +# request normally. +on: + release: + types: [published] + +permissions: {} + +concurrency: + group: dev-version-bump + cancel-in-progress: false + +jobs: + open-bump-pr: + runs-on: ubuntu-latest + permissions: + # Push the new codex/dev-version-* branch. Ruleset `Protect dev` covers only + # refs/heads/dev, so the bump branch is unprotected and this token cannot + # bypass dev review. It is the ruleset that keeps this job off dev, not the + # permission name. + contents: write + # Open the pull request. + pull-requests: write + steps: + - name: Checkout dev + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + with: + ref: dev + # Tags are load-bearing, not decoration: the freeness gate below is a bun + # test that reads the local tag set, and release-version-line.test.ts + # returns EARLY on an empty set. A shallow checkout would make that gate + # silently vacuous instead of failing loudly. + fetch-depth: 0 + # Do NOT set persist-credentials: false here as the read-only workflows do. + # This job has to push its bump branch. + + # The repository-owned composite action, not a hand-pinned setup-bun SHA: it + # resolves the Bun version from package.json so the runtime SOT stays in one + # place. An independently pinned action here would drift from every other job. + - name: Setup project Bun + uses: ./.github/actions/setup-project-bun + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Decide the version dev should carry + id: decide + env: + RELEASED_VERSION: ${{ github.event.release.tag_name }} + run: | + set -euo pipefail + bun scripts/bump-dev-version.ts "${RELEASED_VERSION}" package.json + + - name: Prove the chosen version is unused + if: ${{ steps.decide.outputs.changed == 'true' }} + # The script decides the candidate from the released version SHAPE, which is all + # a pure function can see. Whether that candidate is actually FREE is a property + # of the tag set, so it is settled here by the detector that already owns the + # question. If this fails, no pull request is opened and the job goes red asking + # for a human decision - which is the correct outcome, not a fallback. + run: bun test tests/release-version-line.test.ts + + - name: Open the bump pull request + if: ${{ steps.decide.outputs.changed == 'true' }} + env: + GH_TOKEN: ${{ github.token }} + NEXT_VERSION: ${{ steps.decide.outputs.version }} + RELEASED_VERSION: ${{ github.event.release.tag_name }} + run: | + set -euo pipefail + + branch="codex/dev-version-${NEXT_VERSION}" + + # Idempotent: a second publish, a re-run, or a manual repair must not turn a + # successful release into a red job. + # + # Check the PULL REQUEST as well as the branch, not just the branch. A security + # review caught that: an open bump pull request whose head branch was deleted + # leaves the branch check passing, so the job would recreate the branch and then + # fail on `gh pr create` with "already exists" — turning a successful release red + # for a repair that was already queued. + open_prs="$(gh pr list --base dev --head "${branch}" --state open --json number --jq 'length')" + if [ "${open_prs}" != "0" ]; then + echo "::notice::a bump pull request for ${branch} is already open; nothing to do" + exit 0 + fi + + # An existing branch is NOT terminal. If a previous run pushed the branch and then + # failed at `gh pr create`, exiting here would leave the repair permanently unqueued + # while every rerun reports success - the exact failure mode a reviewer caught. So + # reuse the branch and fall through to pull-request creation instead. + if git ls-remote --exit-code --heads origin "${branch}" >/dev/null 2>&1; then + echo "::notice::${branch} exists without an open pull request; validating it" + git fetch origin "${branch}" + + # Fail closed on unexpected content. The branch carries the bot's own one-line + # bump, so anything else on it means a human or another job is using that name and + # this job must not push to it or open a pull request from it. + changed_files="$(git diff --name-only "origin/dev...origin/${branch}")" + if [ "${changed_files}" != "package.json" ]; then + echo "::error::${branch} touches unexpected files: ${changed_files:-}" + exit 1 + fi + branch_version="$(git show "origin/${branch}:package.json" | node -p "JSON.parse(require('fs').readFileSync(0,'utf8')).version")" + if [ "${branch_version}" != "${NEXT_VERSION}" ]; then + echo "::error::${branch} carries ${branch_version}, expected ${NEXT_VERSION}" + exit 1 + fi + git checkout -B "${branch}" "origin/${branch}" + else + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git checkout -b "${branch}" + git add package.json + git commit -m "fix(release): move dev to ${NEXT_VERSION} after ${RELEASED_VERSION}" + git push origin "${branch}" + fi + + gh pr create \ + --base dev \ + --head "${branch}" \ + --title "fix(release): move dev to ${NEXT_VERSION} after ${RELEASED_VERSION}" \ + --body "$(cat < package.json`, + then open the pull request normally. ## The retired `dev2-go` line diff --git a/devlog/_plan/260830_dev_version_line_bump_pr/000_cause_and_roadmap.md b/devlog/_plan/260830_dev_version_line_bump_pr/000_cause_and_roadmap.md new file mode 100644 index 0000000000..32b1a7efd6 --- /dev/null +++ b/devlog/_plan/260830_dev_version_line_bump_pr/000_cause_and_roadmap.md @@ -0,0 +1,134 @@ +# dev version line: stop repairing it by hand + +Unit: `devlog/_plan/260830_dev_version_line_bump_pr/` + +Named for what it ships: a version-bump PULL REQUEST opened when a release publishes. +The unit was briefly called `..._autobump`, which an audit correctly rejected — the +workflow prepares the change and a human merges it, so nothing is automatic end to +end. +Goalplan: `repair-the-dev-version-line-and-add-a-post-relea` + +## The symptom, today + +`dev` head `df8b3882f` carries `package.json` version `2.36.0`. Tag `v2.36.0` +names `c7d8407d2`, which is `origin/main`. So the tree claims a version that is +already published from a different commit, and +`tests/release-version-line.test.ts` reports exactly that: + +``` +(fail) release version line > the in-tree version is never behind a released one +error: package.json version 2.36.0 equals release tag v2.36.0, but this commit is +not the one that tag names. The tree claims an already-published version: +publishing is refused as a duplicate. Bump package.json. +``` + +This fails CI jobs `test 2/4` and `macos` on `dev` itself (run 33312566315, cut at +`c2778ca3a` — `dev` has since advanced to `df8b3882f` and the failure still +reproduces there) and therefore on every PR opened against it. PR #3007 inherited +the same two red jobs for a two-file GUI change, and branch protection refused the +merge until it was overridden. + +## Why a one-line bump is not the fix + +The same defect has been repaired by hand FOUR times: + +| commit | what it did | +|---|---| +| `32529c2b2` | `2.24.2` -> `2.27.0`, after dev trailed the published channel by two releases | +| `e4a85d134` | `2.32.1-preview.20260825` -> `2.34.0`; also ADDED `release-version-line.test.ts` | +| `076ad3036` | `2.34.0` -> `2.35.0`, right after v2.34.0 shipped | +| `befcac3e1` | `2.35.0` -> `2.36.0`, after v2.36.0-preview.20260829 shipped | + +Note the second row: the detector was added DURING this sequence, and two more +hand-repairs followed it. Visibility was never the missing piece — that is the +finding that decided the design in `020`. + +Four repairs of one cause is a missing actor, not four accidents. The cause is +structural and visible in `scripts/release.ts`: the release runs only on `main` or +`preview` (`allowedBranches = ["main", "preview"]`, line 496), bumps +`package.json` there, commits `release: v`, pushes THAT branch, and +dispatches `release.yml`. The workflow ends at "Create GitHub release" — tag plus +GitHub release, nothing more. No step in either file ever advances `dev`. The +workflow declares `permissions: {}` at the top (line 32) and grants each job only +`contents: read` or `contents: write`, which is what makes an added `dev` write +there a security-review problem rather than a convenience. + +So the version line on `dev` goes stale the moment a release publishes, and stays +stale until a human notices red CI on an unrelated PR. The cost lands on +contributors: inherited red they did not cause and cannot fix from their own diff. + +What this unit can and cannot promise: it moves the repair from "someone eventually +remembers" to "a reviewable PR is waiting." It does not make the red impossible, +because the bump still needs a human merge — `Protect dev` requires an approving +review and code-owner sign-off, which a bot cannot supply. Claiming more than that +was the defect an audit caught in the first two drafts of `020`. + +## Constraint that shapes the design + +`dev` carries the NEXT STABLE version; the preview train adds its own suffix at +release time. That is the precedent `befcac3e1` states explicitly and the three +earlier repairs followed. A mechanism must preserve it — bumping dev to a preview +string would contradict every prior repair. + +The existing test is already the right detector. It reads the local tag set, needs +no network, and distinguishes "equal on the release commit" (legal) from "equal +anywhere else" (duplicate). Nothing about the detector needs changing. What is +missing is anything that PREPARES the repair: today the detector reports the problem +to whoever happens to open the next PR, and the fix is left to memory. + +## Phase map + +Each decade doc below is one full PABCD cycle. Dependency-ordered: the version +repair lands first because it unblocks CI for everything else, then the actor that +prepares the next repair as a reviewable PR, then the ship. + +- `010_version_repair.md` — move `dev` off the consumed `2.36.0` (wp2). +- `020_post_release_bump.md` — open the dev bump as a PR when a release publishes (wp3). + Note: that workflow only runs once it reaches `main`, the default branch. Merging it + to `dev` does not activate it. +- `030_ship.md` — PR against `dev`, CI evidence, merge (wp4). + +## Audit record + +TWO drafts of this roadmap were FAILED by an independent reviewer, and both verdicts +changed the design rather than the wording. + +Round 1: `020` chose a printed notice inside the release script and called it an +autobump. The reviewer showed the existing test is already louder than any printout, +and that two hand-repairs happened AFTER it landed. It also caught a wrong +"highest tag" claim in `010` and a test plan citing a `--dry-run` flag and reusable +shim helpers that do not exist. + +Round 2: the replacement PR-workflow design could not have worked. A `release` event +runs the workflow from the DEFAULT branch (`main`), which the scope forbade touching; +the named comparator `compareReleaseVersions` sits behind a module-scope +`process.exit` in `scripts/release.ts` and cannot be imported; and the "+minor" bump +rule contradicted `befcac3e1`, which moved `dev` to `2.36.0` on a +`v2.36.0-preview.*` publish. All three are fixed in the third draft, which imports +`compareReleaseTags` from `scripts/release-notes.ts` instead, records the `main` +promotion as a named follow-up in `030`, and replaces "+minor" with the two-branch +rule in `020`. The unit was also renamed. + +Round 3 caught the sequel to that last fix: "lowest unused stable" is not a pure +function of the script's two inputs, because "unused" is a property of the tag set and +the registry. The rule is now split — shape arithmetic in the script, freeness in the +tag-aware detector that already exists. It also caught that the out-of-scope list +below forbade the very promotion `030` depends on. + +Every rejected option and its reason stay in `020` so the decision is auditable. + +## Out of scope + +No publish, tag, or Release dispatch. No `main`/`preview` change IN THIS UNIT. No +merge of `main` back into `dev` to "sync" the version: `010_wp2_version_line.md` +names that as the trap that lands the consumed string on top of newer commits. + +That `main` exclusion is a scope boundary, not a claim that `main` is irrelevant. The +workflow in `020` cannot run until an ordinary maintainer-controlled promotion carries +it to the default branch; `030` records that as the named follow-up. Two consequences +worth stating plainly: + +- Merging this unit into `dev` fixes the red CI immediately (that is `010`) but arms + nothing (that is `020`, dormant until promotion). +- The next release cut from the CURRENT `main` will still strand `dev` one last time. + The loop closes on the release AFTER the workflow reaches `main`. diff --git a/devlog/_plan/260830_dev_version_line_bump_pr/010_version_repair.md b/devlog/_plan/260830_dev_version_line_bump_pr/010_version_repair.md new file mode 100644 index 0000000000..f74141e12c --- /dev/null +++ b/devlog/_plan/260830_dev_version_line_bump_pr/010_version_repair.md @@ -0,0 +1,55 @@ +# 010 — move dev off the consumed 2.36.0 (wp2) + +One line. `package.json` `version`: `2.36.0` -> `2.37.0`. + +## Why 2.37.0 + +Verified against the real state, not read off a pattern: + +| candidate | verdict | +|---|---| +| `2.36.0` (current) | tag `v2.36.0` names `c7d8407d2`, not dev's head; npm `latest` = 2.36.0. Consumed. | +| `2.36.1` | mechanically legal but labels the range a patch, against the `befcac3e1` precedent | +| `2.36.1-preview.*` | contradicts "dev carries the next STABLE version" | +| `2.37.0` | `npm view @bitkyc08/opencodex@2.37.0` -> E404; no `v2.37.0` in the tag set; forward of every tag | + +Highest existing tag by the repository's own ordering is `v2.36.0` — NOT the +later-dated `v2.36.0-preview.20260830`. Sorting all 218 `v*` tags with +`compareReleaseTags` puts the stable release above its own prerelease, which is +correct SemVer precedence and the reason the failing message names `v2.36.0`: + +``` +top 5: v2.34.0 v2.35.0 v2.36.0-preview.20260829 v2.36.0-preview.20260830 v2.36.0 +HIGHEST = v2.36.0 +compareReleaseTags("v2.37.0", "v2.36.0") -> 1 +``` + +The first draft of this doc asserted the preview was highest while claiming to have +run the comparator. It had not. Run it. + +npm dist-tags at the time of writing: `latest` = 2.36.0, `preview` = +2.36.0-preview.20260830. + +## The diff + +```json +- "version": "2.36.0", ++ "version": "2.37.0", +``` + +No other file carries the product version. `gui/package.json` is `0.0.0`, +`docs-site/package.json` is `0.0.1`, and `src/generated/*` hold catalog hashes. +Re-verify with a repo-wide search excluding `node_modules`, `.tmp`, `devlog`, +`gui/dist` before claiming the line is unique. + +## Verification + +- `bun test tests/release-version-line.test.ts` — all three tests pass, including + "the in-tree version is never behind a released one" which currently fails. +- Re-run the freeness checks (`npm view`, `git tag --list`) immediately before + committing: another release landing mid-cycle would consume the candidate. + +## What this does not do + +It does not publish, tag, or promote, and it does not stop the next release from +stranding dev again. That is `020`. diff --git a/devlog/_plan/260830_dev_version_line_bump_pr/020_post_release_bump.md b/devlog/_plan/260830_dev_version_line_bump_pr/020_post_release_bump.md new file mode 100644 index 0000000000..b3b51de7d3 --- /dev/null +++ b/devlog/_plan/260830_dev_version_line_bump_pr/020_post_release_bump.md @@ -0,0 +1,202 @@ +# 020 — open the dev bump as a PR when a release publishes (wp3) + +Third draft. Two independent audit rounds failed the first two; both verdicts and the +reasons are recorded below, because each one changed the design rather than the prose. + +## Round 1 rejected a printed notice (option C) + +> The detector already exists and is louder than a notice. +> `tests/release-version-line.test.ts` fails CI on every unrelated PR, and TWO +> hand-repairs happened after it landed — `e4a85d134` added it. A printout is a +> reminder, not a mechanism. + +Also verified: `dryRun = !args.includes("--publish")` (`scripts/release.ts:492`) makes +the default invocation a rehearsal, so a notice fires on every dry run until it is +trained away; and `release.yml` is `workflow_dispatch`, so an Actions-tab release +never runs `scripts/release.ts` at all. + +## Round 2 rejected the first PR-workflow design + +Three blockers, each confirmed against the repository: + +1. **It would never fire.** A `release` event runs the workflow file from the + DEFAULT branch. `gh repo view` reports `main`. This repository already documents + the identical trap in `cleanup-closed-pr-branches.yml:8-10` for scheduled + workflows. Landing the file on `dev` alone starts nothing. +2. **It could not import its comparator.** `compareReleaseVersions` is exported from + `scripts/release.ts:303`, but that file parses `process.argv` and calls + `process.exit(1)` at module scope (lines 487-491) with no `import.meta.main` + guard. `tests/release-version-line.test.ts:27-29` already records that importing + it kills the runner. +3. **The bump rule was wrong for preview-first releases.** `befcac3e1` moved `dev` + from `2.35.0` to `2.36.0` when the published tag was + `v2.36.0-preview.20260829`. "Increment the released core's minor" would have said + `2.37.0` and skipped a stable version that had not shipped. + +## Chosen design + +A separate workflow that opens a PULL REQUEST against `dev`, plus a pure script that +decides the version. + +**Honest scope.** This does not silently repair `dev`; it converts a forgotten chore +into a review-queue item that a human merges. Until that merge, +`release-version-line` stays red on `dev`. That is a real improvement over today — +a PR is durable where a printout is not, and it lands in the same place +`MAINTAINERS.md` already requires every `dev` change to land — but it is not an +autobump, and this unit should not be described as one. + +## The version rule + +Not "+minor" — that contradicts `befcac3e1`. But not "lowest unused stable" either, +phrased as if the script could evaluate it: "unused" is a property of the TAG SET and +the npm registry, and a pure function cannot see either. Stating the rule that way +would have made the doc unimplementable in exactly the manner the previous two drafts +were. + +Split the rule by who can answer it: + +**The script decides the CANDIDATE from the published version's SHAPE alone.** + +| published | candidate | precedent | +|---|---|---| +| `X.Y.Z-preview.*` (a prerelease of an unreleased core) | `X.Y.Z` | `befcac3e1`: 2.35.0 -> 2.36.0 on v2.36.0-preview.20260829 | +| `X.Y.Z` (stable) | `X.(Y+1).0` | `e4a85d134` 2.33.0 -> 2.34.0; `076ad3036` 2.34.0 -> 2.35.0; `32529c2b2` tip 2.26.0 -> 2.27.0 | + +Both rows are pure string arithmetic on the published version, and both are pinned by +tests. The prerelease row is the one that matters: the stable core of a +preview-first release has NOT shipped, so `dev` should carry it rather than skip it. + +**Freeness is verified where the tag set is visible.** The candidate is passed to the +existing detector, not re-derived: after the bump the workflow runs +`bun test tests/release-version-line.test.ts` in the `dev` checkout, which sorts the +real local tags with `compareReleaseTags` and fails if the candidate is at or behind +any published version. If that test fails, the workflow opens NO PR and the job goes +red — a visible request for a human decision, not a wrong PR. + +This is the honest division: shape arithmetic in the pure function, set membership in +the tag-aware gate that already exists. The script additionally refuses to emit a +candidate that `compareReleaseTags` does not rank strictly ahead of both `dev`'s +current version and the published one, which is the part it CAN check without I/O. + +## Files + +**`scripts/bump-dev-version.ts`** — pure decision logic, no git and no network. + +- Imports `compareReleaseTags` from `scripts/release-notes.ts`, NOT + `compareReleaseVersions` from `scripts/release.ts`. `release-notes.ts` guards its + CLI behind `import.meta.main` (line 1231) and already exports the comparator at + line 66, which is exactly why `release-version-line.test.ts` imports from there. + This avoids editing `scripts/release.ts` at all, keeping the release authority and + its security review surface untouched. +- Takes the released version and an explicit `package.json` path, so a test can + operate on a temp copy and the script is genuinely pure with respect to the + checkout. +- Emits a MACHINE CONTRACT, not prose: writes `changed=true|false` and `version=` + to `$GITHUB_OUTPUT` when set, and prints the same as JSON otherwise. Round 2 was + right that "print the chosen version" mixed with "print that nothing is needed" is + not an interface. +- `dev` already ahead -> `changed=false`, file untouched, exit 0. +- Malformed released version -> non-zero exit, file untouched. + +**`.github/workflows/dev-version-bump.yml`** — the actor. + +- Trigger: `release: [published]` only. No `workflow_dispatch`: round 2 correctly + noted that a branch-selected manual run executes THAT branch's body with + `contents: write`, which is the pattern this repository's own workflow comments + refuse. A missed run is re-driven by running the script by hand and opening the PR + normally. +- `permissions: {}` at the top; the single job takes `contents: write` (to push a new + `codex/dev-version-` branch — ruleset `Protect dev` covers only + `refs/heads/dev`, so the new branch is unprotected) and `pull-requests: write` (to + open the PR). Not `issues: write`, not `id-token: write`. +- `actions/checkout` with `ref: dev` AND `fetch-depth: 0` (or `fetch-tags: true`). A + `release` checkout defaults to the tag on `main`/`preview`, which is the wrong tree + to bump — and the tags are not optional decoration: `release-version-line.test.ts` + returns early on an empty tag set (line 93), so a shallow checkout would make the + freeness gate below silently vacuous rather than failing loudly. +- Do NOT copy `persist-credentials: false` from the repository's read-only workflows. + This job has to push its bump branch. +- Set up Bun and run `bun install` before the freeness gate: that gate is a + `bun test` invocation, not a shell comparison. +- Idempotent: if `codex/dev-version-` or its PR already exists, log and exit 0 + rather than failing the push. A second publish must not error. +- The workflow file must reach `main` to ever run. That is a promotion, not a + `dev`-only change, and `030` records it as an explicit follow-up rather than + pretending the merge to `dev` activates it. + +**Known limitation, stated not hidden:** a PR opened with `GITHUB_TOKEN` does not +start `pull_request` workflows, so the bump PR arrives without CI. `Protect dev` +additionally requires an approving review and code-owner review, and +`.github/CODEOWNERS` assigns `/.github/` and `/package.json` to human owners. A bot +cannot satisfy those. The PR is therefore a prepared, reviewable change — which is +the honest ceiling for automation here, and the reason the "autobump" framing is +dropped. + +## Test + +`tests/bump-dev-version.test.ts`, against temp copies of `package.json`. No shim +harness: the script is pure and takes a path. + +- dev `2.36.0`, released stable `2.36.0` -> `2.37.0`, `changed=true`. +- dev `2.35.0`, released stable `2.36.0` -> `2.37.0` (behind, not merely equal). +- dev `2.35.0`, released `2.36.0-preview.20260829` -> `2.36.0`. Pins `befcac3e1`, and + fails under a naive "+minor" rule, which is what makes it the load-bearing case. +- dev `2.36.0`, released `2.36.0-preview.20260830` -> `changed=false`: dev already + carries the prerelease's stable core, so there is nothing to do. +- dev `2.37.0`, released `2.36.0` -> `changed=false`, file BYTE-IDENTICAL, exit 0. +- dev `2.37.0-preview.1`, released `2.36.0` -> `changed=false`; a preview of a future + core is ahead, which `release-version-line.test.ts` already pins. +- released version malformed -> non-zero exit, file untouched. + +Red-first for a CLI is a behavioral red, not an import error: assert the chosen +version and the untouched-file invariant, and confirm each assertion fails against a +deliberately wrong rule (e.g. always `+minor`, which breaks the preview case) before +committing. + +## Also + +`MAINTAINERS.md`: after a release publishes, a `dev` version-bump PR is opened +automatically; merging it is part of closing out the release. Note that the workflow +only runs once it is on `main`. + +## As implemented + +Shipped in `075a33be8`. Three deviations from the sketch above, recorded because each +was forced by the tree rather than chosen: + +1. **Bun setup uses the repository's composite action**, `./.github/actions/setup-project-bun`, + not a hand-pinned `oven-sh/setup-bun` SHA. That action resolves the version from + `package.json` so the runtime source of truth stays in one place; an independently + pinned SHA here would have drifted from every other job. The first draft of the + workflow pinned its own and disagreed with the one already in the tree. +2. **`parseReleaseTag` is not exported** from `release-notes.ts`, so the script does its + own shape parse rather than widening that module's surface for one caller. Only + `compareReleaseTags` is imported. +3. **A `v`-prefix normaliser was required.** The workflow passes + `github.event.release.tag_name` (`v2.36.0`) while `package.json` holds a bare version, + so prefixing blindly built `vv2.36.0` and every comparison against it misordered. It + surfaced as the script rejecting a correct candidate: "candidate 2.37.0 does not rank + ahead of released v2.36.0". Now pinned by a test. + +The tests also caught a defect the plan did not anticipate. The ahead-check originally +compared `dev` against the CANDIDATE, which is the wrong question: a `dev` at +`2.37.0-preview.1` with `2.36.0` published is genuinely ahead of the release but behind +the candidate `2.37.0`, so the script would have "repaired" a healthy tree and +downgraded a legitimate prerelease line. It now compares against the released version, +which is the same question `release-version-line.test.ts` asks. + +A security review of the shipped workflow also found one gap worth recording. The +idempotency guard originally checked only whether the bump BRANCH existed. An open bump +pull request whose head branch had been deleted leaves that check passing, so the job +would recreate the branch and then fail on `gh pr create` with "already exists" - turning +a successful release red for a repair that was already queued. It now checks for an open +pull request first, then the branch. + +Two residual gaps are accepted rather than fixed, and named so a later reader does not +mistake them for oversights: + +- `Bun.write` to `$GITHUB_OUTPUT` truncates rather than appends. That is equivalent to a + first write today because the step emits nothing else, but it is not append-safe if a + later edit adds a second output in the same step. +- There is no test that exercises the `$GITHUB_OUTPUT` path itself; the tests cover the + decision and the file rewrite. diff --git a/devlog/_plan/260830_dev_version_line_bump_pr/030_ship.md b/devlog/_plan/260830_dev_version_line_bump_pr/030_ship.md new file mode 100644 index 0000000000..5d1bb35545 --- /dev/null +++ b/devlog/_plan/260830_dev_version_line_bump_pr/030_ship.md @@ -0,0 +1,73 @@ +# 030 — ship it (wp4) + +## Branch and commits + +Branch `codex/dev-version-line-bump-pr` off `origin/dev`. Two commits, matching +the two implementation phases: + +1. `fix(release): move dev's version line past the published 2.36.0` +2. `feat(release): open the dev version bump as a PR when a release publishes` + +Plus the devlog unit. Push with `--no-verify` as the user directed. + +## PR + +Against `dev`, filling every `.github/PULL_REQUEST_TEMPLATE.md` section: Summary, +Verification, Checklist. No screenshot section is required — this touches no GUI. + +The description must state the four prior hand-repairs, because that history is the +argument for the mechanism. Reviewers who see only the version bump will read it as +routine maintenance. + +Release-tooling changes require explicit security review per `scripts/AGENTS.md` and +`MAINTAINERS.md`. Call that out in the description rather than leaving a reviewer to +discover it, and be precise about what the new workflow can do: it takes +`contents: write` to push a NEW unprotected bump branch and `pull-requests: write` to +open the PR. It does not use the release deploy key, does not write to protected +`dev` directly, and is a separate file from `release.yml` so the publish job's +permissions are unchanged. + +## Evidence required before the merge claim + +Local: +- `bun test tests/release-version-line.test.ts` — pass. +- `bun test tests/bump-dev-version.test.ts` — pass, including the NOOP case that must + leave `package.json` byte-identical. +- `bun test tests/release-helper.test.ts` — pass, proving the existing release + contract is unbroken. `scripts/release.ts` is deliberately NOT modified by this + unit, so this suite is a regression check rather than coverage of new behavior. +- `actionlint` on the new workflow if available; otherwise state that the YAML was + not machine-validated. +- `bun x tsc --noEmit` — clean. +- `bun run privacy:scan` — clean. +- `bun run prepush` — required by `scripts/AGENTS.md` for release-tooling changes. +- Red-then-green transcript for each new assertion. + +Remote: +- `gh pr checks` for the PR head showing `test 2/4` and `macos` GREEN. This is the + specific flip that proves the fix: those two jobs are red on `dev` today for this + exact test. + +The full local root suite is prohibited by the user. State that boundary in the PR +and rely on CI for whole-suite coverage. + +## Merge + +Merge into `dev` once the two previously-red jobs are green. If some unrelated job +is red, check whether it is also red on `dev` at `c2778ca3a` before deciding — the +point of this unit is to stop inheriting someone else's red, not to add to it. + +## Required follow-up, not part of this PR + +`.github/workflows/dev-version-bump.yml` DOES NOT RUN until it reaches `main`. A +`release` event resolves the workflow file from the repository default branch, which +`gh repo view` reports as `main`; this repository documents the same trap for +scheduled workflows in `cleanup-closed-pr-branches.yml:8-10`. + +So merging this PR into `dev` installs the file but arms nothing. The workflow first +fires after the next ordinary `dev` -> `main` promotion carries it there. That +promotion is maintainer-controlled (`MAINTAINERS.md`) and explicitly out of scope +here: this unit must not touch `main`. + +State this in the PR description. A reviewer who assumes the merge activates the +automation will believe the loop is closed a release earlier than it is. diff --git a/package.json b/package.json index 03911d978a..b0f39a14aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitkyc08/opencodex", - "version": "2.36.0", + "version": "2.37.0", "description": "Universal provider proxy for OpenAI Codex & Claude Code — use any LLM with Codex CLI/App/SDK and Claude Code", "type": "module", "main": "./bin/package-main.mjs", diff --git a/scripts/bump-dev-version.ts b/scripts/bump-dev-version.ts new file mode 100644 index 0000000000..e57d02e032 --- /dev/null +++ b/scripts/bump-dev-version.ts @@ -0,0 +1,205 @@ +#!/usr/bin/env bun +/** + * Decide the version `dev` should carry after a release publishes. + * + * WHY THIS EXISTS + * + * `scripts/release.ts` runs only on `main` or `preview` (`allowedBranches`), bumps + * `package.json` there, and pushes that branch. `release.yml` ends at "Create GitHub + * release". Nothing advances `dev`. So the moment a release publishes, `dev` carries a + * version that is at or behind a published one, and + * `tests/release-version-line.test.ts` fails on `dev` and on every pull request opened + * against it — inherited red that a contributor cannot fix from their own diff. + * + * That has been repaired by hand four times: `32529c2b2`, `e4a85d134`, `076ad3036`, + * `befcac3e1`. The second of those ADDED the detector, and two more repairs followed + * it, which is the evidence that visibility was never the missing piece. + * + * WHAT THIS IS AND IS NOT + * + * This decides a version. It does no git and no network work, which is what makes it + * unit-testable and what keeps the credential surface in the workflow that calls it. + * It does not merge anything: `.github/workflows/dev-version-bump.yml` uses the + * output to open a pull request, and a human still merges that. Until they do, the + * red persists. This is a prepared repair, not an automatic one. + * + * THE RULE + * + * Not "increment the minor". That contradicts `befcac3e1`, which moved `dev` from + * `2.35.0` to `2.36.0` when the published tag was `v2.36.0-preview.20260829`: + * incrementing the released core's minor would have skipped the stable `2.36.0` that + * had not shipped yet. + * + * Not "lowest unused stable" either, however natural that sounds. "Unused" is a + * property of the tag set and the npm registry, and a function with no I/O cannot + * evaluate it. Stating the rule that way would make this file unimplementable as + * specified. + * + * The rule is therefore about the published version's SHAPE, which is the only thing + * this function can see: + * + * published `X.Y.Z-preview.*` -> dev becomes `X.Y.Z` (befcac3e1) + * published `X.Y.Z` (stable) -> dev becomes `X.(Y+1).0` (e4a85d134, 076ad3036, 32529c2b2) + * + * A prerelease means the stable core has not shipped, so `dev` should carry it. A + * stable release means that core is consumed, so `dev` moves to the next minor. + * + * Freeness is then checked where the tag set IS visible: the workflow runs + * `tests/release-version-line.test.ts` in the `dev` checkout after the rewrite. If the + * candidate collides with something published, that test fails, no pull request is + * opened, and the job goes red asking for a human decision. This file only enforces + * what it can prove without I/O — that the candidate ranks strictly ahead of both + * inputs by the repository's own comparator. + */ + +import { existsSync, renameSync, unlinkSync, writeFileSync } from "node:fs"; + +import { compareReleaseTags } from "./release-notes"; + +/** + * `compareReleaseTags` wants a tag. The workflow supplies `github.event.release.tag_name` + * (`v2.36.0`) while `package.json` holds a bare version (`2.36.0`), so prefixing blindly + * produces `vv2.36.0` and every comparison against it silently misorders. + * + * That is not hypothetical: it made the first version of this script reject a correct + * candidate with "candidate 2.37.0 does not rank ahead of released v2.36.0" when handed + * the tag the workflow actually passes. + */ +function asTag(version: string): string { + return version.startsWith("v") ? version : `v${version}`; +} + +/** + * `parseReleaseTag` in `release-notes.ts` is not exported, so parse here rather than + * widen that module's surface for one caller. Same shape, optional `v` prefix. + */ +function parseVersion(raw: string): { major: number; minor: number; patch: number; prerelease: string | null } | null { + const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-(.+))?$/.exec(raw.trim()); + if (!match) return null; + return { + major: Number(match[1]), + minor: Number(match[2]), + patch: Number(match[3]), + prerelease: match[4] ?? null, + }; +} + +export interface BumpDecision { + changed: boolean; + /** The version dev should carry. Equals `current` when `changed` is false. */ + version: string; + reason: string; +} + +/** + * Pure decision. `released` is the version just published; `current` is what `dev` + * carries now. + * + * @throws when either input is not a parseable version. A malformed input must not + * silently produce a plausible-looking bump. + */ +export function decideDevVersion(released: string, current: string): BumpDecision { + const rel = parseVersion(released); + if (!rel) throw new Error(`released version is not parseable: ${JSON.stringify(released)}`); + if (!parseVersion(current)) throw new Error(`current version is not parseable: ${JSON.stringify(current)}`); + + const candidate = rel.prerelease === null + ? `${rel.major}.${rel.minor + 1}.0` + : `${rel.major}.${rel.minor}.${rel.patch}`; + + // Nothing to do when dev is already clear of the RELEASED version. That is the real + // question — the detector in tests/release-version-line.test.ts compares dev against + // published tags, not against this candidate. + // + // Comparing against the candidate instead is wrong, and a test caught it: dev at + // `2.37.0-preview.1` with `2.36.0` published is genuinely ahead of the release, but it + // is BEHIND the candidate `2.37.0`, so a candidate-based guard would "fix" a tree that + // was never broken and downgrade a legitimate prerelease line. release-version-line + // already pins that a prerelease of a future core outranks a published stable; these + // two must not disagree. + if (compareReleaseTags(asTag(current), asTag(released)) > 0) { + return { + changed: false, + version: current, + reason: `dev already carries ${current}, which is ahead of the published ${released}`, + }; + } + + // The candidate must beat the published version too. With the rule above this holds + // by construction, so a failure here means the rule and the comparator disagree — + // refuse rather than emit a version the detector would reject. + if (compareReleaseTags(asTag(candidate), asTag(released)) <= 0) { + throw new Error(`candidate ${candidate} does not rank ahead of released ${released}`); + } + + return { + changed: true, + version: candidate, + reason: rel.prerelease === null + ? `${released} is a stable release, so dev moves to the next minor ${candidate}` + : `${released} is a prerelease of an unshipped ${candidate}, so dev carries that core`, + }; +} + +if (import.meta.main) { + const [released, packageJsonPath] = process.argv.slice(2); + if (!released || !packageJsonPath) { + console.error("Usage: bun scripts/bump-dev-version.ts "); + process.exit(1); + } + + const file = Bun.file(packageJsonPath); + const raw = await file.text(); + const parsed = JSON.parse(raw) as { version?: unknown }; + if (typeof parsed.version !== "string") { + console.error(`${packageJsonPath} has no string version`); + process.exit(1); + } + + let decision: BumpDecision; + try { + decision = decideDevVersion(released, parsed.version); + } catch (err) { + console.error(`✗ ${err instanceof Error ? err.message : String(err)}`); + process.exit(1); + } + + if (decision.changed) { + // Rewrite only the version line. A full JSON round-trip would reformat the file + // and turn a one-line bump into an unreviewable diff. + const rewritten = raw.replace( + /("version"\s*:\s*")[^"]+(")/, + (_match, open: string, close: string) => `${open}${decision.version}${close}`, + ); + if (rewritten === raw) { + console.error("✗ could not locate the version line to rewrite"); + process.exit(1); + } + // Atomic replacement, per scripts/AGENTS.md: package metadata is exactly the class of + // file whose partial write corrupts a checkout. This script is also the documented + // manual recovery path, so it can run on a developer machine where an interrupt or a + // full disk mid-write would leave a truncated package.json and no way to install. + // Write a sibling temp file, rename it into place (atomic within one filesystem), and + // remove the temp on any failure so a crash leaves no debris. + const temp = `${packageJsonPath}.tmp-${process.pid}`; + try { + writeFileSync(temp, rewritten, "utf8"); + renameSync(temp, packageJsonPath); + } catch (err) { + try { + if (existsSync(temp)) unlinkSync(temp); + } catch { + // Nothing more to do: the original file is untouched, which is the point. + } + console.error(`✗ could not write ${packageJsonPath}: ${err instanceof Error ? err.message : String(err)}`); + process.exit(1); + } + } + + // A machine contract, not prose: the workflow branches on these values. + const output = process.env.GITHUB_OUTPUT; + if (output) { + await Bun.write(output, `changed=${decision.changed}\nversion=${decision.version}\n`); + } + console.log(JSON.stringify(decision)); +} diff --git a/tests/bump-dev-version.test.ts b/tests/bump-dev-version.test.ts new file mode 100644 index 0000000000..914861fd96 --- /dev/null +++ b/tests/bump-dev-version.test.ts @@ -0,0 +1,163 @@ +import { describe, expect, test } from "bun:test"; +import { chmodSync, mkdtempSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join } from "node:path"; +import { decideDevVersion } from "../scripts/bump-dev-version"; + +/** + * The bump rule that keeps dev off an already-published version. + * + * Every case here is a real repair this repository performed by hand. The rule was got + * wrong once during design - "increment the released minor" - and befcac3e1 is the + * case that disproves it, so that row is load-bearing rather than an edge case. + */ + +const CLI = new URL("../scripts/bump-dev-version.ts", import.meta.url).pathname; + +function tempPackageJson(version: string): string { + const dir = mkdtempSync(join(tmpdir(), "ocx-bump-")); + const path = join(dir, "package.json"); + // Two neighbouring keys and specific spacing on purpose: the CLI rewrites only the + // version line, and this fixture is what proves the rest stays byte-identical. + const body = [ + "{", + ' "name": "@bitkyc08/opencodex",', + ' "version": "' + version + '",', + ' "private": false', + "}", + "", + ].join("\n"); + writeFileSync(path, body, "utf8"); + return path; +} + +describe("dev version bump rule", () => { + test("a stable release moves dev to the next minor", () => { + // e4a85d134 (2.33.0 -> 2.34.0) and 076ad3036 (2.34.0 -> 2.35.0). + expect(decideDevVersion("2.36.0", "2.36.0")).toMatchObject({ changed: true, version: "2.37.0" }); + expect(decideDevVersion("2.36.0", "2.35.0")).toMatchObject({ changed: true, version: "2.37.0" }); + expect(decideDevVersion("2.33.0", "2.32.1-preview.20260825")).toMatchObject({ changed: true, version: "2.34.0" }); + }); + + test("a prerelease moves dev to that prereleases own stable core", () => { + // befcac3e1: published v2.36.0-preview.20260829, dev went to 2.36.0 - NOT 2.37.0. + // An "increment the released minor" rule returns 2.37.0 here and skips a stable + // version that has not shipped. This assertion is the whole reason the rule keys + // off the published version shape. + expect(decideDevVersion("2.36.0-preview.20260829", "2.35.0")).toMatchObject({ + changed: true, + version: "2.36.0", + }); + expect(decideDevVersion("2.36.0-preview.20260829", "2.35.0").version).not.toBe("2.37.0"); + }); + + test("dev already ahead is a no-op, not a downgrade", () => { + expect(decideDevVersion("2.36.0", "2.37.0")).toMatchObject({ changed: false, version: "2.37.0" }); + // A prerelease of a FUTURE core is ahead of a published stable. This is the same + // ordering release-version-line.test.ts pins, so the two must not disagree. + expect(decideDevVersion("2.36.0", "2.37.0-preview.1")).toMatchObject({ changed: false }); + // dev already carries the prerelease stable core. + expect(decideDevVersion("2.36.0-preview.20260830", "2.36.0")).toMatchObject({ changed: false }); + }); + + test("a v-prefixed release tag is accepted, not double-prefixed", () => { + // The workflow passes github.event.release.tag_name, which is "v2.36.0", while + // package.json holds a bare "2.36.0". Prefixing blindly built "vv2.36.0" and the + // comparison silently misordered, so the script rejected a correct candidate with + // "candidate 2.37.0 does not rank ahead of released v2.36.0". Both forms must agree. + expect(decideDevVersion("v2.36.0", "2.35.0")).toMatchObject({ changed: true, version: "2.37.0" }); + // Compare the DECISION, not the reason text: reason echoes the input verbatim, so it + // legitimately differs between the two forms while the outcome must not. + const tagged = decideDevVersion("v2.36.0", "2.35.0"); + const bare = decideDevVersion("2.36.0", "2.35.0"); + expect({ changed: tagged.changed, version: tagged.version }) + .toEqual({ changed: bare.changed, version: bare.version }); + expect(decideDevVersion("v2.36.0-preview.20260829", "2.35.0")).toMatchObject({ + changed: true, + version: "2.36.0", + }); + // And a v-prefixed dev version must not fool the ahead-check either. + expect(decideDevVersion("v2.36.0", "v2.37.0")).toMatchObject({ changed: false }); + }); + + test("a malformed version is refused rather than guessed at", () => { + expect(() => decideDevVersion("not-a-version", "2.36.0")).toThrow(/not parseable/); + expect(() => decideDevVersion("2.36", "2.36.0")).toThrow(/not parseable/); + expect(() => decideDevVersion("2.36.0", "garbage")).toThrow(/not parseable/); + }); + + test("the CLI rewrites only the version line", () => { + const path = tempPackageJson("2.36.0"); + const before = readFileSync(path, "utf8"); + const proc = Bun.spawnSync(["bun", CLI, "2.36.0", path]); + expect(proc.exitCode).toBe(0); + const after = readFileSync(path, "utf8"); + expect(after).toContain('"version": "2.37.0"'); + // Everything else survives. A JSON round-trip would reformat the file and turn a + // one-line bump into an unreviewable diff, so assert the inverse substitution + // reproduces the original exactly. + expect(after.replace('"version": "2.37.0"', '"version": "2.36.0"')).toBe(before); + }); + + test("the CLI leaves the file byte-identical when nothing is needed", () => { + const path = tempPackageJson("2.37.0"); + const before = readFileSync(path, "utf8"); + const proc = Bun.spawnSync(["bun", CLI, "2.36.0", path]); + expect(proc.exitCode).toBe(0); + // Byte-identical, not merely "still parses": a no-op run that reformats the file + // would open a pull request with a diff and no version change. + expect(readFileSync(path, "utf8")).toBe(before); + expect(new TextDecoder().decode(proc.stdout)).toContain('"changed":false'); + }); + + test("the rewrite is atomic and leaves no debris", () => { + // package.json is package metadata, so a partial write corrupts a checkout and this + // script is also the documented manual recovery path - it runs on developer machines + // where an interrupt or a full disk mid-write would strand an unusable file. + // scripts/AGENTS.md requires atomic replacement for exactly this class of file. + const path = tempPackageJson("2.36.0"); + const dir = dirname(path); + const proc = Bun.spawnSync(["bun", CLI, "2.36.0", path]); + expect(proc.exitCode).toBe(0); + // The temp sibling must be gone: a leftover .tmp- means the rename never + // happened and the write was not atomic. + expect(readdirSync(dir).filter(f => f.includes(".tmp-"))).toEqual([]); + expect(readdirSync(dir)).toEqual(["package.json"]); + // And the surviving file is complete, not truncated. + const after = readFileSync(path, "utf8"); + expect(JSON.parse(after).version).toBe("2.37.0"); + expect(JSON.parse(after).name).toBe("@bitkyc08/opencodex"); + expect(after.endsWith("}\n")).toBe(true); + }); + + // Skipped on Windows: `chmod 0500` is not access control there, so the write would + // succeed and this test would fail red for a reason that has nothing to do with the + // behavior under test. Same guard as tests/codex-native-residue.test.ts uses for its + // EACCES case. The POSIX runners still cover the failure path. + const unwritableTest = process.platform === "win32" ? test.skip : test; + unwritableTest("an unwritable target fails closed with the original intact", () => { + // The atomic path must not destroy the original when the write itself fails. A + // read-only directory makes both the temp write and the rename impossible. + const path = tempPackageJson("2.36.0"); + const before = readFileSync(path, "utf8"); + const dir = dirname(path); + chmodSync(dir, 0o500); + try { + const proc = Bun.spawnSync(["bun", CLI, "2.36.0", path]); + expect(proc.exitCode).not.toBe(0); + // Byte-identical: the failure path must leave the checkout installable. + expect(readFileSync(path, "utf8")).toBe(before); + expect(readdirSync(dir).filter(f => f.includes(".tmp-"))).toEqual([]); + } finally { + chmodSync(dir, 0o700); + } + }); + + test("the CLI fails without writing when the released version is malformed", () => { + const path = tempPackageJson("2.36.0"); + const before = readFileSync(path, "utf8"); + const proc = Bun.spawnSync(["bun", CLI, "nonsense", path]); + expect(proc.exitCode).not.toBe(0); + expect(readFileSync(path, "utf8")).toBe(before); + }); +}); From 0ea439672231d9f2e098fc3af7e6ad4b601e1627 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 13:51:12 -0400 Subject: [PATCH 28/33] fix(providers): restore config refresh batch cancellation --- gui/src/pages/Providers.tsx | 7 ++++++- gui/src/pages/use-providers-fetch.ts | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gui/src/pages/Providers.tsx b/gui/src/pages/Providers.tsx index da3039aacc..a427bb18b4 100644 --- a/gui/src/pages/Providers.tsx +++ b/gui/src/pages/Providers.tsx @@ -73,6 +73,7 @@ export default function Providers({ apiBase }: { apiBase: string }) { }, []); const { batchTesting, startBatch, cancelMountedBatch, isActiveBatch } = useProviderBatchController(); + const [providerConfigGeneration, setProviderConfigGeneration] = useState(0); // Cancel batch when apiBase changes. const prevApiBaseRef = useRef(apiBase); @@ -186,11 +187,15 @@ export default function Providers({ apiBase }: { apiBase: string }) { setQuotaRefresh(previous => ({ epoch: previous.epoch + 1, force })); }, []); const { fetchConfig, fetchOauth, fetchProviderQuotas } = useProvidersFetch({ - apiBase, t, setConfig, setOauthProviders, setOauthStatus, notify, + apiBase, t, setConfig, setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, invalidateProviderQuotas, configCacheKey, }); + useEffect(() => { + cancelMountedBatch(); + }, [providerConfigGeneration, cancelMountedBatch]); + // WP3, shared by the diff --git a/gui/src/pages/use-providers-fetch.ts b/gui/src/pages/use-providers-fetch.ts index b310731d2f..87eb1560d1 100644 --- a/gui/src/pages/use-providers-fetch.ts +++ b/gui/src/pages/use-providers-fetch.ts @@ -8,6 +8,7 @@ export function useProvidersFetch({ apiBase, t, setConfig, + setProviderConfigGeneration, setOauthProviders, setOauthStatus, notify, @@ -17,6 +18,7 @@ export function useProvidersFetch({ apiBase: string; t: TFn; setConfig: React.Dispatch>; + setProviderConfigGeneration: React.Dispatch>; setOauthProviders: React.Dispatch>; setOauthStatus: React.Dispatch>>; notify: (msg: string, ok: boolean) => void; @@ -30,11 +32,12 @@ export function useProvidersFetch({ const res = await fetch(`${apiBase}/api/config`); const data = await readJsonOrThrow(res); setConfig(data ?? null); + setProviderConfigGeneration(generation => generation + 1); if (configCacheKey && data) writeSessionListCache(configCacheKey, data); } catch { notify(t("prov.loadConfigFail"), false); } - }, [apiBase, configCacheKey, notify, setConfig, t]); + }, [apiBase, configCacheKey, notify, setConfig, setProviderConfigGeneration, t]); const fetchOauth = useCallback(async () => { try { From 5f2986f900dd186d747d99d5c04935e488bb33b7 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 13:54:06 -0400 Subject: [PATCH 29/33] fix(providers): restore config refresh cancellation coverage --- .../hooks/use-provider-batch-controller.ts | 3 --- gui/tests/providers-batch-test.test.tsx | 27 +++++++++---------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/gui/src/hooks/use-provider-batch-controller.ts b/gui/src/hooks/use-provider-batch-controller.ts index e3c56f7f3d..43faf57263 100644 --- a/gui/src/hooks/use-provider-batch-controller.ts +++ b/gui/src/hooks/use-provider-batch-controller.ts @@ -30,7 +30,6 @@ export function useProviderBatchController(): ProviderBatchController { const nextBatchIdRef = useRef(0); /** Identity of the currently-active batch; stale callbacks see a mismatch and bail out. */ const activeBatchRef = useRef<{ id: number; controller: AbortController } | null>(null); - const batchTestingRef = useRef(false); const [batchTestingState, setBatchTestingState] = useState(false); const cancelMountedBatch = useCallback(() => { @@ -38,7 +37,6 @@ export function useProviderBatchController(): ProviderBatchController { if (!active) return; active.controller.abort(); activeBatchRef.current = null; - batchTestingRef.current = false; setBatchTestingState(false); }, []); @@ -53,7 +51,6 @@ export function useProviderBatchController(): ProviderBatchController { const batchId = ++nextBatchIdRef.current; const controller = new AbortController(); activeBatchRef.current = { id: batchId, controller }; - batchTestingRef.current = true; setBatchTestingState(true); return controller; }, []); diff --git a/gui/tests/providers-batch-test.test.tsx b/gui/tests/providers-batch-test.test.tsx index 0e2b6bc45d..39e26458be 100644 --- a/gui/tests/providers-batch-test.test.tsx +++ b/gui/tests/providers-batch-test.test.tsx @@ -809,35 +809,32 @@ test("16. same-base config refresh cancels in-flight batch", async () => { const hc = hcRef!; // Start batch A - const controllerA = hc.startBatch(); - // Force re-render by triggering a dummy state update - await act(async () => { - batchTestingRef = hc.batchTesting; - }); + let controllerA!: AbortController; + await act(async () => { controllerA = hcRef!.startBatch(); }); + await act(async () => { batchTestingRef = hcRef!.batchTesting; }); expect(batchTestingRef).toBe(true); expect(controllerA.signal.aborted).toBe(false); // Simulate config refresh: call cancelMountedBatch (same effect as generation bump) - hc.cancelMountedBatch(); - await act(async () => { - batchTestingRef = hc.batchTesting; - }); + await act(async () => { hcRef!.cancelMountedBatch(); }); + await act(async () => { batchTestingRef = hcRef!.batchTesting; }); expect(batchTestingRef).toBe(false); expect(controllerA.signal.aborted).toBe(true); - expect(hc.isActiveBatch(controllerA)).toBe(false); + expect(hcRef!.isActiveBatch(controllerA)).toBe(false); // Start batch B - const controllerB = hc.startBatch(); + let controllerB!: AbortController; + await act(async () => { controllerB = hcRef!.startBatch(); }); await act(async () => { - batchTestingRef = hc.batchTesting; + batchTestingRef = hcRef!.batchTesting; }); expect(batchTestingRef).toBe(true); expect(controllerB.signal.aborted).toBe(false); - expect(hc.isActiveBatch(controllerB)).toBe(true); - expect(hc.isActiveBatch(controllerA)).toBe(false); + expect(hcRef!.isActiveBatch(controllerB)).toBe(true); + expect(hcRef!.isActiveBatch(controllerA)).toBe(false); // Unmount cleanup - hc.abortBatchOnUnmount(); + hcRef!.abortBatchOnUnmount(); expect(controllerB.signal.aborted).toBe(true); await act(async () => { root.unmount(); }); From 719d5e1c5149b7004b6e51599286e1db9afb394b Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 14:12:22 -0400 Subject: [PATCH 30/33] feat(launcher): add Windows source checkout launcher --- Start-OpenCodex.cmd | 13 ++++ Start-OpenCodex.ps1 | 140 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 Start-OpenCodex.cmd create mode 100644 Start-OpenCodex.ps1 diff --git a/Start-OpenCodex.cmd b/Start-OpenCodex.cmd new file mode 100644 index 0000000000..ea8f81fa73 --- /dev/null +++ b/Start-OpenCodex.cmd @@ -0,0 +1,13 @@ +@echo off +setlocal + +powershell.exe -NoLogo -NoProfile -ExecutionPolicy Bypass -File "%~dp0Start-OpenCodex.ps1" %* +set "launcher_exit=%ERRORLEVEL%" + +if not "%launcher_exit%"=="0" ( + echo. + echo OpenCodex could not be started. Review the error above. + pause +) + +exit /b %launcher_exit% diff --git a/Start-OpenCodex.ps1 b/Start-OpenCodex.ps1 new file mode 100644 index 0000000000..b28e836573 --- /dev/null +++ b/Start-OpenCodex.ps1 @@ -0,0 +1,140 @@ +[CmdletBinding()] +param( + [ValidateRange(1, 65535)] + [int]$Port = 10100, + + [ValidateRange(1, 120)] + [int]$StartupTimeoutSeconds = 30, + + [switch]$NoBrowser +) + +$ErrorActionPreference = "Stop" +$repoRoot = $PSScriptRoot +$dashboardUrl = "http://127.0.0.1:$Port/" +$healthUrl = "${dashboardUrl}healthz" +$logDirectory = Join-Path $repoRoot ".tmp" +$stdoutLog = Join-Path $logDirectory "launcher.out.log" +$stderrLog = Join-Path $logDirectory "launcher.err.log" + +function Get-OpenCodexHealth { + try { + $response = Invoke-RestMethod -Uri $healthUrl -Method Get -TimeoutSec 2 + if ($response.service -eq "opencodex" -and $response.status -eq "ok") { + return $response + } + } + catch { + return $null + } + + return $null +} + +function Open-Dashboard { + if (-not $NoBrowser) { + Start-Process $dashboardUrl + } +} + +function Test-IsLocalCheckoutProcess { + param([Parameter(Mandatory = $true)][int]$ProcessId) + + try { + $runningProcess = Get-CimInstance Win32_Process -Filter "ProcessId=$ProcessId" + if ($null -eq $runningProcess) { + return $false + } + + if (-not [string]::IsNullOrWhiteSpace($runningProcess.ExecutablePath) -and + $runningProcess.ExecutablePath.StartsWith($repoRoot, [StringComparison]::OrdinalIgnoreCase)) { + return $true + } + + if ([string]::IsNullOrWhiteSpace($runningProcess.CommandLine)) { + return $false + } + + $expectedEntryPoint = Join-Path $repoRoot "src\cli\index.ts" + return $runningProcess.CommandLine.IndexOf($expectedEntryPoint, [StringComparison]::OrdinalIgnoreCase) -ge 0 + } + catch { + return $false + } +} + +$localBunExecutable = Join-Path $repoRoot "node_modules\bun\bin\bun.exe" +$bunApplication = Get-Command bun.exe -CommandType Application -ErrorAction SilentlyContinue +if (Test-Path -LiteralPath $localBunExecutable) { + $bunExecutable = $localBunExecutable +} +elseif ($null -ne $bunApplication) { + $bunExecutable = $bunApplication.Source +} +else { + throw "Bun was not found. Install Bun from https://bun.sh, then run this launcher again." +} + +if (-not (Test-Path -LiteralPath (Join-Path $repoRoot "node_modules"))) { + throw "Dependencies are missing. Open PowerShell in '$repoRoot', run 'bun install', then try again." +} + +$existingHealth = Get-OpenCodexHealth +if ($null -ne $existingHealth) { + if (Test-IsLocalCheckoutProcess -ProcessId $existingHealth.pid) { + Write-Host "This OpenCodex checkout is already running on port $Port (PID $($existingHealth.pid))." + Open-Dashboard + exit 0 + } + + Write-Host "A different OpenCodex installation is using port $Port (PID $($existingHealth.pid))." + Write-Host "Stopping it before starting this checkout..." + & $bunExecutable run src/cli/index.ts stop + if ($LASTEXITCODE -ne 0) { + throw "The existing OpenCodex instance could not be stopped safely." + } + + $stopDeadline = (Get-Date).AddSeconds(15) + do { + Start-Sleep -Milliseconds 250 + $existingHealth = Get-OpenCodexHealth + } while ($null -ne $existingHealth -and (Get-Date) -lt $stopDeadline) + + if ($null -ne $existingHealth) { + throw "The previous OpenCodex instance is still using port $Port." + } +} + +New-Item -ItemType Directory -Path $logDirectory -Force | Out-Null + +Write-Host "Starting OpenCodex on port $Port..." +$process = Start-Process ` + -FilePath $bunExecutable ` + -ArgumentList @("run", "src/cli/index.ts", "start", "--port", "$Port") ` + -WorkingDirectory $repoRoot ` + -WindowStyle Hidden ` + -RedirectStandardOutput $stdoutLog ` + -RedirectStandardError $stderrLog ` + -PassThru + +$deadline = (Get-Date).AddSeconds($StartupTimeoutSeconds) +do { + Start-Sleep -Milliseconds 250 + $process.Refresh() + + $health = Get-OpenCodexHealth + if ($null -ne $health) { + if (-not (Test-IsLocalCheckoutProcess -ProcessId $health.pid)) { + throw "Port $Port became healthy, but it belongs to a different OpenCodex installation." + } + Write-Host "OpenCodex is ready at $dashboardUrl (PID $($health.pid))." + Open-Dashboard + exit 0 + } + + if ($process.HasExited) { + throw "OpenCodex stopped during startup (exit code $($process.ExitCode)). See '$stderrLog'." + } +} while ((Get-Date) -lt $deadline) + +throw "OpenCodex did not become ready within $StartupTimeoutSeconds seconds. See '$stderrLog'." From e60e8cb2d7662545128dd270fc5cb4583470191c Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 14:48:28 -0400 Subject: [PATCH 31/33] test(integrations): allow Windows snapshot retention budget --- tests/management-integration-routes.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/management-integration-routes.test.ts b/tests/management-integration-routes.test.ts index 095a5d146a..1fafed2de8 100644 --- a/tests/management-integration-routes.test.ts +++ b/tests/management-integration-routes.test.ts @@ -766,7 +766,7 @@ describe("POST /api/client-integrations/restore", () => { }); expect(readFileSync(configPath, "utf8")).toBe(before); expect(store.listOperations()).toHaveLength(journalBefore); - }); + }, 15_000); }); describe("GET /api/client-integrations/journal", () => { From 007d74c2aa4db905a85109df0ae291ded9b8bc11 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 21:07:06 -0400 Subject: [PATCH 32/33] test(providers): add regression test for upstream timeout branch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cover the timeout path in provider-routes.ts where upstreamSignal.aborted && !clientAborted — ensures the handler returns 'Connection test timed out' instead of hanging or leaking internal error details when the 8s upstream timeout fires while the client request signal remains active. --- tests/provider-connection-test.test.ts | 47 +++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/provider-connection-test.test.ts b/tests/provider-connection-test.test.ts index 4faee92b45..755b8c029e 100644 --- a/tests/provider-connection-test.test.ts +++ b/tests/provider-connection-test.test.ts @@ -10,6 +10,7 @@ import { saveCredential } from "../src/oauth/store"; import { PROVIDER_REGISTRY } from "../src/providers/registry"; import type { OcxConfig } from "../src/types"; import { withRegistryDiscovery } from "./helpers/provider-registry-discovery"; +import { ManagementRequest } from "./helpers/management-auth"; const TEST_DIR = join(tmpdir(), "ocx-conn-test"); const previousHome = process.env.OPENCODEX_HOME; @@ -455,7 +456,7 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { }) as typeof fetch; const config = baseConfig({ - testprov: { adapter: "openai-chat", baseUrl: "https://api.example.test/v1", apiKey: "sk-x" }, + testprov: { adapter: "openai-chat", baseUrl: "https://api.example.test/v1", apiKey: "***" }, }); const controller = new AbortController(); @@ -481,6 +482,50 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { expect(String(body.error)).not.toContain("Error"); expect(outboundSignal!.aborted).toBe(true); }); + + test("upstream timeout while client signal remains active returns 'Connection test timed out'", async () => { + // Regression test for the timeout branch in provider-routes.ts: + // const isTimeout = upstreamSignal.aborted && !clientAborted; + // The outbound fetch stays pending until AbortSignal.timeout(8000) + // aborts upstreamSignal, while req.signal stays un-aborted. + let markStarted!: () => void; + const started = new Promise(resolve => { markStarted = resolve; }); + const mockFetch = (async (input: RequestInfo | URL, init?: RequestInit) => { + const signal = init?.signal; + markStarted(); + // Listen for abort and reject immediately when upstreamSignal fires. + await new Promise((_, reject) => { + signal?.addEventListener("abort", () => reject(new Error("aborted")), { once: true }); + // Hold indefinitely — the 8s upstream timeout will fire first. + }); + return Response.json({ models: [] }); + }) as typeof fetch; + + const config = baseConfig({ + testprov: { adapter: "openai-chat", baseUrl: "https://api.example.test/v1", apiKey: "***", fetch: mockFetch }, + }); + + // Use ManagementRequest to ensure Host header is set automatically. + const controller = new AbortController(); + const req = new ManagementRequest( + "http://127.0.0.1/api/providers/test?name=testprov", + { method: "POST", signal: controller.signal }, + ); + const handlerPromise = handleManagementAPI(req, new URL(req.url), config, {}); + + await started; + // req.signal must NOT be aborted — timeout should fire on upstreamSignal only. + expect(controller.signal.aborted).toBe(false); + + const res = await handlerPromise; + expect(res).not.toBeNull(); + const body = await res!.json() as Record; + expect(body.ok).toBe(false); + expect(body.error).toBe("Connection test timed out"); + + // Clean up — abort the client signal so the dangling fetch is released. + controller.abort(); + }); }); describe("POST /api/oauth/login/cancel (WP040)", () => { From 38df9ff652f961576dfeddf16fe0c92774d56eb7 Mon Sep 17 00:00:00 2001 From: randomix777 Date: Sun, 30 Aug 2026 21:38:27 -0400 Subject: [PATCH 33/33] test(providers): use ManagementRequest for client-abort probes Replace new Request with ManagementRequest in the two client-abort tests so the Host header is set correctly, matching the pattern used by the upstream timeout regression test. --- tests/provider-connection-test.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/provider-connection-test.test.ts b/tests/provider-connection-test.test.ts index 755b8c029e..d744d6c5b2 100644 --- a/tests/provider-connection-test.test.ts +++ b/tests/provider-connection-test.test.ts @@ -406,7 +406,7 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { }); // Fire the request with an explicit AbortController signal. - const req = new Request( + const req = new ManagementRequest( "http://127.0.0.1/api/providers/test?name=testprov", { method: "POST", signal: controller.signal }, ); @@ -460,7 +460,7 @@ describe("POST /api/providers/test (WP040 connectivity probe)", () => { }); const controller = new AbortController(); - const req = new Request( + const req = new ManagementRequest( "http://127.0.0.1/api/providers/test?name=testprov", { method: "POST", signal: controller.signal }, );

!JbY4fg|V$K6EFa|uN7{N^}yvz{$;0+wkkiQ|% zvH@Ee_hq+OfiBI?&Q5gPvT6wd)X~F66eRF{$8N-Jw%#YUX=hDnxXHVqHI5RuQyELp zn-A88YO1LTFLAY3&;7*cssq%D)CNTl{$YNk-qwV-Y2hZG{P0P@*y^aI)G#TMUcvXC zj_1kL$X799zx2~@spns<*+ zrXB|kDfTkLPyTvAuU435RKh2Mu(&~-Cu+|meNNpLkdqDtr@y+nrJFAM08+Z^JJ7dJeT z)3h`-eGh6wA+|PI)!rsH91n33R#v=D9JS~DbV@oo+q#JYLhQZ!EBWT@YzxGom|)D6 zs%jP$9O26VIWU>0Q50-B@1vsNXk zhj3dpc}Gs>pzLhlAPGQdeP))8d2DGqF>)i-W@oV-twO1WNS~D}&^$@m8^AD~=+XrC z#15JlJ82=_>R0%9D_?mPWx)OQ^o|6EZU)Xe=T$a5F?#Q!qP9C|{R*UDTIlC<((92`El{#}>sl#?wnJxqIQ%3N+1UvUjH zhu(yWL-S=zLyw&`=T>r&r)~vA=L$O7c&%0Zk)=6mxGj8}CuL4eYJx*I`qbJvXO;Hz z93rs_JPXodGykxFou>PD9b3O<>VpyD(qOB>Oo4(7uf8VVAgQRPy1LFGr6AWvvrKu} z`dNVe!4HvM?tAzTM@B~efG3rK1Yg3~37gzL%z%K+?lT$CYfi+P3AVNEetuOQJD|l0z;KBSIt4a4!AGjNkrA1V#b2w8*a^7qli`26;DmIolE1_FC;WCkK>q zxG2Q$DKCP15Ef**Vr)svD5&7{r9)Zi2^h`5b%fL$wIj21tEXl+XX+pp&+9FZp*#6Oj-s;%jz32-IsZE{ScEJyN-zZUkUu6M_S zB5MGe>%c6{a!bf~4)B+ocTL$AE!wl`cJGz}CTFR_AJ#R5^15o)gaa6{39yG>zL8ED zW0jj34xa(3og5D7mUU9&>up058FGPTw$jO`3|m01=We8A66C1W011(4NTM)~pcHRMeqkQ%vBAU6J5M0}E2_E>$-uJ3-q0t4G1{?9gVaFXc1I zz}eNF!*{xyL;KPf-w;<(rAHq4b@+ltaw#ns(^k3;YX=-gtUd3&^O{07L17(w-ryZy z{RpgVx^*B!)%W|1^$2ik${aMa!$dNx-}GZ7;SEOaeAJDSI4+K1_QmIxWHIKI$|0{f z`nw+XXU037Yl=ZeA~;<{>tL4CH&yQwqsf)5Bb&WYU$d`*;CQd5xstD>^jI;DyxsW_ zC+Wwp8D08B)4VPaT1eAKku98kK&E;d0IrySfrwqkp~(9>adh3z!0bUBdYPC%Zx z^hQe7zUK*4BaFS*;NW*wbhf;p#Rp9piqz5=~oiTARQLwoF@THu>_#XTNp*6HFA*kC> z{^uSteSJwhT^~KSGn(Zxf1$tO9@B>hN9YXMd`HMYx`t8KNaM$D{HZJ z-&Uia=V+%UaHZ!rB%hn`qmf z;YXZvs+hIHIfQe|q5P{&>~XDv$9XFKrh*)SasC{Chf&uCjeY5fUS?fRV2S3$@=9-V zSkN+09JV=D=<}}TD^)!y^7aRVT`n3|tLeAJ)R`m(>@tjbCzC#<9~ zo2l#B=Y!8k9v;QfwUx$*oFy+5m_sePf=0ICuQb)g ztbLJj*RI&aM7zaXwW1(pm*H4)Xx_C?nml%S;I!%u>oC`C$icpdmgSz)?OoNiwM0ie z83DGQ$EA&=bLT#S#{Re^7Kw*rUS)Y0dQJ=dAO-<>qcKY6X9$PV);1qCOHS{}KOd@Y zenU!f-?3{qAVAqI>m@EBQA`lGOE1OdHc7w`|X=B z&MS0$XWK8ep*Ta_b0Dpz;M-+sw5+Q9<*C6V7PD`;F54sI6PSJXX*S?$X_*ns=&b%ps#39v;3V7k0e3!2kO7y5;uX^CL`4msp?1 zv^+iY^1tC6Jva7u*P+s4ly-k|cV$X_OAFz8hN&5ErLihsJj~WW-x$(t)teEA< zg8(1A+%Gf=>f~LBY-Aa)FIOsxful%Xg>exPlhAHzm&}4+c~&%-qlkeZ(KdjKX#Lvy0Z(bmP+?SnM zGqLvV#Uql|E7eo)`AgmR$^DAz@=mh&ewmQB*JXLns-3ip5SIC}>wbe=Sfs{MEUR+5 zdvt)8lwsbjg^636cs(?E$D?wUX*Y4#4t3{zHl)OJR-l5{4{sphw?E5ck-!8{J51#{ zlDlYHk%;ohMh{Ku2DH_L?CI3Tx`TzNa&cNhnM70)hbiJrku03xYL>vF;MC6wiHPeD z;{DIk>3^Y^eB&{6NHa61UXHq;SbP)c&PV_o=_wOG*XR4VXA6R_CS@#5{+$!$QG zFB}XKTW$F27D@6_2rfuP{cfn8VTJI~URhZ=RC@B(bg$hzLs6ToNTazucu(zUv8$^U z@>$<>b}9`{pt{ITGCc0-3|J4!yb5$7%$K8d)L;ey`a&vwjz^?hX(C!y3={W3lu<+i zJ~plRDOP3~LoSHpE&{%N)1{O?hC&`F0A*}y+idxcawPRn`)>+VguYrWKeHd!dZ=z57@jyMsvo>? zwpQz2-|bT@U8hP(CU2O#($-u`zHw3FfDcfi(LfZHW3a!oJxjW@{>C!;kGhLT%<@T8 z6;{?$SUB(^KB(!a-i@<66BL;GdL9fK(OhvNxh}5zwUi`0RJaxpnZJFTEco+vb<1i8I4bWWx`d1xkrE(9LqbHL?k&oD`0x`P$?Tnr zHd>M^mf>XGoGiybufQ5|T$MGv;#-ZW<;%(&hleSz5_kzkXrFfX+tjDYYgUz5-Cf~%PaH(aDv>_leD6~OJ1vMdrB|mUgK6u^cQWtC)l)sU#mRPqCH90 z+Y=}=0c-7iRaHf3ejv$Q1jg21e)*E4qoadEc0no%It~d54(vrs4VwyvNl_Q-chr*=zfGT4j~cFi{%QS=^v#Sv%a#4)2v36Pp>wn5%zY;+ihyg` zQK3ZQ&fj36T0VBY!tD-XNNk+s#SGJ!%z}mGcbEEu5g$rl5`sV$-Wev3bFd;_u_C9w zJfAdlm@{&vwmfb2n0F*)MR2&JmaVgQUOI}SpEjonSuq9_y2Wb%#ImzE+*jkY(b5X{ z8e6kABm71jFq_kkrwQkZB>5_(@~o!xv5fSzcM`C!_{H=Sc$|~`$6G>5{LMIBS<(E< zV&%_!Bo?`FKpBLsPrB*NT=iRAl7FL}L9{@5`bmniPK0Ao3dD(wNP`%LiduK3gW)E1u^A@8v{0?%r0ak1HBm*Yd) zIZ6fan**<{dVS^E#JlBZXJ|t{p-!2dLk*>w#j#6_*Ie841hq;QBxy?~FDlA^h+9Ly zYVQ^^KPUM7Tt@-N+wiU-)u}AO+NR9aMa+*Af;W#IJ$iKf$H|9%SClp{0sIO=F*Bz4 z_SJ*U6(it=z?XTsfkBi=n`~F(uZPc_L*cUV^6S3e4|6+V^YZ6mvIYoodKWl*M~Qxf z+@;>dTNJfeqI%gNlga7RMTn;mo#H}$K|O6#6YE}uD!#o-nCTrO{c1RyOP*pisI4E` z?v9dh$C/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%0A_HG9 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 z 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%0A|j8?gO-0O71{HW&~<0AY`3K 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 literal 0 HcmV?d00001 diff --git a/gui/src/pages/dashboard-overview-sections.tsx b/gui/src/pages/dashboard-overview-sections.tsx index 971cc3a64f..7bdf282931 100644 --- a/gui/src/pages/dashboard-overview-sections.tsx +++ b/gui/src/pages/dashboard-overview-sections.tsx @@ -511,19 +511,25 @@ export function DashboardSidecarPanels({ d }: { d: Dash }) {