Skip to content

fix(test): cancel Steady commands waiting for cache locks - #2636

Merged
HAYDEN-OAI merged 1 commit into
mainfrom
codex/steady-lock-cancel
Sep 5, 2026
Merged

HAYDEN-OAI merged 1 commit into
mainfrom
codex/steady-lock-cancel

Conversation

@HAYDEN-OAI

@HAYDEN-OAI HAYDEN-OAI commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Problem

Steady's cache wrapper installs SIGINT and SIGTERM handlers before acquiring the cache lifecycle lock, but those handlers only forward signals to an already-created child. If an install or mock command is waiting for another cache user, cancellation is swallowed. Once the lock is released, the cancelled command can still start and exit successfully.

This is reproducible through the actual wrapper CLI on unchanged main. Holding the lock, interrupting the wrapper, and then releasing the lock still prints the command's execution marker and exits zero for either signal.

Change

Make the existing lock wait cancellable with a standard AbortSignal before child startup. Recheck cancellation after acquiring the lock and before running the command. A pending SIGINT or SIGTERM returns the existing signal-equivalent status of 130 or 143 without starting the command or reacquiring another owner's lock for cleanup.

Preserve the first cancellation signal, distinguish the actual cancellation error from unrelated filesystem failures, and keep active-child signal forwarding, exit codes, lease cleanup, cache pruning, and lock timeout behavior unchanged.

Only the handwritten cache wrapper and a new cohesive CLI regression file change. Both paths are absent from the verified pure-generated snapshot d223f5ab382c6a7d64f3863e75865624cbefad21. There are no dependency, manifest, downloaded-source, SDK, lease-format, or generated-file changes, and no open PR covers this issue.

Verification

  • The exact final six-case regression file on unchanged main 124b6525497a93315f8563d8e4e3d552cbb0518f has two expected pending-cancellation failures and four passing controls. All six pass after the fix on Node 22.22.3, 24.19.0, and 26.7.0.
  • The regressions run the actual wrapper, hold another owner's lock throughout cancellation, and verify no command starts, the ownership sentinel survives, and no lease is created. Controls cover normal zero/nonzero exits and both signals after the command starts.
  • Existing cache-lifecycle tests pass on all three Node lines. Cache and concurrent-publication controls also pass on the exact Node 22.0.0 floor.
  • The complete Steady integration passes both before and after the fix, including the pinned installation, offline launch, source/runtime integrity checks, relative paths, server health, and signal-driven shutdown.
  • Full TypeScript checking, canonical lint, and the final diff check pass.
  • All 7,673 handwritten tests pass across 199 files on Node 24.19.0 through the canonical test script with two workers. An initial full-suite attempt was interrupted by host disk exhaustion; the unchanged rerun passed after disk space recovered.

Adversarial review

Reviewed cancellation during lock acquisition, lock and lease ownership, error filtering, first-signal behavior, and active-child compatibility. Independent review caught a test-cleanup risk involving historical process IDs; the final fixture uses a bounded child lifetime and only signals the live owned wrapper handle. Repeated review found no remaining required changes.

Signal-dependent regressions are POSIX-only; ordinary exit controls remain portable. All fixture data is synthetic, and no live OpenAI API call is made.

@HAYDEN-OAI
HAYDEN-OAI requested a review from a team as a code owner September 5, 2026 18:56
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 5, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-05T18:58:39.285983Z 5c62a0c PR opened
🔒 Security Review ✅ Completed 2026-09-05T19:00:43.536645Z 5c62a0c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@openai-sdks

openai-sdks Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

OkTest Summary

✅ 237/237 SDK tests passed in 10.72s for Node SDK PR #2636.

