Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
2e92c89
test(catalog): pin Copilot vision precedence and nested/flat denial e…
lidge-jun Aug 29, 2026
8427efe
fix(adapters): classify failed exec wrappers by forward scan, not bac…
lidge-jun Aug 29, 2026
47b8d16
test(codex): isolate the tombstone guard with a credential-carrying t…
lidge-jun Aug 29, 2026
dca1694
test: let the README asset check tell files from directories (#2952)
luvs01 Aug 30, 2026
b95dc5d
fix(test): scope test lock to user runtime (#2962)
lidge-jun Aug 30, 2026
4f6a196
fix(gui): give the provider toggle a real flex basis so the header ca…
lidge-jun Aug 30, 2026
209e9f4
fix(google): strip rejected Claude SDK paragraph (#2961)
lidge-jun Aug 30, 2026
de4e846
fix(responses): stop a namespaced MCP exec from authorizing bare shel…
lidge-jun Aug 30, 2026
dd3ff42
perf(windows): skip proven ACL mutations (#2963)
lidge-jun Aug 30, 2026
eeedbb6
fix(config): start when proxy settings hold values the schema never c…
lidge-jun Aug 30, 2026
62df78d
fix(cursor): keep checkpoint-suffix history intact through pruning an…
lidge-jun Aug 30, 2026
d4fe9ca
fix(test): install gui dependencies the local runner needs (#2964)
lidge-jun Aug 30, 2026
13ba8f1
docs(devlog): close the cursor tool-continuation unit into _fin (#2970)
lidge-jun Aug 30, 2026
d760f36
fix(responses): keep the empty-completion notice to one log record (#…
luvs01 Aug 30, 2026
41d7d4c
fix(windows): repair the two dispatch-only Windows test failures (#2968)
lidge-jun Aug 30, 2026
d2a8022
fix(quota): keep the capacity panel when a credit expiry cannot be fo…
lidge-jun Aug 30, 2026
7747bf7
docs(devlog): record the terminal outcome the unit close claimed (#2971)
lidge-jun Aug 30, 2026
c2b64db
docs(devlog): record the release-readiness train and its outcome (#2974)
lidge-jun Aug 30, 2026
aa16a71
test(windows): preserve external prompt path semantics (#2972)
lidge-jun Aug 30, 2026
4157593
docs(devlog): record the final gate for the cursor tool-continuation …
lidge-jun Aug 30, 2026
223a0a2
test(windows): close the four residual shard-2 Windows failures (#2975)
lidge-jun Aug 30, 2026
28c69b0
test(windows): tolerate loaded launcher startup (#2983)
lidge-jun Aug 30, 2026
015fedb
fix(quota): correct GLM Coding Plan auth and exclude MCP allowance fr…
lidge-jun Aug 30, 2026
f4d2862
fix(slug): resolve self-namespaced native ids before the provider-qua…
luvs01 Aug 30, 2026
8b8197d
feat(xai): expose grok-4.20-multi-agent on the Responses lane (carry …
lidge-jun Aug 30, 2026
628b8e8
fix(codex): bound the provenance ledger by bytes, not only by transac…
luvs01 Aug 30, 2026
641466d
fix(test): isolate per-user test run locks (#2984)
luvs01 Aug 30, 2026
8fba9d1
fix(adapters): annotate empty tool outputs, keeping an explicit provi…
lidge-jun Aug 30, 2026
f636763
feat(server): add least-privilege GET /v1/catalog for remote Codex cl…
lidge-jun Aug 30, 2026
607042b
feat(providers): add opt-in transient-5xx retry with a shared total-s…
lidge-jun Aug 30, 2026
46c3383
feat(anthropic): add quota-window account pool routing (carry of #256…
lidge-jun Aug 30, 2026
9cd4e4b
docs: correct Kiro pooling, combo strategies, and undocumented config…
lidge-jun Aug 30, 2026
3bd6873
fix(responses): keep the terminal-guard continuation on the shared tr…
lidge-jun Aug 30, 2026
3998bb4
test(responses): pin every transient-retry leg to the shared send budget
lidge-jun Aug 30, 2026
bb6a6fb
Merge pull request #2998 from lidge-jun/codex/shared-transient-budget…
lidge-jun Aug 30, 2026
ce883a5
fix(gui): give both sidecar cards one shared control band
lidge-jun Aug 30, 2026
bd21269
docs(devlog): record the sidecar control-band fix and its rendered ev…
lidge-jun Aug 30, 2026
c2778ca
fix(claude): drop admission credentials paired with a replaced stale …
lidge-jun Aug 30, 2026
73eb88b
fix(gui): move the streaming toggle to its own right-aligned row
lidge-jun Aug 30, 2026
df8b388
Merge pull request #3007 from lidge-jun/codex/sidecar-shared-control-…
lidge-jun Aug 30, 2026
a85e9f5
feat(dashboard): show proxy port in overview stats
randomix777 Aug 29, 2026
dcdceab
feat(dashboard): add health status column to providers table
randomix777 Aug 29, 2026
6c360de
feat(providers): add batch test all button
randomix777 Aug 29, 2026
0290d29
feat(logs): add auto-scroll, clear view, and buffer count
randomix777 Aug 29, 2026
c7c94cf
fix(dashboard): harden clear view, auto-scroll, batch testing; add 20…
randomix777 Aug 29, 2026
3d1a28f
fix(logs): make cleared views stable across legacy and evicted entries
randomix777 Aug 29, 2026
a95be90
refactor(providers): share connection probe and bound batch concurrency
randomix777 Aug 29, 2026
ad8ba04
test(gui): cover manager dashboard, provider batch, and logs clear be…
randomix777 Aug 29, 2026
ab60fd5
fix(providers): cancel superseded batch connection probes
randomix777 Aug 29, 2026
6cb770d
fix(logs): preserve duplicate legacy entries across clear boundaries
randomix777 Aug 29, 2026
90b8972
fix(logs): use requestId as sole clear-view identity
randomix777 Aug 29, 2026
b273950
fix(providers): detect provider config content changes for batch canc…
randomix777 Aug 29, 2026
8d1c99c
fix(logs): enforce stable management log identities
randomix777 Aug 30, 2026
6b9f15c
fix(providers): verify batch cancellation across input changes
randomix777 Aug 30, 2026
11aeea5
fix(providers): preserve batch ownership across cancellation
randomix777 Aug 30, 2026
751adf1
test(logs): verify generated request identities remain stable
randomix777 Aug 30, 2026
0df7a89
fix(providers): replace snapshot with generation counter, propagate a…
randomix777 Aug 30, 2026
5eaf591
test(providers): isolate config generation and upstream abort regression
randomix777 Aug 30, 2026
c9a4569
test(providers): remove production test hook and harden abort privacy
randomix777 Aug 30, 2026
f5a625c
fix(kiro): advertise the completion tool as terminal so finished turn…
lidge-jun Aug 30, 2026
6f75616
docs(devlog): close out the Kiro terminal completion contract unit (#…
lidge-jun Aug 30, 2026
1031b6f
docs(devlog): record the landed-state verification and merge trail (#…
lidge-jun Aug 30, 2026
870a2ad
fix(release): repair dev version line and open future bumps as PRs (#…
lidge-jun Aug 30, 2026
0ea4396
fix(providers): restore config refresh batch cancellation
randomix777 Aug 30, 2026
5f2986f
fix(providers): restore config refresh cancellation coverage
randomix777 Aug 30, 2026
719d5e1
feat(launcher): add Windows source checkout launcher
randomix777 Aug 30, 2026
23d5f02
Merge remote-tracking branch 'upstream/dev' into feature/manager-ui
randomix777 Aug 30, 2026
e60e8cb
test(integrations): allow Windows snapshot retention budget
randomix777 Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 170 additions & 0 deletions .github/workflows/dev-version-bump.yml
Original file line number Diff line number Diff line change
@@ -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 <released> 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:-<none>}"
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 <<BODY
## Summary

\`${RELEASED_VERSION}\` published, so \`dev\` would otherwise keep a version at or
behind a released one and \`tests/release-version-line.test.ts\` would fail on
\`dev\` and on every pull request opened against it. This moves \`dev\` to
\`${NEXT_VERSION}\`.

Opened automatically by \`.github/workflows/dev-version-bump.yml\`. The same
repair was previously done by hand in 32529c2b2, e4a85d134, 076ad3036, and
befcac3e1.

## Verification

\`bun test tests/release-version-line.test.ts\` ran against this exact tree
before the pull request was opened; the workflow refuses to open one if the
chosen version collides with a published release.

## Checklist

- [x] Scope stays focused and avoids unrelated cleanup.
- [x] Docs or release notes were updated when needed.
- [x] Security-sensitive changes were reviewed for secrets, auth, and unsafe defaults.
BODY
)"
15 changes: 15 additions & 0 deletions MAINTAINERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,21 @@ when a maintainer steps down.
- Direct pushes are reserved for maintainer-owned integration work, urgent repairs, or incident
recovery. The same CI and documentation requirements still apply.
- Promotion from `dev` to `main` and npm releases is maintainer-controlled.
- **Closing out a release includes moving `dev`'s version line forward.** A published
release leaves `dev` carrying a version at or behind it, and
`tests/release-version-line.test.ts` then fails on `dev` and on every pull request
opened against it — red that contributors inherit and cannot fix from their own diff.
This was repaired by hand four times (`32529c2b2`, `e4a85d134`, `076ad3036`,
`befcac3e1`) before it was automated.

`.github/workflows/dev-version-bump.yml` now opens that bump as a pull request when a
release publishes. Merging it is part of closing the release; a bot cannot, because
`Protect dev` requires an approving review and code-owner sign-off. Two caveats worth
knowing: the workflow runs from the DEFAULT branch, so it only fires once it has been
promoted to `main`; and a pull request opened with `GITHUB_TOKEN` does not start
`pull_request` workflows, so the bump pull request arrives without CI. To re-drive a
missed run by hand: `bun scripts/bump-dev-version.ts <released-version> package.json`,
then open the pull request normally.

## The retired `dev2-go` line

Expand Down
13 changes: 13 additions & 0 deletions Start-OpenCodex.cmd
Original file line number Diff line number Diff line change
@@ -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%
140 changes: 140 additions & 0 deletions Start-OpenCodex.ps1
Original file line number Diff line number Diff line change
@@ -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'."
Binary file added assets/pr2950-capacity-expiry.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading