diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 230c4ad..95e91fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,14 +55,18 @@ jobs: run: ./scripts/build - name: Get GitHub OIDC Token - if: github.repository == 'stainless-sdks/kernel-typescript' + if: |- + github.repository == 'stainless-sdks/kernel-typescript' && + !startsWith(github.ref, 'refs/heads/stl/') id: github-oidc uses: actions/github-script@v8 with: script: core.setOutput('github_token', await core.getIDToken()); - name: Upload tarball - if: github.repository == 'stainless-sdks/kernel-typescript' + if: |- + github.repository == 'stainless-sdks/kernel-typescript' && + !startsWith(github.ref, 'refs/heads/stl/') env: URL: https://pkg.stainless.com/s AUTH: ${{ steps.github-oidc.outputs.github_token }} diff --git a/.release-please-manifest.json b/.release-please-manifest.json index cede7a5..2ff8218 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.42.1" + ".": "0.43.0" } diff --git a/.stats.yml b/.stats.yml index e1ce185..ae22a71 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 103 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-ef24d4bf172555bcbe8e3b432c644a25a1c6afd99c958a2eda8c3b1ea9568113.yml -openapi_spec_hash: b603c5a983e837928fa7d1100ed64fc9 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/kernel%2Fkernel-bda5e58fa0bbd08761f27a1e0edbc602c44141ac9483bf6c96d52b7f4d10d9a7.yml +openapi_spec_hash: 10833b36358e8cda023e5bb0abeab0ba config_hash: cff4d43372b6fa66b64e2d4150f6aa76 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3403de7..4ae0911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,26 @@ # Changelog +## 0.43.0 (2026-03-10) + +Full Changelog: [v0.42.1...v0.43.0](https://github.com/kernel/kernel-node-sdk/compare/v0.42.1...v0.43.0) + +### Features + +* Add webdriver_ws_url and metro webdriver session proxy ([cff6562](https://github.com/kernel/kernel-node-sdk/commit/cff6562f4488fd3dd4131f8bdac10ccb81173f43)) + + +### Bug Fixes + +* **client:** preserve URL params already embedded in path ([d7ab66f](https://github.com/kernel/kernel-node-sdk/commit/d7ab66fa9cb44f5b56113ff57f745b86d10e4ba8)) + + +### Chores + +* **ci:** skip uploading artifacts on stainless-internal branches ([2e40c24](https://github.com/kernel/kernel-node-sdk/commit/2e40c24ead5d5d2b8a98d0dde705e62d346b63ae)) +* **internal:** codegen related update ([1185eae](https://github.com/kernel/kernel-node-sdk/commit/1185eae6d84aadd098de9429a24192187a00a74c)) +* **internal:** update dependencies to address dependabot vulnerabilities ([51c1411](https://github.com/kernel/kernel-node-sdk/commit/51c14111248aa4d876e829da2f7ef01216238aa5)) +* update placeholder string ([7608d8b](https://github.com/kernel/kernel-node-sdk/commit/7608d8b49713c24693c52d2eee64284f974158af)) + ## 0.42.1 (2026-03-05) Full Changelog: [v0.42.0...v0.42.1](https://github.com/kernel/kernel-node-sdk/compare/v0.42.0...v0.42.1) diff --git a/package-lock.json b/package-lock.json index 6d85c3b..6efba2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@onkernel/sdk", - "version": "0.42.1", + "version": "0.43.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@onkernel/sdk", - "version": "0.42.1", + "version": "0.43.0", "license": "Apache-2.0", "devDependencies": { "@arethetypeswrong/cli": "^0.17.0", diff --git a/package.json b/package.json index 4529916..af7875f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/sdk", - "version": "0.42.1", + "version": "0.43.0", "description": "The official TypeScript library for the Kernel API", "author": "Kernel <>", "types": "dist/index.d.ts", @@ -52,6 +52,17 @@ "typescript": "5.8.3", "typescript-eslint": "8.31.1" }, + "overrides": { + "minimatch": "^9.0.5" + }, + "pnpm": { + "overrides": { + "minimatch": "^9.0.5" + } + }, + "resolutions": { + "minimatch": "^9.0.5" + }, "exports": { ".": { "import": "./dist/index.mjs", diff --git a/src/client.ts b/src/client.ts index 73d0810..81e51e9 100644 --- a/src/client.ts +++ b/src/client.ts @@ -382,8 +382,9 @@ export class Kernel { : new URL(baseURL + (baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path)); const defaultQuery = this.defaultQuery(); - if (!isEmptyObj(defaultQuery)) { - query = { ...defaultQuery, ...query }; + const pathQuery = Object.fromEntries(url.searchParams); + if (!isEmptyObj(defaultQuery) || !isEmptyObj(pathQuery)) { + query = { ...pathQuery, ...defaultQuery, ...query }; } if (typeof query === 'object' && query && !Array.isArray(query)) { @@ -716,9 +717,9 @@ export class Kernel { } } - // If the API asks us to wait a certain amount of time (and it's a reasonable amount), - // just do what it says, but otherwise calculate a default - if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) { + // If the API asks us to wait a certain amount of time, just do what it + // says, but otherwise calculate a default + if (timeoutMillis === undefined) { const maxRetries = options.maxRetries ?? this.maxRetries; timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries); } diff --git a/src/resources/browser-pools.ts b/src/resources/browser-pools.ts index 3dd4426..16a8c72 100644 --- a/src/resources/browser-pools.ts +++ b/src/resources/browser-pools.ts @@ -288,6 +288,11 @@ export interface BrowserPoolAcquireResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. diff --git a/src/resources/browsers/browsers.ts b/src/resources/browsers/browsers.ts index c008731..756dbdd 100644 --- a/src/resources/browsers/browsers.ts +++ b/src/resources/browsers/browsers.ts @@ -313,6 +313,11 @@ export interface BrowserCreateResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. @@ -404,6 +409,11 @@ export interface BrowserRetrieveResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. @@ -495,6 +505,11 @@ export interface BrowserUpdateResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. @@ -586,6 +601,11 @@ export interface BrowserListResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. diff --git a/src/resources/invocations.ts b/src/resources/invocations.ts index b48c129..8699ffe 100644 --- a/src/resources/invocations.ts +++ b/src/resources/invocations.ts @@ -448,6 +448,11 @@ export namespace InvocationListBrowsersResponse { */ timeout_seconds: number; + /** + * Websocket URL for WebDriver BiDi connections to the browser session + */ + webdriver_ws_url: string; + /** * Remote URL for live viewing the browser session. Only available for non-headless * browsers. diff --git a/src/version.ts b/src/version.ts index 7c38063..771efed 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.42.1'; // x-release-please-version +export const VERSION = '0.43.0'; // x-release-please-version diff --git a/tests/api-resources/browsers/browsers.test.ts b/tests/api-resources/browsers/browsers.test.ts index 7647427..e4f9997 100644 --- a/tests/api-resources/browsers/browsers.test.ts +++ b/tests/api-resources/browsers/browsers.test.ts @@ -148,7 +148,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('loadExtensions: only required params', async () => { const responsePromise = client.browsers.loadExtensions('id', { - extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('# my file contents'), 'README.md') }], + extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('Example data'), 'README.md') }], }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -162,7 +162,7 @@ describe('resource browsers', () => { // Mock server tests are disabled test.skip('loadExtensions: required and optional params', async () => { const response = await client.browsers.loadExtensions('id', { - extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('# my file contents'), 'README.md') }], + extensions: [{ name: 'name', zip_file: await toFile(Buffer.from('Example data'), 'README.md') }], }); }); }); diff --git a/tests/api-resources/browsers/fs/fs.test.ts b/tests/api-resources/browsers/fs/fs.test.ts index 086e98f..6dcd3db 100644 --- a/tests/api-resources/browsers/fs/fs.test.ts +++ b/tests/api-resources/browsers/fs/fs.test.ts @@ -145,7 +145,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('upload: only required params', async () => { const responsePromise = client.browsers.fs.upload('id', { - files: [{ dest_path: '/J!', file: await toFile(Buffer.from('# my file contents'), 'README.md') }], + files: [{ dest_path: '/J!', file: await toFile(Buffer.from('Example data'), 'README.md') }], }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -159,7 +159,7 @@ describe('resource fs', () => { // Mock server tests are disabled test.skip('upload: required and optional params', async () => { const response = await client.browsers.fs.upload('id', { - files: [{ dest_path: '/J!', file: await toFile(Buffer.from('# my file contents'), 'README.md') }], + files: [{ dest_path: '/J!', file: await toFile(Buffer.from('Example data'), 'README.md') }], }); }); @@ -167,7 +167,7 @@ describe('resource fs', () => { test.skip('uploadZip: only required params', async () => { const responsePromise = client.browsers.fs.uploadZip('id', { dest_path: '/J!', - zip_file: await toFile(Buffer.from('# my file contents'), 'README.md'), + zip_file: await toFile(Buffer.from('Example data'), 'README.md'), }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -182,7 +182,7 @@ describe('resource fs', () => { test.skip('uploadZip: required and optional params', async () => { const response = await client.browsers.fs.uploadZip('id', { dest_path: '/J!', - zip_file: await toFile(Buffer.from('# my file contents'), 'README.md'), + zip_file: await toFile(Buffer.from('Example data'), 'README.md'), }); }); @@ -190,7 +190,7 @@ describe('resource fs', () => { test.skip('writeFile: only required params', async () => { const responsePromise = client.browsers.fs.writeFile( 'id', - await toFile(Buffer.from('# my file contents'), 'README.md'), + await toFile(Buffer.from('Example data'), 'README.md'), { path: '/J!' }, ); const rawResponse = await responsePromise.asResponse(); @@ -206,7 +206,7 @@ describe('resource fs', () => { test.skip('writeFile: required and optional params', async () => { const response = await client.browsers.fs.writeFile( 'id', - await toFile(Buffer.from('# my file contents'), 'README.md'), + await toFile(Buffer.from('Example data'), 'README.md'), { path: '/J!', mode: '0611' }, ); }); diff --git a/tests/api-resources/extensions.test.ts b/tests/api-resources/extensions.test.ts index 65c2ef3..9a00e8c 100644 --- a/tests/api-resources/extensions.test.ts +++ b/tests/api-resources/extensions.test.ts @@ -40,7 +40,7 @@ describe('resource extensions', () => { // Mock server tests are disabled test.skip('upload: only required params', async () => { const responsePromise = client.extensions.upload({ - file: await toFile(Buffer.from('# my file contents'), 'README.md'), + file: await toFile(Buffer.from('Example data'), 'README.md'), }); const rawResponse = await responsePromise.asResponse(); expect(rawResponse).toBeInstanceOf(Response); @@ -54,7 +54,7 @@ describe('resource extensions', () => { // Mock server tests are disabled test.skip('upload: required and optional params', async () => { const response = await client.extensions.upload({ - file: await toFile(Buffer.from('# my file contents'), 'README.md'), + file: await toFile(Buffer.from('Example data'), 'README.md'), name: 'name', }); }); diff --git a/yarn.lock b/yarn.lock index fc9f262..078f09a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1219,15 +1219,7 @@ baseline-browser-mapping@^2.9.0: resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.9.14.tgz#3b6af0bc032445bca04de58caa9a87cfe921cbb3" integrity sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg== -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: +brace-expansion@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== @@ -1395,11 +1387,6 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -2600,26 +2587,12 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.0.1, minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^2.0.2" minimist@^1.2.6: version "1.2.6"