Test results — 42 files
Test Result Time
tests/chat-completions-complex-body.test.ts ✅ Passed 166ms
tests/chat-completions-create.test.ts ✅ Passed 224ms
tests/chat-completions-stream.test.ts ✅ Passed 224ms
tests/files-content-binary.test.ts ✅ Passed 188ms
tests/files-create-multipart.test.ts ✅ Passed 134ms
tests/files-list-pagination.test.ts ✅ Passed 179ms
tests/initialize-config.test.ts ✅ Passed 250ms
tests/instance-isolation.test.ts ✅ Passed 103ms
tests/models-list.test.ts ✅ Passed 149ms
tests/responses-background-lifecycle.test.ts ✅ Passed 248ms
tests/responses-body-method-errors.test.ts ✅ Passed 300ms
tests/responses-cancel-timeout.test.ts ✅ Passed 230ms
tests/responses-cancel.test.ts ✅ Passed 207ms
tests/responses-compact-retries.test.ts ✅ Passed 241ms
tests/responses-compact.test.ts ✅ Passed 232ms
tests/responses-create-advanced-stream.test.ts ✅ Passed 145ms
tests/responses-create-advanced.test.ts ✅ Passed 202ms
tests/responses-create-disconnect.test.ts ✅ Passed 1.171s
tests/responses-create-errors.test.ts ✅ Passed 236ms
tests/responses-create-malformed-api-responses.test.ts ✅ Passed 196ms
tests/responses-create-retries.test.ts ✅ Passed 261ms
tests/responses-create-stream-failures.test.ts ✅ Passed 240ms
tests/responses-create-stream-timeout.test.ts ✅ Passed 2.148s
tests/responses-create-stream-wire.test.ts ✅ Passed 2.55s
tests/responses-create-stream.test.ts ✅ Passed 111ms
tests/responses-create-terminal-states.test.ts ✅ Passed 331ms
tests/responses-create-timeout.test.ts ✅ Passed 233ms
tests/responses-create.test.ts ✅ Passed 152ms
tests/responses-delete.test.ts ✅ Passed 231ms
tests/responses-input-items-errors.test.ts ✅ Passed 181ms
tests/responses-input-items-list.test.ts ✅ Passed 198ms
tests/responses-input-items-options.test.ts ✅ Passed 131ms
tests/responses-input-tokens-count-timeout.test.ts ✅ Passed 256ms
tests/responses-input-tokens-count.test.ts ✅ Passed 258ms
tests/responses-malformed-inputs.test.ts ✅ Passed 2.254s
tests/responses-not-found-errors.test.ts ✅ Passed 252ms
tests/responses-parse.test.ts ✅ Passed 228ms
tests/responses-retrieve-retries.test.ts ✅ Passed 286ms
tests/responses-retrieve.test.ts ✅ Passed 229ms
tests/responses-stored-method-errors.test.ts ✅ Passed 589ms
tests/retry-behavior.test.ts ✅ Passed 2.998s
tests/sdk-error-shape.test.ts ✅ Passed 340ms

View OkTest run #33985588894

SDK merge (94914f9874a6) · head (5c62a0ce1bd4) · base (124b6525497a) · OkTest (2b1bdfd25e98)

@github-actions

github-actions Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Castiron custom code

✅ No new custom-code files detected.

32 mixed files remain; 0 existing customizations changed.

Compared 124b6525497a → 5c62a0ce1bd4. Generated baselines verified.

32 existing customizations unchanged
  • api.md
  • scripts/castiron/README.md
  • scripts/castiron/custom_code_report.py
  • scripts/castiron/test_custom_code_report.py
  • src/client.ts
  • src/resources/audio/transcriptions.ts
  • src/resources/audio/translations.ts
  • src/resources/beta/assistants.ts
  • src/resources/beta/beta.ts
  • src/resources/beta/index.ts
  • src/resources/beta/responses/internal-base.ts
  • src/resources/beta/responses/responses.ts
  • src/resources/beta/threads/index.ts
  • src/resources/beta/threads/runs/index.ts
  • src/resources/beta/threads/runs/runs.ts
  • src/resources/beta/threads/threads.ts
  • src/resources/chat/completions/completions.ts
  • src/resources/chat/completions/index.ts
  • src/resources/conversations/index.ts
  • src/resources/embeddings.ts
  • src/resources/files.ts
  • src/resources/fine-tuning/checkpoints/permissions.ts
  • src/resources/images.ts
  • src/resources/responses/internal-base.ts
  • src/resources/responses/responses.ts
  • src/resources/skills/skills.ts
  • src/resources/skills/versions/versions.ts
  • src/resources/vector-stores/file-batches.ts
  • src/resources/vector-stores/files.ts
  • src/resources/webhooks/index.ts
  • src/resources/webhooks/webhooks.ts
  • tests/lib/data-residency.test.ts

