diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 0510f41f2..8358f5fe2 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "0.447.0"
+ ".": "0.448.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index a42ce1f9a..165ec440d 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 232
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-910400a5c3fcab85b95bf574472b6356767c24d4f76eb296bcba4b7db309710c.yml
-openapi_spec_hash: c8b1cebba3d13a5c050c1296b93e2bdb
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-985e738d362cc4d7dce557163d9e57b9a3a254718d862bdeb2758b6c265584b9.yml
+openapi_spec_hash: aa0b0b7eb6ca282b6e607dcc0408fafe
config_hash: d15ecbf4dc8a7a0ef99397d11b557444
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ff19e7f78..904d83efe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,18 @@
# Changelog
+## 0.448.0 (2026-03-05)
+
+Full Changelog: [v0.447.0...v0.448.0](https://github.com/Increase/increase-java/compare/v0.447.0...v0.448.0)
+
+### Features
+
+* **api:** api update ([7356e8b](https://github.com/Increase/increase-java/commit/7356e8b8413d622ec1734b1796b71f70eafec2eb))
+
+
+### Chores
+
+* **internal:** codegen related update ([446e352](https://github.com/Increase/increase-java/commit/446e352ce5aeb3c1b45c311851fba729000888ae))
+
## 0.447.0 (2026-03-05)
Full Changelog: [v0.446.0...v0.447.0](https://github.com/Increase/increase-java/compare/v0.446.0...v0.447.0)
diff --git a/README.md b/README.md
index faacaa6da..7208f2770 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,8 @@
-[](https://central.sonatype.com/artifact/com.increase.api/increase-java/0.447.0)
-[](https://javadoc.io/doc/com.increase.api/increase-java/0.447.0)
+[](https://central.sonatype.com/artifact/com.increase.api/increase-java/0.448.0)
+[](https://javadoc.io/doc/com.increase.api/increase-java/0.448.0)
@@ -13,7 +13,7 @@ The Increase Java SDK is similar to the Increase Kotlin SDK but with minor diffe
-The REST API documentation can be found on [increase.com](https://increase.com/documentation). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.increase.api/increase-java/0.447.0).
+The REST API documentation can be found on [increase.com](https://increase.com/documentation). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.increase.api/increase-java/0.448.0).
@@ -24,7 +24,7 @@ The REST API documentation can be found on [increase.com](https://increase.com/d
### Gradle
```kotlin
-implementation("com.increase.api:increase-java:0.447.0")
+implementation("com.increase.api:increase-java:0.448.0")
```
### Maven
@@ -33,7 +33,7 @@ implementation("com.increase.api:increase-java:0.447.0")
com.increase.api
increase-java
- 0.447.0
+ 0.448.0
```
diff --git a/build.gradle.kts b/build.gradle.kts
index 3b1c144a8..c578080e2 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -8,7 +8,7 @@ repositories {
allprojects {
group = "com.increase.api"
- version = "0.447.0" // x-release-please-version
+ version = "0.448.0" // x-release-please-version
}
subprojects {
diff --git a/buildSrc/src/main/kotlin/increase.java.gradle.kts b/buildSrc/src/main/kotlin/increase.java.gradle.kts
index 70fc33f41..8f4f902a6 100644
--- a/buildSrc/src/main/kotlin/increase.java.gradle.kts
+++ b/buildSrc/src/main/kotlin/increase.java.gradle.kts
@@ -45,7 +45,7 @@ tasks.withType().configureEach {
val palantir by configurations.creating
dependencies {
- palantir("com.palantir.javaformat:palantir-java-format:2.73.0")
+ palantir("com.palantir.javaformat:palantir-java-format:2.89.0")
}
fun registerPalantir(
diff --git a/increase-java-core/src/main/kotlin/com/increase/api/core/http/RetryingHttpClient.kt b/increase-java-core/src/main/kotlin/com/increase/api/core/http/RetryingHttpClient.kt
index ff1479ee5..d9326237a 100644
--- a/increase-java-core/src/main/kotlin/com/increase/api/core/http/RetryingHttpClient.kt
+++ b/increase-java-core/src/main/kotlin/com/increase/api/core/http/RetryingHttpClient.kt
@@ -214,13 +214,8 @@ private constructor(
}
}
?.let { retryAfterNanos ->
- // If the API asks us to wait a certain amount of time (and it's a reasonable
- // amount), just
- // do what it says.
- val retryAfter = Duration.ofNanos(retryAfterNanos.toLong())
- if (retryAfter in Duration.ofNanos(0)..Duration.ofMinutes(1)) {
- return retryAfter
- }
+ // If the API asks us to wait a certain amount of time, do what it says.
+ return Duration.ofNanos(retryAfterNanos.toLong())
}
// Apply exponential backoff, but not more than the max.
diff --git a/increase-java-core/src/main/kotlin/com/increase/api/models/cardpayments/CardPayment.kt b/increase-java-core/src/main/kotlin/com/increase/api/models/cardpayments/CardPayment.kt
index 23051a9da..4fb40e28e 100644
--- a/increase-java-core/src/main/kotlin/com/increase/api/models/cardpayments/CardPayment.kt
+++ b/increase-java-core/src/main/kotlin/com/increase/api/models/cardpayments/CardPayment.kt
@@ -1774,6 +1774,7 @@ private constructor(
private val merchantCategoryCode: JsonField,
private val merchantCountry: JsonField,
private val merchantName: JsonField,
+ private val priorCardAuthenticationId: JsonField,
private val purchaseAmount: JsonField,
private val purchaseCurrency: JsonField,
private val realTimeDecisionId: JsonField,
@@ -1845,6 +1846,9 @@ private constructor(
@JsonProperty("merchant_name")
@ExcludeMissing
merchantName: JsonField = JsonMissing.of(),
+ @JsonProperty("prior_card_authentication_id")
+ @ExcludeMissing
+ priorCardAuthenticationId: JsonField = JsonMissing.of(),
@JsonProperty("purchase_amount")
@ExcludeMissing
purchaseAmount: JsonField = JsonMissing.of(),
@@ -1880,6 +1884,7 @@ private constructor(
merchantCategoryCode,
merchantCountry,
merchantName,
+ priorCardAuthenticationId,
purchaseAmount,
purchaseCurrency,
realTimeDecisionId,
@@ -2085,6 +2090,16 @@ private constructor(
*/
fun merchantName(): String = merchantName.getRequired("merchant_name")
+ /**
+ * The ID of a prior Card Authentication that the requestor used to authenticate this
+ * cardholder for a previous transaction.
+ *
+ * @throws IncreaseInvalidDataException if the JSON field has an unexpected type (e.g.
+ * if the server responded with an unexpected value).
+ */
+ fun priorCardAuthenticationId(): Optional =
+ priorCardAuthenticationId.getOptional("prior_card_authentication_id")
+
/**
* The purchase amount in minor units.
*
@@ -2336,6 +2351,16 @@ private constructor(
@ExcludeMissing
fun _merchantName(): JsonField = merchantName
+ /**
+ * Returns the raw JSON value of [priorCardAuthenticationId].
+ *
+ * Unlike [priorCardAuthenticationId], this method doesn't throw if the JSON field has
+ * an unexpected type.
+ */
+ @JsonProperty("prior_card_authentication_id")
+ @ExcludeMissing
+ fun _priorCardAuthenticationId(): JsonField = priorCardAuthenticationId
+
/**
* Returns the raw JSON value of [purchaseAmount].
*
@@ -2420,6 +2445,7 @@ private constructor(
* .merchantCategoryCode()
* .merchantCountry()
* .merchantName()
+ * .priorCardAuthenticationId()
* .purchaseAmount()
* .purchaseCurrency()
* .realTimeDecisionId()
@@ -2454,6 +2480,7 @@ private constructor(
private var merchantCategoryCode: JsonField? = null
private var merchantCountry: JsonField? = null
private var merchantName: JsonField? = null
+ private var priorCardAuthenticationId: JsonField? = null
private var purchaseAmount: JsonField? = null
private var purchaseCurrency: JsonField? = null
private var realTimeDecisionId: JsonField? = null
@@ -2484,6 +2511,7 @@ private constructor(
merchantCategoryCode = cardAuthentication.merchantCategoryCode
merchantCountry = cardAuthentication.merchantCountry
merchantName = cardAuthentication.merchantName
+ priorCardAuthenticationId = cardAuthentication.priorCardAuthenticationId
purchaseAmount = cardAuthentication.purchaseAmount
purchaseCurrency = cardAuthentication.purchaseCurrency
realTimeDecisionId = cardAuthentication.realTimeDecisionId
@@ -2896,6 +2924,32 @@ private constructor(
this.merchantName = merchantName
}
+ /**
+ * The ID of a prior Card Authentication that the requestor used to authenticate
+ * this cardholder for a previous transaction.
+ */
+ fun priorCardAuthenticationId(priorCardAuthenticationId: String?) =
+ priorCardAuthenticationId(JsonField.ofNullable(priorCardAuthenticationId))
+
+ /**
+ * Alias for calling [Builder.priorCardAuthenticationId] with
+ * `priorCardAuthenticationId.orElse(null)`.
+ */
+ fun priorCardAuthenticationId(priorCardAuthenticationId: Optional) =
+ priorCardAuthenticationId(priorCardAuthenticationId.getOrNull())
+
+ /**
+ * Sets [Builder.priorCardAuthenticationId] to an arbitrary JSON value.
+ *
+ * You should usually call [Builder.priorCardAuthenticationId] with a well-typed
+ * [String] value instead. This method is primarily for setting the field to an
+ * undocumented or not yet supported value.
+ */
+ fun priorCardAuthenticationId(priorCardAuthenticationId: JsonField) =
+ apply {
+ this.priorCardAuthenticationId = priorCardAuthenticationId
+ }
+
/** The purchase amount in minor units. */
fun purchaseAmount(purchaseAmount: Long?) =
purchaseAmount(JsonField.ofNullable(purchaseAmount))
@@ -3051,6 +3105,7 @@ private constructor(
* .merchantCategoryCode()
* .merchantCountry()
* .merchantName()
+ * .priorCardAuthenticationId()
* .purchaseAmount()
* .purchaseCurrency()
* .realTimeDecisionId()
@@ -3083,6 +3138,7 @@ private constructor(
checkRequired("merchantCategoryCode", merchantCategoryCode),
checkRequired("merchantCountry", merchantCountry),
checkRequired("merchantName", merchantName),
+ checkRequired("priorCardAuthenticationId", priorCardAuthenticationId),
checkRequired("purchaseAmount", purchaseAmount),
checkRequired("purchaseCurrency", purchaseCurrency),
checkRequired("realTimeDecisionId", realTimeDecisionId),
@@ -3120,6 +3176,7 @@ private constructor(
merchantCategoryCode()
merchantCountry()
merchantName()
+ priorCardAuthenticationId()
purchaseAmount()
purchaseCurrency()
realTimeDecisionId()
@@ -3165,6 +3222,7 @@ private constructor(
(if (merchantCategoryCode.asKnown().isPresent) 1 else 0) +
(if (merchantCountry.asKnown().isPresent) 1 else 0) +
(if (merchantName.asKnown().isPresent) 1 else 0) +
+ (if (priorCardAuthenticationId.asKnown().isPresent) 1 else 0) +
(if (purchaseAmount.asKnown().isPresent) 1 else 0) +
(if (purchaseCurrency.asKnown().isPresent) 1 else 0) +
(if (realTimeDecisionId.asKnown().isPresent) 1 else 0) +
@@ -5676,6 +5734,7 @@ private constructor(
merchantCategoryCode == other.merchantCategoryCode &&
merchantCountry == other.merchantCountry &&
merchantName == other.merchantName &&
+ priorCardAuthenticationId == other.priorCardAuthenticationId &&
purchaseAmount == other.purchaseAmount &&
purchaseCurrency == other.purchaseCurrency &&
realTimeDecisionId == other.realTimeDecisionId &&
@@ -5707,6 +5766,7 @@ private constructor(
merchantCategoryCode,
merchantCountry,
merchantName,
+ priorCardAuthenticationId,
purchaseAmount,
purchaseCurrency,
realTimeDecisionId,
@@ -5719,7 +5779,7 @@ private constructor(
override fun hashCode(): Int = hashCode
override fun toString() =
- "CardAuthentication{id=$id, billingAddressCity=$billingAddressCity, billingAddressCountry=$billingAddressCountry, billingAddressLine1=$billingAddressLine1, billingAddressLine2=$billingAddressLine2, billingAddressLine3=$billingAddressLine3, billingAddressPostalCode=$billingAddressPostalCode, billingAddressState=$billingAddressState, cardId=$cardId, cardPaymentId=$cardPaymentId, cardholderEmail=$cardholderEmail, cardholderName=$cardholderName, category=$category, challenge=$challenge, createdAt=$createdAt, denyReason=$denyReason, deviceChannel=$deviceChannel, merchantAcceptorId=$merchantAcceptorId, merchantCategoryCode=$merchantCategoryCode, merchantCountry=$merchantCountry, merchantName=$merchantName, purchaseAmount=$purchaseAmount, purchaseCurrency=$purchaseCurrency, realTimeDecisionId=$realTimeDecisionId, status=$status, type=$type, additionalProperties=$additionalProperties}"
+ "CardAuthentication{id=$id, billingAddressCity=$billingAddressCity, billingAddressCountry=$billingAddressCountry, billingAddressLine1=$billingAddressLine1, billingAddressLine2=$billingAddressLine2, billingAddressLine3=$billingAddressLine3, billingAddressPostalCode=$billingAddressPostalCode, billingAddressState=$billingAddressState, cardId=$cardId, cardPaymentId=$cardPaymentId, cardholderEmail=$cardholderEmail, cardholderName=$cardholderName, category=$category, challenge=$challenge, createdAt=$createdAt, denyReason=$denyReason, deviceChannel=$deviceChannel, merchantAcceptorId=$merchantAcceptorId, merchantCategoryCode=$merchantCategoryCode, merchantCountry=$merchantCountry, merchantName=$merchantName, priorCardAuthenticationId=$priorCardAuthenticationId, purchaseAmount=$purchaseAmount, purchaseCurrency=$purchaseCurrency, realTimeDecisionId=$realTimeDecisionId, status=$status, type=$type, additionalProperties=$additionalProperties}"
}
/**
diff --git a/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentListPageResponseTest.kt b/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentListPageResponseTest.kt
index 4b06f0d4d..380c9aa1d 100644
--- a/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentListPageResponseTest.kt
+++ b/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentListPageResponseTest.kt
@@ -117,6 +117,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -2216,6 +2217,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -4315,6 +4317,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -6414,6 +6417,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -8551,6 +8555,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -10532,6 +10537,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -12513,6 +12519,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -14494,6 +14501,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -16523,6 +16531,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -18622,6 +18631,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -20721,6 +20731,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -22820,6 +22831,7 @@ internal class CardPaymentListPageResponseTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
diff --git a/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentTest.kt b/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentTest.kt
index 3be20aa16..8430169f4 100644
--- a/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentTest.kt
+++ b/increase-java-core/src/test/kotlin/com/increase/api/models/cardpayments/CardPaymentTest.kt
@@ -104,6 +104,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -1963,6 +1964,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -3822,6 +3824,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -5681,6 +5684,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -7567,6 +7571,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -9236,6 +9241,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -10905,6 +10911,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -12574,6 +12581,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -14290,6 +14298,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -16149,6 +16158,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -18008,6 +18018,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
@@ -19867,6 +19878,7 @@ internal class CardPaymentTest {
.merchantCategoryCode("5734")
.merchantCountry("US")
.merchantName("AMAZON.COM")
+ .priorCardAuthenticationId(null)
.purchaseAmount(1000L)
.purchaseCurrency("USD")
.realTimeDecisionId(null)
diff --git a/scripts/mock b/scripts/mock
index 0b28f6ea2..bcf3b392b 100755
--- a/scripts/mock
+++ b/scripts/mock
@@ -21,11 +21,22 @@ echo "==> Starting mock server with URL ${URL}"
# Run prism mock on the given spec
if [ "$1" == "--daemon" ]; then
+ # Pre-install the package so the download doesn't eat into the startup timeout
+ npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism --version
+
npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log &
- # Wait for server to come online
+ # Wait for server to come online (max 30s)
echo -n "Waiting for server"
+ attempts=0
while ! grep -q "✖ fatal\|Prism is listening" ".prism.log" ; do
+ attempts=$((attempts + 1))
+ if [ "$attempts" -ge 300 ]; then
+ echo
+ echo "Timed out waiting for Prism server to start"
+ cat .prism.log
+ exit 1
+ fi
echo -n "."
sleep 0.1
done