From 66f851be9df5851bbc9fdf4364b85676d896ee53 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 13:16:43 +0000 Subject: [PATCH 001/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index c4ea5b74..66b88f42 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7bb26574b68a4a83fda65dd095f3f54fc797d44988eb3ed8b72f6f1be768d284.yml -openapi_spec_hash: 92349dc439d33c6d4bd2a467a36a6190 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-95c0ea3ec9fa6a6d7346cb572fb980e000b52426158b67b37825623df1af15aa.yml +openapi_spec_hash: 389d1562ad6a65c88a856e50bbad3cfa config_hash: 7fe4b7f38470a511342b783de698aa99 From fc14f665f0b8c43689518514ac4ec1a0fdfbaebb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 14:16:46 +0000 Subject: [PATCH 002/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 66b88f42..7a35474f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-95c0ea3ec9fa6a6d7346cb572fb980e000b52426158b67b37825623df1af15aa.yml -openapi_spec_hash: 389d1562ad6a65c88a856e50bbad3cfa +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-c3338e53f3d5b39b8716b7010bdc73900fe8908e262c03328d4cc6bab5892320.yml +openapi_spec_hash: ffb3fd06b866f8ffd4399d81f14468ad config_hash: 7fe4b7f38470a511342b783de698aa99 From bfb159a54a00aa7544c7c587c7f0e7971683e551 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 15:16:45 +0000 Subject: [PATCH 003/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 7a35474f..3710319b 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-c3338e53f3d5b39b8716b7010bdc73900fe8908e262c03328d4cc6bab5892320.yml -openapi_spec_hash: ffb3fd06b866f8ffd4399d81f14468ad +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d62c3b7eaa20f6086c3a17f497f54ffa70641881f93b1091ef9386eddd919248.yml +openapi_spec_hash: 344a04e495be999a819fcae96dcfb27a config_hash: 7fe4b7f38470a511342b783de698aa99 From 49c2e9703d9f73608709b361178d1738b264dcef Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 16:16:44 +0000 Subject: [PATCH 004/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 3710319b..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d62c3b7eaa20f6086c3a17f497f54ffa70641881f93b1091ef9386eddd919248.yml -openapi_spec_hash: 344a04e495be999a819fcae96dcfb27a +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From ed365da71f021c8b40d106e7afecd575659ab353 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 18:16:42 +0000 Subject: [PATCH 005/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 3c5d5b23fa0e041613abefa61a30d1461ae0208b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 19:16:43 +0000 Subject: [PATCH 006/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8369e6a156aa4b6030dfd9f824a370941f28e9a6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 20:16:41 +0000 Subject: [PATCH 007/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 015acade34150ed589d37714bd9acfc3eaab7997 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 21:16:41 +0000 Subject: [PATCH 008/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From 2d2f6843fc2c1590f56a115892016ed8af3a0ce5 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 22:16:39 +0000 Subject: [PATCH 009/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 9cdf85e9824e8bf6357ba9671e87105029dcfb29 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 23:16:40 +0000 Subject: [PATCH 010/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From 6d3ad4b9b78ffd776408a598525e98ba1dc574d0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 02:27:48 +0000 Subject: [PATCH 011/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..8d5b4bfc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml +openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b config_hash: 7fe4b7f38470a511342b783de698aa99 From 54a9947ea3856ea32a1fa130bb126cadd340bbe1 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 03:16:40 +0000 Subject: [PATCH 012/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8d5b4bfc..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml -openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From fcbd4563cbfd02d714a9dfe8fdbf991c4f10161b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 03:56:35 +0000 Subject: [PATCH 013/107] feat(client): improve logging Logging is now: 1. Streaming 4. Configurable in-memory 5. Generally more robust 6. Usable with any underlying http client --- README.md | 15 +- sent-java-client-okhttp/build.gradle.kts | 1 - .../dm/sent/client/okhttp/OkHttpClient.kt | 13 - .../dm/sent/client/okhttp/SentOkHttpClient.kt | 10 + .../client/okhttp/SentOkHttpClientAsync.kt | 10 + .../main/kotlin/dm/sent/core/ClientOptions.kt | 30 +- .../src/main/kotlin/dm/sent/core/LogLevel.kt | 33 + .../src/main/kotlin/dm/sent/core/Utils.kt | 6 + .../dm/sent/core/http/LoggingHttpClient.kt | 627 +++++++++++ .../sent/core/http/LoggingHttpClientTest.kt | 999 ++++++++++++++++++ 10 files changed, 1727 insertions(+), 17 deletions(-) create mode 100644 sent-java-core/src/main/kotlin/dm/sent/core/LogLevel.kt create mode 100644 sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt create mode 100644 sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt diff --git a/README.md b/README.md index f272d7ce..8ecd81b0 100644 --- a/README.md +++ b/README.md @@ -294,8 +294,6 @@ The SDK throws custom unchecked exception types: ## Logging -The SDK uses the standard [OkHttp logging interceptor](https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor). - Enable logging by setting the `SENT_LOG` environment variable to `info`: ```sh @@ -308,6 +306,19 @@ Or to `debug` for more verbose logging: export SENT_LOG=debug ``` +Or configure the client manually using the `logLevel` method: + +```java +import dm.sent.client.SentClient; +import dm.sent.client.okhttp.SentOkHttpClient; +import dm.sent.core.LogLevel; + +SentClient client = SentOkHttpClient.builder() + .fromEnv() + .logLevel(LogLevel.INFO) + .build(); +``` + ## ProGuard and R8 Although the SDK uses reflection, it is still usable with [ProGuard](https://github.com/Guardsquare/proguard) and [R8](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization) because `sent-java-core` is published with a [configuration file](sent-java-core/src/main/resources/META-INF/proguard/sent-java-core.pro) containing [keep rules](https://www.guardsquare.com/manual/configuration/usage). diff --git a/sent-java-client-okhttp/build.gradle.kts b/sent-java-client-okhttp/build.gradle.kts index dd99409f..5033550d 100644 --- a/sent-java-client-okhttp/build.gradle.kts +++ b/sent-java-client-okhttp/build.gradle.kts @@ -7,7 +7,6 @@ dependencies { api(project(":sent-java-core")) implementation("com.squareup.okhttp3:okhttp:4.12.0") - implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") testImplementation(kotlin("test")) testImplementation("org.assertj:assertj-core:3.27.7") diff --git a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/OkHttpClient.kt b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/OkHttpClient.kt index 5110f815..7cc9c20f 100644 --- a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/OkHttpClient.kt +++ b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/OkHttpClient.kt @@ -35,7 +35,6 @@ import okhttp3.Request import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response -import okhttp3.logging.HttpLoggingInterceptor import okio.BufferedSink import okio.buffer import okio.sink @@ -93,18 +92,6 @@ internal constructor(@JvmSynthetic internal val okHttpClient: okhttp3.OkHttpClie private fun newCall(request: HttpRequest, requestOptions: RequestOptions): Call { val clientBuilder = okHttpClient.newBuilder() - val logLevel = - when (System.getenv("SENT_LOG")?.lowercase()) { - "info" -> HttpLoggingInterceptor.Level.BASIC - "debug" -> HttpLoggingInterceptor.Level.BODY - else -> null - } - if (logLevel != null) { - clientBuilder.addNetworkInterceptor( - HttpLoggingInterceptor().setLevel(logLevel).apply { redactHeader("x-api-key") } - ) - } - requestOptions.timeout?.let { clientBuilder .connectTimeout(it.connect()) diff --git a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClient.kt b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClient.kt index 6b008c7a..a89de9b0 100644 --- a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClient.kt +++ b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClient.kt @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper import dm.sent.client.SentClient import dm.sent.client.SentClientImpl import dm.sent.core.ClientOptions +import dm.sent.core.LogLevel import dm.sent.core.Sleeper import dm.sent.core.Timeout import dm.sent.core.http.Headers @@ -277,6 +278,15 @@ class SentOkHttpClient private constructor() { */ fun maxRetries(maxRetries: Int) = apply { clientOptions.maxRetries(maxRetries) } + /** + * The level at which to log request and response information. + * + * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. + * + * Defaults to [LogLevel.fromEnv]. + */ + fun logLevel(logLevel: LogLevel) = apply { clientOptions.logLevel(logLevel) } + /** * Customer API key for authentication. Use `sk_live_*` keys for production and `sk_test_*` * keys for sandbox/testing. Pass via the `x-api-key` header. diff --git a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClientAsync.kt b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClientAsync.kt index 9743ffb5..71b7dfa8 100644 --- a/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClientAsync.kt +++ b/sent-java-client-okhttp/src/main/kotlin/dm/sent/client/okhttp/SentOkHttpClientAsync.kt @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper import dm.sent.client.SentClientAsync import dm.sent.client.SentClientAsyncImpl import dm.sent.core.ClientOptions +import dm.sent.core.LogLevel import dm.sent.core.Sleeper import dm.sent.core.Timeout import dm.sent.core.http.Headers @@ -277,6 +278,15 @@ class SentOkHttpClientAsync private constructor() { */ fun maxRetries(maxRetries: Int) = apply { clientOptions.maxRetries(maxRetries) } + /** + * The level at which to log request and response information. + * + * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. + * + * Defaults to [LogLevel.fromEnv]. + */ + fun logLevel(logLevel: LogLevel) = apply { clientOptions.logLevel(logLevel) } + /** * Customer API key for authentication. Use `sk_live_*` keys for production and `sk_test_*` * keys for sandbox/testing. Pass via the `x-api-key` header. diff --git a/sent-java-core/src/main/kotlin/dm/sent/core/ClientOptions.kt b/sent-java-core/src/main/kotlin/dm/sent/core/ClientOptions.kt index 5db51c44..572df77d 100644 --- a/sent-java-core/src/main/kotlin/dm/sent/core/ClientOptions.kt +++ b/sent-java-core/src/main/kotlin/dm/sent/core/ClientOptions.kt @@ -5,6 +5,7 @@ package dm.sent.core import com.fasterxml.jackson.databind.json.JsonMapper import dm.sent.core.http.Headers import dm.sent.core.http.HttpClient +import dm.sent.core.http.LoggingHttpClient import dm.sent.core.http.PhantomReachableClosingHttpClient import dm.sent.core.http.QueryParams import dm.sent.core.http.RetryingHttpClient @@ -96,6 +97,14 @@ private constructor( * Defaults to 2. */ @get:JvmName("maxRetries") val maxRetries: Int, + /** + * The level at which to log request and response information. + * + * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. + * + * Defaults to [LogLevel.fromEnv]. + */ + @get:JvmName("logLevel") val logLevel: LogLevel, /** * Customer API key for authentication. Use `sk_live_*` keys for production and `sk_test_*` keys * for sandbox/testing. Pass via the `x-api-key` header. @@ -155,6 +164,7 @@ private constructor( private var responseValidation: Boolean = false private var timeout: Timeout = Timeout.default() private var maxRetries: Int = 2 + private var logLevel: LogLevel = LogLevel.fromEnv() private var apiKey: String? = null @JvmSynthetic @@ -170,6 +180,7 @@ private constructor( responseValidation = clientOptions.responseValidation timeout = clientOptions.timeout maxRetries = clientOptions.maxRetries + logLevel = clientOptions.logLevel apiKey = clientOptions.apiKey } @@ -280,6 +291,15 @@ private constructor( */ fun maxRetries(maxRetries: Int) = apply { this.maxRetries = maxRetries } + /** + * The level at which to log request and response information. + * + * [fromEnv] will set the level from environment variables. See [LogLevel.fromEnv]. + * + * Defaults to [LogLevel.fromEnv]. + */ + fun logLevel(logLevel: LogLevel) = apply { this.logLevel = logLevel } + /** * Customer API key for authentication. Use `sk_live_*` keys for production and `sk_test_*` * keys for sandbox/testing. Pass via the `x-api-key` header. @@ -381,6 +401,7 @@ private constructor( * System properties take precedence over environment variables. */ fun fromEnv() = apply { + logLevel(LogLevel.fromEnv()) (System.getProperty("sent.baseUrl") ?: System.getenv("SENT_BASE_URL"))?.let { baseUrl(it) } @@ -437,7 +458,13 @@ private constructor( return ClientOptions( httpClient, RetryingHttpClient.builder() - .httpClient(httpClient) + .httpClient( + LoggingHttpClient.builder() + .httpClient(httpClient) + .clock(clock) + .level(logLevel) + .build() + ) .sleeper(sleeper) .clock(clock) .maxRetries(maxRetries) @@ -452,6 +479,7 @@ private constructor( responseValidation, timeout, maxRetries, + logLevel, apiKey, ) } diff --git a/sent-java-core/src/main/kotlin/dm/sent/core/LogLevel.kt b/sent-java-core/src/main/kotlin/dm/sent/core/LogLevel.kt new file mode 100644 index 00000000..ddd1b47b --- /dev/null +++ b/sent-java-core/src/main/kotlin/dm/sent/core/LogLevel.kt @@ -0,0 +1,33 @@ +// File generated from our OpenAPI spec by Stainless. + +package dm.sent.core + +/** The level at which to log request and response information. */ +enum class LogLevel { + /** No logging. */ + OFF, + /** Minimal request and response summary logs. No headers or bodies are logged. */ + INFO, + /** [INFO] logs plus details about request failures. */ + ERROR, + /** + * Full request and response logs. Sensitive headers are redacted, but sensitive data in request + * and response bodies may still be visible. + */ + DEBUG; + + /** Returns whether this level is at or higher than the given [level]. */ + fun shouldLog(level: LogLevel): Boolean = ordinal >= level.ordinal + + companion object { + + /** Returns a [LogLevel] based on the `SENT_LOG` environment variable. */ + fun fromEnv() = + when (System.getenv("SENT_LOG")?.lowercase()) { + "info" -> INFO + "error" -> ERROR + "debug" -> DEBUG + else -> OFF + } + } +} diff --git a/sent-java-core/src/main/kotlin/dm/sent/core/Utils.kt b/sent-java-core/src/main/kotlin/dm/sent/core/Utils.kt index b294d786..3df09b6b 100644 --- a/sent-java-core/src/main/kotlin/dm/sent/core/Utils.kt +++ b/sent-java-core/src/main/kotlin/dm/sent/core/Utils.kt @@ -5,6 +5,7 @@ package dm.sent.core import dm.sent.errors.SentInvalidDataException import java.util.Collections import java.util.SortedMap +import java.util.SortedSet import java.util.concurrent.CompletableFuture import java.util.concurrent.locks.Lock @@ -16,6 +17,11 @@ internal fun T?.getOrThrow(name: String): T = internal fun List.toImmutable(): List = if (isEmpty()) Collections.emptyList() else Collections.unmodifiableList(toList()) +@JvmSynthetic +internal fun > SortedSet.toImmutable(): SortedSet = + if (isEmpty()) Collections.emptySortedSet() + else Collections.unmodifiableSortedSet(toSortedSet(comparator() ?: Comparator.naturalOrder())) + @JvmSynthetic internal fun Map.toImmutable(): Map = if (isEmpty()) immutableEmptyMap() else Collections.unmodifiableMap(toMap()) diff --git a/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt b/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt new file mode 100644 index 00000000..3d36d6e1 --- /dev/null +++ b/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt @@ -0,0 +1,627 @@ +// File generated from our OpenAPI spec by Stainless. + +package dm.sent.core.http + +import dm.sent.core.LogLevel +import dm.sent.core.RequestOptions +import dm.sent.core.checkRequired +import dm.sent.core.toImmutable +import java.io.ByteArrayOutputStream +import java.io.InputStream +import java.io.OutputStream +import java.nio.ByteBuffer +import java.nio.charset.CharacterCodingException +import java.nio.charset.Charset +import java.nio.charset.CharsetDecoder +import java.nio.charset.CodingErrorAction +import java.nio.charset.StandardCharsets +import java.time.Clock +import java.time.Duration +import java.time.OffsetDateTime +import java.util.SortedSet +import java.util.concurrent.CompletableFuture +import java.util.concurrent.CompletionException +import kotlin.time.toKotlinDuration + +/** A wrapper [HttpClient] around [httpClient] that logs request and response information. */ +class LoggingHttpClient +private constructor( + /** The underlying [HttpClient] for making requests. */ + @get:JvmName("httpClient") val httpClient: HttpClient, + /** + * Sensitive headers to redact from logs. + * + * Defaults to `Set.of("x-api-key")`. + */ + @get:JvmName("redactedHeaders") val redactedHeaders: SortedSet, + /** + * The clock to use for measuring request and response durations. + * + * This is primarily useful for using a fake clock in tests. + * + * Defaults to [Clock.systemUTC]. + */ + @get:JvmName("clock") val clock: Clock, + /** + * The log level to use. + * + * Pass [LogLevel.fromEnv] to read from environment variables. + */ + @get:JvmName("level") val level: LogLevel, +) : HttpClient { + + override fun execute(request: HttpRequest, requestOptions: RequestOptions): HttpResponse { + val loggingRequest = logRequest(request) + + val before = OffsetDateTime.now(clock) + val response = + try { + httpClient.execute(loggingRequest, requestOptions) + } catch (e: Throwable) { + logFailure(e, Duration.between(before, OffsetDateTime.now(clock))) + throw e + } + + val took = Duration.between(before, OffsetDateTime.now(clock)) + return logResponse(response, took) + } + + override fun executeAsync( + request: HttpRequest, + requestOptions: RequestOptions, + ): CompletableFuture { + val loggingRequest = logRequest(request) + + val before = OffsetDateTime.now(clock) + val future = + try { + httpClient.executeAsync(loggingRequest, requestOptions) + } catch (e: Throwable) { + logFailure(e, Duration.between(before, OffsetDateTime.now(clock))) + throw e + } + return future.handle { response, error -> + val took = Duration.between(before, OffsetDateTime.now(clock)) + if (error != null) { + logFailure(unwrapCompletionException(error), took) + throw error + } + logResponse(response, took) + } + } + + private fun logRequest(request: HttpRequest): HttpRequest { + if (!level.shouldLog(LogLevel.INFO)) { + return request + } + + System.err.println( + buildString { + append("--> ${request.method} ${request.url()}") + request.body?.let { + val length = it.contentLength() + append(if (length >= 0) " ($length-byte body)" else " (unknown-length body)") + } + } + ) + + if (!level.shouldLog(LogLevel.DEBUG)) { + return request + } + + logHeaders(request.headers) + + if (request.body == null) { + System.err.println("--> END ${request.method}") + System.err.println() + return request + } + + return request + .toBuilder() + .body(LoggingHttpRequestBody(request.method, request.body)) + .build() + } + + private fun logResponse(response: HttpResponse, took: Duration): HttpResponse { + if (!level.shouldLog(LogLevel.INFO)) { + return response + } + + val contentLength = response.headers().values("Content-Length").firstOrNull()?.toIntOrNull() + System.err.println( + "<-- ${response.statusCode()} (${ + buildString { + append(took.format()) + contentLength?.let { append(", $contentLength-byte body") } + } + })" + ) + + if (!level.shouldLog(LogLevel.DEBUG)) { + return response + } + + logHeaders(response.headers()) + return LoggingHttpResponse(response) + } + + private fun logFailure(error: Throwable, took: Duration) { + if (!level.shouldLog(LogLevel.ERROR)) { + return + } + + System.err.println( + buildString { + append("<-- !! ${error.javaClass.simpleName}") + error.message?.let { append(": $it") } + append(" (${took.format()})") + } + ) + } + + private fun unwrapCompletionException(error: Throwable): Throwable = + if (error is CompletionException && error.cause != null) error.cause!! else error + + private fun logHeaders(headers: Headers) = + headers.names().forEach { name -> + headers.values(name).forEach { value -> + System.err.println("$name: ${if (redactedHeaders.contains(name)) "██" else value}") + } + } + + override fun close() = httpClient.close() + + fun toBuilder() = Builder().from(this) + + companion object { + + /** + * Returns a mutable builder for constructing an instance of [LoggingHttpClient]. + * + * The following fields are required: + * ```java + * .httpClient() + * .level() + * ``` + */ + @JvmStatic fun builder() = Builder() + } + + /** A builder for [LoggingHttpClient]. */ + class Builder internal constructor() { + + private var httpClient: HttpClient? = null + private var redactedHeaders: Set = setOf("x-api-key") + private var clock: Clock = Clock.systemUTC() + private var level: LogLevel? = null + + @JvmSynthetic + internal fun from(loggingHttpClient: LoggingHttpClient) = apply { + httpClient = loggingHttpClient.httpClient + redactedHeaders = loggingHttpClient.redactedHeaders + clock = loggingHttpClient.clock + level = loggingHttpClient.level + } + + /** The underlying [HttpClient] for making requests. */ + fun httpClient(httpClient: HttpClient) = apply { this.httpClient = httpClient } + + /** + * Sensitive headers to redact from logs. + * + * Defaults to `Set.of("x-api-key")`. + */ + fun redactedHeaders(redactedHeaders: Set) = apply { + this.redactedHeaders = redactedHeaders + } + + /** + * The clock to use for measuring request and response durations. + * + * This is primarily useful for using a fake clock in tests. + * + * Defaults to [Clock.systemUTC]. + */ + fun clock(clock: Clock) = apply { this.clock = clock } + + /** + * The log level to use. + * + * Pass [LogLevel.fromEnv] to read from environment variables. + */ + fun level(level: LogLevel) = apply { this.level = level } + + /** + * Returns an immutable instance of [LoggingHttpClient]. + * + * Further updates to this [Builder] will not mutate the returned instance. + * + * The following fields are required: + * ```java + * .httpClient() + * .level() + * ``` + * + * @throws IllegalStateException if any required field is unset. + */ + fun build(): LoggingHttpClient = + LoggingHttpClient( + checkRequired("httpClient", httpClient), + redactedHeaders.toSortedSet(String.CASE_INSENSITIVE_ORDER).toImmutable(), + clock, + checkRequired("level", level), + ) + } +} + +/** + * An [HttpRequestBody] wrapper that delegates to [body] while also logging line by line as it's + * written. + * + * The logging occurs in a streaming manner with minimal buffering. + */ +private class LoggingHttpRequestBody( + private val method: HttpMethod, + private val body: HttpRequestBody, +) : HttpRequestBody { + + private val charset by lazy { parseCharset(body.contentType()) } + + override fun writeTo(outputStream: OutputStream) { + val loggingOutputStream = LoggingOutputStream(outputStream, charset) + body.writeTo(loggingOutputStream) + + loggingOutputStream.flush() + System.err.println("--> END $method (${loggingOutputStream.writeCount()}-byte body)") + System.err.println() + } + + override fun contentType(): String? = body.contentType() + + override fun contentLength(): Long = body.contentLength() + + override fun repeatable(): Boolean = body.repeatable() + + override fun close() = body.close() +} + +/** + * An [OutputStream] wrapper that delegates to [outputStream] while also logging bytes line by line + * as it's written to. + * + * The written content is assumed to be in the given [charset] and the logging occurs in a streaming + * manner with minimal buffering. + */ +private class LoggingOutputStream(private val outputStream: OutputStream, charset: Charset?) : + OutputStream() { + + private val buffer = LoggingBuffer(charset) + + fun writeCount() = buffer.writeCount() + + override fun write(b: Int) { + outputStream.write(b) + buffer.write(b) + } + + override fun write(b: ByteArray, off: Int, len: Int) { + outputStream.write(b, off, len) + for (i in off until off + len) { + buffer.write(b[i].toInt() and 0xFF) + } + } + + /** Prints any currently buffered content. */ + override fun flush() { + buffer.flush() + outputStream.flush() + } + + override fun close() = outputStream.close() +} + +/** + * An [HttpResponse] wrapper that delegates to [response] while also logging line-by-line as it's + * read. + * + * The logging occurs in a streaming manner with minimal buffering. + */ +private class LoggingHttpResponse(private val response: HttpResponse) : HttpResponse { + + private val loggingBody: Lazy = lazy { + LoggingInputStream( + response.body(), + parseCharset(response.headers().values("Content-Type").firstOrNull()), + ) + } + + override fun statusCode(): Int = response.statusCode() + + override fun headers(): Headers = response.headers() + + override fun body(): InputStream = loggingBody.value + + override fun close() { + if (loggingBody.isInitialized()) { + loggingBody.value.close() + } + response.close() + } +} + +/** + * An [InputStream] wrapper that delegates to [inputStream] while also logging bytes line by line as + * it's read. + * + * The contents of [inputStream] are assumed to be in the given [charset] and the logging occurs in + * a streaming manner with minimal buffering. + */ +private class LoggingInputStream(private val inputStream: InputStream, charset: Charset?) : + InputStream() { + + private var isDone = false + private val buffer = LoggingBuffer(charset) + + override fun read(): Int { + if (isDone) { + return -1 + } + + val b = inputStream.read() + + if (b == -1) { + markDone() + return b + } + + buffer.write(b) + return b + } + + override fun read(b: ByteArray, off: Int, len: Int): Int { + if (isDone) { + return -1 + } + + val bytesRead = inputStream.read(b, off, len) + + if (bytesRead == -1) { + markDone() + return bytesRead + } + + for (i in off until off + bytesRead) { + buffer.write(b[i].toInt() and 0xFF) + } + return bytesRead + } + + override fun close() { + if (!isDone) { + markDone(closedEarly = true) + } + inputStream.close() + } + + private fun markDone(closedEarly: Boolean = false) { + isDone = true + buffer.flush() + val suffix = if (closedEarly) ", closed early" else "" + System.err.println("<-- END HTTP (${buffer.writeCount()}-byte body$suffix)") + System.err.println() + } +} + +/** + * A byte buffer that prints line by line, using the given [charset], as bytes are written to it. + * + * When [charset] is `null`, the buffer performs an upfront check to detect binary content. If + * non-whitespace ISO control characters are found in the first [PROBABLY_UTF8_CODE_POINT_LIMIT] + * code points, body logging is suppressed entirely. + */ +private class LoggingBuffer(charset: Charset?) { + + private val charset = charset ?: StandardCharsets.UTF_8 + + private val decoder: CharsetDecoder = + this.charset + .newDecoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT) + private var writeCount = 0 + private val buffer = ByteArrayOutputStream(128) + + /** + * Whether logging has been suppressed because the content doesn't appear to be readable text. + * + * This is only set when [charset] is `null` and the content fails the [isProbablyUtf8] check. + */ + private var suppressed = false + + /** + * Bytes accumulated for the [isProbablyUtf8] check before any lines are printed. + * + * Once the check passes (or [charset] is non-null), this is set to `null` and bytes flow + * directly to [buffer]. + */ + private var prefetchBuffer: ByteArrayOutputStream? = + if (charset != null) null else ByteArrayOutputStream(128) + + fun writeCount() = writeCount + + fun write(b: Int) { + if (writeCount == 0) { + // Print a newline before we start printing anything to separate the printed content + // from previous content. + System.err.println() + } + + writeCount++ + + if (suppressed) { + return + } + + val prefetch = prefetchBuffer + if (prefetch != null) { + prefetch.write(b) + // Continue accumulating until we have enough bytes to decide. + if (prefetch.size() < PROBABLY_UTF8_BYTE_LIMIT && b != '\n'.code) { + return + } + // We have enough bytes. Check if the content is probably UTF-8. + prefetchBuffer = null + val bytes = prefetch.toByteArray() + if (!isProbablyUtf8(bytes)) { + suppressed = true + System.err.println("(binary body omitted)") + return + } + // Content looks like UTF-8. Feed the accumulated bytes into the normal buffer. + for (byte in bytes) { + writeToBuffer(byte.toInt() and 0xFF) + } + return + } + + writeToBuffer(b) + } + + private fun writeToBuffer(b: Int) { + if (b == '\n'.code) { + flush() + return + } + + buffer.write(b) + } + + /** Prints any currently buffered content. */ + fun flush() { + if (suppressed) { + return + } + + // If we still have a prefetch buffer when flush is called (body was shorter than the + // limit), run the check now. + val prefetch = prefetchBuffer + if (prefetch != null) { + prefetchBuffer = null + val bytes = prefetch.toByteArray() + if (bytes.isEmpty()) { + return + } + if (!isProbablyUtf8(bytes)) { + suppressed = true + System.err.println("(binary body omitted)") + return + } + for (byte in bytes) { + writeToBuffer(byte.toInt() and 0xFF) + } + } + + if (buffer.size() == 0) { + return + } + + val line = + try { + decoder.decode(ByteBuffer.wrap(buffer.toByteArray())) + } catch (e: CharacterCodingException) { + "(omitted line is not valid $charset)" + } + buffer.reset() + System.err.println(line) + } +} + +/** The maximum number of code points to sample when checking if content is probably UTF-8. */ +private const val PROBABLY_UTF8_CODE_POINT_LIMIT = 64 + +/** + * The maximum number of bytes to accumulate before running the [isProbablyUtf8] check. UTF-8 code + * points are at most 4 bytes, so this accommodates [PROBABLY_UTF8_CODE_POINT_LIMIT] code points. + */ +private const val PROBABLY_UTF8_BYTE_LIMIT = PROBABLY_UTF8_CODE_POINT_LIMIT * 4 + +/** + * Returns `true` if the given [bytes] probably contain human-readable UTF-8 text. + * + * Decodes up to [PROBABLY_UTF8_CODE_POINT_LIMIT] code points and returns `false` if any + * non-whitespace ISO control characters are found, or if the bytes are not valid UTF-8. + */ +private fun isProbablyUtf8(bytes: ByteArray): Boolean { + try { + val decoder = + StandardCharsets.UTF_8.newDecoder() + .onMalformedInput(CodingErrorAction.REPORT) + .onUnmappableCharacter(CodingErrorAction.REPORT) + val charBuffer = decoder.decode(ByteBuffer.wrap(bytes)) + var codePointCount = 0 + var i = 0 + while (i < charBuffer.length && codePointCount < PROBABLY_UTF8_CODE_POINT_LIMIT) { + val codePoint = Character.codePointAt(charBuffer, i) + if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) { + return false + } + i += Character.charCount(codePoint) + codePointCount++ + } + return true + } catch (e: CharacterCodingException) { + return false + } +} + +/** Returns the [Charset] in the given [contentType] string, or `null` if unspecified. */ +private fun parseCharset(contentType: String?): Charset? = + contentType + ?.split(";") + ?.drop(1) + ?.map { it.trim() } + ?.firstOrNull { it.startsWith("charset=", ignoreCase = true) } + ?.substringAfter("=") + ?.trim() + ?.removeSurrounding("\"") + ?.let { runCatching { charset(it) }.getOrNull() } + +/** Formats the [Duration] into a string like "1m 40s 467ms". */ +private fun Duration.format(): String = + toKotlinDuration().toComponents { days, hours, minutes, seconds, nanoseconds -> + buildString { + val milliseconds = nanoseconds / 1_000_000 + if (days > 0) { + append("${days}d") + } + if (hours > 0) { + if (isNotEmpty()) { + append(" ") + } + append("${hours}h") + } + if (minutes > 0) { + if (isNotEmpty()) { + append(" ") + } + append("${minutes}m") + } + if (seconds > 0) { + if (isNotEmpty()) { + append(" ") + } + append("${seconds}s") + } + if (milliseconds > 0) { + if (isNotEmpty()) { + append(" ") + } + append("${milliseconds}ms") + } + + if (isEmpty()) { + append("0s") + } + } + } diff --git a/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt b/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt new file mode 100644 index 00000000..d055216b --- /dev/null +++ b/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt @@ -0,0 +1,999 @@ +// File generated from our OpenAPI spec by Stainless. + +package dm.sent.core.http + +import dm.sent.core.LogLevel +import dm.sent.core.RequestOptions +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.io.PrintStream +import java.nio.charset.StandardCharsets +import java.time.Clock +import java.time.Instant +import java.time.ZoneOffset +import java.util.concurrent.CompletableFuture +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.parallel.ResourceLock +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource + +@ResourceLock("stderr") +internal class LoggingHttpClientTest { + + private lateinit var originalErr: PrintStream + private lateinit var errContent: ByteArrayOutputStream + + @BeforeEach + fun beforeEach() { + originalErr = System.err + errContent = ByteArrayOutputStream() + System.setErr(PrintStream(errContent)) + } + + @AfterEach + fun afterEach() { + System.setErr(originalErr) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun offLevel_noOutput(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.OFF) + + val response = client.execute(simpleGetRequest(), async).apply { body().readBytes() } + + assertThat(response.statusCode()).isEqualTo(200) + assertThat(stderrOutput()).isEmpty() + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_logsGetRequest(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.INFO) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- 200 (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_logsPostRequestWithBodySize(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.INFO) + + client.execute(postRequestWithBody("""{"key":"value"}"""), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> POST https://api.example.com/v1/resources (15-byte body) + |<-- 200 (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_logsRequestWithUnknownLengthBody(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.INFO) + + client + .execute(postRequestWithBody("""{"key":"value"}""", contentLength = -1L), async) + .body() + .readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> POST https://api.example.com/v1/resources (unknown-length body) + |<-- 200 (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_logsResponseStatusAndDuration(async: Boolean) { + val clock = + clockFrom( + Instant.parse("1998-04-21T00:00:00Z"), + Instant.parse("1998-04-21T00:00:01.234Z"), + ) + val client = loggingClient(fakeHttpClient(statusCode = 201), LogLevel.INFO, clock) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- 201 (1s 234ms) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_logsResponseContentLength(async: Boolean) { + val headers = + Headers.builder().put("Content-Length", "42").put("Content-Type", "text/plain").build() + val client = loggingClient(fakeHttpClient(responseHeaders = headers), LogLevel.INFO) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- 200 (0s, 42-byte body) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_doesNotLogHeaders(async: Boolean) { + val headers = Headers.builder().put("X-Custom", "visible").build() + val client = loggingClient(fakeHttpClient(responseHeaders = headers), LogLevel.INFO) + + client + .execute( + HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.example.com") + .addPathSegment("v1") + .putHeader("X-Request-Custom", "req-value") + .build(), + async, + ) + .body() + .readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1 + |<-- 200 (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsGetWithEndMarker(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsRequestAndResponseHeaders(async: Boolean) { + val responseHeaders = + Headers.builder() + .put("X-Response-Id", "abc-123") + .put("Content-Type", "text/plain") + .build() + val client = + loggingClient(fakeHttpClient(responseHeaders = responseHeaders), LogLevel.DEBUG) + + client + .execute( + HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.example.com") + .addPathSegment("test") + .putHeader("X-Custom", "my-value") + .build(), + async, + ) + .body() + .readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/test + |X-Custom: my-value + |--> END GET + | + |<-- 200 (0s) + |Content-Type: text/plain + |X-Response-Id: abc-123 + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_redactsSensitiveHeaders(async: Boolean) { + val client = + loggingClient( + fakeHttpClient(), + LogLevel.DEBUG, + redactedHeaders = setOf("Authorization", "X-Secret"), + ) + + client + .execute( + HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.example.com") + .addPathSegment("test") + .putHeader("Authorization", "Bearer token-123") + .putHeader("X-Secret", "secret-value") + .putHeader("X-Public", "public-value") + .build(), + async, + ) + .body() + .readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/test + |Authorization: ██ + |X-Public: public-value + |X-Secret: ██ + |--> END GET + | + |<-- 200 (0s) + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_redactsHeadersCaseInsensitively(async: Boolean) { + val client = + loggingClient( + fakeHttpClient(), + LogLevel.DEBUG, + redactedHeaders = setOf("Authorization"), + ) + + client + .execute( + HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.example.com") + .addPathSegment("test") + .putHeader("authorization", "Bearer secret") + .build(), + async, + ) + .body() + .readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/test + |authorization: ██ + |--> END GET + | + |<-- 200 (0s) + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsRequestBody(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) + val body = """{"name":"test","value":42}""" + + client.execute(postRequestWithBody(body), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> POST https://api.example.com/v1/resources (26-byte body) + | + |{"name":"test","value":42} + |--> END POST (26-byte body) + | + |<-- 200 (0s) + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsResponseBody(async: Boolean) { + val responseBody = """{"id":1,"status":"ok"}""" + val headers = Headers.builder().put("Content-Type", "application/json").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + val response = client.execute(simpleGetRequest(), async) + val body = response.body().readBytes().toString(StandardCharsets.UTF_8) + + assertThat(body).isEqualTo(responseBody) + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: application/json + | + |{"id":1,"status":"ok"} + |<-- END HTTP (22-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsBinaryResponseBodyAsOmitted(async: Boolean) { + val binaryBody = ByteArray(256) { it.toByte() } + val client = loggingClient(fakeHttpClient(responseBody = binaryBody), LogLevel.DEBUG) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + | + |(binary body omitted) + |<-- END HTTP (256-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsMultilineResponseBody(async: Boolean) { + val multilineBody = "line1\nline2\nline3" + val headers = Headers.builder().put("Content-Type", "text/plain; charset=utf-8").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = multilineBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: text/plain; charset=utf-8 + | + |line1 + |line2 + |line3 + |<-- END HTTP (17-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsResponseBodyWithExplicitCharset(async: Boolean) { + val responseBody = "héllo wörld" + val headers = Headers.builder().put("Content-Type", "text/plain; charset=utf-8").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: text/plain; charset=utf-8 + | + |héllo wörld + |<-- END HTTP (13-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsResponseBodyWithNoContentType(async: Boolean) { + val responseBody = "plain text body" + val client = + loggingClient( + fakeHttpClient(responseBody = responseBody.toByteArray(StandardCharsets.UTF_8)), + LogLevel.DEBUG, + ) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + | + |plain text body + |<-- END HTTP (15-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsEmptyResponseBody(async: Boolean) { + val client = loggingClient(fakeHttpClient(), LogLevel.DEBUG) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |<-- END HTTP (0-byte body) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsEndHttpMarkerOnEarlyClose(async: Boolean) { + val responseBody = """{"id":1,"status":"ok"}""" + val headers = Headers.builder().put("Content-Type", "application/json").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + val body = client.execute(simpleGetRequest(), async).body() + body.read(ByteArray(5)) + body.close() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: application/json + | + |{"id" + |<-- END HTTP (5-byte body, closed early) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsEndHttpMarkerOnCloseWithoutReading(async: Boolean) { + val responseBody = """{"id":1,"status":"ok"}""" + val headers = Headers.builder().put("Content-Type", "application/json").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + client.execute(simpleGetRequest(), async).body().close() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: application/json + |<-- END HTTP (0-byte body, closed early) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsEndHttpMarkerWhenResponseClosedAfterPartialRead(async: Boolean) { + val responseBody = """{"id":1,"status":"ok"}""" + val headers = Headers.builder().put("Content-Type", "application/json").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + val response = client.execute(simpleGetRequest(), async) + response.body().read(ByteArray(5)) + response.close() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: application/json + | + |{"id" + |<-- END HTTP (5-byte body, closed early) + | + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_doesNotLogEndHttpMarkerWhenResponseClosedWithoutBodyAccess(async: Boolean) { + val responseBody = """{"id":1,"status":"ok"}""" + val headers = Headers.builder().put("Content-Type", "application/json").build() + val client = + loggingClient( + fakeHttpClient( + responseHeaders = headers, + responseBody = responseBody.toByteArray(StandardCharsets.UTF_8), + ), + LogLevel.DEBUG, + ) + + client.execute(simpleGetRequest(), async).close() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- 200 (0s) + |Content-Type: application/json + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun errorLevel_logsRequestFailure(async: Boolean) { + val clock = + clockFrom( + Instant.parse("1998-04-21T00:00:00Z"), + Instant.parse("1998-04-21T00:00:01.234Z"), + ) + val client = + loggingClient( + failingHttpClient(IOException("Connection refused")), + LogLevel.ERROR, + clock, + ) + + assertThatThrownBy { client.execute(simpleGetRequest(), async) } + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- !! IOException: Connection refused (1s 234ms) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun infoLevel_doesNotLogRequestFailure(async: Boolean) { + val client = + loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.INFO) + + assertThatThrownBy { client.execute(simpleGetRequest(), async) } + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun debugLevel_logsRequestFailureAfterHeaders(async: Boolean) { + val client = + loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.DEBUG) + + assertThatThrownBy { client.execute(simpleGetRequest(), async) } + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |--> END GET + | + |<-- !! IOException: Connection refused (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun errorLevel_logsRequestFailureWithoutMessage(async: Boolean) { + val client = loggingClient(failingHttpClient(IOException()), LogLevel.ERROR) + + assertThatThrownBy { client.execute(simpleGetRequest(), async) } + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- !! IOException (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun offLevel_doesNotLogRequestFailure(async: Boolean) { + val client = + loggingClient(failingHttpClient(IOException("Connection refused")), LogLevel.OFF) + + assertThatThrownBy { client.execute(simpleGetRequest(), async) } + + assertThat(stderrOutput()).isEmpty() + } + + @Test + fun errorLevel_logsExecuteAsyncSynchronousThrow() { + val error = IOException("Connection refused") + val client = + loggingClient( + object : HttpClient { + override fun execute( + request: HttpRequest, + requestOptions: RequestOptions, + ): HttpResponse = throw UnsupportedOperationException() + + override fun executeAsync( + request: HttpRequest, + requestOptions: RequestOptions, + ): CompletableFuture = throw error + + override fun close() {} + }, + LogLevel.ERROR, + ) + + assertThatThrownBy { client.execute(simpleGetRequest(), async = true) }.isSameAs(error) + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- !! IOException: Connection refused (0s) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun durationFormat_seconds(async: Boolean) { + val clock = + clockFrom( + Instant.parse("1998-04-21T00:00:00Z"), + Instant.parse("1998-04-21T00:00:02.500Z"), + ) + val client = loggingClient(fakeHttpClient(), LogLevel.INFO, clock) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- 200 (2s 500ms) + |""" + .trimMargin() + ) + } + + @ParameterizedTest + @ValueSource(booleans = [false, true]) + fun durationFormat_minutesAndSeconds(async: Boolean) { + val clock = + clockFrom( + Instant.parse("1998-04-21T00:00:00Z"), + Instant.parse("1998-04-21T00:01:40.467Z"), + ) + val client = loggingClient(fakeHttpClient(), LogLevel.INFO, clock) + + client.execute(simpleGetRequest(), async).body().readBytes() + + assertThat(stderrOutput()) + .isEqualTo( + """ + |--> GET https://api.example.com/v1/resources + |<-- 200 (1m 40s 467ms) + |""" + .trimMargin() + ) + } + + @Test + fun builder_toBuilder_roundtrips() { + val delegate = fakeHttpClient() + val clock = Clock.fixed(Instant.parse("1998-04-21T00:00:00Z"), ZoneOffset.UTC) + val client = + LoggingHttpClient.builder() + .httpClient(delegate) + .level(LogLevel.DEBUG) + .redactedHeaders(setOf("X-Secret")) + .clock(clock) + .build() + + val rebuilt = client.toBuilder().build() + + assertThat(rebuilt.httpClient).isSameAs(delegate) + assertThat(rebuilt.level).isEqualTo(LogLevel.DEBUG) + assertThat(rebuilt.redactedHeaders).containsExactly("X-Secret") + assertThat(rebuilt.clock).isEqualTo(clock) + } + + @Test + fun close_delegatesToUnderlyingClient() { + var closed = false + val delegate = + object : HttpClient { + override fun execute( + request: HttpRequest, + requestOptions: RequestOptions, + ): HttpResponse = throw UnsupportedOperationException() + + override fun executeAsync( + request: HttpRequest, + requestOptions: RequestOptions, + ): CompletableFuture = throw UnsupportedOperationException() + + override fun close() { + closed = true + } + } + val client = loggingClient(delegate, LogLevel.OFF) + + client.close() + + assertThat(closed).isTrue() + } + + private fun stderrOutput(): String = errContent.toString("UTF-8") + + private fun loggingClient( + httpClient: HttpClient, + level: LogLevel, + clock: Clock = clockFrom(Instant.parse("1998-04-21T00:00:00Z")), + redactedHeaders: Set = setOf("x-api-key"), + ): LoggingHttpClient = + LoggingHttpClient.builder() + .httpClient(httpClient) + .level(level) + .clock(clock) + .redactedHeaders(redactedHeaders) + .build() + + private fun simpleGetRequest(): HttpRequest = + HttpRequest.builder() + .method(HttpMethod.GET) + .baseUrl("https://api.example.com") + .addPathSegment("v1") + .addPathSegment("resources") + .build() + + private fun postRequestWithBody( + body: String, + contentType: String = "application/json", + contentLength: Long? = null, + ): HttpRequest = + HttpRequest.builder() + .method(HttpMethod.POST) + .baseUrl("https://api.example.com") + .addPathSegment("v1") + .addPathSegment("resources") + .body( + object : HttpRequestBody { + private val bytes = body.toByteArray(StandardCharsets.UTF_8) + + override fun writeTo(outputStream: OutputStream) { + outputStream.write(bytes) + } + + override fun contentType(): String = contentType + + override fun contentLength(): Long = contentLength ?: bytes.size.toLong() + + override fun repeatable(): Boolean = true + + override fun close() {} + } + ) + .build() + + private fun fakeHttpClient( + statusCode: Int = 200, + responseHeaders: Headers = Headers.builder().build(), + responseBody: ByteArray = ByteArray(0), + ): HttpClient = + object : HttpClient { + override fun execute( + request: HttpRequest, + requestOptions: RequestOptions, + ): HttpResponse { + // Consume the request body if present to trigger logging. + request.body?.let { + val out = ByteArrayOutputStream() + it.writeTo(out) + } + return fakeResponse(statusCode, responseHeaders, responseBody) + } + + override fun executeAsync( + request: HttpRequest, + requestOptions: RequestOptions, + ): CompletableFuture = + CompletableFuture.completedFuture(execute(request, requestOptions)) + + override fun close() {} + } + + private fun failingHttpClient(error: Throwable): HttpClient = + object : HttpClient { + override fun execute( + request: HttpRequest, + requestOptions: RequestOptions, + ): HttpResponse { + request.body?.let { + val out = ByteArrayOutputStream() + it.writeTo(out) + } + throw error + } + + override fun executeAsync( + request: HttpRequest, + requestOptions: RequestOptions, + ): CompletableFuture { + val future = CompletableFuture() + future.completeExceptionally(error) + return future + } + + override fun close() {} + } + + private fun fakeResponse(statusCode: Int, headers: Headers, body: ByteArray): HttpResponse = + object : HttpResponse { + override fun statusCode(): Int = statusCode + + override fun headers(): Headers = headers + + override fun body(): InputStream = ByteArrayInputStream(body) + + override fun close() {} + } + + private fun clockFrom(vararg instants: Instant): Clock = + object : Clock() { + private var index = 0 + + override fun getZone() = ZoneOffset.UTC + + override fun withZone(zone: java.time.ZoneId?) = this + + override fun instant(): Instant { + val instant = instants[index % instants.size] + index++ + return instant + } + } + + private fun HttpClient.execute(request: HttpRequest, async: Boolean): HttpResponse = + if (async) executeAsync(request).get() else execute(request) +} From 7b472ce5068ef1e31062d6f3fa2f3e76f605572b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 04:16:37 +0000 Subject: [PATCH 014/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From 87a22aebdf8df7f9b1b758340279fc7986c2fafc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 05:16:41 +0000 Subject: [PATCH 015/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..8d5b4bfc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml +openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b config_hash: 7fe4b7f38470a511342b783de698aa99 From f8dbe95a33755be15752ae1ecb2eecb041ad03b5 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 08:16:42 +0000 Subject: [PATCH 016/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8d5b4bfc..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml -openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From cf380949ca62823fdcdc812de6f5b9cced214dc8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 09:17:02 +0000 Subject: [PATCH 017/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From f6fdbe1f6b1f3dc84c6babef70c3f8f221d64d47 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 10:16:54 +0000 Subject: [PATCH 018/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..8d5b4bfc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml +openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b config_hash: 7fe4b7f38470a511342b783de698aa99 From c055e89c38f493edca537fcbc7f0a0fbe0a812b4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 11:16:45 +0000 Subject: [PATCH 019/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8d5b4bfc..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml -openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 28c3e0bd59cdd7772922bd8111e220706ec4c249 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 13:16:57 +0000 Subject: [PATCH 020/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..8d5b4bfc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml +openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b config_hash: 7fe4b7f38470a511342b783de698aa99 From d0cd2e6918a0ca61acfa377c7eec0b82d6c26b0e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 15:16:51 +0000 Subject: [PATCH 021/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8d5b4bfc..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml -openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 870c6479200540c7eb6977a7536fd3b16f99aa1e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 17:19:22 +0000 Subject: [PATCH 022/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From 11e7498bf425a2acd42542a1415c7ed066768da4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 18:16:41 +0000 Subject: [PATCH 023/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From 2ff3476973b93fb32b3f3343a60d52eb3130afd0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 19:16:54 +0000 Subject: [PATCH 024/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8813f451ac3e3d02efa163c79600588fad5b4459 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 20:16:58 +0000 Subject: [PATCH 025/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From f8a0fec671ba0b60397ac2872db666d535579e15 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 21:16:41 +0000 Subject: [PATCH 026/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From bf64d5b36858b1455ce44d84f246cb79b017b25d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 23:16:47 +0000 Subject: [PATCH 027/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..0bfad2e8 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml +openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe config_hash: 7fe4b7f38470a511342b783de698aa99 From 3c82a874759913022078e0d4a033f21dfc08dd25 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 00:17:00 +0000 Subject: [PATCH 028/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 0bfad2e8..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-bfba917043e984f7c12c83843cc01381d45b9eaaceb2df49d46da3b83e7df254.yml -openapi_spec_hash: 6c0db0e4f481c63cc8e2a4866639d2fe +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 774bb5bd688635b3c7cfe52d3eba1457f5748405 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 03:14:21 +0000 Subject: [PATCH 029/107] chore: redact api-key headers in debug logs --- .../src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt | 7 ++++--- .../test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt b/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt index 3d36d6e1..4f02b28d 100644 --- a/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt +++ b/sent-java-core/src/main/kotlin/dm/sent/core/http/LoggingHttpClient.kt @@ -31,7 +31,7 @@ private constructor( /** * Sensitive headers to redact from logs. * - * Defaults to `Set.of("x-api-key")`. + * Defaults to `Set.of("authorization", "api-key", "x-api-key", "cookie", "set-cookie")`. */ @get:JvmName("redactedHeaders") val redactedHeaders: SortedSet, /** @@ -192,7 +192,8 @@ private constructor( class Builder internal constructor() { private var httpClient: HttpClient? = null - private var redactedHeaders: Set = setOf("x-api-key") + private var redactedHeaders: Set = + setOf("authorization", "api-key", "x-api-key", "cookie", "set-cookie") private var clock: Clock = Clock.systemUTC() private var level: LogLevel? = null @@ -210,7 +211,7 @@ private constructor( /** * Sensitive headers to redact from logs. * - * Defaults to `Set.of("x-api-key")`. + * Defaults to `Set.of("authorization", "api-key", "x-api-key", "cookie", "set-cookie")`. */ fun redactedHeaders(redactedHeaders: Set) = apply { this.redactedHeaders = redactedHeaders diff --git a/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt b/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt index d055216b..48d7c50e 100644 --- a/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt +++ b/sent-java-core/src/test/kotlin/dm/sent/core/http/LoggingHttpClientTest.kt @@ -870,7 +870,8 @@ internal class LoggingHttpClientTest { httpClient: HttpClient, level: LogLevel, clock: Clock = clockFrom(Instant.parse("1998-04-21T00:00:00Z")), - redactedHeaders: Set = setOf("x-api-key"), + redactedHeaders: Set = + setOf("authorization", "api-key", "x-api-key", "cookie", "set-cookie"), ): LoggingHttpClient = LoggingHttpClient.builder() .httpClient(httpClient) From 67605bcc3604450dc736673d2bf83fb2cd46b337 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 04:16:58 +0000 Subject: [PATCH 030/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..936ff73e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml +openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 config_hash: 7fe4b7f38470a511342b783de698aa99 From a8dd9310316a9707d9e9ef7980ef02541b2e119b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 06:16:49 +0000 Subject: [PATCH 031/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 936ff73e..8d5b4bfc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d34807169a85c97851709d7dd10f532fddf08e15ef16e7d6487e7cf86770d929.yml -openapi_spec_hash: 3e841883a81985eeb2645f3a0ce60351 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml +openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b config_hash: 7fe4b7f38470a511342b783de698aa99 From 7114aec9151d985f87a103dc913ae8411e40cbf8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 08:17:02 +0000 Subject: [PATCH 032/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8d5b4bfc..1e4b924c 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-149c43905bf6a666bb7ee90d3accd0c36b84324c0fc20100a887b4ac0ad272c8.yml -openapi_spec_hash: 2df1163d2558492dfa18f277ddf5ba5b +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml +openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 config_hash: 7fe4b7f38470a511342b783de698aa99 From 5709c094e90e2d676075faf39aa35564ec862525 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 09:16:55 +0000 Subject: [PATCH 033/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1e4b924c..50aa11c5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-21f3ad999906b6b886f79e15991d43f65bea811dec0a033e3cbe8730aec83f56.yml -openapi_spec_hash: 5b1e9de79d27d3ccd1ee2847f117be46 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-b7f4e08f67cbd25e8498a1e4b1c79eed0595811183f2e52b2500ca53264593f9.yml +openapi_spec_hash: 73df4745f8529dadb8077ba1edb96c65 config_hash: 7fe4b7f38470a511342b783de698aa99 From 918d0d70510660e8817a0129b72fead2e8fabcf4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 10:16:53 +0000 Subject: [PATCH 034/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 50aa11c5..8c0c778e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-b7f4e08f67cbd25e8498a1e4b1c79eed0595811183f2e52b2500ca53264593f9.yml -openapi_spec_hash: 73df4745f8529dadb8077ba1edb96c65 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-99754e7aed040918ba43a6d32881ed4b914de075ab4537bc3d969217b95c13fe.yml +openapi_spec_hash: 299a0fdff2683fc4b11bf8c55dad3993 config_hash: 7fe4b7f38470a511342b783de698aa99 From 9a0911fbb09a94c8dc40396602e7f5e97175b4f0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 11:17:02 +0000 Subject: [PATCH 035/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8c0c778e..50aa11c5 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-99754e7aed040918ba43a6d32881ed4b914de075ab4537bc3d969217b95c13fe.yml -openapi_spec_hash: 299a0fdff2683fc4b11bf8c55dad3993 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-b7f4e08f67cbd25e8498a1e4b1c79eed0595811183f2e52b2500ca53264593f9.yml +openapi_spec_hash: 73df4745f8529dadb8077ba1edb96c65 config_hash: 7fe4b7f38470a511342b783de698aa99 From a3fb0dd6cc28cf36048ded933f2a33a0ec64189f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 12:16:51 +0000 Subject: [PATCH 036/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 50aa11c5..44abcfdc 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-b7f4e08f67cbd25e8498a1e4b1c79eed0595811183f2e52b2500ca53264593f9.yml -openapi_spec_hash: 73df4745f8529dadb8077ba1edb96c65 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-af8b98a1e0ce71a7203fd85bf5930b405dfdf6be9c6387ef72e95228b858284e.yml +openapi_spec_hash: d63f764daec10e7bab7965db6ed9e3c0 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8c3cea3940e5efb6d80f715ec7a127e8ad1e113a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 13:17:11 +0000 Subject: [PATCH 037/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 44abcfdc..8c0c778e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-af8b98a1e0ce71a7203fd85bf5930b405dfdf6be9c6387ef72e95228b858284e.yml -openapi_spec_hash: d63f764daec10e7bab7965db6ed9e3c0 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-99754e7aed040918ba43a6d32881ed4b914de075ab4537bc3d969217b95c13fe.yml +openapi_spec_hash: 299a0fdff2683fc4b11bf8c55dad3993 config_hash: 7fe4b7f38470a511342b783de698aa99 From 54c33e539b7f27b041e153c1a37a1a8ea446aa82 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 15:17:14 +0000 Subject: [PATCH 038/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 8c0c778e..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-99754e7aed040918ba43a6d32881ed4b914de075ab4537bc3d969217b95c13fe.yml -openapi_spec_hash: 299a0fdff2683fc4b11bf8c55dad3993 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 6900f7b9d4daae07d3663f87e34ec9d1761a0dad Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 16:17:11 +0000 Subject: [PATCH 039/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From b7ed8509bbdddc79f649be7d71702e28575ca9f1 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 17:16:54 +0000 Subject: [PATCH 040/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 1fd5969dd1e967787822844d2f8670d4e977fc85 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 18:17:40 +0000 Subject: [PATCH 041/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 1c461d000868a90cf1970995e0679a265eaaca12 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 21:17:44 +0000 Subject: [PATCH 042/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 86b98d78c4551772eebafd96ddc854ada2ac0e81 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 22:17:53 +0000 Subject: [PATCH 043/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From d1be85956e6f6343d7bc87198524dbd8fb942a71 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 01:17:51 +0000 Subject: [PATCH 044/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 4b53a1f861efe0ec3ff202492caffdfd42e025f2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 02:17:48 +0000 Subject: [PATCH 045/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 2b393e7ec3c127bf731258bf0e4ba66a18528df0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 04:18:01 +0000 Subject: [PATCH 046/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 791542ea2023c147d7d588138778d9d0f8a98873 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 05:17:50 +0000 Subject: [PATCH 047/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 45089dee436ed31c3212092a503a34da96a9b3c6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 06:18:09 +0000 Subject: [PATCH 048/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 37b79b85d6bddcfd4ae82132f2e1829c0c8bae34 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 07:17:51 +0000 Subject: [PATCH 049/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From a9c5e235584af28da74c6c7a3d4eea637c34d83f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 09:17:53 +0000 Subject: [PATCH 050/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From e048ebb7600781152220702823fe6fc120373fc1 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 11:18:07 +0000 Subject: [PATCH 051/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8e07fe1f5bdb742a3b5a0ebb83e180c527e0bdd8 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 12:18:03 +0000 Subject: [PATCH 052/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From c1e129b2fcb52785724d0fe03d38f42733e8d714 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 14:17:53 +0000 Subject: [PATCH 053/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 09d9769838ca0ee1a2df24e0f093f43de1a0cef5 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 15:17:51 +0000 Subject: [PATCH 054/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 9754d0f5634911637523367ee338471f3ac0d955 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 16:18:04 +0000 Subject: [PATCH 055/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 66483740dccd03d8a29834410367e962a9e37566 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 17:18:01 +0000 Subject: [PATCH 056/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8a28407599ca02cb38b3c50e0680f7101f88d60e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 18:17:49 +0000 Subject: [PATCH 057/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From cc370cdc09d90cbdf5ea5be328614a698dd0b8bf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 19:18:08 +0000 Subject: [PATCH 058/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 44722b8c95483232adf88632deaaa96a03c6ef93 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 21:18:03 +0000 Subject: [PATCH 059/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 7296eb47fb6761cf2b3c26179ebcc9efd3ae8382 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 22:18:03 +0000 Subject: [PATCH 060/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From cc9089d7c0036f2698d4d117239aa45d2a3d64d7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 9 May 2026 23:18:01 +0000 Subject: [PATCH 061/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 1b3852ab6362665fc6a6000612003f28ff4aed43 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 00:17:58 +0000 Subject: [PATCH 062/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 924cd7e9e93605ad2249b2ef96ff013d1e86ad1e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 02:17:58 +0000 Subject: [PATCH 063/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 30d0449b29846095a31634159e9c0db6b88b02b7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 04:17:57 +0000 Subject: [PATCH 064/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From e734c80fd2d804fbebceded8ec34cd9da41cc453 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 05:17:57 +0000 Subject: [PATCH 065/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 28e07432fb499dd249e641ba48bbf9bfa743dd26 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 06:17:57 +0000 Subject: [PATCH 066/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From ec7511724ad4cd825b7f37783aeb1ac0d5384f15 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 07:18:02 +0000 Subject: [PATCH 067/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From c8eb10386ff81568e1f16aff18a4ef3f01bc07ab Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 08:18:03 +0000 Subject: [PATCH 068/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From ed8a498abf98bace18f2c913bf06635beb2ee966 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 09:18:04 +0000 Subject: [PATCH 069/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 504ffd487c8615ef56fadbd9809a42389b210311 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 10:18:09 +0000 Subject: [PATCH 070/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 4fb62650c0c006cd539df0276ad04ff1a13f1747 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 11:18:07 +0000 Subject: [PATCH 071/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 0e7ec04ed72ed195fe734a0d94ea22d5a1f6ffa0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 13:18:05 +0000 Subject: [PATCH 072/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 38feb5c7ea6566658874830dccf1d8219a046cbd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 14:18:10 +0000 Subject: [PATCH 073/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From c6d1162caa11a6d907ab91cd003d801de1df3197 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 15:18:07 +0000 Subject: [PATCH 074/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 84dae0dfe0b23c72c28a2285c566fd83ae3c8e60 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 16:18:00 +0000 Subject: [PATCH 075/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 7b14e2246ccf18d4c36c6693574883451ee212f4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 17:18:03 +0000 Subject: [PATCH 076/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 919c71d7a341d04486dfbe5df46bbf0657f503ac Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 18:18:04 +0000 Subject: [PATCH 077/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 812616093dcef58eb8850e272a97335d586b4024 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 20:18:02 +0000 Subject: [PATCH 078/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From a11379872a9c0b767306ff8ab26fab04311f9c07 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 21:18:06 +0000 Subject: [PATCH 079/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 676bb6730408d98f3a1c88a5cc31be997b6ed9eb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 22:18:06 +0000 Subject: [PATCH 080/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From bded3fcd38566ab79d204c4c0a3affef75dcc0a4 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 10 May 2026 23:18:06 +0000 Subject: [PATCH 081/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 745f029bb9fb716c25c3819b76cac5a7795ecc05 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 00:18:07 +0000 Subject: [PATCH 082/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 8298c705956f8f93f9a95f7561d355e4d508ea93 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 01:18:06 +0000 Subject: [PATCH 083/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 6ef7eb62fd0bebbfd9c54f1468269c790b6c419b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 02:18:08 +0000 Subject: [PATCH 084/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From ff84e3caa5346f457b60fcad53003154a2110bdf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 03:18:06 +0000 Subject: [PATCH 085/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 78000eb17712a699d5aa3b48dd80c73309483d53 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 04:18:01 +0000 Subject: [PATCH 086/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 72e72b1cd40758d1d59d9e8cb2a68e3f4aa713d6 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 05:18:02 +0000 Subject: [PATCH 087/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 198f90695b914da7af1c3979a5e0ff7dddc4a59e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 06:18:04 +0000 Subject: [PATCH 088/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 19427d7b3765ce6c8fd5484585f9c148b01fdcfb Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 08:18:07 +0000 Subject: [PATCH 089/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 5934b49d9026433d4f826ec7245fcb653e847912 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 09:18:04 +0000 Subject: [PATCH 090/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 67b905423074fc3ce92af3189e1b6ce78bc3f676 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 11:18:15 +0000 Subject: [PATCH 091/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 4229f1753a6b3e7c1f050d27e85d0a0d672ad3e9 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 12:18:04 +0000 Subject: [PATCH 092/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From 6c4319500e4263e10c0f1bb56b1a057cfbae5547 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 13:18:10 +0000 Subject: [PATCH 093/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From 154afaeb586b69a5426e9475b95de7b3224caee3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 16:18:06 +0000 Subject: [PATCH 094/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From fb9ee95a27e405fe67779c273ea3da06a97f14bf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 17:18:10 +0000 Subject: [PATCH 095/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..1111faaf 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml +openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 config_hash: 7fe4b7f38470a511342b783de698aa99 From 71120860b2a5584499c7887e20d399576b045f24 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 18:18:09 +0000 Subject: [PATCH 096/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1111faaf..e28af00a 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-9a0d01d4dc1d1462a83ce2b38912e5bfd8cb0e86d81f8f572ff8b1ab70e16d81.yml -openapi_spec_hash: e36a786c620baa9176dd219be1de4b18 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml +openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 config_hash: 7fe4b7f38470a511342b783de698aa99 From be06913d462e386673b18bbba3c56072ccf6ac00 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 19:18:09 +0000 Subject: [PATCH 097/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index e28af00a..fae7ac85 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-d97e57316ff3a2ce31bd3bee7f7a3eefc797cb44adf2d84258a1c47e800d7370.yml -openapi_spec_hash: 30230effd6dea7dca70be1d264c9b331 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml +openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb config_hash: 7fe4b7f38470a511342b783de698aa99 From 32ac05142d29fb19bc52ab1f13b91319c2cfefde Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 20:18:10 +0000 Subject: [PATCH 098/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index fae7ac85..f6618a92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-0fcb12ce1879a4b98b65943aa83c473640fb2526c9628beeecddea81efa266b8.yml -openapi_spec_hash: 2d5143f454ac05a520e1ea2ec6922aeb +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml +openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c config_hash: 7fe4b7f38470a511342b783de698aa99 From b1622bea415177ff8a8d3c4118b88566406c31fa Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 21:18:17 +0000 Subject: [PATCH 099/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index f6618a92..46e29168 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-7733bac6ee18c932669b7efc0e8cbaf6c2fcc4fe47718317d4f73da5689be577.yml -openapi_spec_hash: 5d5f7b2b02a3299807599dbe877be99c +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-cd3602173bd6a0a9492974a8541e246b36758015cb5f3e214b4abec90f3f9306.yml +openapi_spec_hash: 4d6829284030da47b715b4f5557167db config_hash: 7fe4b7f38470a511342b783de698aa99 From fdad23bd43d6589d0a7f7eec9c55ad715533cce9 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 22:18:14 +0000 Subject: [PATCH 100/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 46e29168..2829621d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-cd3602173bd6a0a9492974a8541e246b36758015cb5f3e214b4abec90f3f9306.yml -openapi_spec_hash: 4d6829284030da47b715b4f5557167db +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-e472553a88d7792f3a2f2576bdceec1bd5e7ee41148e0518792d1ac27653ae4f.yml +openapi_spec_hash: fed0a128fa0025b0df0e66fab95272dc config_hash: 7fe4b7f38470a511342b783de698aa99 From dabd95b56c961e254af3788bf9017a119eb24ea3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 11 May 2026 23:19:14 +0000 Subject: [PATCH 101/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2829621d..eccd4420 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-e472553a88d7792f3a2f2576bdceec1bd5e7ee41148e0518792d1ac27653ae4f.yml -openapi_spec_hash: fed0a128fa0025b0df0e66fab95272dc +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-a9fb8deca8b7f2d5817689c8f5dc84146b24704424fd3760fa1e1ad88c1773dc.yml +openapi_spec_hash: 6d0e3d005919cd071a4bbd75e514be34 config_hash: 7fe4b7f38470a511342b783de698aa99 From 1b017694de642c60b9842dc6ff28c773bf558e4e Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 00:19:14 +0000 Subject: [PATCH 102/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index eccd4420..71d6112e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-a9fb8deca8b7f2d5817689c8f5dc84146b24704424fd3760fa1e1ad88c1773dc.yml -openapi_spec_hash: 6d0e3d005919cd071a4bbd75e514be34 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-71c47f6a43b0cee540846bf970e7ade39917db66190e98a3ce36107684c4cf4d.yml +openapi_spec_hash: 3fd2a6416562b8e9c643d2dbd2573ea2 config_hash: 7fe4b7f38470a511342b783de698aa99 From c9da566796e0219edda262b90aa8631f697e0952 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 02:19:09 +0000 Subject: [PATCH 103/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 71d6112e..eccd4420 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-71c47f6a43b0cee540846bf970e7ade39917db66190e98a3ce36107684c4cf4d.yml -openapi_spec_hash: 3fd2a6416562b8e9c643d2dbd2573ea2 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-a9fb8deca8b7f2d5817689c8f5dc84146b24704424fd3760fa1e1ad88c1773dc.yml +openapi_spec_hash: 6d0e3d005919cd071a4bbd75e514be34 config_hash: 7fe4b7f38470a511342b783de698aa99 From 77205c6083fdeca20d719ca1f3a995089fecc979 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 03:19:01 +0000 Subject: [PATCH 104/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index eccd4420..71d6112e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-a9fb8deca8b7f2d5817689c8f5dc84146b24704424fd3760fa1e1ad88c1773dc.yml -openapi_spec_hash: 6d0e3d005919cd071a4bbd75e514be34 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-71c47f6a43b0cee540846bf970e7ade39917db66190e98a3ce36107684c4cf4d.yml +openapi_spec_hash: 3fd2a6416562b8e9c643d2dbd2573ea2 config_hash: 7fe4b7f38470a511342b783de698aa99 From 17ac965a931258815efc5a2cd871b0e32968cee7 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 04:19:11 +0000 Subject: [PATCH 105/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 71d6112e..2829621d 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-71c47f6a43b0cee540846bf970e7ade39917db66190e98a3ce36107684c4cf4d.yml -openapi_spec_hash: 3fd2a6416562b8e9c643d2dbd2573ea2 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-e472553a88d7792f3a2f2576bdceec1bd5e7ee41148e0518792d1ac27653ae4f.yml +openapi_spec_hash: fed0a128fa0025b0df0e66fab95272dc config_hash: 7fe4b7f38470a511342b783de698aa99 From e6ad2dc1e9be561d7219b253d7ef387dd9d0271b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 06:19:06 +0000 Subject: [PATCH 106/107] codegen metadata --- .stats.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2829621d..71d6112e 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 40 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-e472553a88d7792f3a2f2576bdceec1bd5e7ee41148e0518792d1ac27653ae4f.yml -openapi_spec_hash: fed0a128fa0025b0df0e66fab95272dc +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sent/sent-dm-71c47f6a43b0cee540846bf970e7ade39917db66190e98a3ce36107684c4cf4d.yml +openapi_spec_hash: 3fd2a6416562b8e9c643d2dbd2573ea2 config_hash: 7fe4b7f38470a511342b783de698aa99 From 4cda380b70a104d46d878f8ef2d700db2afa8fe0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 06:20:09 +0000 Subject: [PATCH 107/107] release: 0.23.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 13 +++++++++++++ README.md | 10 +++++----- build.gradle.kts | 2 +- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index cb9d2541..7f3f5c84 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.22.0" + ".": "0.23.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 0819fd41..d7761675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## 0.23.0 (2026-05-12) + +Full Changelog: [v0.22.0...v0.23.0](https://github.com/sentdm/sent-dm-java/compare/v0.22.0...v0.23.0) + +### Features + +* **client:** improve logging ([fcbd456](https://github.com/sentdm/sent-dm-java/commit/fcbd4563cbfd02d714a9dfe8fdbf991c4f10161b)) + + +### Chores + +* redact api-key headers in debug logs ([774bb5b](https://github.com/sentdm/sent-dm-java/commit/774bb5bd688635b3c7cfe52d3eba1457f5748405)) + ## 0.22.0 (2026-05-06) Full Changelog: [v0.21.0...v0.22.0](https://github.com/sentdm/sent-dm-java/compare/v0.21.0...v0.22.0) diff --git a/README.md b/README.md index 8ecd81b0..71614731 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ -[![Maven Central](https://img.shields.io/maven-central/v/dm.sent/sent-java)](https://central.sonatype.com/artifact/dm.sent/sent-java/0.22.0) -[![javadoc](https://javadoc.io/badge2/dm.sent/sent-java/0.22.0/javadoc.svg)](https://javadoc.io/doc/dm.sent/sent-java/0.22.0) +[![Maven Central](https://img.shields.io/maven-central/v/dm.sent/sent-java)](https://central.sonatype.com/artifact/dm.sent/sent-java/0.23.0) +[![javadoc](https://javadoc.io/badge2/dm.sent/sent-java/0.23.0/javadoc.svg)](https://javadoc.io/doc/dm.sent/sent-java/0.23.0) @@ -22,7 +22,7 @@ Use the Sent MCP Server to enable AI assistants to interact with this API, allow -The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm). Javadocs are available on [javadoc.io](https://javadoc.io/doc/dm.sent/sent-java/0.22.0). +The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm). Javadocs are available on [javadoc.io](https://javadoc.io/doc/dm.sent/sent-java/0.23.0). @@ -33,7 +33,7 @@ The REST API documentation can be found on [docs.sent.dm](https://docs.sent.dm). ### Gradle ```kotlin -implementation("dm.sent:sent-java:0.22.0") +implementation("dm.sent:sent-java:0.23.0") ``` ### Maven @@ -42,7 +42,7 @@ implementation("dm.sent:sent-java:0.22.0") dm.sent sent-java - 0.22.0 + 0.23.0 ``` diff --git a/build.gradle.kts b/build.gradle.kts index b34869e5..e66269b7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ repositories { allprojects { group = "dm.sent" - version = "0.22.0" // x-release-please-version + version = "0.23.0" // x-release-please-version } subprojects {