A changed generated baseline means this report cannot reliably identify which handwritten lines changed.

Inspect the custom-code diff

Download the exact patch produced by this run (requires repository access):

gh run download 33985913730 --repo openai/openai-node \
  --name castiron-custom-code-33985913730-1 --dir /tmp/castiron-custom-code-33985913730-1
git apply --stat /tmp/castiron-custom-code-33985913730-1/custom-code.patch
cat /tmp/castiron-custom-code-33985913730-1/custom-code.patch

Or reproduce it from an SDK checkout containing the vendored reporter:

git fetch --no-tags origin 124b6525497a93315f8563d8e4e3d552cbb0518f 5c62a0ce1bd42c1fadeec8cbfd2068edb988c80b
python3 scripts/castiron/custom_code_report.py report \
  --base 124b6525497a93315f8563d8e4e3d552cbb0518f \
  --head 5c62a0ce1bd42c1fadeec8cbfd2068edb988c80b --fetch --require-head-hash --public \
  --out /tmp/castiron-custom-code-5c62a0ce1bd4
cat /tmp/castiron-custom-code-5c62a0ce1bd4/custom-code.patch

This is the current full custom patch for mixed files, not an attribution of only the handwritten lines changed by this PR.

Full report and patch

@jbeckwith-oai jbeckwith-oai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact head across the full two-file diff. The AbortSignal integration makes only the pre-spawn lock wait cancellable, preserves the first signal, rechecks cancellation after lock acquisition, removes only a lock acquired by this process, and leaves active-child forwarding plus ordinary exit and cleanup behavior intact. The regression tests exercise the real wrapper for both pending signals, both active-child signals, and ordinary zero/nonzero exits while protecting another owners lock and asserting no lease or command startup. Review threads are clear and the full Node matrix is green. No blocking findings.

@markstuart-oai markstuart-oai left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed both changed files and the Steady install/launch and lease-cleanup paths. The abort signal stays with the pending acquisition; the post-acquisition check releases an acquired lock before cancellation returns, and the cleanup guard avoids reacquiring another owner's lock while preserving unrelated error behavior. Active-child forwarding remains intact.

Validated on Node 24.20.0: all six CLI regressions pass at this head; the same tests on base reproduce only the two pending-cancellation failures. Existing cache lifecycle tests and additional isolated checks for pre-abort, acquisition-boundary cancellation, first-signal preservation, exactly-once release, filesystem/action errors, and listener cleanup pass. Canonical lint passes. No substantive correctness or maintainability findings. Full TypeScript checking could not pass with the available dependency tree because example-only dotenv, @azure/identity, and express imports are missing; I did not rerun the full SDK suite or download the Steady integration dependencies.

@HAYDEN-OAI
HAYDEN-OAI added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit 8896395 Sep 5, 2026
49 checks passed
@HAYDEN-OAI
HAYDEN-OAI deleted the codex/steady-lock-cancel branch September 5, 2026 19:35
@openai-sdks openai-sdks Bot mentioned this pull request Sep 5, 2026
gh-actions-shared Bot pushed a commit to xf-qubit/openai-node that referenced this pull request Sep 6, 2026
## Summary

- Use Node's monotonic clock for the Steady cache lock's existing
10-second acquisition budget.
- Add two regression tests through the actual cache CLI for backward and
forward wall-clock corrections. The test preloads and child program are
static; paths and clock direction are passed as data.
- Keep the 50-ms polling interval, cancellation, lease ownership,
separate cleanup acquisition, and wall-clock file-aging timestamps
unchanged. No generated files, SDK runtime code, dependency pins, or
cache policy changes.

## Reproduction

On current main, hold the lifecycle lock and release it after 12 real
seconds. With no clock adjustment, the wrapper rejects the command with
its existing lock-timeout error. With a single 60-second backward
`Date.now()` correction after the acquisition deadline is established,
the same wrapper incorrectly launches the command after roughly 12.1
seconds and exits successfully.

