release: 0.39.0#94
Conversation
|
🧪 Testing To try out this version of the SDK: Expires at: Fri, 12 Jun 2026 03:07:02 GMT |
🐤 Canary SummaryThis is an automated release PR with no UI/UX changes:
|
🐤 Canary Proposed TestsNo testable user journeys found for this PR. |
Confidence Score: 5/5 - Safe to MergeSafe to merge — this appears to be a standard release bump to version 0.38.1 with no identified logic, security, or correctness issues surfaced during review. The automated analysis found zero critical, significant, or medium-severity issues across the reviewed files. While only 4 of 13 changed files received coverage, the absence of any flagged concerns and the nature of a patch release (typically containing minor fixes or version metadata updates) supports a clean merge. Key Findings:
|
dcbda64 to
7fde307
Compare
7fde307 to
983f201
Compare
EntelligenceAI PR SummaryRelease v0.39.0 expands integration support, hardens CI/CD security, refactors the publish flow, and adjusts linting/formatting tooling.
Confidence Score: 2/5 - Changes NeededNot safe to merge — while this release PR successfully expands integration support for Key Findings:
Files requiring special attention
|
983f201 to
8dead0f
Compare
8dead0f to
c890ae3
Compare
c890ae3 to
63c35fd
Compare
63c35fd to
479c910
Compare
479c910 to
f6c43d6
Compare
f6c43d6 to
6f3fbdd
Compare
6f3fbdd to
7e1e1c1
Compare
7e1e1c1 to
705d4a6
Compare
f0498f8 to
9c89038
Compare
9c89038 to
c9af6e9
Compare
c9af6e9 to
46188f1
Compare
46188f1 to
b9777ce
Compare
b9777ce to
5e41d76
Compare
5e41d76 to
bd4ac3c
Compare
bd4ac3c to
3de92dd
Compare
| if (colon >= 0) { | ||
| parsed[line.substring(0, colon).trim()] = line.substring(colon + 1).trim(); |
There was a problem hiding this comment.
colon === 0 (e.g. a line like : value), line.substring(0, 0).trim() is "", so an empty-string key is written into parsed and forwarded as a header. The guard should be colon > 0 to skip lines with no header name.
🤖 AI Agent Prompt for Cursor/Windsurf
📋 Copy this prompt to your AI coding assistant (Cursor, Windsurf, etc.) to get help fixing this issue
In src/client.ts at line 236, change `if (colon >= 0)` to `if (colon > 0)`. The current condition allows `colon === 0`, which means a line starting with `:` produces an empty-string header name (`line.substring(0, 0).trim() === ""`). This is an invalid HTTP header name. Changing to `colon > 0` skips such lines.
3de92dd to
f8182ef
Compare
f8182ef to
9ea9d7d
Compare
| echo "$PRETTIER_FILES" | xargs ./node_modules/.bin/prettier \ | ||
| --write --cache --cache-strategy metadata --no-error-on-unmatched-pattern \ | ||
| '!**/dist' '!**/*.ts' '!**/*.mts' '!**/*.cts' '!**/*.js' '!**/*.mjs' '!**/*.cjs' | ||
| if ! [ -z "$FILE_LIST" ]; then |
There was a problem hiding this comment.
$FILE_LIST holds a file path (e.g. /tmp/changed.txt), which is always a non-empty string after the validation at line 22, so this guard is always true. When FILE_LIST contains zero lines, cat "$FILE_LIST" | xargs prettier invokes prettier with no file arguments; GNU xargs runs the command once on empty stdin (without -r), causing prettier to block waiting on stdin. The eslint section correctly guards on the filtered content ($ESLINT_FILES), not the path variable.
🤖 AI Agent Prompt for Cursor/Windsurf
📋 Copy this prompt to your AI coding assistant (Cursor, Windsurf, etc.) to get help fixing this issue
In `scripts/fast-format`, line 34, the guard `if ! [ -z "$FILE_LIST" ]` incorrectly checks whether the variable holding the file path is non-empty (always true) instead of whether the file has any content. Change line 34 from:
if ! [ -z "$FILE_LIST" ]; then
to:
if [ -s "$FILE_LIST" ]; then
This mirrors how the eslint section avoids running the tool when there are no files to process, and prevents prettier from being invoked with no file arguments (which causes it to hang reading from stdin).
Pin all GitHub Actions referenced in generated workflows (both first-party `actions/*` and third-party) to immutable commit SHAs. Updating pinned actions is now a deliberate codegen-side bump rather than implicit on every workflow run.
9ea9d7d to
53e88d4
Compare
| if ! [ -z "$FILE_LIST" ]; then | ||
| cat "$FILE_LIST" | xargs ./node_modules/.bin/prettier \ |
There was a problem hiding this comment.
🔧 Nit: Guard checks path variable instead of file contents, allowing prettier to hang on empty input — $FILE_LIST is the path string, which is always non-empty here (the script exits earlier if the file is missing), so this guard never prevents prettier from running. When the file is empty (no changed files), cat "$FILE_LIST" | xargs prettier causes GNU xargs to invoke prettier with no file arguments, making it block on stdin.
🤖 AI Agent Prompt for Cursor/Windsurf
📋 Copy this prompt to your AI coding assistant (Cursor, Windsurf, etc.) to get help fixing this issue
In `scripts/fast-format`, lines 33–37, the prettier guard checks the path variable `$FILE_LIST` instead of the file contents. Replace the block:
if ! [ -z "$FILE_LIST" ]; then
cat "$FILE_LIST" | xargs ./node_modules/.bin/prettier
--write --cache --cache-strategy metadata --no-error-on-unmatched-pattern --ignore-unknown
fi
with a content-aware check, for example by adding `-r` to xargs to prevent running when stdin is empty:
if [ -s "$FILE_LIST" ]; then
cat "$FILE_LIST" | xargs -r ./node_modules/.bin/prettier
--write --cache --cache-strategy metadata --no-error-on-unmatched-pattern --ignore-unknown
fi
This matches the pattern the ESLint block already uses (lines 28–31) and prevents prettier from hanging when no files are listed.
53e88d4 to
964197b
Compare
964197b to
efee314
Compare
| // line as the type declaration, which doesn't work. So we convert to // @ts-ignore | ||
| // on its own line to properly suppresses errors. | ||
| if (file.endsWith('.d.ts') || file.endsWith('.d.mts') || file.endsWith('.d.cts')) { | ||
| transformed = transformed.replace(/\/\*\* @ts-ignore\b[^*]*\*\/ /gm, '// @ts-ignore\n'); |
There was a problem hiding this comment.
ts-ignore replacement changes character count, breaking declaration maps
The existing replacement explicitly preserves character count to avoid breaking source maps, but this replacement converts /** @ts-ignore */ (18 chars, same line) to // @ts-ignore\n (15 chars + new line), corrupting offsets in the .d.ts.map files that declarationMap: true emits.
Prompt to fix with AI
Copy this prompt into your AI coding assistant to fix this issue.
In `scripts/utils/postprocess-files.cjs`, line 36, the replacement `transformed.replace(/\/\*\* @ts-ignore\b[^*]*\*\/ /gm, '// @ts-ignore\n')` changes the character count and inserts a new line, which breaks `.d.ts.map` declaration maps (the project has `declarationMap: true` in tsconfig.build.json). The sibling replacement at line 29 explicitly preserves character count to avoid this. Fix by padding the replacement to the same length as the match, e.g.: `transformed.replace(/\/\*\* @ts-ignore\b[^*]*\*\/ /gm, (match) => '// @ts-ignore' + '\n' + ' '.repeat(match.length - 14))` — or by restructuring so the `@ts-ignore` line replaces its content but the line count and subsequent offsets are preserved.
efee314 to
1d3589f
Compare
Automated Release PR
0.39.0 (2026-05-15)
Full Changelog: v0.38.0...v0.39.0
Features
Chores
Documentation
This pull request is managed by Stainless's GitHub App.
The semver version number is based on included commit messages. Alternatively, you can manually set the version number in the title of this pull request.
For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request.
🔗 Stainless website
📚 Read the docs
🙋 Reach out for help or questions