This unaccelerated command-boundary reproduction fails before the fix on
Node 22.0.0, 24.19.0, and 26.7.0. After the fix, both the normal-clock
and corrected-clock cases reject late execution on all three runtimes,
preserve the existing owner's lock until it is released, and leave no
leases. The separate cleanup lock explains why the final process exit
occurs after the fixture releases the lock; that lifecycle behavior is
not changed here.

## Validation

- Both new regressions failed before the production change and passed
afterward.
- New clock and existing cancellation tests: 8 passed on Node 22.0.0,
22.22.3, 24.19.0, and 26.7.0. An independent reviewer also repeated the
clock tests five times successfully.
- Canonical cache expiry, active-lease, and cleanup checks passed on
Node 22.0.0, 24.19.0, and 26.7.0.
- Full canonical handwritten suite on the final files: 7,800 tests
passed across 205 files.
- Canonical lint/format, TypeScript checking, CJS/ESM build, and `git
diff --check` passed.
- Independent adversarial review found no security, compatibility,
lock-ownership, cancellation, or regression-test issues. Windows was
reviewed for path/spawn compatibility but not executed locally; the
generated suite will run in CI.

This is separate from openai#2657's file-processing timeout and retains
openai#2636's Steady cancellation behavior.
gh-actions-shared Bot pushed a commit to xf-qubit/openai-node that referenced this pull request Sep 8, 2026
Automated Release PR
---


##
[7.11.0](openai/openai-node@v7.10.0...v7.11.0)
(2026-09-08)


### Features

* **api:** Add prompt cache diagnostics
([openai#2608](openai#2608))
([f83de8f](openai@f83de8f))
* **api:** add service-account API key expiration fields
([openai#2618](openai#2618))
([eecbebe](openai@eecbebe))
* **api:** correct function argument completion event fields
(openapi-545)
([openai#2611](openai#2611))
([31bf7e7](openai@31bf7e7))
* **api:** recognize incomplete web search call status
([openai#2576](openai#2576))
([c093c44](openai@c093c44))


### Bug Fixes

* **assistants:** retain terminal message snapshots
([openai#2650](openai#2650))
([414677e](openai@414677e))
* **audio:** only signal started recording processes
([openai#2665](openai#2665))
([cebdf7c](openai@cebdf7c))
* **audio:** prefer readable inputs over body metadata
([openai#2548](openai#2548))
([86ff7d5](openai@86ff7d5))
* **audio:** use ALSA card identifiers when recording
([openai#2564](openai#2564))
([67da19c](openai@67da19c))
* **audio:** wait for input cleanup before reporting success
([openai#2624](openai#2624))
([5ed87fe](openai@5ed87fe))
* **auth:** account for token exchange elapsed time
([openai#2609](openai#2609))
([b0f6f20](openai@b0f6f20))
* **auth:** validate Azure metadata access token values
([openai#2523](openai#2523))
([32b4d35](openai@32b4d35))
* **azure:** carry declared options through withOptions and fix
deployment paths
([openai#2514](openai#2514))
([f8f29fb](openai@f8f29fb))
* **bedrock:** cancel requests awaiting AWS credentials
([openai#2610](openai#2610))
([97c94e4](openai@97c94e4))
* bound partial number recovery to its token
([openai#2692](openai#2692))
([0d306ca](openai@0d306ca))
* **build:** fail on reported transpile errors
([openai#2638](openai#2638))
([833e3e8](openai@833e3e8))
* **build:** fail when a compiler worker is signaled
([openai#2633](openai#2633))
([cd79cd1](openai@cd79cd1))
* **build:** honor configured compiler worker limits
([openai#2635](openai#2635))
([aa08b44](openai@aa08b44))
* **build:** narrow Git-install staging detection
([openai#2621](openai#2621))
([a6170d3](openai@a6170d3))
* **build:** postprocess the selected package manifest
([openai#2620](openai#2620))
([1850d58](openai@1850d58))
* **build:** preserve CommonJS source-map positions
([openai#2623](openai#2623))
([df0034d](openai@df0034d))
* **build:** preserve config-relative compiler project paths
([openai#2637](openai#2637))
([3acb064](openai@3acb064))
* **build:** preserve declaration file import specifiers
([openai#2659](openai#2659))
([0098c2e](openai@0098c2e))
* **ci:** propagate Node matrix check failures
([openai#2569](openai#2569))
([bff92c9](openai@bff92c9))
* **ci:** serialize release-please branch updates
([openai#2631](openai#2631))
([bb0e400](openai@bb0e400))
* clean up failed mock-server startups
([openai#2558](openai#2558))
([83c92f0](openai@83c92f0))
* **deps:** bump qs to 6.16.0 for security fixes
([openai#2588](openai#2588))
([4e5c6e3](openai@4e5c6e3))
* **docs:** await headers in Next.js webhook examples
([openai#2595](openai#2595))
([7e48f05](openai@7e48f05))
* **docs:** correct the chat streaming helper contract
([openai#2596](openai#2596))
([135ac7e](openai@135ac7e))
* **docs:** include image detail in the Vision example
([openai#2598](openai#2598))
([e76bb16](openai@e76bb16))
* **docs:** omit absent Bedrock provider session tokens
([openai#2597](openai#2597))
([41f85bd](openai@41f85bd))
* **ecosystem:** preserve retry delays in parallel workers
([openai#2673](openai#2673))
([6164745](openai@6164745))
* **ecosystem:** reject invalid retry counts
([openai#2642](openai#2642))
([d0e2bcf](openai@d0e2bcf))
* **ecosystem:** restore explicit web type-test module markers
([openai#2584](openai#2584))
([3c189f4](openai@3c189f4))
* **embeddings:** preserve numeric output with body overrides
([openai#2549](openai#2549))
([97d1ae7](openai@97d1ae7))
* **embeddings:** preserve numeric responses after request hooks
([openai#2590](openai#2590))
([5202b13](openai@5202b13))
* **embeddings:** reject incomplete float32 vectors
([openai#2615](openai#2615))
([3940a20](openai@3940a20))
* **embeddings:** validate response collection before decoding
([openai#2686](openai#2686))
([888811f](openai@888811f))
* **events:** preserve unbound listener receivers
([openai#2644](openai#2644))
([c8238e7](openai@c8238e7))
* **examples:** annotate Responses WebSocket turn result
([openai#2585](openai#2585))
([dde19c5](openai@dde19c5))
* **examples:** avoid extra requests for empty tool calls
([openai#2672](openai#2672))
([be292d3](openai@be292d3))
* **examples:** avoid unhandled WebSocket rejections
([openai#2669](openai#2669))
([744b0ad](openai@744b0ad))
* **examples:** cancel Edge streams when requests abort
([openai#2530](openai#2530))
([18100a1](openai@18100a1))
* **examples:** close failed streaming responses
([openai#2531](openai#2531))
([eb9b468](openai@eb9b468))
* **examples:** close multi-agent WebSockets on terminal responses
([openai#2533](openai#2533))
([51ec453](openai@51ec453))
* **examples:** drain manual conversation error output
([openai#2629](openai#2629))
([e488b53](openai@e488b53))
* **examples:** find structured-output tool calls
([openai#2572](openai#2572))
([84870a8](openai@84870a8))
* **examples:** keep tracking fine-tuning file validation
([openai#2528](openai#2528))
([63312f2](openai@63312f2))
* **examples:** preserve background stream resume cursors
([openai#2671](openai#2671))
([b7398e3](openai@b7398e3))
* **examples:** reject early multi-agent WebSocket closure
([openai#2599](openai#2599))
([c6320f0](openai@c6320f0))
* **examples:** reject early Realtime socket closure
([openai#2639](openai#2639))
([7db48ec](openai@7db48ec))
* **examples:** reject incomplete image streams
([openai#2617](openai#2617))
([ef39397](openai@ef39397))
* **examples:** reject incomplete multi-agent streams
([openai#2666](openai#2666))
([152b98d](openai@152b98d))
* **examples:** reject unsuccessful background responses
([openai#2600](openai#2600))
([902a931](openai@902a931))
* **examples:** reject unsuccessful Responses streams
([openai#2645](openai#2645))
([86acb95](openai@86acb95))
* **examples:** reject unsuccessful structured-tool responses
([openai#2668](openai#2668))
([99aa303](openai@99aa303))
* **examples:** report audio demo failures
([openai#2570](openai#2570))
([29c0572](openai@29c0572))
* **examples:** report image-streaming failures
([openai#2563](openai#2563))
([947c555](openai@947c555))
* **examples:** report multi-agent streaming failures
([openai#2550](openai#2550))
([19d9151](openai@19d9151))
* **examples:** report nonstreaming request failures
([openai#2603](openai#2603))
([384dc26](openai@384dc26))
* **examples:** report premature WebSocket closure
([openai#2544](openai#2544))
([7eb5f7e](openai@7eb5f7e))
* **examples:** report unsuccessful Azure Realtime responses
([openai#2612](openai#2612))
([2b62209](openai@2b62209))
* **examples:** report unsuccessful fine-tuning jobs
([openai#2616](openai#2616))
([e761c16](openai@e761c16))
* **examples:** report unsuccessful Realtime responses
([openai#2559](openai#2559))
([5d3e584](openai@5d3e584))
* **examples:** respect raw streaming proxy backpressure
([openai#2663](openai#2663))
([a11bb1b](openai@a11bb1b))
* **examples:** reuse completed background responses
([openai#2557](openai#2557))
([8e1977b](openai@8e1977b))
* **examples:** serialize missing book lookup results
([openai#2573](openai#2573))
([db7e371](openai@db7e371))
* **examples:** stop polling failed training files
([openai#2592](openai#2592))
([1d67945](openai@1d67945))
* **examples:** support redirected streaming output
([openai#2546](openai#2546))
([8df2e3a](openai@8df2e3a))
* **examples:** use the default audio recording input
([openai#2593](openai#2593))
([6153484](openai@6153484))
* **format:** ignore missing literal file-list paths
([openai#2670](openai#2670))
([516a849](openai@516a849))
* **format:** preserve file-list scope
([openai#2568](openai#2568))
([7faff0e](openai@7faff0e))
* identify modern Edge browser runtime headers
([openai#2628](openai#2628))
([9cdf6f0](openai@9cdf6f0))
* isolate monthly node review publication
([openai#2691](openai#2691))
([3970dae](openai@3970dae))
* isolate realtime connection credentials
([openai#2690](openai#2690))
([e9db491](openai@e9db491))
* keep formatter inputs on LF across Git checkouts
([openai#2515](openai#2515))
([074618f](openai@074618f))
* **lint:** preserve leading-dash generated file paths
([openai#2640](openai#2640))
([3b91a83](openai@3b91a83))
* **pagination:** follow next cursors through empty pages
([openai#2561](openai#2561))
([9ea39ce](openai@9ea39ce))
* parse JSON media types case-insensitively
([openai#2551](openai#2551))
([7ea7926](openai@7ea7926))
* **polling:** honor zero custom polling intervals
([openai#2518](openai#2518))
([0cd94bb](openai@0cd94bb))
* **polling:** treat a cancelled vector store file as terminal
([openai#2506](openai#2506))
([43c1007](openai@43c1007))
* preserve alternate Headers inputs
([openai#2560](openai#2560))
([5d36ff4](openai@5d36ff4))
* preserve CommonJS constructor inheritance
([openai#2547](openai#2547))
([aafb64e](openai@aafb64e))
* preserve cross-realm error causes
([openai#2555](openai#2555))
([bfec504](openai@bfec504))
* preserve own Zod schema definition names
([openai#2695](openai#2695))
([f65d190](openai@f65d190))
* preserve package selection in parallel ecosystem tests
([openai#2516](openai#2516))
([fa0ce41](openai@fa0ce41))
* preserve streamed API error classification
([openai#2694](openai#2694))
([8e2c6ee](openai@8e2c6ee))
* **realtime:** preserve base URL routing components
([openai#2567](openai#2567))
([0f2e22d](openai@0f2e22d))
* **responses:** omit parsed values from replayed history
([openai#2634](openai#2634))
([124b652](openai@124b652))
* **responses:** parse namespaced function tools
([openai#2574](openai#2574))
([4d86684](openai@4d86684))
* **responses:** validate indexed response collections
([openai#2687](openai#2687))
([1ecbf52](openai@1ecbf52))
* **runners:** observe cancellation after completion callbacks
([openai#2591](openai#2591))
([27f5c6a](openai@27f5c6a))
* **runners:** preserve frozen input history
([openai#2525](openai#2525))
([1211038](openai@1211038))
* **runners:** reuse caller abort listeners across tool turns
([openai#2594](openai#2594))
([57d0da4](openai@57d0da4))
* **runners:** suppress content events for input history
([openai#2520](openai#2520))
([37d6fc2](openai@37d6fc2))
* serialize tool-call IDs once per completion
([openai#2688](openai#2688))
([8afb23e](openai@8afb23e))
* **streaming:** abort before early-exit cleanup
([openai#2613](openai#2613))
([03acf94](openai@03acf94))
* **streaming:** avoid duplicate terminal tool argument events
([openai#2658](openai#2658))
([12e5db6](openai@12e5db6))
* **streaming:** interrupt pending reads on cancellation
([openai#2556](openai#2556))
([2d7a767](openai@2d7a767))
* **streaming:** surface server error frames and settle streams past
throwing listeners
([openai#2502](openai#2502))
([17a661e](openai@17a661e))
* support Edge Runtime without Node process
([openai#2552](openai#2552))
([5dc4deb](openai@5dc4deb))
* **test:** cancel Steady commands waiting for cache locks
([openai#2636](openai#2636))
([8896395](openai@8896395))
* **test:** preserve unrelated processes on mock startup failure
([openai#2622](openai#2622))
([6896e66](openai@6896e66))
* **test:** reap Steady commands when lease creation fails
([openai#2664](openai#2664))
([518756a](openai@518756a))
* **test:** reject HTTP errors in mock health checks
([openai#2667](openai#2667))
([7b9e0b0](openai@7b9e0b0))
* **test:** reject unknown ecosystem project names
([openai#2626](openai#2626))
([fcd12bb](openai@fcd12bb))
* **test:** run Bun validation with --from-npm
([openai#2625](openai#2625))
([74f58a9](openai@74f58a9))
* **test:** use a monotonic Steady lock timeout
([openai#2661](openai#2661))
([7b5d120](openai@7b5d120))
* **types:** account for optional event arguments
([openai#2527](openai#2527))
([548a651](openai@548a651))
* **types:** include missing parsed response stream events
([openai#2521](openai#2521))
([6a9db07](openai@6a9db07))
* **types:** preserve custom tool factory metadata
([openai#2526](openai#2526))
([13dca7b](openai@13dca7b))
* **types:** preserve runnable function tuple positions
([openai#2524](openai#2524))
([e345d0f](openai@e345d0f))
* **uploads:** accept cross-realm ArrayBuffers
([openai#2529](openai#2529))
([69d7bda](openai@69d7bda))
* **uploads:** preserve explicit empty filenames
([openai#2532](openai#2532))
([eabb487](openai@eabb487))
* **uploads:** reject zero batch upload concurrency
([openai#2519](openai#2519))
([8b9405a](openai@8b9405a))
* validate partial image indices in streaming example
([openai#2693](openai#2693))
([a9a4440](openai@a9a4440))
* **zod:** preserve strict schema compatibility with Zod 4.5.4
([openai#2677](openai#2677))
([c11870e](openai@c11870e))
* **zod:** retain the original tool parameter schema
([openai#2662](openai#2662))
([fdb038e](openai@fdb038e))


### Performance Improvements

* **bedrock:** avoid copying repeated query values
([openai#2545](openai#2545))
([80ab919](openai@80ab919))


### Chores

* **api:** document throttling and model overload responses — SDK-235
([openai#2632](openai#2632))
([9dd0524](openai@9dd0524))
* clarify Response types and remove unused handwritten code
([openai#2660](openai#2660))
([86152ab](openai@86152ab))
* **deps-dev:** bump @aws-sdk/credential-provider-node from 3.972.78 to
3.972.81 ([openai#2681](openai#2681))
([48629a3](openai@48629a3))
* **deps-dev:** bump @cloudflare/workers-types from 5.20260816.1 to
5.20260823.1 in /ecosystem-tests/cloudflare-worker
([openai#2535](openai#2535))
([dc14bf5](openai@dc14bf5))
* **deps-dev:** bump @cloudflare/workers-types from 5.20260823.1 to
5.20260830.1 in /ecosystem-tests/cloudflare-worker
([openai#2676](openai#2676))
([ae04066](openai@ae04066))
* **deps-dev:** bump @smithy/signature-v4 from 5.7.2 to 5.7.3
([openai#2679](openai#2679))
([41ca20d](openai@41ca20d))
* **deps-dev:** bump @swc/core from 1.15.47 to 1.16.1
([openai#2538](openai#2538))
([5c04dc4](openai@5c04dc4))
* **deps-dev:** bump fast-uri from 3.1.5 to 3.1.7 in
/ecosystem-tests/ts-browser-webpack
([openai#2579](openai#2579))
([34380bf](openai@34380bf))
* **deps-dev:** bump fast-uri from 3.1.5 to 3.1.7 in
/ecosystem-tests/vercel-edge
([openai#2577](openai#2577))
([511d1e4](openai@511d1e4))
* **deps-dev:** bump oxlint from 1.76.0 to 1.79.0
([openai#2542](openai#2542))
([2683c3a](openai@2683c3a))
* **deps-dev:** bump oxlint from 1.79.0 to 1.80.0
([openai#2683](openai#2683))
([02d5fb0](openai@02d5fb0))
* **deps-dev:** bump puppeteer from 25.7.0 to 25.8.0 in
/ecosystem-tests/browser-direct-import
([openai#2534](openai#2534))
([f039c09](openai@f039c09))
* **deps-dev:** bump puppeteer from 25.7.0 to 25.8.0 in
/ecosystem-tests/ts-browser-webpack
([openai#2539](openai#2539))
([5828818](openai@5828818))
* **deps-dev:** bump puppeteer from 25.8.0 to 25.9.0 in
/ecosystem-tests/browser-direct-import
([openai#2675](openai#2675))
([bebd72f](openai@bebd72f))
* **deps-dev:** bump puppeteer from 25.8.0 to 25.9.0 in
/ecosystem-tests/ts-browser-webpack
([openai#2680](openai#2680))
([fe3770f](openai@fe3770f))
* **deps-dev:** bump ultracite from 7.10.0 to 7.10.5
([openai#2537](openai#2537))
([6d37b30](openai@6d37b30))
* **deps-dev:** bump vitest from 4.1.10 to 4.1.11
([openai#2541](openai#2541))
([6ea24b3](openai@6ea24b3))
* **deps-dev:** bump webpack from 5.109.2 to 5.110.2 in
/ecosystem-tests/ts-browser-webpack
([openai#2682](openai#2682))
([73405d1](openai@73405d1))
* **deps-dev:** bump wrangler from 4.125.0 to 4.127.1 in
/ecosystem-tests/cloudflare-worker
([openai#2678](openai#2678))
([0d92742](openai@0d92742))
* **deps:** bump @azure/identity from 4.13.1 to 4.13.2
([openai#2540](openai#2540))
([0318287](openai@0318287))
* **deps:** bump express and @types/express
([openai#2684](openai#2684))
([c581c17](openai@c581c17))
* **ecosystem:** remove unused proxy stub
([openai#2641](openai#2641))
([ce1713a](openai@ce1713a))
* migrate to forked steady
([openai#2587](openai#2587))
([67ce45d](openai@67ce45d))


### Documentation

* correct Bun ecosystem test instructions
([openai#2627](openai#2627))
([3434b42](openai@3434b42))
* correct error handling diagnostics
([openai#2630](openai#2630))
([d334d8c](openai@d334d8c))
* **helpers:** remove undefined main call from parsing example
([openai#2648](openai#2648))
([d8f6be9](openai@d8f6be9))
* **realtime:** report unsuccessful responses in the guide
([openai#2647](openai#2647))
([f58b1fd](openai@f58b1fd))
* **streaming:** reject unsuccessful background responses
([openai#2614](openai#2614))
([1025f7a](openai@1025f7a))
* **tools:** support TypeScript 4.9 in the function loop
([openai#2649](openai#2649))
([42e852b](openai@42e852b))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: openai-sdks[bot] <284451331+openai-sdks[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants