From 954c75c5a35db11273ba7b3cf7b2d5481ab86287 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 15 Sep 2026 10:25:25 +0000 Subject: [PATCH 01/26] feat(stripe-projects): rename ServiceDetail.provider to match 0.40.0 wire Catalog services now expose `provider` instead of `provider_id`. Update the typed model, journal compare, hermetic catalog envelopes, and doctor pin. --- crates/stackless-integrations/src/providers/agentmail/api.rs | 2 +- .../stackless-integrations/src/providers/agentphone/number.rs | 2 +- .../src/providers/algolia/application.rs | 2 +- .../src/providers/amplitude/analytics.rs | 2 +- crates/stackless-integrations/src/providers/auth0/client.rs | 2 +- .../src/providers/base44_projects/app.rs | 2 +- .../src/providers/blaxel/agent_drive.rs | 2 +- crates/stackless-integrations/src/providers/blaxel/sandbox.rs | 2 +- .../src/providers/browserbase/project.rs | 2 +- crates/stackless-integrations/src/providers/chatbase/agent.rs | 2 +- .../stackless-integrations/src/providers/chroma/database.rs | 2 +- crates/stackless-integrations/src/providers/clerk.rs | 2 +- .../src/providers/clickhouse/cluster.rs | 2 +- .../src/providers/clickhouse/postgres.rs | 2 +- .../src/providers/cloudflare/browser_run.rs | 2 +- crates/stackless-integrations/src/providers/cloudflare/d1.rs | 2 +- .../src/providers/cloudflare/hyperdrive.rs | 2 +- crates/stackless-integrations/src/providers/cloudflare/kv.rs | 2 +- .../stackless-integrations/src/providers/cloudflare/queues.rs | 2 +- crates/stackless-integrations/src/providers/cloudflare/r2.rs | 2 +- .../src/providers/cloudflare/workers.rs | 2 +- .../src/providers/cloudflare/workers_ai.rs | 2 +- .../stackless-integrations/src/providers/composio/project.rs | 2 +- .../src/providers/customerio/workspace.rs | 2 +- .../src/providers/datadog/observability.rs | 2 +- .../stackless-integrations/src/providers/daytona/sandbox.rs | 2 +- crates/stackless-integrations/src/providers/depot/api.rs | 2 +- crates/stackless-integrations/src/providers/e2b/sandbox.rs | 2 +- crates/stackless-integrations/src/providers/elevenlabs/tts.rs | 2 +- crates/stackless-integrations/src/providers/exa/api.rs | 2 +- crates/stackless-integrations/src/providers/firecrawl/api.rs | 2 +- crates/stackless-integrations/src/providers/flyio/mpg.rs | 2 +- crates/stackless-integrations/src/providers/flyio/sprite.rs | 2 +- crates/stackless-integrations/src/providers/gitlab/project.rs | 2 +- .../stackless-integrations/src/providers/herenow/hosting.rs | 2 +- crates/stackless-integrations/src/providers/heygen/api.rs | 2 +- crates/stackless-integrations/src/providers/inngest/app.rs | 2 +- crates/stackless-integrations/src/providers/kernel/project.rs | 2 +- .../src/providers/laravel_cloud/application.rs | 2 +- .../src/providers/laravel_cloud/mysql.rs | 2 +- .../src/providers/laravel_cloud/valkey.rs | 2 +- .../stackless-integrations/src/providers/metronome/sandbox.rs | 2 +- .../src/providers/mixpanel/analytics.rs | 2 +- crates/stackless-integrations/src/providers/neon/postgres.rs | 2 +- crates/stackless-integrations/src/providers/openrouter/api.rs | 2 +- crates/stackless-integrations/src/providers/parallel/api.rs | 2 +- crates/stackless-integrations/src/providers/perplexity/api.rs | 2 +- .../stackless-integrations/src/providers/planetscale/mysql.rs | 2 +- .../src/providers/planetscale/postgresql.rs | 2 +- .../stackless-integrations/src/providers/postalform/mail.rs | 2 +- .../stackless-integrations/src/providers/posthog/analytics.rs | 2 +- .../stackless-integrations/src/providers/prisma/database.rs | 2 +- crates/stackless-integrations/src/providers/privy/app.rs | 2 +- .../stackless-integrations/src/providers/pydantic/logfire.rs | 2 +- crates/stackless-integrations/src/providers/railway/bucket.rs | 2 +- .../stackless-integrations/src/providers/railway/hosting.rs | 2 +- crates/stackless-integrations/src/providers/railway/mongo.rs | 2 +- .../stackless-integrations/src/providers/railway/postgres.rs | 2 +- crates/stackless-integrations/src/providers/railway/redis.rs | 2 +- .../src/providers/render_db/postgres.rs | 2 +- crates/stackless-integrations/src/providers/revenuecat/app.rs | 2 +- .../stackless-integrations/src/providers/runloop/sandbox.rs | 2 +- .../src/providers/schematic/schematic_environment.rs | 2 +- crates/stackless-integrations/src/providers/sentry/project.rs | 2 +- crates/stackless-integrations/src/providers/sentry/seer.rs | 2 +- crates/stackless-integrations/src/providers/shopify/store.rs | 2 +- crates/stackless-integrations/src/providers/steel/browser.rs | 2 +- .../stackless-integrations/src/providers/supabase/project.rs | 2 +- .../src/providers/supermemory/memory.rs | 2 +- crates/stackless-integrations/src/providers/tabstack/api.rs | 2 +- crates/stackless-integrations/src/providers/turso/database.rs | 2 +- crates/stackless-integrations/src/providers/twilio/email.rs | 2 +- crates/stackless-integrations/src/providers/upstash/qstash.rs | 2 +- crates/stackless-integrations/src/providers/upstash/redis.rs | 2 +- crates/stackless-integrations/src/providers/upstash/search.rs | 2 +- crates/stackless-integrations/src/providers/upstash/vector.rs | 2 +- crates/stackless-integrations/src/providers/wix/headless.rs | 2 +- .../src/providers/wordpress_com/site.rs | 2 +- crates/stackless-integrations/src/providers/workos/auth.rs | 2 +- crates/stackless-stripe-projects/src/catalog.rs | 2 +- crates/stackless-stripe-projects/src/catalog/tests.rs | 2 +- crates/stackless-stripe-projects/src/catalog/verify.rs | 4 ++-- crates/stackless-stripe-projects/src/journal.rs | 4 ++-- crates/stackless-stripe-projects/src/stripe.rs | 4 ++-- crates/stackless-stripe-projects/src/surface.rs | 2 +- crates/stackless/src/authoring.rs | 2 +- 86 files changed, 89 insertions(+), 89 deletions(-) diff --git a/crates/stackless-integrations/src/providers/agentmail/api.rs b/crates/stackless-integrations/src/providers/agentmail/api.rs index 5e71dbfa..8bcc1ddd 100644 --- a/crates/stackless-integrations/src/providers/agentmail/api.rs +++ b/crates/stackless-integrations/src/providers/agentmail/api.rs @@ -74,7 +74,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_agentmail","provider_name":"AgentMail","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_agentmail","provider_name":"AgentMail","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/agentphone/number.rs b/crates/stackless-integrations/src/providers/agentphone/number.rs index 92f623d3..663412e6 100644 --- a/crates/stackless-integrations/src/providers/agentphone/number.rs +++ b/crates/stackless-integrations/src/providers/agentphone/number.rs @@ -109,7 +109,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_number","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_agentphone","provider_name":"AgentPhone","service_id":"number","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"agent_name":{"description":"Name for the AI agent","type":"string"},"area_code":{"description":"Preferred 3-digit area code (optional)","type":"string"},"country":{"description":"Country for the phone number","enum":["US","CA"],"type":"string"}},"required":["agent_name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_number","object":"v2.provisioning.provider_service_detail","provider":"prvdr_agentphone","provider_name":"AgentPhone","service_id":"number","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"agent_name":{"description":"Name for the AI agent","type":"string"},"area_code":{"description":"Preferred 3-digit area code (optional)","type":"string"},"country":{"description":"Country for the phone number","enum":["US","CA"],"type":"string"}},"required":["agent_name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/algolia/application.rs b/crates/stackless-integrations/src/providers/algolia/application.rs index daec46d8..2a2fc669 100644 --- a/crates/stackless-integrations/src/providers/algolia/application.rs +++ b/crates/stackless-integrations/src/providers/algolia/application.rs @@ -113,7 +113,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_application","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_algolia","provider_name":"Algolia","service_id":"application","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid","paid_pricing":[{"type":"free","configuration":{"accept_terms":"test-accept_terms","plan":"free"}}]},"configuration_schema":{"properties":{"accept_terms":{"type":"string"},"name":{"description":"Name of your Algolia application","type":"string"},"region":{"description":"Where your Algolia application will be created. This cannot be changed after provisioning.","enum":["EU West","US Central","US East","US West","United Kingdom"],"type":"string"}},"required":["name","region","accept_terms"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_application","object":"v2.provisioning.provider_service_detail","provider":"prvdr_algolia","provider_name":"Algolia","service_id":"application","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid","paid_pricing":[{"type":"free","configuration":{"accept_terms":"test-accept_terms","plan":"free"}}]},"configuration_schema":{"properties":{"accept_terms":{"type":"string"},"name":{"description":"Name of your Algolia application","type":"string"},"region":{"description":"Where your Algolia application will be created. This cannot be changed after provisioning.","enum":["EU West","US Central","US East","US West","United Kingdom"],"type":"string"}},"required":["name","region","accept_terms"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/amplitude/analytics.rs b/crates/stackless-integrations/src/providers/amplitude/analytics.rs index 402eff7b..843c28ca 100644 --- a/crates/stackless-integrations/src/providers/amplitude/analytics.rs +++ b/crates/stackless-integrations/src/providers/amplitude/analytics.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_amplitude","provider_name":"Amplitude","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider":"prvdr_amplitude","provider_name":"Amplitude","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/auth0/client.rs b/crates/stackless-integrations/src/providers/auth0/client.rs index dd2c9830..b9beafcf 100644 --- a/crates/stackless-integrations/src/providers/auth0/client.rs +++ b/crates/stackless-integrations/src/providers/auth0/client.rs @@ -91,7 +91,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_client","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_auth0","provider_name":"Auth0","service_id":"client","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"minLength":1,"type":"string"}},"required":["name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_client","object":"v2.provisioning.provider_service_detail","provider":"prvdr_auth0","provider_name":"Auth0","service_id":"client","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"minLength":1,"type":"string"}},"required":["name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/base44_projects/app.rs b/crates/stackless-integrations/src/providers/base44_projects/app.rs index 6c99f4db..d03f1070 100644 --- a/crates/stackless-integrations/src/providers/base44_projects/app.rs +++ b/crates/stackless-integrations/src/providers/base44_projects/app.rs @@ -93,7 +93,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_base44_projects","provider_name":"Base44_Projects","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"app_name":{"description":"Human-readable name for the Base44 app. Shown in the Base44 dashboard.","maxLength":50,"minLength":1,"title":"App name","type":"string"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider":"prvdr_base44_projects","provider_name":"Base44_Projects","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"app_name":{"description":"Human-readable name for the Base44 app. Shown in the Base44 dashboard.","maxLength":50,"minLength":1,"title":"App name","type":"string"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/blaxel/agent_drive.rs b/crates/stackless-integrations/src/providers/blaxel/agent_drive.rs index e51e6083..98fe73b5 100644 --- a/crates/stackless-integrations/src/providers/blaxel/agent_drive.rs +++ b/crates/stackless-integrations/src/providers/blaxel/agent_drive.rs @@ -99,7 +99,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_agent_drive","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_blaxel","provider_name":"Blaxel","service_id":"agent-drive","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"display_name":{"description":"Human-readable display name shown in the Blaxel dashboard.","type":"string"},"region":{"description":"Region where the drive is created.","enum":["us-was-1"],"type":"string"},"size":{"description":"Drive size in GB.","enum":[1,5,10,50,100],"type":"integer"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_agent_drive","object":"v2.provisioning.provider_service_detail","provider":"prvdr_blaxel","provider_name":"Blaxel","service_id":"agent-drive","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"display_name":{"description":"Human-readable display name shown in the Blaxel dashboard.","type":"string"},"region":{"description":"Region where the drive is created.","enum":["us-was-1"],"type":"string"},"size":{"description":"Drive size in GB.","enum":[1,5,10,50,100],"type":"integer"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/blaxel/sandbox.rs b/crates/stackless-integrations/src/providers/blaxel/sandbox.rs index f560f5fb..1c2574f3 100644 --- a/crates/stackless-integrations/src/providers/blaxel/sandbox.rs +++ b/crates/stackless-integrations/src/providers/blaxel/sandbox.rs @@ -113,7 +113,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_blaxel","provider_name":"Blaxel","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"display_name":{"description":"Human-readable display name shown in the Blaxel dashboard.","type":"string"},"image":{"description":"Base image for the sandbox.","enum":["blaxel/base-image:latest","blaxel/ts-app:latest","blaxel/node:latest","blaxel/py-app:latest","blaxel/nextjs:latest","blaxel/vite:latest","blaxel/expo:latest"],"type":"string"},"memory":{"description":"Memory in MB. CPU is derived automatically.","enum":[1024,2048,4096,8192,16384],"type":"integer"},"region":{"description":"Region where the sandbox runs.","enum":["us-pdx-1","us-was-1","eu-lon-1","eu-fra-1"],"type":"string"},"ttl":{"description":"Max-age TTL from creation. Sandbox is deleted after this duration.","enum":["24h","7d","30d"],"type":"string"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider":"prvdr_blaxel","provider_name":"Blaxel","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"display_name":{"description":"Human-readable display name shown in the Blaxel dashboard.","type":"string"},"image":{"description":"Base image for the sandbox.","enum":["blaxel/base-image:latest","blaxel/ts-app:latest","blaxel/node:latest","blaxel/py-app:latest","blaxel/nextjs:latest","blaxel/vite:latest","blaxel/expo:latest"],"type":"string"},"memory":{"description":"Memory in MB. CPU is derived automatically.","enum":[1024,2048,4096,8192,16384],"type":"integer"},"region":{"description":"Region where the sandbox runs.","enum":["us-pdx-1","us-was-1","eu-lon-1","eu-fra-1"],"type":"string"},"ttl":{"description":"Max-age TTL from creation. Sandbox is deleted after this duration.","enum":["24h","7d","30d"],"type":"string"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/browserbase/project.rs b/crates/stackless-integrations/src/providers/browserbase/project.rs index 18f85b3a..80787449 100644 --- a/crates/stackless-integrations/src/providers/browserbase/project.rs +++ b/crates/stackless-integrations/src/providers/browserbase/project.rs @@ -79,7 +79,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_browserbase","provider_name":"Browserbase","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_browserbase","provider_name":"Browserbase","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/chatbase/agent.rs b/crates/stackless-integrations/src/providers/chatbase/agent.rs index 9cc0ae77..0a491d28 100644 --- a/crates/stackless-integrations/src/providers/chatbase/agent.rs +++ b/crates/stackless-integrations/src/providers/chatbase/agent.rs @@ -92,7 +92,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_agent","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_chatbase","provider_name":"Chatbase","service_id":"agent","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object","required":["name"]}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_agent","object":"v2.provisioning.provider_service_detail","provider":"prvdr_chatbase","provider_name":"Chatbase","service_id":"agent","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object","required":["name"]}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/chroma/database.rs b/crates/stackless-integrations/src/providers/chroma/database.rs index 35e0d121..17a4970a 100644 --- a/crates/stackless-integrations/src/providers/chroma/database.rs +++ b/crates/stackless-integrations/src/providers/chroma/database.rs @@ -89,7 +89,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_chroma","provider_name":"Chroma","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Name for the database (defaults to 'agent'). Must be at least 3 characters, using only letters, numbers, underscores, and hyphens.","minLength":3,"type":"string"}},"required":["name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider":"prvdr_chroma","provider_name":"Chroma","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Name for the database (defaults to 'agent'). Must be at least 3 characters, using only letters, numbers, underscores, and hyphens.","minLength":3,"type":"string"}},"required":["name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/clerk.rs b/crates/stackless-integrations/src/providers/clerk.rs index 406418b5..db3c7f33 100644 --- a/crates/stackless-integrations/src/providers/clerk.rs +++ b/crates/stackless-integrations/src/providers/clerk.rs @@ -481,7 +481,7 @@ mod tests { const CLERK_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-12T00:00:00Z","services":[{ "id":"prvsvc_clerk","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_clerk","provider_name":"Clerk","service_id":"auth", + "provider":"prvdr_clerk","provider_name":"Clerk","service_id":"auth", "categories":["auth"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","required":["app_name"],"additionalProperties":false, diff --git a/crates/stackless-integrations/src/providers/clickhouse/cluster.rs b/crates/stackless-integrations/src/providers/clickhouse/cluster.rs index 3d4e8fd2..a9f95906 100644 --- a/crates/stackless-integrations/src/providers/clickhouse/cluster.rs +++ b/crates/stackless-integrations/src/providers/clickhouse/cluster.rs @@ -157,7 +157,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_clickhouse","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_clickhouse","provider_name":"ClickHouse","service_id":"clickhouse","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"idleScaling":{"description":"When true, compute scales to zero after idleTimeoutMinutes of inactivity and bills $0/hour during idle periods. Defaults to false when omitted.","type":"boolean"},"idleTimeoutMinutes":{"description":"Minutes of inactivity before idle scale-down triggers. Only meaningful when idleScaling=true. Defaults to 60 when omitted.","maximum":1440,"minimum":5,"type":"integer"},"maxReplicaMemoryGb":{"default":12,"description":"Autoscale upper bound: memory per replica, in GiB. Must be \u2265 minReplicaMemoryGb (enforced server-side). Accepts 8\u2013356 GiB per replica in steps of 4; the maximum drops to 236 GiB on AWS regions due to UI caps.","maximum":356,"minimum":8,"multipleOf":4,"type":"integer"},"minReplicaMemoryGb":{"default":12,"description":"Autoscale lower bound: memory per replica, in GiB. Must be \u2264 maxReplicaMemoryGb (enforced server-side). Accepts 8\u2013356 GiB per replica in steps of 4; the maximum drops to 236 GiB on AWS regions due to UI caps.","maximum":356,"minimum":8,"multipleOf":4,"type":"integer"},"name":{"description":"Human-readable name for the ClickHouse service.","maxLength":64,"minLength":1,"type":"string"},"numReplicas":{"default":2,"description":"Number of replicas (HA). Defaults to 2 when omitted. Each replica meters compute independently, so total compute cost scales linearly with numReplicas.","maximum":100,"minimum":1,"type":"integer"},"region":{"description":"Cloud provider and region to host the service in, as a single cloud-qualified id (e.g. aws-us-east-1, gcp-us-east1, azure-eastus). The cloud provider is encoded in the value, so no separate field is needed. Pricing varies per region.","enum":["aws-us-west-2","aws-us-east-2","aws-us-east-1","aws-eu-west-1","aws-eu-west-2","aws-eu-central-1","aws-ap-southeast-1","aws-ap-southeast-2","aws-ap-northeast-1","aws-ap-south-1","aws-ap-northeast-2","aws-il-central-1","gcp-us-east1","gcp-us-central1","gcp-europe-west2","gcp-europe-west4","gcp-asia-southeast1","gcp-asia-northeast1","azure-germanywestcentral","azure-eastus2","azure-westus3"],"type":"string"}},"required":["name","region","minReplicaMemoryGb","maxReplicaMemoryGb"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_clickhouse","object":"v2.provisioning.provider_service_detail","provider":"prvdr_clickhouse","provider_name":"ClickHouse","service_id":"clickhouse","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"idleScaling":{"description":"When true, compute scales to zero after idleTimeoutMinutes of inactivity and bills $0/hour during idle periods. Defaults to false when omitted.","type":"boolean"},"idleTimeoutMinutes":{"description":"Minutes of inactivity before idle scale-down triggers. Only meaningful when idleScaling=true. Defaults to 60 when omitted.","maximum":1440,"minimum":5,"type":"integer"},"maxReplicaMemoryGb":{"default":12,"description":"Autoscale upper bound: memory per replica, in GiB. Must be \u2265 minReplicaMemoryGb (enforced server-side). Accepts 8\u2013356 GiB per replica in steps of 4; the maximum drops to 236 GiB on AWS regions due to UI caps.","maximum":356,"minimum":8,"multipleOf":4,"type":"integer"},"minReplicaMemoryGb":{"default":12,"description":"Autoscale lower bound: memory per replica, in GiB. Must be \u2264 maxReplicaMemoryGb (enforced server-side). Accepts 8\u2013356 GiB per replica in steps of 4; the maximum drops to 236 GiB on AWS regions due to UI caps.","maximum":356,"minimum":8,"multipleOf":4,"type":"integer"},"name":{"description":"Human-readable name for the ClickHouse service.","maxLength":64,"minLength":1,"type":"string"},"numReplicas":{"default":2,"description":"Number of replicas (HA). Defaults to 2 when omitted. Each replica meters compute independently, so total compute cost scales linearly with numReplicas.","maximum":100,"minimum":1,"type":"integer"},"region":{"description":"Cloud provider and region to host the service in, as a single cloud-qualified id (e.g. aws-us-east-1, gcp-us-east1, azure-eastus). The cloud provider is encoded in the value, so no separate field is needed. Pricing varies per region.","enum":["aws-us-west-2","aws-us-east-2","aws-us-east-1","aws-eu-west-1","aws-eu-west-2","aws-eu-central-1","aws-ap-southeast-1","aws-ap-southeast-2","aws-ap-northeast-1","aws-ap-south-1","aws-ap-northeast-2","aws-il-central-1","gcp-us-east1","gcp-us-central1","gcp-europe-west2","gcp-europe-west4","gcp-asia-southeast1","gcp-asia-northeast1","azure-germanywestcentral","azure-eastus2","azure-westus3"],"type":"string"}},"required":["name","region","minReplicaMemoryGb","maxReplicaMemoryGb"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/clickhouse/postgres.rs b/crates/stackless-integrations/src/providers/clickhouse/postgres.rs index 32d13d1d..26f31497 100644 --- a/crates/stackless-integrations/src/providers/clickhouse/postgres.rs +++ b/crates/stackless-integrations/src/providers/clickhouse/postgres.rs @@ -129,7 +129,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_clickhouse","provider_name":"ClickHouse","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"haType":{"description":"High-availability mode. Defaults to \"none\" when omitted.","enum":["none","async","sync"],"type":"string"},"name":{"description":"Human-readable name for the Postgres instance.","maxLength":50,"minLength":1,"type":"string"},"postgresVersion":{"description":"Major Postgres version. Defaults to the latest available when omitted.","enum":["18","17"],"type":"string"},"region":{"description":"Cloud provider and region to host the service in, as a single cloud-qualified id (e.g. aws-us-east-1). The cloud provider is encoded in the value, so no separate field is needed. Pricing varies per region.","enum":["aws-ap-northeast-1","aws-ap-northeast-2","aws-ap-south-1","aws-ap-southeast-1","aws-ap-southeast-2","aws-eu-central-1","aws-eu-west-1","aws-eu-west-2","aws-us-east-1","aws-us-east-2","aws-us-west-2"],"type":"string"},"size":{"description":"VM instance type determining CPU, memory, and storage.","enum":["c6gd.large","c6gd.xlarge","c6gd.2xlarge","c6gd.4xlarge","c6gd.8xlarge","c6gd.16xlarge","i7i.large","i7i.xlarge","i7i.2xlarge","i7i.4xlarge","i7i.8xlarge","i7i.12xlarge","i7i.16xlarge","i7i.24xlarge","i7ie.large","i7ie.xlarge","i7ie.2xlarge","i7ie.3xlarge","i7ie.6xlarge","i7ie.12xlarge","i7ie.18xlarge","i7ie.24xlarge","i8g.large","i8g.xlarge","i8g.2xlarge","i8g.4xlarge","i8g.8xlarge","i8g.16xlarge","i8g.24xlarge","i8ge.large","i8ge.xlarge","i8ge.2xlarge","i8ge.3xlarge","i8ge.6xlarge","i8ge.12xlarge","i8ge.18xlarge","i8ge.24xlarge","m6gd.large","m6gd.xlarge","m6gd.2xlarge","m6gd.4xlarge","m6gd.8xlarge","m6gd.16xlarge","m6id.large","m6id.xlarge","m6id.2xlarge","m6id.4xlarge","m6id.8xlarge","m6id.16xlarge","m8gd.large","m8gd.xlarge","m8gd.2xlarge","m8gd.4xlarge","m8gd.8xlarge","m8gd.16xlarge","r6gd.medium","r6gd.large","r6gd.xlarge","r6gd.2xlarge","r6gd.4xlarge","r6gd.8xlarge","r6gd.12xlarge","r6gd.16xlarge","r6id.large","r6id.xlarge","r6id.2xlarge","r6id.4xlarge","r6id.8xlarge","r6id.12xlarge","r6id.16xlarge","r6id.24xlarge","r6id.32xlarge","r8gd.medium","r8gd.large","r8gd.xlarge","r8gd.2xlarge","r8gd.4xlarge","r8gd.8xlarge","r8gd.12xlarge","r8gd.16xlarge","r8gd.24xlarge","r8gd.48xlarge"],"type":"string"}},"required":["name","region","size"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider":"prvdr_clickhouse","provider_name":"ClickHouse","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"additionalProperties":false,"properties":{"haType":{"description":"High-availability mode. Defaults to \"none\" when omitted.","enum":["none","async","sync"],"type":"string"},"name":{"description":"Human-readable name for the Postgres instance.","maxLength":50,"minLength":1,"type":"string"},"postgresVersion":{"description":"Major Postgres version. Defaults to the latest available when omitted.","enum":["18","17"],"type":"string"},"region":{"description":"Cloud provider and region to host the service in, as a single cloud-qualified id (e.g. aws-us-east-1). The cloud provider is encoded in the value, so no separate field is needed. Pricing varies per region.","enum":["aws-ap-northeast-1","aws-ap-northeast-2","aws-ap-south-1","aws-ap-southeast-1","aws-ap-southeast-2","aws-eu-central-1","aws-eu-west-1","aws-eu-west-2","aws-us-east-1","aws-us-east-2","aws-us-west-2"],"type":"string"},"size":{"description":"VM instance type determining CPU, memory, and storage.","enum":["c6gd.large","c6gd.xlarge","c6gd.2xlarge","c6gd.4xlarge","c6gd.8xlarge","c6gd.16xlarge","i7i.large","i7i.xlarge","i7i.2xlarge","i7i.4xlarge","i7i.8xlarge","i7i.12xlarge","i7i.16xlarge","i7i.24xlarge","i7ie.large","i7ie.xlarge","i7ie.2xlarge","i7ie.3xlarge","i7ie.6xlarge","i7ie.12xlarge","i7ie.18xlarge","i7ie.24xlarge","i8g.large","i8g.xlarge","i8g.2xlarge","i8g.4xlarge","i8g.8xlarge","i8g.16xlarge","i8g.24xlarge","i8ge.large","i8ge.xlarge","i8ge.2xlarge","i8ge.3xlarge","i8ge.6xlarge","i8ge.12xlarge","i8ge.18xlarge","i8ge.24xlarge","m6gd.large","m6gd.xlarge","m6gd.2xlarge","m6gd.4xlarge","m6gd.8xlarge","m6gd.16xlarge","m6id.large","m6id.xlarge","m6id.2xlarge","m6id.4xlarge","m6id.8xlarge","m6id.16xlarge","m8gd.large","m8gd.xlarge","m8gd.2xlarge","m8gd.4xlarge","m8gd.8xlarge","m8gd.16xlarge","r6gd.medium","r6gd.large","r6gd.xlarge","r6gd.2xlarge","r6gd.4xlarge","r6gd.8xlarge","r6gd.12xlarge","r6gd.16xlarge","r6id.large","r6id.xlarge","r6id.2xlarge","r6id.4xlarge","r6id.8xlarge","r6id.12xlarge","r6id.16xlarge","r6id.24xlarge","r6id.32xlarge","r8gd.medium","r8gd.large","r8gd.xlarge","r8gd.2xlarge","r8gd.4xlarge","r8gd.8xlarge","r8gd.12xlarge","r8gd.16xlarge","r8gd.24xlarge","r8gd.48xlarge"],"type":"string"}},"required":["name","region","size"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/cloudflare/browser_run.rs b/crates/stackless-integrations/src/providers/cloudflare/browser_run.rs index 0a45f857..55f035a2 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/browser_run.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/browser_run.rs @@ -85,7 +85,7 @@ mod tests { const CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_br","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"browser-run", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"browser-run", "categories":["compute"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","additionalProperties":false,"properties":{}} diff --git a/crates/stackless-integrations/src/providers/cloudflare/d1.rs b/crates/stackless-integrations/src/providers/cloudflare/d1.rs index cf6b3208..02be5e7b 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/d1.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/d1.rs @@ -98,7 +98,7 @@ mod tests { const D1_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_d1","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"d1", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"d1", "categories":["database"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","required":["name"],"additionalProperties":false, diff --git a/crates/stackless-integrations/src/providers/cloudflare/hyperdrive.rs b/crates/stackless-integrations/src/providers/cloudflare/hyperdrive.rs index 6ddb962a..8e8280ca 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/hyperdrive.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/hyperdrive.rs @@ -137,7 +137,7 @@ mod tests { const HYPERDRIVE_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_hd","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"hyperdrive", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"hyperdrive", "categories":["database"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object", diff --git a/crates/stackless-integrations/src/providers/cloudflare/kv.rs b/crates/stackless-integrations/src/providers/cloudflare/kv.rs index 6a55f2a5..6af96e5e 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/kv.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/kv.rs @@ -93,7 +93,7 @@ mod tests { const KV_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_kv","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"kv", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"kv", "categories":["cache"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","required":["title"],"additionalProperties":false, diff --git a/crates/stackless-integrations/src/providers/cloudflare/queues.rs b/crates/stackless-integrations/src/providers/cloudflare/queues.rs index fd651542..59c7273c 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/queues.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/queues.rs @@ -104,7 +104,7 @@ mod tests { const QUEUES_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_queues","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"queues", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"queues", "categories":["queue"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","required":["queue_name"],"additionalProperties":false, diff --git a/crates/stackless-integrations/src/providers/cloudflare/r2.rs b/crates/stackless-integrations/src/providers/cloudflare/r2.rs index c7b3a620..f4136bfc 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/r2.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/r2.rs @@ -119,7 +119,7 @@ mod tests { const R2_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_r2","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"r2:bucket", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"r2:bucket", "categories":["storage"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true, "pricing":{"type":"paid","paid_pricing":[{"type":"freeform","freeform":"usage-based"}]}, diff --git a/crates/stackless-integrations/src/providers/cloudflare/workers.rs b/crates/stackless-integrations/src/providers/cloudflare/workers.rs index b017ff6b..090155c6 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/workers.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/workers.rs @@ -90,7 +90,7 @@ mod tests { const WORKERS_CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_workers","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"workers", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"workers", "categories":["compute"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","additionalProperties":false,"properties":{}} diff --git a/crates/stackless-integrations/src/providers/cloudflare/workers_ai.rs b/crates/stackless-integrations/src/providers/cloudflare/workers_ai.rs index 200fbe22..a02415a9 100644 --- a/crates/stackless-integrations/src/providers/cloudflare/workers_ai.rs +++ b/crates/stackless-integrations/src/providers/cloudflare/workers_ai.rs @@ -85,7 +85,7 @@ mod tests { const CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{ "last_updated":"2026-06-16T00:00:00Z","services":[{ "id":"prvsvc_wai","object":"v2.provisioning.provider_service_detail", - "provider_id":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"workers-ai", + "provider":"prvdr_cloudflare","provider_name":"Cloudflare","service_id":"workers-ai", "categories":["compute"],"kind":"deployable","scope":"project","availability":"available", "development":false,"livemode":true,"pricing":{"type":"component"}, "configuration_schema":{"type":"object","additionalProperties":false,"properties":{}} diff --git a/crates/stackless-integrations/src/providers/composio/project.rs b/crates/stackless-integrations/src/providers/composio/project.rs index 2f4720c4..37825782 100644 --- a/crates/stackless-integrations/src/providers/composio/project.rs +++ b/crates/stackless-integrations/src/providers/composio/project.rs @@ -97,7 +97,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_composio","provider_name":"Composio","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_composio","provider_name":"Composio","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/customerio/workspace.rs b/crates/stackless-integrations/src/providers/customerio/workspace.rs index 38c6b42f..02310a5f 100644 --- a/crates/stackless-integrations/src/providers/customerio/workspace.rs +++ b/crates/stackless-integrations/src/providers/customerio/workspace.rs @@ -88,7 +88,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_workspace","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_customerio","provider_name":"customerio","service_id":"workspace","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_workspace","object":"v2.provisioning.provider_service_detail","provider":"prvdr_customerio","provider_name":"customerio","service_id":"workspace","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/datadog/observability.rs b/crates/stackless-integrations/src/providers/datadog/observability.rs index f6c73ebc..22530cc9 100644 --- a/crates/stackless-integrations/src/providers/datadog/observability.rs +++ b/crates/stackless-integrations/src/providers/datadog/observability.rs @@ -80,7 +80,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_61V3GqrHb9AUATMHV5U6q","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_61V2Z15R0ek7uaOxE57Z2","provider_name":"Datadog","service_id":"observability","categories":["observability"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_61V3GqrHb9AUATMHV5U6q","object":"v2.provisioning.provider_service_detail","provider":"prvdr_61V2Z15R0ek7uaOxE57Z2","provider_name":"Datadog","service_id":"observability","categories":["observability"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/daytona/sandbox.rs b/crates/stackless-integrations/src/providers/daytona/sandbox.rs index e17252f3..2d1be52f 100644 --- a/crates/stackless-integrations/src/providers/daytona/sandbox.rs +++ b/crates/stackless-integrations/src/providers/daytona/sandbox.rs @@ -153,7 +153,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_daytona","provider_name":"Daytona","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"auto_archive_interval":{"minimum":0,"type":"integer"},"auto_delete_interval":{"description":"Negative values disable auto-delete.","type":"integer"},"auto_stop_interval":{"minimum":0,"type":"integer"},"cpu":{"minimum":1,"type":"integer"},"disk":{"description":"Disk in GiB.","minimum":1,"type":"integer"},"env":{"description":"Environment variables as comma-separated KEY=value pairs (e.g., FOO=bar,BAZ=qux).","type":"string"},"ephemeral":{"description":"If true, sandbox is deleted immediately upon stopping.","type":"boolean"},"image":{"description":"Docker image to use (e.g., debian:12.9). Mutually exclusive with snapshot.","type":"string"},"labels":{"description":"Labels as comma-separated KEY=value pairs (e.g., team=backend,env=dev).","type":"string"},"language":{"description":"Programming language for code execution.","enum":["python","typescript","javascript"],"type":"string"},"memory":{"description":"Memory in GiB.","minimum":1,"type":"integer"},"name":{"description":"Optional display name for the Daytona sandbox.","type":"string"},"network_allow_list":{"description":"Comma-separated CIDR allow list.","type":"string"},"network_block_all":{"description":"Block all egress from the sandbox.","type":"boolean"},"public":{"description":"Expose HTTP preview publicly.","type":"boolean"},"snapshot":{"description":"Optional Daytona snapshot ID or name to restore.","type":"string"},"target":{"description":"Daytona target region.","enum":["us","eu"],"type":"string"},"user":{"description":"User value sent to Daytona for the sandbox.","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider":"prvdr_daytona","provider_name":"Daytona","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"auto_archive_interval":{"minimum":0,"type":"integer"},"auto_delete_interval":{"description":"Negative values disable auto-delete.","type":"integer"},"auto_stop_interval":{"minimum":0,"type":"integer"},"cpu":{"minimum":1,"type":"integer"},"disk":{"description":"Disk in GiB.","minimum":1,"type":"integer"},"env":{"description":"Environment variables as comma-separated KEY=value pairs (e.g., FOO=bar,BAZ=qux).","type":"string"},"ephemeral":{"description":"If true, sandbox is deleted immediately upon stopping.","type":"boolean"},"image":{"description":"Docker image to use (e.g., debian:12.9). Mutually exclusive with snapshot.","type":"string"},"labels":{"description":"Labels as comma-separated KEY=value pairs (e.g., team=backend,env=dev).","type":"string"},"language":{"description":"Programming language for code execution.","enum":["python","typescript","javascript"],"type":"string"},"memory":{"description":"Memory in GiB.","minimum":1,"type":"integer"},"name":{"description":"Optional display name for the Daytona sandbox.","type":"string"},"network_allow_list":{"description":"Comma-separated CIDR allow list.","type":"string"},"network_block_all":{"description":"Block all egress from the sandbox.","type":"boolean"},"public":{"description":"Expose HTTP preview publicly.","type":"boolean"},"snapshot":{"description":"Optional Daytona snapshot ID or name to restore.","type":"string"},"target":{"description":"Daytona target region.","enum":["us","eu"],"type":"string"},"user":{"description":"User value sent to Daytona for the sandbox.","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/depot/api.rs b/crates/stackless-integrations/src/providers/depot/api.rs index 24785f13..3de6a6ba 100644 --- a/crates/stackless-integrations/src/providers/depot/api.rs +++ b/crates/stackless-integrations/src/providers/depot/api.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_depot","provider_name":"Depot","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_depot","provider_name":"Depot","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/e2b/sandbox.rs b/crates/stackless-integrations/src/providers/e2b/sandbox.rs index 1e3375b7..a7ac059f 100644 --- a/crates/stackless-integrations/src/providers/e2b/sandbox.rs +++ b/crates/stackless-integrations/src/providers/e2b/sandbox.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_e2b","provider_name":"E2B","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider":"prvdr_e2b","provider_name":"E2B","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/elevenlabs/tts.rs b/crates/stackless-integrations/src/providers/elevenlabs/tts.rs index 68a2f545..8e7402d8 100644 --- a/crates/stackless-integrations/src/providers/elevenlabs/tts.rs +++ b/crates/stackless-integrations/src/providers/elevenlabs/tts.rs @@ -74,7 +74,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_tts","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_elevenlabs","provider_name":"ElevenLabs","service_id":"tts","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_tts","object":"v2.provisioning.provider_service_detail","provider":"prvdr_elevenlabs","provider_name":"ElevenLabs","service_id":"tts","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/exa/api.rs b/crates/stackless-integrations/src/providers/exa/api.rs index 89e3ec1b..4a376e38 100644 --- a/crates/stackless-integrations/src/providers/exa/api.rs +++ b/crates/stackless-integrations/src/providers/exa/api.rs @@ -74,7 +74,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_exa","provider_name":"Exa","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_exa","provider_name":"Exa","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/firecrawl/api.rs b/crates/stackless-integrations/src/providers/firecrawl/api.rs index da431873..477cb6e6 100644 --- a/crates/stackless-integrations/src/providers/firecrawl/api.rs +++ b/crates/stackless-integrations/src/providers/firecrawl/api.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_firecrawl","provider_name":"Firecrawl","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_firecrawl","provider_name":"Firecrawl","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/flyio/mpg.rs b/crates/stackless-integrations/src/providers/flyio/mpg.rs index b9994d13..d19b259b 100644 --- a/crates/stackless-integrations/src/providers/flyio/mpg.rs +++ b/crates/stackless-integrations/src/providers/flyio/mpg.rs @@ -105,7 +105,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mpg","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_flyio","provider_name":"Flyio","service_id":"mpg","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Cluster name","maxLength":63,"minLength":5,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"},"plan":{"enum":["basic","starter","launch","scale","Performance"],"type":"string"},"region":{"enum":["ams","dfw","fra","gru","iad","lax","lhr","nrt","ord","sin","sjc","syd","yyz"],"type":"string"}},"required":["name","region","plan"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mpg","object":"v2.provisioning.provider_service_detail","provider":"prvdr_flyio","provider_name":"Flyio","service_id":"mpg","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Cluster name","maxLength":63,"minLength":5,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"},"plan":{"enum":["basic","starter","launch","scale","Performance"],"type":"string"},"region":{"enum":["ams","dfw","fra","gru","iad","lax","lhr","nrt","ord","sin","sjc","syd","yyz"],"type":"string"}},"required":["name","region","plan"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/flyio/sprite.rs b/crates/stackless-integrations/src/providers/flyio/sprite.rs index 48311494..caea828e 100644 --- a/crates/stackless-integrations/src/providers/flyio/sprite.rs +++ b/crates/stackless-integrations/src/providers/flyio/sprite.rs @@ -91,7 +91,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sprite","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_flyio","provider_name":"Flyio","service_id":"sprite","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Sprite name","maxLength":63,"minLength":5,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"}},"required":["name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sprite","object":"v2.provisioning.provider_service_detail","provider":"prvdr_flyio","provider_name":"Flyio","service_id":"sprite","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Sprite name","maxLength":63,"minLength":5,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"}},"required":["name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/gitlab/project.rs b/crates/stackless-integrations/src/providers/gitlab/project.rs index f6ad8168..fb4f4e28 100644 --- a/crates/stackless-integrations/src/providers/gitlab/project.rs +++ b/crates/stackless-integrations/src/providers/gitlab/project.rs @@ -105,7 +105,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_gitlab","provider_name":"GitLab","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"properties":{"name":{"description":"Name of the project","type":"string"},"visibility":{"description":"Visibility level of the project","enum":["private","public"],"type":"string"}},"required":["name","visibility"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_gitlab","provider_name":"GitLab","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"properties":{"name":{"description":"Name of the project","type":"string"},"visibility":{"description":"Visibility level of the project","enum":["private","public"],"type":"string"}},"required":["name","visibility"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/herenow/hosting.rs b/crates/stackless-integrations/src/providers/herenow/hosting.rs index 07671d8e..bb04ecc0 100644 --- a/crates/stackless-integrations/src/providers/herenow/hosting.rs +++ b/crates/stackless-integrations/src/providers/herenow/hosting.rs @@ -76,7 +76,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_hosting","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_herenow","provider_name":"herenow","service_id":"hosting","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_hosting","object":"v2.provisioning.provider_service_detail","provider":"prvdr_herenow","provider_name":"herenow","service_id":"hosting","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/heygen/api.rs b/crates/stackless-integrations/src/providers/heygen/api.rs index 0b2a6303..3f390385 100644 --- a/crates/stackless-integrations/src/providers/heygen/api.rs +++ b/crates/stackless-integrations/src/providers/heygen/api.rs @@ -93,7 +93,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_heygen","provider_name":"HeyGen","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"auto_reload_amount":{"default":10,"description":"USD of API credit to add each time the balance runs low. Range $5-$1000, default $10.","maximum":1000,"minimum":5,"type":"integer"},"auto_reload_enabled":{"description":"Turn auto-reload on to top up API credit automatically when the balance runs low. Off by default; when off, amount/threshold are ignored.","type":"boolean"},"auto_reload_threshold":{"default":5,"description":"Auto-reload triggers when the remaining API credit balance falls below this USD amount. Range $5-$1000, default $5.","maximum":1000,"minimum":5,"type":"integer"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_heygen","provider_name":"HeyGen","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"auto_reload_amount":{"default":10,"description":"USD of API credit to add each time the balance runs low. Range $5-$1000, default $10.","maximum":1000,"minimum":5,"type":"integer"},"auto_reload_enabled":{"description":"Turn auto-reload on to top up API credit automatically when the balance runs low. Off by default; when off, amount/threshold are ignored.","type":"boolean"},"auto_reload_threshold":{"default":5,"description":"Auto-reload triggers when the remaining API credit balance falls below this USD amount. Range $5-$1000, default $5.","maximum":1000,"minimum":5,"type":"integer"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/inngest/app.rs b/crates/stackless-integrations/src/providers/inngest/app.rs index ea59ad94..52a205d5 100644 --- a/crates/stackless-integrations/src/providers/inngest/app.rs +++ b/crates/stackless-integrations/src/providers/inngest/app.rs @@ -100,7 +100,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_inngest","provider_name":"Inngest","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"id":{"description":"Inngest app ID. This should match the id passed to your Inngest SDK client, e.g. new Inngest({ id: \"my-app\" }).","minLength":1,"type":"string"}},"required":["id"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider":"prvdr_inngest","provider_name":"Inngest","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"id":{"description":"Inngest app ID. This should match the id passed to your Inngest SDK client, e.g. new Inngest({ id: \"my-app\" }).","minLength":1,"type":"string"}},"required":["id"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/kernel/project.rs b/crates/stackless-integrations/src/providers/kernel/project.rs index 849d1d48..7dd86d27 100644 --- a/crates/stackless-integrations/src/providers/kernel/project.rs +++ b/crates/stackless-integrations/src/providers/kernel/project.rs @@ -93,7 +93,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_kernel","provider_name":"KERNEL","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"description":"A name for this API key","type":"string"}},"required":["name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_kernel","provider_name":"KERNEL","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"description":"A name for this API key","type":"string"}},"required":["name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/laravel_cloud/application.rs b/crates/stackless-integrations/src/providers/laravel_cloud/application.rs index dd1675b9..f572ee04 100644 --- a/crates/stackless-integrations/src/providers/laravel_cloud/application.rs +++ b/crates/stackless-integrations/src/providers/laravel_cloud/application.rs @@ -119,7 +119,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_application","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"application","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"create_cache":{"default":"no","description":"Provision a managed Valkey cache and connect it to this application.","enum":["yes","no"],"title":"Create a cache","type":"string"},"create_database":{"default":"no","description":"Provision a managed MySQL database and connect it to this application.","enum":["yes","no"],"title":"Create a database","type":"string"},"name":{"description":"A name for your Laravel application.","title":"Application Name","type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"},"repository":{"description":"Full repository name (e.g. laravel/cloud).","title":"Repository","type":"string"}},"required":["name","repository","region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_application","object":"v2.provisioning.provider_service_detail","provider":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"application","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"create_cache":{"default":"no","description":"Provision a managed Valkey cache and connect it to this application.","enum":["yes","no"],"title":"Create a cache","type":"string"},"create_database":{"default":"no","description":"Provision a managed MySQL database and connect it to this application.","enum":["yes","no"],"title":"Create a database","type":"string"},"name":{"description":"A name for your Laravel application.","title":"Application Name","type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"},"repository":{"description":"Full repository name (e.g. laravel/cloud).","title":"Repository","type":"string"}},"required":["name","repository","region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/laravel_cloud/mysql.rs b/crates/stackless-integrations/src/providers/laravel_cloud/mysql.rs index 27d5e57c..3da0470e 100644 --- a/crates/stackless-integrations/src/providers/laravel_cloud/mysql.rs +++ b/crates/stackless-integrations/src/providers/laravel_cloud/mysql.rs @@ -104,7 +104,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mysql","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"mysql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"instance_size":{"enum":["mysql-flex-512mb","mysql-flex-1gb","mysql-flex-2gb","mysql-pro-4gb","mysql-pro-8gb","mysql-pro-16gb","mysql-pro-32gb"],"type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"}},"required":["instance_size","region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mysql","object":"v2.provisioning.provider_service_detail","provider":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"mysql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"instance_size":{"enum":["mysql-flex-512mb","mysql-flex-1gb","mysql-flex-2gb","mysql-pro-4gb","mysql-pro-8gb","mysql-pro-16gb","mysql-pro-32gb"],"type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"}},"required":["instance_size","region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/laravel_cloud/valkey.rs b/crates/stackless-integrations/src/providers/laravel_cloud/valkey.rs index f5956ad5..8dca1a4f 100644 --- a/crates/stackless-integrations/src/providers/laravel_cloud/valkey.rs +++ b/crates/stackless-integrations/src/providers/laravel_cloud/valkey.rs @@ -102,7 +102,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_valkey","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"valkey","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"instance_size":{"enum":["valkey-flex-250mb","valkey-flex-1gb","valkey-flex-2.5gb","valkey-pro.5gb","valkey-pro.12gb","valkey-pro.25gb","valkey-pro.50gb"],"type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"}},"required":["instance_size","region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_valkey","object":"v2.provisioning.provider_service_detail","provider":"prvdr_laravel_cloud","provider_name":"Laravel_Cloud","service_id":"valkey","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"instance_size":{"enum":["valkey-flex-250mb","valkey-flex-1gb","valkey-flex-2.5gb","valkey-pro.5gb","valkey-pro.12gb","valkey-pro.25gb","valkey-pro.50gb"],"type":"string"},"region":{"enum":["us-east-1","us-east-2","eu-central-1","eu-west-1","eu-west-2","ap-southeast-1","ap-southeast-2","ap-northeast-1","ca-central-1","me-central-1"],"type":"string"}},"required":["instance_size","region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/metronome/sandbox.rs b/crates/stackless-integrations/src/providers/metronome/sandbox.rs index e1c5d58e..cbe4ce4d 100644 --- a/crates/stackless-integrations/src/providers/metronome/sandbox.rs +++ b/crates/stackless-integrations/src/providers/metronome/sandbox.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_metronome","provider_name":"Metronome","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider":"prvdr_metronome","provider_name":"Metronome","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/mixpanel/analytics.rs b/crates/stackless-integrations/src/providers/mixpanel/analytics.rs index 4747c0a1..f766b1e2 100644 --- a/crates/stackless-integrations/src/providers/mixpanel/analytics.rs +++ b/crates/stackless-integrations/src/providers/mixpanel/analytics.rs @@ -90,7 +90,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_mixpanel","provider_name":"Mixpanel","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider":"prvdr_mixpanel","provider_name":"Mixpanel","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/neon/postgres.rs b/crates/stackless-integrations/src/providers/neon/postgres.rs index 5a21a79c..9031f23c 100644 --- a/crates/stackless-integrations/src/providers/neon/postgres.rs +++ b/crates/stackless-integrations/src/providers/neon/postgres.rs @@ -87,7 +87,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_neon","provider_name":"Neon","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider":"prvdr_neon","provider_name":"Neon","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/openrouter/api.rs b/crates/stackless-integrations/src/providers/openrouter/api.rs index ccddabc6..acfbae10 100644 --- a/crates/stackless-integrations/src/providers/openrouter/api.rs +++ b/crates/stackless-integrations/src/providers/openrouter/api.rs @@ -74,7 +74,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_openrouter","provider_name":"OpenRouter","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_openrouter","provider_name":"OpenRouter","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/parallel/api.rs b/crates/stackless-integrations/src/providers/parallel/api.rs index 30990eac..47b8e261 100644 --- a/crates/stackless-integrations/src/providers/parallel/api.rs +++ b/crates/stackless-integrations/src/providers/parallel/api.rs @@ -99,7 +99,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_parallel","provider_name":"Parallel","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid","paid_pricing":[{"type":"freeform","is_default":true,"configuration":{"product":"search"}}]},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_parallel","provider_name":"Parallel","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid","paid_pricing":[{"type":"freeform","is_default":true,"configuration":{"product":"search"}}]},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/perplexity/api.rs b/crates/stackless-integrations/src/providers/perplexity/api.rs index 25b30459..87d5d811 100644 --- a/crates/stackless-integrations/src/providers/perplexity/api.rs +++ b/crates/stackless-integrations/src/providers/perplexity/api.rs @@ -97,7 +97,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_perplexity","provider_name":"Perplexity","service_id":"api","categories":["search","ai"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"auto_recharge":{"description":"Automatically buy more API credits when the balance runs low; applies to the whole account. When true, recharge_amount_usd must also be sent.","type":"boolean"},"buy_credits_usd":{"description":"One-time credit purchase in USD charged to the shared payment token. Valid on updates only, and never persisted as configuration state: each update carrying it is one purchase.","minimum":10,"type":"integer"},"initial_credit_usd":{"description":"One-time credit purchase in USD charged to the shared payment token when the resource is provisioned. Valid at provisioning only; to buy more credits later, send buy_credits_usd on an update.","minimum":10,"type":"integer"},"recharge_amount_usd":{"description":"Credit amount in USD purchased by each automatic recharge; only valid alongside auto_recharge.","minimum":10,"type":"integer"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_perplexity","provider_name":"Perplexity","service_id":"api","categories":["search","ai"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"auto_recharge":{"description":"Automatically buy more API credits when the balance runs low; applies to the whole account. When true, recharge_amount_usd must also be sent.","type":"boolean"},"buy_credits_usd":{"description":"One-time credit purchase in USD charged to the shared payment token. Valid on updates only, and never persisted as configuration state: each update carrying it is one purchase.","minimum":10,"type":"integer"},"initial_credit_usd":{"description":"One-time credit purchase in USD charged to the shared payment token when the resource is provisioned. Valid at provisioning only; to buy more credits later, send buy_credits_usd on an update.","minimum":10,"type":"integer"},"recharge_amount_usd":{"description":"Credit amount in USD purchased by each automatic recharge; only valid alongside auto_recharge.","minimum":10,"type":"integer"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/planetscale/mysql.rs b/crates/stackless-integrations/src/providers/planetscale/mysql.rs index 058e8a92..542c77bd 100644 --- a/crates/stackless-integrations/src/providers/planetscale/mysql.rs +++ b/crates/stackless-integrations/src/providers/planetscale/mysql.rs @@ -109,7 +109,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mysql","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_planetscale","provider_name":"PlanetScale","service_id":"mysql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"cluster":{"description":"Cluster size","enum":["PS-10","PS-20","PS-40","PS-80","PS-160","PS-320"],"type":"string"},"name":{"description":"Database name.","maxLength":63,"minLength":2,"pattern":"^[a-z0-9][a-z0-9_-]*[a-z0-9]$","type":"string"},"region":{"description":"Deployment region (prefixed with cloud provider, e.g., aws-us-east, gcp-us-central1)","enum":["aws-ap-northeast","aws-ap-south","aws-ap-southeast","aws-ap-southeast-2","aws-ca-central-1","aws-eu-central","aws-eu-west","aws-eu-west-2","aws-sa-east-1","aws-us-east","aws-us-east-2","aws-us-west","gcp-asia-northeast3","gcp-europe-west1","gcp-europe-west4","gcp-northamerica-northeast1","gcp-us-central1","gcp-us-east1","gcp-us-east4"],"type":"string"}},"required":["name","cluster","region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mysql","object":"v2.provisioning.provider_service_detail","provider":"prvdr_planetscale","provider_name":"PlanetScale","service_id":"mysql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"cluster":{"description":"Cluster size","enum":["PS-10","PS-20","PS-40","PS-80","PS-160","PS-320"],"type":"string"},"name":{"description":"Database name.","maxLength":63,"minLength":2,"pattern":"^[a-z0-9][a-z0-9_-]*[a-z0-9]$","type":"string"},"region":{"description":"Deployment region (prefixed with cloud provider, e.g., aws-us-east, gcp-us-central1)","enum":["aws-ap-northeast","aws-ap-south","aws-ap-southeast","aws-ap-southeast-2","aws-ca-central-1","aws-eu-central","aws-eu-west","aws-eu-west-2","aws-sa-east-1","aws-us-east","aws-us-east-2","aws-us-west","gcp-asia-northeast3","gcp-europe-west1","gcp-europe-west4","gcp-northamerica-northeast1","gcp-us-central1","gcp-us-east1","gcp-us-east4"],"type":"string"}},"required":["name","cluster","region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/planetscale/postgresql.rs b/crates/stackless-integrations/src/providers/planetscale/postgresql.rs index 732f5531..32226871 100644 --- a/crates/stackless-integrations/src/providers/planetscale/postgresql.rs +++ b/crates/stackless-integrations/src/providers/planetscale/postgresql.rs @@ -113,7 +113,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgresql","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_planetscale","provider_name":"PlanetScale","service_id":"postgresql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"cluster":{"description":"Cluster size","enum":["PS-5","PS-10","PS-20","PS-40","PS-80","PS-160","PS-320"],"type":"string"},"name":{"description":"Database name.","maxLength":63,"minLength":2,"pattern":"^[a-z0-9][a-z0-9_-]*[a-z0-9]$","type":"string"},"region":{"description":"Deployment region (prefixed with cloud provider, e.g., aws-us-east, gcp-us-central1)","enum":["aws-ap-northeast","aws-ap-south","aws-ap-southeast","aws-ap-southeast-2","aws-ca-central-1","aws-eu-central","aws-eu-west","aws-eu-west-2","aws-sa-east-1","aws-us-east","aws-us-east-2","aws-us-west","gcp-asia-northeast3","gcp-europe-west1","gcp-europe-west4","gcp-northamerica-northeast1","gcp-us-central1","gcp-us-east1","gcp-us-east4"],"type":"string"},"replicas":{"default":0,"description":"Number of replicas (0 for single node, 2+ for high availability)","maximum":9,"minimum":0,"type":"integer"}},"required":["name","cluster","region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgresql","object":"v2.provisioning.provider_service_detail","provider":"prvdr_planetscale","provider_name":"PlanetScale","service_id":"postgresql","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"cluster":{"description":"Cluster size","enum":["PS-5","PS-10","PS-20","PS-40","PS-80","PS-160","PS-320"],"type":"string"},"name":{"description":"Database name.","maxLength":63,"minLength":2,"pattern":"^[a-z0-9][a-z0-9_-]*[a-z0-9]$","type":"string"},"region":{"description":"Deployment region (prefixed with cloud provider, e.g., aws-us-east, gcp-us-central1)","enum":["aws-ap-northeast","aws-ap-south","aws-ap-southeast","aws-ap-southeast-2","aws-ca-central-1","aws-eu-central","aws-eu-west","aws-eu-west-2","aws-sa-east-1","aws-us-east","aws-us-east-2","aws-us-west","gcp-asia-northeast3","gcp-europe-west1","gcp-europe-west4","gcp-northamerica-northeast1","gcp-us-central1","gcp-us-east1","gcp-us-east4"],"type":"string"},"replicas":{"default":0,"description":"Number of replicas (0 for single node, 2+ for high availability)","maximum":9,"minimum":0,"type":"integer"}},"required":["name","cluster","region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/postalform/mail.rs b/crates/stackless-integrations/src/providers/postalform/mail.rs index e5cc88ce..b006fbd4 100644 --- a/crates/stackless-integrations/src/providers/postalform/mail.rs +++ b/crates/stackless-integrations/src/providers/postalform/mail.rs @@ -109,7 +109,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mail","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_postalform","provider_name":"PostalForm","service_id":"mail","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":true,"properties":{"webhook_url":{"description":"Optional HTTPS endpoint that receives signed PostalForm status webhooks. If supplied, PostalForm creates or reuses a webhook endpoint and returns its signing secret in the access configuration.","pattern":"^https://","type":"string"},"workspace_name":{"description":"Optional display name for the PostalForm Projects workspace.","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mail","object":"v2.provisioning.provider_service_detail","provider":"prvdr_postalform","provider_name":"PostalForm","service_id":"mail","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":true,"properties":{"webhook_url":{"description":"Optional HTTPS endpoint that receives signed PostalForm status webhooks. If supplied, PostalForm creates or reuses a webhook endpoint and returns its signing secret in the access configuration.","pattern":"^https://","type":"string"},"workspace_name":{"description":"Optional display name for the PostalForm Projects workspace.","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/posthog/analytics.rs b/crates/stackless-integrations/src/providers/posthog/analytics.rs index 75cbbbcf..4531f313 100644 --- a/crates/stackless-integrations/src/providers/posthog/analytics.rs +++ b/crates/stackless-integrations/src/providers/posthog/analytics.rs @@ -80,7 +80,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_posthog","provider_name":"PostHog","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_analytics","object":"v2.provisioning.provider_service_detail","provider":"prvdr_posthog","provider_name":"PostHog","service_id":"analytics","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/prisma/database.rs b/crates/stackless-integrations/src/providers/prisma/database.rs index c617edb3..6ac0f83e 100644 --- a/crates/stackless-integrations/src/providers/prisma/database.rs +++ b/crates/stackless-integrations/src/providers/prisma/database.rs @@ -97,7 +97,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_prisma","provider_name":"Prisma","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"region":{"default":"us-east-1","description":"Prisma Postgres region identifier (Defaults to \"us-east-1\").","enum":["us-east-1","us-west-1","eu-west-3","eu-central-1","ap-northeast-1","ap-southeast-1"],"type":"string"}},"required":["region"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider":"prvdr_prisma","provider_name":"Prisma","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"additionalProperties":false,"properties":{"region":{"default":"us-east-1","description":"Prisma Postgres region identifier (Defaults to \"us-east-1\").","enum":["us-east-1","us-west-1","eu-west-3","eu-central-1","ap-northeast-1","ap-southeast-1"],"type":"string"}},"required":["region"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/privy/app.rs b/crates/stackless-integrations/src/providers/privy/app.rs index dfcc2d9a..2dce1b2e 100644 --- a/crates/stackless-integrations/src/providers/privy/app.rs +++ b/crates/stackless-integrations/src/providers/privy/app.rs @@ -91,7 +91,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_privy","provider_name":"Privy","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"app_name":{"description":"Display name for the app","type":"string"}},"required":["app_name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider":"prvdr_privy","provider_name":"Privy","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"app_name":{"description":"Display name for the app","type":"string"}},"required":["app_name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/pydantic/logfire.rs b/crates/stackless-integrations/src/providers/pydantic/logfire.rs index 6ae7e2b3..188d515a 100644 --- a/crates/stackless-integrations/src/providers/pydantic/logfire.rs +++ b/crates/stackless-integrations/src/providers/pydantic/logfire.rs @@ -105,7 +105,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_logfire","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_pydantic","provider_name":"Pydantic","service_id":"logfire","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"organization":{"type":"string"},"project_name":{"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_logfire","object":"v2.provisioning.provider_service_detail","provider":"prvdr_pydantic","provider_name":"Pydantic","service_id":"logfire","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"organization":{"type":"string"},"project_name":{"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/railway/bucket.rs b/crates/stackless-integrations/src/providers/railway/bucket.rs index 5e02cca2..6288556d 100644 --- a/crates/stackless-integrations/src/providers/railway/bucket.rs +++ b/crates/stackless-integrations/src/providers/railway/bucket.rs @@ -101,7 +101,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_bucket","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_railway","provider_name":"Railway","service_id":"bucket","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"description":"Bucket name (auto-generated if omitted).","type":"string"},"region":{"description":"Storage region (e.g. sjc, iad, ams, sin).","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_bucket","object":"v2.provisioning.provider_service_detail","provider":"prvdr_railway","provider_name":"Railway","service_id":"bucket","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"description":"Bucket name (auto-generated if omitted).","type":"string"},"region":{"description":"Storage region (e.g. sjc, iad, ams, sin).","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/railway/hosting.rs b/crates/stackless-integrations/src/providers/railway/hosting.rs index 11a1538e..bf6085fe 100644 --- a/crates/stackless-integrations/src/providers/railway/hosting.rs +++ b/crates/stackless-integrations/src/providers/railway/hosting.rs @@ -85,7 +85,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_hosting","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_railway","provider_name":"Railway","service_id":"hosting","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_hosting","object":"v2.provisioning.provider_service_detail","provider":"prvdr_railway","provider_name":"Railway","service_id":"hosting","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/railway/mongo.rs b/crates/stackless-integrations/src/providers/railway/mongo.rs index 6db054cf..889608c5 100644 --- a/crates/stackless-integrations/src/providers/railway/mongo.rs +++ b/crates/stackless-integrations/src/providers/railway/mongo.rs @@ -82,7 +82,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mongo","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_railway","provider_name":"Railway","service_id":"mongo","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_mongo","object":"v2.provisioning.provider_service_detail","provider":"prvdr_railway","provider_name":"Railway","service_id":"mongo","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/railway/postgres.rs b/crates/stackless-integrations/src/providers/railway/postgres.rs index 0c7917b5..894291f6 100644 --- a/crates/stackless-integrations/src/providers/railway/postgres.rs +++ b/crates/stackless-integrations/src/providers/railway/postgres.rs @@ -82,7 +82,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_railway","provider_name":"Railway","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider":"prvdr_railway","provider_name":"Railway","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/railway/redis.rs b/crates/stackless-integrations/src/providers/railway/redis.rs index 5acdcaf2..e5d5cae7 100644 --- a/crates/stackless-integrations/src/providers/railway/redis.rs +++ b/crates/stackless-integrations/src/providers/railway/redis.rs @@ -82,7 +82,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_redis","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_railway","provider_name":"Railway","service_id":"redis","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_redis","object":"v2.provisioning.provider_service_detail","provider":"prvdr_railway","provider_name":"Railway","service_id":"redis","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"region":{"description":"Deployment region (e.g. us-west1, us-east4)","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/render_db/postgres.rs b/crates/stackless-integrations/src/providers/render_db/postgres.rs index 6a0a3f0d..de5fdb46 100644 --- a/crates/stackless-integrations/src/providers/render_db/postgres.rs +++ b/crates/stackless-integrations/src/providers/render_db/postgres.rs @@ -103,7 +103,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_render_db","provider_name":"Render","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"disk_size":{"description":"Storage capacity for the database instance, in GB. Defaults to 15 GB. Must be in multiples of 5 GB.","type":"integer"},"name":{"description":"Name of the PostgreSQL database instance","type":"string"},"owner_id":{"description":"Workspace ID to deploy into. If omitted, uses the default workspace.","type":"string"},"region":{"description":"Region to deploy the database in (e.g. oregon, frankfurt, ohio, singapore, virginia). Defaults to 'oregon'.","type":"string"},"version":{"description":"PostgreSQL major version (e.g. 16, 17, 18). Defaults to the latest supported version.","type":"string"}},"required":["name"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_postgres","object":"v2.provisioning.provider_service_detail","provider":"prvdr_render_db","provider_name":"Render","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"disk_size":{"description":"Storage capacity for the database instance, in GB. Defaults to 15 GB. Must be in multiples of 5 GB.","type":"integer"},"name":{"description":"Name of the PostgreSQL database instance","type":"string"},"owner_id":{"description":"Workspace ID to deploy into. If omitted, uses the default workspace.","type":"string"},"region":{"description":"Region to deploy the database in (e.g. oregon, frankfurt, ohio, singapore, virginia). Defaults to 'oregon'.","type":"string"},"version":{"description":"PostgreSQL major version (e.g. 16, 17, 18). Defaults to the latest supported version.","type":"string"}},"required":["name"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/revenuecat/app.rs b/crates/stackless-integrations/src/providers/revenuecat/app.rs index 86ac8128..7ea78993 100644 --- a/crates/stackless-integrations/src/providers/revenuecat/app.rs +++ b/crates/stackless-integrations/src/providers/revenuecat/app.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_revenuecat","provider_name":"RevenueCat","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_app","object":"v2.provisioning.provider_service_detail","provider":"prvdr_revenuecat","provider_name":"RevenueCat","service_id":"app","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/runloop/sandbox.rs b/crates/stackless-integrations/src/providers/runloop/sandbox.rs index 8746765d..facf3a2e 100644 --- a/crates/stackless-integrations/src/providers/runloop/sandbox.rs +++ b/crates/stackless-integrations/src/providers/runloop/sandbox.rs @@ -78,7 +78,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_runloop","provider_name":"Runloop","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_sandbox","object":"v2.provisioning.provider_service_detail","provider":"prvdr_runloop","provider_name":"Runloop","service_id":"sandbox","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/schematic/schematic_environment.rs b/crates/stackless-integrations/src/providers/schematic/schematic_environment.rs index 921d77c4..31d0cd1a 100644 --- a/crates/stackless-integrations/src/providers/schematic/schematic_environment.rs +++ b/crates/stackless-integrations/src/providers/schematic/schematic_environment.rs @@ -99,7 +99,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_schematic_environment","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_schematic","provider_name":"Schematic","service_id":"schematic-environment","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"environment_type":{"type":"string","enum":["development","production"]},"name":{"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_schematic_environment","object":"v2.provisioning.provider_service_detail","provider":"prvdr_schematic","provider_name":"Schematic","service_id":"schematic-environment","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"environment_type":{"type":"string","enum":["development","production"]},"name":{"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/sentry/project.rs b/crates/stackless-integrations/src/providers/sentry/project.rs index a4acda67..62df4f26 100644 --- a/crates/stackless-integrations/src/providers/sentry/project.rs +++ b/crates/stackless-integrations/src/providers/sentry/project.rs @@ -93,7 +93,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_sentry","provider_name":"Sentry","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"platform":{"description":"Platform/language (e.g. python, javascript, node, react)","type":"string"},"project_name":{"description":"Name for the Sentry project","type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_sentry","provider_name":"Sentry","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"platform":{"description":"Platform/language (e.g. python, javascript, node, react)","type":"string"},"project_name":{"description":"Name for the Sentry project","type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/sentry/seer.rs b/crates/stackless-integrations/src/providers/sentry/seer.rs index d7c06e58..468e3af8 100644 --- a/crates/stackless-integrations/src/providers/sentry/seer.rs +++ b/crates/stackless-integrations/src/providers/sentry/seer.rs @@ -77,7 +77,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_seer","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_sentry","provider_name":"Sentry","service_id":"seer","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_seer","object":"v2.provisioning.provider_service_detail","provider":"prvdr_sentry","provider_name":"Sentry","service_id":"seer","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"type":"object","required":[],"additionalProperties":false,"properties":{}}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/shopify/store.rs b/crates/stackless-integrations/src/providers/shopify/store.rs index 21859d7c..edcb7ab2 100644 --- a/crates/stackless-integrations/src/providers/shopify/store.rs +++ b/crates/stackless-integrations/src/providers/shopify/store.rs @@ -92,7 +92,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_store","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_shopify","provider_name":"Shopify","service_id":"store","categories":["ecommerce"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":false,"properties":{"plan":{"enum":["trial","basic","grow","advanced"],"type":"string"},"store_name":{"maxLength":50,"minLength":1,"type":"string"}},"optional":["store_name","plan"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_store","object":"v2.provisioning.provider_service_detail","provider":"prvdr_shopify","provider_name":"Shopify","service_id":"store","categories":["ecommerce"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":false,"properties":{"plan":{"enum":["trial","basic","grow","advanced"],"type":"string"},"store_name":{"maxLength":50,"minLength":1,"type":"string"}},"optional":["store_name","plan"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/steel/browser.rs b/crates/stackless-integrations/src/providers/steel/browser.rs index 233fdab1..fe2c9293 100644 --- a/crates/stackless-integrations/src/providers/steel/browser.rs +++ b/crates/stackless-integrations/src/providers/steel/browser.rs @@ -84,7 +84,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_browser","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_steel","provider_name":"Steel","service_id":"browser","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_browser","object":"v2.provisioning.provider_service_detail","provider":"prvdr_steel","provider_name":"Steel","service_id":"browser","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/supabase/project.rs b/crates/stackless-integrations/src/providers/supabase/project.rs index 45dc764d..7b403776 100644 --- a/crates/stackless-integrations/src/providers/supabase/project.rs +++ b/crates/stackless-integrations/src/providers/supabase/project.rs @@ -101,7 +101,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_supabase","provider_name":"Supabase","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"maxLength":60,"minLength":1,"type":"string"},"region":{"default":"americas","enum":["americas","emea","apac"],"type":"string"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_project","object":"v2.provisioning.provider_service_detail","provider":"prvdr_supabase","provider_name":"Supabase","service_id":"project","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"name":{"maxLength":60,"minLength":1,"type":"string"},"region":{"default":"americas","enum":["americas","emea","apac"],"type":"string"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/supermemory/memory.rs b/crates/stackless-integrations/src/providers/supermemory/memory.rs index 760fc79a..854065d5 100644 --- a/crates/stackless-integrations/src/providers/supermemory/memory.rs +++ b/crates/stackless-integrations/src/providers/supermemory/memory.rs @@ -92,7 +92,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_memory","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_supermemory","provider_name":"Supermemory","service_id":"memory","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"description":"Subscription tier","enum":["free","pro","max","scale"],"type":"string"}},"required":["plan"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_memory","object":"v2.provisioning.provider_service_detail","provider":"prvdr_supermemory","provider_name":"Supermemory","service_id":"memory","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"description":"Subscription tier","enum":["free","pro","max","scale"],"type":"string"}},"required":["plan"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/tabstack/api.rs b/crates/stackless-integrations/src/providers/tabstack/api.rs index cbda8a41..e808d105 100644 --- a/crates/stackless-integrations/src/providers/tabstack/api.rs +++ b/crates/stackless-integrations/src/providers/tabstack/api.rs @@ -80,7 +80,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_tabstack","provider_name":"Tabstack","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"type":"string","enum":["trial","individual","team","pro"],"description":"The plan tier to provision."}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_api","object":"v2.provisioning.provider_service_detail","provider":"prvdr_tabstack","provider_name":"Tabstack","service_id":"api","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"type":"string","enum":["trial","individual","team","pro"],"description":"The plan tier to provision."}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/turso/database.rs b/crates/stackless-integrations/src/providers/turso/database.rs index a35a8ab4..fb2caf76 100644 --- a/crates/stackless-integrations/src/providers/turso/database.rs +++ b/crates/stackless-integrations/src/providers/turso/database.rs @@ -97,7 +97,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_turso","provider_name":"Turso","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"location":{"description":"Primary location (e.g. aws-us-east-1, aws-eu-west-1)","enum":["aws-us-east-1","aws-us-east-2","aws-us-west-2","aws-eu-west-1","aws-ap-south-1","aws-ap-northeast-1"],"type":"string"},"name":{"description":"Database name","type":"string"}},"required":["name","location"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_database","object":"v2.provisioning.provider_service_detail","provider":"prvdr_turso","provider_name":"Turso","service_id":"database","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{"properties":{"location":{"description":"Primary location (e.g. aws-us-east-1, aws-eu-west-1)","enum":["aws-us-east-1","aws-us-east-2","aws-us-west-2","aws-eu-west-1","aws-ap-south-1","aws-ap-northeast-1"],"type":"string"},"name":{"description":"Database name","type":"string"}},"required":["name","location"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/twilio/email.rs b/crates/stackless-integrations/src/providers/twilio/email.rs index 45cb4f85..2c056e3c 100644 --- a/crates/stackless-integrations/src/providers/twilio/email.rs +++ b/crates/stackless-integrations/src/providers/twilio/email.rs @@ -75,7 +75,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_61UQvwE7qadLu0Kgo5BZg","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_61UQsPLOiNuyFxFP45ADo","provider_name":"Twilio","service_id":"email","categories":["email"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_61UQvwE7qadLu0Kgo5BZg","object":"v2.provisioning.provider_service_detail","provider":"prvdr_61UQsPLOiNuyFxFP45ADo","provider_name":"Twilio","service_id":"email","categories":["email"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"component"},"configuration_schema":{}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/upstash/qstash.rs b/crates/stackless-integrations/src/providers/upstash/qstash.rs index 8f483df2..8b087111 100644 --- a/crates/stackless-integrations/src/providers/upstash/qstash.rs +++ b/crates/stackless-integrations/src/providers/upstash/qstash.rs @@ -88,7 +88,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_qstash","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_upstash","provider_name":"Upstash","service_id":"qstash","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the QStash user","enum":["eu-central-1","us-east-1"],"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_qstash","object":"v2.provisioning.provider_service_detail","provider":"prvdr_upstash","provider_name":"Upstash","service_id":"qstash","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the QStash user","enum":["eu-central-1","us-east-1"],"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/upstash/redis.rs b/crates/stackless-integrations/src/providers/upstash/redis.rs index eed89f08..126dd5cc 100644 --- a/crates/stackless-integrations/src/providers/upstash/redis.rs +++ b/crates/stackless-integrations/src/providers/upstash/redis.rs @@ -117,7 +117,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_redis","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_upstash","provider_name":"Upstash","service_id":"redis","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"eviction":{"description":"Enable eviction when data size limit is reached (on or off)","enum":["on","off"],"type":"string"},"name":{"description":"Database name","maxLength":40,"minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"prod_pack":{"description":"Enable Production Pack ($200/mo) for enhanced SLA, higher limits, and multi-zone replication. Requires price=payg.","enum":["on","off"],"type":"string"},"read_regions":{"description":"Comma-separated list of read replica regions for global databases (e.g. \"eu-west-1,ap-southeast-1\"). Leave empty for single-region. Allowed values: us-east-1, us-west-1, us-west-2, us-east-2, eu-west-1, eu-west-2, eu-central-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-south-1, af-south-1, sa-east-1, ca-central-1, us-central1, europe-west1, asia-northeast1, us-east4","type":"string"},"region":{"description":"AWS/GCP region for the database","enum":["us-east-1","us-west-1","us-west-2","us-east-2","eu-west-1","eu-west-2","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-south-1","af-south-1","sa-east-1","ca-central-1","us-central1","europe-west1","asia-northeast1","us-east4"],"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_redis","object":"v2.provisioning.provider_service_detail","provider":"prvdr_upstash","provider_name":"Upstash","service_id":"redis","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"eviction":{"description":"Enable eviction when data size limit is reached (on or off)","enum":["on","off"],"type":"string"},"name":{"description":"Database name","maxLength":40,"minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"prod_pack":{"description":"Enable Production Pack ($200/mo) for enhanced SLA, higher limits, and multi-zone replication. Requires price=payg.","enum":["on","off"],"type":"string"},"read_regions":{"description":"Comma-separated list of read replica regions for global databases (e.g. \"eu-west-1,ap-southeast-1\"). Leave empty for single-region. Allowed values: us-east-1, us-west-1, us-west-2, us-east-2, eu-west-1, eu-west-2, eu-central-1, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-south-1, af-south-1, sa-east-1, ca-central-1, us-central1, europe-west1, asia-northeast1, us-east4","type":"string"},"region":{"description":"AWS/GCP region for the database","enum":["us-east-1","us-west-1","us-west-2","us-east-2","eu-west-1","eu-west-2","eu-central-1","ap-southeast-1","ap-southeast-2","ap-northeast-1","ap-south-1","af-south-1","sa-east-1","ca-central-1","us-central1","europe-west1","asia-northeast1","us-east4"],"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/upstash/search.rs b/crates/stackless-integrations/src/providers/upstash/search.rs index 12e19bf2..9687796a 100644 --- a/crates/stackless-integrations/src/providers/upstash/search.rs +++ b/crates/stackless-integrations/src/providers/upstash/search.rs @@ -92,7 +92,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_search","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_upstash","provider_name":"Upstash","service_id":"search","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Search index name","minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the search index","enum":["eu-west-1","us-central1"],"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_search","object":"v2.provisioning.provider_service_detail","provider":"prvdr_upstash","provider_name":"Upstash","service_id":"search","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"name":{"description":"Search index name","minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the search index","enum":["eu-west-1","us-central1"],"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/upstash/vector.rs b/crates/stackless-integrations/src/providers/upstash/vector.rs index 0d86ecfe..ad0365cd 100644 --- a/crates/stackless-integrations/src/providers/upstash/vector.rs +++ b/crates/stackless-integrations/src/providers/upstash/vector.rs @@ -104,7 +104,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_vector","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_upstash","provider_name":"Upstash","service_id":"vector","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"dimension":{"description":"Vector dimension count. Ignored when embedding_model is set (dimension is derived from the model)","maximum":3072,"minimum":1,"type":"integer"},"embedding_model":{"description":"Embedding model. Use empty string to bring your own vectors (dimension required).","enum":["BGE_SMALL_EN_V1_5","BGE_BASE_EN_V1_5","BGE_LARGE_EN_V1_5","BGE_M3"],"type":"string"},"name":{"description":"Index name","minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the vector index","enum":["us-east-1","eu-west-1","us-central1"],"type":"string"},"similarity_function":{"description":"Distance metric for similarity search","enum":["COSINE","EUCLIDEAN","DOT_PRODUCT"],"type":"string"}},"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_vector","object":"v2.provisioning.provider_service_detail","provider":"prvdr_upstash","provider_name":"Upstash","service_id":"vector","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"dimension":{"description":"Vector dimension count. Ignored when embedding_model is set (dimension is derived from the model)","maximum":3072,"minimum":1,"type":"integer"},"embedding_model":{"description":"Embedding model. Use empty string to bring your own vectors (dimension required).","enum":["BGE_SMALL_EN_V1_5","BGE_BASE_EN_V1_5","BGE_LARGE_EN_V1_5","BGE_M3"],"type":"string"},"name":{"description":"Index name","minLength":1,"type":"string"},"price":{"default":"payg","description":"Pricing tier. 'free' provisions on the free plan (subject to free-tier limits and one-per-account). 'payg' provisions pay-as-you-go. Defaults to 'payg'.","enum":["free","payg"],"type":"string"},"region":{"description":"Region for the vector index","enum":["us-east-1","eu-west-1","us-central1"],"type":"string"},"similarity_function":{"description":"Distance metric for similarity search","enum":["COSINE","EUCLIDEAN","DOT_PRODUCT"],"type":"string"}},"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/wix/headless.rs b/crates/stackless-integrations/src/providers/wix/headless.rs index 8e22dc91..3369e86b 100644 --- a/crates/stackless-integrations/src/providers/wix/headless.rs +++ b/crates/stackless-integrations/src/providers/wix/headless.rs @@ -92,7 +92,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_headless","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_wix","provider_name":"Wix","service_id":"headless","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":false,"properties":{"plan":{"description":"Pre-filled from the tier selected above; override only if you need to.","enum":["free","premium"],"title":"Plan","type":"string"},"wix_project_name":{"description":"Human-readable name for the Wix site that backs this project. Shown in the Wix dashboard.","maxLength":50,"minLength":1,"title":"Wix project name","type":"string"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_headless","object":"v2.provisioning.provider_service_detail","provider":"prvdr_wix","provider_name":"Wix","service_id":"headless","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"additionalProperties":false,"properties":{"plan":{"description":"Pre-filled from the tier selected above; override only if you need to.","enum":["free","premium"],"title":"Plan","type":"string"},"wix_project_name":{"description":"Human-readable name for the Wix site that backs this project. Shown in the Wix dashboard.","maxLength":50,"minLength":1,"title":"Wix project name","type":"string"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/wordpress_com/site.rs b/crates/stackless-integrations/src/providers/wordpress_com/site.rs index 9492b08d..1d70e7c2 100644 --- a/crates/stackless-integrations/src/providers/wordpress_com/site.rs +++ b/crates/stackless-integrations/src/providers/wordpress_com/site.rs @@ -100,7 +100,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_site","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_wordpress_com","provider_name":"WordPress.com","service_id":"site","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"description":"Which WordPress.com plan to provision. See the pricing options for what each plan includes.","enum":["free","personal","premium","business","commerce"],"type":"string"}},"required":["plan"],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_site","object":"v2.provisioning.provider_service_detail","provider":"prvdr_wordpress_com","provider_name":"WordPress.com","service_id":"site","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"plan":{"description":"Which WordPress.com plan to provision. See the pricing options for what each plan includes.","enum":["free","personal","premium","business","commerce"],"type":"string"}},"required":["plan"],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-integrations/src/providers/workos/auth.rs b/crates/stackless-integrations/src/providers/workos/auth.rs index d386ad6b..b487d971 100644 --- a/crates/stackless-integrations/src/providers/workos/auth.rs +++ b/crates/stackless-integrations/src/providers/workos/auth.rs @@ -87,7 +87,7 @@ mod tests { ); } - const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_auth","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_workos","provider_name":"WorkOS","service_id":"auth","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"environment":{"default":"sandbox","description":"Environment type. Sandbox environments are free for development and testing.","enum":["sandbox","production"],"type":"string"}},"required":[],"type":"object"}}]}}"##; + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_auth","object":"v2.provisioning.provider_service_detail","provider":"prvdr_workos","provider_name":"WorkOS","service_id":"auth","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"paid"},"configuration_schema":{"properties":{"environment":{"default":"sandbox","description":"Environment type. Sandbox environments are free for development and testing.","enum":["sandbox","production"],"type":"string"}},"required":[],"type":"object"}}]}}"##; fn test_def() -> StackDef { StackDef::parse( diff --git a/crates/stackless-stripe-projects/src/catalog.rs b/crates/stackless-stripe-projects/src/catalog.rs index bdb2e01d..530aa7ef 100644 --- a/crates/stackless-stripe-projects/src/catalog.rs +++ b/crates/stackless-stripe-projects/src/catalog.rs @@ -72,7 +72,7 @@ impl Catalog { pub struct ServiceDetail { pub id: String, pub object: String, - pub provider_id: String, + pub provider: String, pub provider_name: String, pub service_id: String, #[serde(default)] diff --git a/crates/stackless-stripe-projects/src/catalog/tests.rs b/crates/stackless-stripe-projects/src/catalog/tests.rs index 46df8acc..db6d0fa0 100644 --- a/crates/stackless-stripe-projects/src/catalog/tests.rs +++ b/crates/stackless-stripe-projects/src/catalog/tests.rs @@ -6,7 +6,7 @@ fn service(reference: &str, schema: Value, pricing: Value) -> ServiceDetail { serde_json::from_value(json!({ "id": "prvsvc_test", "object": "v2.provisioning.provider_service_detail", - "provider_id": "prvdr_test", + "provider": "prvdr_test", "provider_name": provider, "service_id": service_id, "categories": [], diff --git a/crates/stackless-stripe-projects/src/catalog/verify.rs b/crates/stackless-stripe-projects/src/catalog/verify.rs index 78b78404..0003603f 100644 --- a/crates/stackless-stripe-projects/src/catalog/verify.rs +++ b/crates/stackless-stripe-projects/src/catalog/verify.rs @@ -170,7 +170,7 @@ mod tests { { "id": "prvsvc_app", "object": "v2.provisioning.provider_service_detail", - "provider_id": "prvdr_example", + "provider": "prvdr_example", "provider_name": "Example", "service_id": "app", "categories": ["communications"], @@ -198,7 +198,7 @@ mod tests { { "id": "prvsvc_starter", "object": "v2.provisioning.provider_service_detail", - "provider_id": "prvdr_example", + "provider": "prvdr_example", "provider_name": "Example", "service_id": "starter", "categories": ["communications"], diff --git a/crates/stackless-stripe-projects/src/journal.rs b/crates/stackless-stripe-projects/src/journal.rs index 9c31d37d..90031234 100644 --- a/crates/stackless-stripe-projects/src/journal.rs +++ b/crates/stackless-stripe-projects/src/journal.rs @@ -462,7 +462,7 @@ async fn recover_remote( .ok_or_else(|| ProjectsError::CreationUnknown { resource: name.into(), })?; - if remote.provider != service.provider_id || remote.service_ref != service.service_id { + if remote.provider != service.provider || remote.service_ref != service.service_id { return Err(crate::remote::invalid( "remote resource name has a different catalog identity", )); @@ -640,7 +640,7 @@ mod tests { .unwrap(); let mut service = catalog["data"]["services"][0].clone(); service["provider_name"] = json!("Example"); - service["provider_id"] = json!("provider_1"); + service["provider"] = json!("provider_1"); service["service_id"] = json!("database"); catalog["data"]["services"] = json!([service]); Ok(ok(catalog["data"].clone())) diff --git a/crates/stackless-stripe-projects/src/stripe.rs b/crates/stackless-stripe-projects/src/stripe.rs index 62ca0648..0ece664c 100644 --- a/crates/stackless-stripe-projects/src/stripe.rs +++ b/crates/stackless-stripe-projects/src/stripe.rs @@ -790,7 +790,7 @@ mod tests { "services": [{ "id": "clerk_auth", "object": "service", - "provider_id": "clerk", + "provider": "clerk", "provider_name": "Clerk", "service_id": "auth", "kind": "saas", @@ -842,7 +842,7 @@ mod tests { #[tokio::test] async fn catalog_envelope_falls_back_to_category_filters() { - let service = r#"{"id":"prvsvc_1","object":"v2.provisioning.provider_service_detail","provider_id":"prvdr_1","provider_name":"Neon","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"}}"#; + let service = r#"{"id":"prvsvc_1","object":"v2.provisioning.provider_service_detail","provider":"prvdr_1","provider_name":"Neon","service_id":"postgres","categories":["database"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"}}"#; let filtered = format!( r#"{{"ok":true,"command":"projects catalog","version":"0.1","data":{{"last_updated":"t","provider":null,"category_filter":"database","provider_filter":null,"services":[{service}],"source":null}}}}"# ); diff --git a/crates/stackless-stripe-projects/src/surface.rs b/crates/stackless-stripe-projects/src/surface.rs index ddf7f742..2dcf6241 100644 --- a/crates/stackless-stripe-projects/src/surface.rs +++ b/crates/stackless-stripe-projects/src/surface.rs @@ -13,7 +13,7 @@ use crate::stripe::{CommandRunner, StripeProjects}; /// never self-reorders — a newly shipped command surfaces as a diff in the /// top-level `--help` block and is then added here in the same change. Groups /// (`services`/`env`/`billing`) are listed immediately before their children. -/// Verified against plugin 0.39.1. +/// Verified against plugin 0.40.0. const TRAVERSAL: &[&[&str]] = &[ &[], // GET STARTED diff --git a/crates/stackless/src/authoring.rs b/crates/stackless/src/authoring.rs index 090fdf17..c10628dd 100644 --- a/crates/stackless/src/authoring.rs +++ b/crates/stackless/src/authoring.rs @@ -8,7 +8,7 @@ use stackless_core::types::DnsName; use crate::error::Error; /// The Stripe Projects plugin version stackless is tested against. -pub const STRIPE_PROJECTS_PINNED: &str = "0.39.1"; +pub const STRIPE_PROJECTS_PINNED: &str = "0.40.0"; pub fn default_output_path() -> PathBuf { PathBuf::from("stackless.toml") From 5fd19d49cf0ddf8bf444b15f55ad56b7a558f9ee Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 15 Sep 2026 10:25:27 +0000 Subject: [PATCH 02/26] chore(stripe-projects): bless plugin 0.40.0 fixtures Regenerate catalog.json, command-surface.txt, and plugin-version.txt via mise run stripe-refresh against the locally installed projects plugin. --- .../tests/fixtures/catalog.json | 816 +++++++++--------- .../tests/fixtures/command-surface.txt | 4 +- .../tests/fixtures/plugin-version.txt | 2 +- 3 files changed, 411 insertions(+), 411 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index e4a1b04e..12015117 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -77,8 +77,8 @@ ], "type": "paid" }, + "provider": "prvdr_61VGMON1XIsZqQ3Fd5Cro", "provider_configuration_schema": {}, - "provider_id": "prvdr_61VGMON1XIsZqQ3Fd5Cro", "provider_name": "Perplexity", "scope": "project", "service_id": "api", @@ -111,7 +111,7 @@ } ], "created": null, - "description": "here.now Developer plan — $20/month: unlimited sites, 2 TB storage, 20 custom domains, vanity subdomain namespaces, and a higher publish rate limit.", + "description": "here.now Developer plan — $20/month: unlimited sites, 2 TB storage, 20 custom domains, vanity subdomain namespaces, and a higher publish rate limit. Includes $5/month of Editor credits.", "development": false, "group": "plan", "id": "prvsvc_61VFZkEhYvWqln2mM5L4i", @@ -137,8 +137,8 @@ ], "type": "paid" }, + "provider": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_name": "herenow", "scope": "account", "service_id": "developer", @@ -196,8 +196,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_name": "herenow", "scope": "project", "service_id": "hosting", @@ -230,7 +230,7 @@ } ], "created": null, - "description": "here.now Hobby plan — $4/month: up to 1,000 sites, 500 GB storage, 5 custom domains, vanity subdomain namespaces, and a higher publish rate limit.", + "description": "here.now Hobby plan — $4/month: up to 1,000 sites, 500 GB storage, 5 custom domains, vanity subdomain namespaces, and a higher publish rate limit. Includes $2/month of Editor credits.", "development": false, "group": "plan", "id": "prvsvc_61VFZkE0r3eb7UjQR5AK0", @@ -256,8 +256,8 @@ ], "type": "paid" }, + "provider": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61VFZkDcte0pRsAFj5BFo", "provider_name": "herenow", "scope": "account", "service_id": "hobby", @@ -356,12 +356,12 @@ ], "type": "paid" }, + "provider": "prvdr_61V3J0dhwegIR1fhV5Jx2", "provider_configuration_schema": { "additionalProperties": false, "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V3J0dhwegIR1fhV5Jx2", "provider_name": "Shopify", "scope": "project", "service_id": "store", @@ -415,6 +415,7 @@ ], "type": "paid" }, + "provider": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_configuration_schema": { "properties": { "org_name": { @@ -427,7 +428,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_name": "Datadog", "scope": "account", "service_id": "pay-as-you-go", @@ -488,6 +488,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_configuration_schema": { "properties": { "org_name": { @@ -500,7 +501,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_name": "Datadog", "scope": "project", "service_id": "observability", @@ -547,6 +547,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_configuration_schema": { "properties": { "org_name": { @@ -559,7 +560,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61V2Z15R0ek7uaOxE57Z2", "provider_name": "Datadog", "scope": "account", "service_id": "trial", @@ -629,11 +629,11 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_name": "Steel", "scope": "project", "service_id": "browser", @@ -680,11 +680,11 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_name": "Steel", "scope": "account", "service_id": "plan-launch", @@ -744,11 +744,11 @@ ], "type": "paid" }, + "provider": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V2d6KyQRdM5XHd4505o", "provider_name": "Steel", "scope": "account", "service_id": "plan-scale", @@ -785,8 +785,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_name": "Schematic", "scope": "account", "service_id": "schematic-free", @@ -844,8 +844,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_name": "Schematic", "scope": "project", "service_id": "schematic-environment", @@ -893,8 +893,8 @@ ], "type": "paid" }, + "provider": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V2MN5n5dVBeEEIX5S8m", "provider_name": "Schematic", "scope": "account", "service_id": "schematic-growth", @@ -938,11 +938,11 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V0NO7jETrcGDKod57JY", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0NO7jETrcGDKod57JY", "provider_name": "customerio", "scope": "account", "service_id": "builder:sandbox", @@ -1006,11 +1006,11 @@ ], "type": "paid" }, + "provider": "prvdr_61V0NO7jETrcGDKod57JY", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0NO7jETrcGDKod57JY", "provider_name": "customerio", "scope": "account", "service_id": "builder", @@ -1055,6 +1055,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_configuration_schema": { "properties": { "account": { @@ -1064,7 +1065,6 @@ }, "type": "object" }, - "provider_id": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_name": "Pydantic", "scope": "account", "service_id": "personal", @@ -1141,6 +1141,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_configuration_schema": { "properties": { "account": { @@ -1150,7 +1151,6 @@ }, "type": "object" }, - "provider_id": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_name": "Pydantic", "scope": "project", "service_id": "logfire", @@ -1200,8 +1200,8 @@ ], "type": "paid" }, + "provider": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_name": "Composio", "scope": "account", "service_id": "starter", @@ -1239,8 +1239,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_name": "Composio", "scope": "account", "service_id": "hobby", @@ -1286,8 +1286,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0tIZIwN9RMcR2T54Yi", "provider_name": "Composio", "scope": "project", "service_id": "project", @@ -1339,11 +1339,11 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V0NO7jETrcGDKod57JY", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0NO7jETrcGDKod57JY", "provider_name": "customerio", "scope": "project", "service_id": "workspace", @@ -1355,15 +1355,15 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "free" + "service": "pro-monthly" } ], "availability": "available", @@ -1399,15 +1399,15 @@ ], "type": "paid" }, + "provider": "prvdr_61V0eGC6sUPXoATb051se", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0eGC6sUPXoATb051se", "provider_name": "createos", "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ + "free", "beginner-monthly", "pro-monthly", - "free", "enterprise-monthly" ] }, @@ -1415,15 +1415,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1459,15 +1459,15 @@ ], "type": "paid" }, + "provider": "prvdr_61V0eGC6sUPXoATb051se", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0eGC6sUPXoATb051se", "provider_name": "createos", "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ - "enterprise-monthly", "free", "pro-monthly", + "enterprise-monthly", "beginner-monthly" ] }, @@ -1475,7 +1475,7 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", @@ -1483,7 +1483,7 @@ }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1519,15 +1519,15 @@ ], "type": "paid" }, + "provider": "prvdr_61V0eGC6sUPXoATb051se", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0eGC6sUPXoATb051se", "provider_name": "createos", "scope": "account", "service_id": "pro-monthly", "updateable_to": [ - "enterprise-monthly", - "beginner-monthly", "free", + "beginner-monthly", + "enterprise-monthly", "pro-monthly" ] }, @@ -1535,15 +1535,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1567,15 +1567,15 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61V0eGC6sUPXoATb051se", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0eGC6sUPXoATb051se", "provider_name": "createos", "scope": "account", "service_id": "free", "updateable_to": [ - "enterprise-monthly", "beginner-monthly", "pro-monthly", + "enterprise-monthly", "free" ] }, @@ -1616,8 +1616,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V0eGC6sUPXoATb051se", "provider_configuration_schema": {}, - "provider_id": "prvdr_61V0eGC6sUPXoATb051se", "provider_name": "createos", "scope": "project", "service_id": "project", @@ -1693,6 +1693,7 @@ ], "type": "paid" }, + "provider": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_configuration_schema": { "properties": { "account": { @@ -1702,7 +1703,6 @@ }, "type": "object" }, - "provider_id": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_name": "Pydantic", "scope": "account", "service_id": "growth", @@ -1785,6 +1785,7 @@ ], "type": "paid" }, + "provider": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_configuration_schema": { "properties": { "account": { @@ -1794,7 +1795,6 @@ }, "type": "object" }, - "provider_id": "prvdr_61V0eUvURNJSjPY2J5WfY", "provider_name": "Pydantic", "scope": "account", "service_id": "team", @@ -1807,11 +1807,11 @@ "allowed_updates": [ { "direction": "down", - "service": "hobby" + "service": "standard" }, { "direction": "down", - "service": "standard" + "service": "hobby" } ], "availability": "available", @@ -1858,17 +1858,17 @@ ], "type": "paid" }, + "provider": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_name": "Chatbase", "scope": "account", "service_id": "pro", "updateable_to": [ - "hobby", "standard", + "hobby", "pro" ] }, @@ -1929,11 +1929,11 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_name": "Chatbase", "scope": "project", "service_id": "agent", @@ -1945,11 +1945,11 @@ "allowed_updates": [ { "direction": "up", - "service": "standard" + "service": "pro" }, { "direction": "up", - "service": "pro" + "service": "standard" } ], "availability": "available", @@ -1996,29 +1996,29 @@ ], "type": "paid" }, + "provider": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_name": "Chatbase", "scope": "account", "service_id": "hobby", "updateable_to": [ - "standard", "pro", + "standard", "hobby" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "hobby" - }, { "direction": "up", "service": "pro" + }, + { + "direction": "down", + "service": "hobby" } ], "availability": "available", @@ -2065,17 +2065,17 @@ ], "type": "paid" }, + "provider": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61V0Na4Yx14hBk8Yw5WG8", "provider_name": "Chatbase", "scope": "account", "service_id": "standard", "updateable_to": [ - "hobby", "pro", + "hobby", "standard" ] }, @@ -2136,8 +2136,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_name": "Depot", "scope": "account", "service_id": "startup-plan", @@ -2187,8 +2187,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_name": "Depot", "scope": "project", "service_id": "api", @@ -2253,8 +2253,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UwKuCVtXVMFgprf59Ng", "provider_name": "Depot", "scope": "account", "service_id": "developer-plan", @@ -2348,8 +2348,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Uuf4oXg8bVlDmma51z6", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Uuf4oXg8bVlDmma51z6", "provider_name": "Tabstack", "scope": "project", "service_id": "api", @@ -2405,8 +2405,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UvW0H6W4mhL335F54SW", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UvW0H6W4mhL335F54SW", "provider_name": "Spaceship", "scope": "project", "service_id": "domain", @@ -2438,11 +2438,11 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UvIBCNECigaYpha53zM", "provider_configuration_schema": { "properties": {}, "type": "object" }, - "provider_id": "prvdr_61UvIBCNECigaYpha53zM", "provider_name": "RevenueCat", "scope": "project", "service_id": "app", @@ -2502,8 +2502,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_name": "Exa", "scope": "project", "service_id": "pay_as_you_go", @@ -2552,8 +2552,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_name": "Exa", "scope": "project", "service_id": "free", @@ -2613,8 +2613,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_name": "E2B", "scope": "project", "service_id": "sandbox", @@ -2763,8 +2763,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_name": "ClickHouse", "scope": "account", "service_id": "clickhouse", @@ -2774,13 +2774,13 @@ }, { "allowed_updates": [ - { - "direction": "up", - "service": "enterprise" - }, { "direction": "down", "service": "basic" + }, + { + "direction": "up", + "service": "enterprise" } ], "availability": "available", @@ -2822,14 +2822,14 @@ ], "type": "paid" }, + "provider": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_name": "ClickHouse", "scope": "account", "service_id": "scale", "updateable_to": [ - "enterprise", "basic", + "enterprise", "scale" ] }, @@ -2994,8 +2994,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_name": "ClickHouse", "scope": "account", "service_id": "postgres", @@ -3053,8 +3053,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_name": "ClickHouse", "scope": "account", "service_id": "basic", @@ -3068,11 +3068,11 @@ "allowed_updates": [ { "direction": "down", - "service": "scale" + "service": "basic" }, { "direction": "down", - "service": "basic" + "service": "scale" } ], "availability": "available", @@ -3114,14 +3114,14 @@ ], "type": "paid" }, + "provider": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnUOEpxbShf2sSK5NYO", "provider_name": "ClickHouse", "scope": "account", "service_id": "enterprise", "updateable_to": [ - "scale", "basic", + "scale", "enterprise" ] }, @@ -3178,8 +3178,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "project", "service_id": "agent-drive", @@ -3265,8 +3265,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "project", "service_id": "sandbox", @@ -3336,8 +3336,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-1", @@ -3352,10 +3352,6 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-1" - }, { "direction": "down", "service": "tier-2" @@ -3371,6 +3367,10 @@ { "direction": "up", "service": "tier-6" + }, + { + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3412,26 +3412,22 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-1", "tier-2", "tier-3", "tier-5", "tier-6", + "tier-1", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-1" - }, { "direction": "down", "service": "tier-2" @@ -3447,6 +3443,10 @@ { "direction": "up", "service": "tier-6" + }, + { + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3488,17 +3488,17 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-1", "tier-2", "tier-3", "tier-4", "tier-6", + "tier-1", "tier-5" ] }, @@ -3509,8 +3509,8 @@ "service": "tier-3" }, { - "direction": "down", - "service": "tier-1" + "direction": "up", + "service": "tier-4" }, { "direction": "up", @@ -3518,11 +3518,11 @@ }, { "direction": "up", - "service": "tier-4" + "service": "tier-6" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3564,26 +3564,22 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-2", "updateable_to": [ "tier-3", - "tier-1", - "tier-5", "tier-4", + "tier-5", "tier-6", + "tier-1", "tier-2" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-1" - }, { "direction": "down", "service": "tier-2" @@ -3599,6 +3595,10 @@ { "direction": "down", "service": "tier-5" + }, + { + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3640,41 +3640,41 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-6", "updateable_to": [ - "tier-1", "tier-2", "tier-3", "tier-4", "tier-5", + "tier-1", "tier-6" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-1" - }, { "direction": "down", "service": "tier-2" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { "direction": "up", "service": "tier-6" + }, + { + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3716,17 +3716,17 @@ ], "type": "paid" }, + "provider": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnoL4ZPCBLxqCQW5WJU", "provider_name": "Blaxel", "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-1", "tier-2", - "tier-5", "tier-4", + "tier-5", "tier-6", + "tier-1", "tier-3" ] }, @@ -3797,8 +3797,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Uo1AQvDtb7Wseng5OHw", "provider_configuration_schema": null, - "provider_id": "prvdr_61Uo1AQvDtb7Wseng5OHw", "provider_name": "PostalForm", "scope": "project", "service_id": "mail", @@ -3870,8 +3870,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnkAFYNcaD50TOY54Q4", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnkAFYNcaD50TOY54Q4", "provider_name": "HeyGen", "scope": "project", "service_id": "api", @@ -3924,8 +3924,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Unj5D2LO6EYhGmo5DBQ", "provider_name": "Exa", "scope": "project", "service_id": "api", @@ -3984,8 +3984,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_name": "E2B", "scope": "project", "service_id": "hobby", @@ -4045,8 +4045,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Um10GcB4A0pdo6z56Bk", "provider_name": "E2B", "scope": "project", "service_id": "pro", @@ -4139,8 +4139,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnTCu1qlHAWbYZU5Sv2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnTCu1qlHAWbYZU5Sv2", "provider_name": "Supermemory", "scope": "project", "service_id": "memory", @@ -4206,8 +4206,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_name": "KERNEL", "scope": "project", "service_id": "project", @@ -4219,11 +4219,11 @@ "allowed_updates": [ { "direction": "up", - "service": "startup" + "service": "hobbyist" }, { "direction": "up", - "service": "hobbyist" + "service": "startup" } ], "availability": "available", @@ -4258,14 +4258,14 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_name": "KERNEL", "scope": "account", "service_id": "developer", "updateable_to": [ - "startup", "hobbyist", + "startup", "developer" ] }, @@ -4324,8 +4324,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_name": "KERNEL", "scope": "account", "service_id": "startup", @@ -4337,13 +4337,13 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "developer" - }, { "direction": "up", "service": "startup" + }, + { + "direction": "down", + "service": "developer" } ], "availability": "available", @@ -4390,14 +4390,14 @@ ], "type": "paid" }, + "provider": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnOfhF7jlP9Fcxr55Z2", "provider_name": "KERNEL", "scope": "account", "service_id": "hobbyist", "updateable_to": [ - "developer", "startup", + "developer", "hobbyist" ] }, @@ -4476,8 +4476,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Uj2YmiyLwllzQQX5Vui", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Uj2YmiyLwllzQQX5Vui", "provider_name": "Wix", "scope": "project", "service_id": "headless", @@ -4692,8 +4692,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UnKXcVflBIkLCbX54aW", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UnKXcVflBIkLCbX54aW", "provider_name": "Parallel", "scope": "project", "service_id": "api", @@ -4746,8 +4746,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_name": "Laravel_Cloud", "scope": "account", "service_id": "growth", @@ -4830,8 +4830,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_name": "Laravel_Cloud", "scope": "project", "service_id": "valkey", @@ -4932,8 +4932,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_name": "Laravel_Cloud", "scope": "project", "service_id": "application", @@ -5015,8 +5015,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_name": "Laravel_Cloud", "scope": "project", "service_id": "mysql", @@ -5069,8 +5069,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulotgugv9hEYa1b5HwO", "provider_name": "Laravel_Cloud", "scope": "account", "service_id": "starter", @@ -5166,8 +5166,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UmxGkoAMSyI59y25SzA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UmxGkoAMSyI59y25SzA", "provider_name": "WordPress.com", "scope": "project", "service_id": "site", @@ -5221,8 +5221,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UmxGkoAMSyI59y25SzA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UmxGkoAMSyI59y25SzA", "provider_name": "WordPress.com", "scope": "project", "service_id": "domain", @@ -5276,8 +5276,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UlD0fxuDb9nsZ7c5VfE", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UlD0fxuDb9nsZ7c5VfE", "provider_name": "Base44_Projects", "scope": "project", "service_id": "app", @@ -5343,8 +5343,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_name": "Prisma", "scope": "project", "service_id": "database", @@ -5362,13 +5362,13 @@ "direction": "up", "service": "starter" }, - { - "direction": "any", - "service": "free" - }, { "direction": "up", "service": "pro" + }, + { + "direction": "any", + "service": "free" } ], "availability": "available", @@ -5392,16 +5392,16 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_name": "Prisma", "scope": "account", "service_id": "free", "updateable_to": [ "business", "starter", - "free", - "pro" + "pro", + "free" ] }, { @@ -5410,14 +5410,14 @@ "direction": "down", "service": "pro" }, - { - "direction": "any", - "service": "business" - }, { "direction": "down", "service": "free" }, + { + "direction": "any", + "service": "business" + }, { "direction": "down", "service": "starter" @@ -5456,15 +5456,15 @@ ], "type": "paid" }, + "provider": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_name": "Prisma", "scope": "account", "service_id": "business", "updateable_to": [ "pro", - "business", "free", + "business", "starter" ] }, @@ -5520,8 +5520,8 @@ ], "type": "paid" }, + "provider": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_name": "Prisma", "scope": "account", "service_id": "pro", @@ -5538,14 +5538,14 @@ "direction": "down", "service": "free" }, - { - "direction": "any", - "service": "starter" - }, { "direction": "up", "service": "business" }, + { + "direction": "any", + "service": "starter" + }, { "direction": "up", "service": "pro" @@ -5584,15 +5584,15 @@ ], "type": "paid" }, + "provider": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Ulq2NBoEkAzhMKC50vA", "provider_name": "Prisma", "scope": "account", "service_id": "starter", "updateable_to": [ "free", - "starter", "business", + "starter", "pro" ] }, @@ -5626,8 +5626,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61Uko2Ae2S1CUgAxI54kS", "provider_configuration_schema": {}, - "provider_id": "prvdr_61Uko2Ae2S1CUgAxI54kS", "provider_name": "Metronome", "scope": "project", "service_id": "sandbox", @@ -5693,8 +5693,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UjQLgXIM0R40WnZ5S8m", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UjQLgXIM0R40WnZ5S8m", "provider_name": "AgentPhone", "scope": "project", "service_id": "number", @@ -5744,8 +5744,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_name": "Twilio", "scope": "project", "service_id": "business", @@ -5795,8 +5795,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_name": "Twilio", "scope": "project", "service_id": "hobbyist", @@ -5840,8 +5840,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_name": "AgentMail", "scope": "project", "service_id": "api", @@ -5898,8 +5898,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UacoeBnJSHilBZJ5FIm", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UacoeBnJSHilBZJ5FIm", "provider_name": "Squarespace", "scope": "project", "service_id": "domain", @@ -5930,8 +5930,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UYtnmm5DvySq8Ol56tE", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UYtnmm5DvySq8Ol56tE", "provider_name": "ElevenLabs", "scope": "project", "service_id": "tts", @@ -6021,8 +6021,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UU7UnQL58lBHk2p55uC", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UU7UnQL58lBHk2p55uC", "provider_name": "Algolia", "scope": "project", "service_id": "application", @@ -6071,6 +6071,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6084,7 +6085,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_name": "Privy", "scope": "account", "service_id": "scale", @@ -6126,6 +6126,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6139,7 +6140,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_name": "Privy", "scope": "account", "service_id": "free", @@ -6190,6 +6190,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6203,7 +6204,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_name": "Privy", "scope": "account", "service_id": "core", @@ -6271,8 +6271,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "r2:bucket", @@ -6316,8 +6316,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_configuration_schema": null, - "provider_id": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_name": "Browserbase", "scope": "project", "service_id": "project", @@ -6377,6 +6377,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6406,7 +6407,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "b2b-professional", @@ -6470,6 +6470,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6499,7 +6500,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "b2b-essentials", @@ -6563,6 +6563,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6592,7 +6593,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "b2c-professional", @@ -6644,6 +6644,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6673,7 +6674,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "free", @@ -6737,6 +6737,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6766,7 +6767,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "b2c-essentials", @@ -6915,8 +6915,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVwArXdJpejOfkn5POi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVwArXdJpejOfkn5POi", "provider_name": "Render", "scope": "project", "service_id": "web-service", @@ -6960,6 +6960,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -6973,7 +6974,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_name": "Privy", "scope": "account", "service_id": "enterprise", @@ -7085,8 +7085,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_name": "Upstash", "scope": "project", "service_id": "vector", @@ -7171,8 +7171,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_name": "Upstash", "scope": "project", "service_id": "search", @@ -7252,8 +7252,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_name": "Upstash", "scope": "project", "service_id": "qstash", @@ -7376,8 +7376,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVa3kQyvSOEnWgd5Naa", "provider_name": "Upstash", "scope": "project", "service_id": "redis", @@ -7389,15 +7389,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" } ], "availability": "available", @@ -7435,15 +7435,15 @@ ], "type": "paid" }, + "provider": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_name": "Daytona", "scope": "project", "service_id": "top-up-0500", "updateable_to": [ - "top-up-2000", "top-up-1000", "top-up-0025", + "top-up-2000", "top-up-0500" ] }, @@ -7451,15 +7451,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" } ], "availability": "available", @@ -7497,15 +7497,15 @@ ], "type": "paid" }, + "provider": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_name": "Daytona", "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-0500", "top-up-0025", "top-up-2000", + "top-up-0500", "top-up-1000" ] }, @@ -7513,15 +7513,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" } ], "availability": "available", @@ -7559,15 +7559,15 @@ ], "type": "paid" }, + "provider": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_name": "Daytona", "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-0500", "top-up-1000", "top-up-2000", + "top-up-0500", "top-up-0025" ] }, @@ -7575,15 +7575,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" } ], "availability": "available", @@ -7621,15 +7621,15 @@ ], "type": "paid" }, + "provider": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_name": "Daytona", "scope": "project", "service_id": "top-up-2000", "updateable_to": [ - "top-up-0500", "top-up-1000", "top-up-0025", + "top-up-0500", "top-up-2000" ] }, @@ -7764,8 +7764,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UZ9SrkCMLr94xp859Vo", "provider_name": "Daytona", "scope": "project", "service_id": "sandbox", @@ -7777,11 +7777,11 @@ "allowed_updates": [ { "direction": "any", - "service": "team" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "team" } ], "availability": "available", @@ -7819,14 +7819,14 @@ ], "type": "paid" }, + "provider": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_name": "Supabase", "scope": "project", "service_id": "pro", "updateable_to": [ - "team", "free", + "team", "pro" ] }, @@ -7876,8 +7876,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_name": "Supabase", "scope": "project", "service_id": "team", @@ -7930,8 +7930,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_configuration_schema": null, - "provider_id": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_name": "Sentry", "scope": "account", "service_id": "developer", @@ -7996,8 +7996,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_configuration_schema": null, - "provider_id": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_name": "Sentry", "scope": "account", "service_id": "business", @@ -8062,8 +8062,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_configuration_schema": null, - "provider_id": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_name": "Sentry", "scope": "account", "service_id": "team", @@ -8117,8 +8117,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_configuration_schema": null, - "provider_id": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_name": "Browserbase", "scope": "project", "service_id": "developer", @@ -8160,8 +8160,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_configuration_schema": null, - "provider_id": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_name": "Browserbase", "scope": "project", "service_id": "free", @@ -8215,8 +8215,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_configuration_schema": null, - "provider_id": "prvdr_61UYA33tkF5l7Dkwz5KGG", "provider_name": "Browserbase", "scope": "project", "service_id": "startup", @@ -8317,8 +8317,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVwArXdJpejOfkn5POi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVwArXdJpejOfkn5POi", "provider_name": "Render", "scope": "project", "service_id": "postgres", @@ -8330,15 +8330,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" } ], "availability": "available", @@ -8376,6 +8376,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_configuration_schema": { "properties": { "marketing": { @@ -8397,14 +8398,13 @@ ], "type": "object" }, - "provider_id": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_name": "Amplitude", "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ - "plus-v3-25k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly", + "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] }, @@ -8412,15 +8412,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -8458,6 +8458,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_configuration_schema": { "properties": { "marketing": { @@ -8479,14 +8480,13 @@ ], "type": "object" }, - "provider_id": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_name": "Amplitude", "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ - "plus-v3-10k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] }, @@ -8494,11 +8494,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", @@ -8540,6 +8540,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_configuration_schema": { "properties": { "marketing": { @@ -8561,13 +8562,12 @@ ], "type": "object" }, - "provider_id": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_name": "Amplitude", "scope": "project", "service_id": "plus-v3-50k-mtu-monthly", "updateable_to": [ - "plus-v3-25k-mtu-monthly", "free", + "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", "plus-v3-50k-mtu-monthly" ] @@ -8602,8 +8602,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UXju1taz9UCvkk95GEK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UXju1taz9UCvkk95GEK", "provider_name": "Netlify", "scope": "project", "service_id": "project", @@ -8654,8 +8654,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "hobby", @@ -8702,8 +8702,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "pro", @@ -8760,6 +8760,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -8773,7 +8774,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UWLVjDZyzuP1BCY5EAi", "provider_name": "Privy", "scope": "project", "service_id": "app", @@ -8785,11 +8785,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "startup" }, { "direction": "any", - "service": "startup" + "service": "free" } ], "availability": "available", @@ -8827,14 +8827,14 @@ ], "type": "paid" }, + "provider": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_name": "AgentMail", "scope": "project", "service_id": "developer", "updateable_to": [ - "free", "startup", + "free", "developer" ] }, @@ -8884,8 +8884,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_name": "AgentMail", "scope": "project", "service_id": "startup", @@ -8929,8 +8929,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UWNSVKoGlVDwbHX5IUK", "provider_name": "AgentMail", "scope": "project", "service_id": "free", @@ -8995,8 +8995,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UVwArXdJpejOfkn5POi", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVwArXdJpejOfkn5POi", "provider_name": "Render", "scope": "project", "service_id": "static-site", @@ -9061,8 +9061,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_configuration_schema": null, - "provider_id": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_name": "Sentry", "scope": "account", "service_id": "seer", @@ -9130,8 +9130,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_configuration_schema": null, - "provider_id": "prvdr_61UWhMpOMGYc7qQhs53su", "provider_name": "Sentry", "scope": "project", "service_id": "project", @@ -9183,8 +9183,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_name": "Neon", "scope": "project", "service_id": "launch", @@ -9225,8 +9225,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_name": "Neon", "scope": "project", "service_id": "free", @@ -9287,8 +9287,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_name": "Inngest", "scope": "project", "service_id": "app", @@ -9328,8 +9328,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_name": "Inngest", "scope": "project", "service_id": "hobby", @@ -9372,8 +9372,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_name": "Supabase", "scope": "project", "service_id": "free", @@ -9451,8 +9451,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UIXYHdsyF69pZbG52n2", "provider_name": "Supabase", "scope": "project", "service_id": "project", @@ -9464,11 +9464,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9515,14 +9515,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "workers-ai", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "workers-ai" ] }, @@ -9530,11 +9530,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9585,14 +9585,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "browser-run", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "browser-run" ] }, @@ -9600,11 +9600,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9740,14 +9740,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "hyperdrive", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "hyperdrive" ] }, @@ -9755,11 +9755,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9819,14 +9819,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "kv", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "kv" ] }, @@ -9834,11 +9834,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9910,14 +9910,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "d1", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "d1" ] }, @@ -9925,11 +9925,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -9989,14 +9989,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "queues", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "queues" ] }, @@ -10004,11 +10004,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10051,14 +10051,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "containers", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "containers" ] }, @@ -10111,6 +10111,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -10140,7 +10141,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UVctyxfLOj4FpVw5Bmi", "provider_name": "Auth0", "scope": "project", "service_id": "client", @@ -10190,8 +10190,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61URImmFACEuDHEx651IO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URImmFACEuDHEx651IO", "provider_name": "OpenRouter", "scope": "project", "service_id": "api", @@ -10234,8 +10234,8 @@ ], "type": "paid" }, + "provider": "prvdr_61URImmFACEuDHEx651IO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URImmFACEuDHEx651IO", "provider_name": "OpenRouter", "scope": "project", "service_id": "pay_as_you_go", @@ -10299,8 +10299,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UVpYy9KwOpOlUVw5WD2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UVpYy9KwOpOlUVw5WD2", "provider_name": "WorkOS", "scope": "project", "service_id": "auth", @@ -10312,19 +10312,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", - "service": "free" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", - "service": "api" + "service": "free" } ], "availability": "available", @@ -10387,16 +10387,16 @@ ], "type": "paid" }, + "provider": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_name": "Firecrawl", "scope": "project", "service_id": "growth", "updateable_to": [ + "api", + "hobby", "standard", "free", - "hobby", - "api", "growth" ] }, @@ -10404,19 +10404,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", - "service": "api" + "service": "standard" }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10479,16 +10479,16 @@ ], "type": "paid" }, + "provider": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_name": "Firecrawl", "scope": "project", "service_id": "hobby", "updateable_to": [ - "standard", - "free", "api", "growth", + "standard", + "free", "hobby" ] }, @@ -10496,7 +10496,7 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "api" }, { "direction": "any", @@ -10504,11 +10504,11 @@ }, { "direction": "any", - "service": "api" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10571,16 +10571,16 @@ ], "type": "paid" }, + "provider": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_name": "Firecrawl", "scope": "project", "service_id": "standard", "updateable_to": [ - "free", - "hobby", "api", + "hobby", "growth", + "free", "standard" ] }, @@ -10612,8 +10612,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61URImmFACEuDHEx651IO", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URImmFACEuDHEx651IO", "provider_name": "OpenRouter", "scope": "project", "service_id": "free", @@ -10626,19 +10626,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "hobby" }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10679,9 +10679,9 @@ "type": "freeform" }, "parent_services": [ + "hobby", "standard", - "growth", - "hobby" + "growth" ], "type": "paid" } @@ -10691,16 +10691,16 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_name": "Firecrawl", "scope": "project", "service_id": "api", "updateable_to": [ - "standard", - "free", "hobby", "growth", + "standard", + "free", "api" ] }, @@ -10708,7 +10708,7 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", @@ -10716,11 +10716,11 @@ }, { "direction": "any", - "service": "api" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "standard" } ], "availability": "available", @@ -10748,16 +10748,16 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_configuration_schema": {}, - "provider_id": "prvdr_61URa0AjsVCYCdagK5Xqy", "provider_name": "Firecrawl", "scope": "project", "service_id": "free", "updateable_to": [ - "standard", - "hobby", "api", + "hobby", "growth", + "standard", "free" ] }, @@ -10793,8 +10793,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "workers:free", @@ -10852,8 +10852,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UU5TYtG0f1neJCz5EwK", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UU5TYtG0f1neJCz5EwK", "provider_name": "GitLab", "scope": "project", "service_id": "project", @@ -10893,8 +10893,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_configuration_schema": {}, - "provider_id": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_name": "Vercel", "scope": "project", "service_id": "hobby", @@ -10947,8 +10947,8 @@ ], "type": "paid" }, + "provider": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_configuration_schema": {}, - "provider_id": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_name": "Vercel", "scope": "project", "service_id": "pro", @@ -11003,8 +11003,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_name": "Mixpanel", "scope": "project", "service_id": "analytics", @@ -11024,11 +11024,11 @@ }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" } ], "availability": "available", @@ -11101,6 +11101,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_configuration_schema": { "properties": { "marketing": { @@ -11122,15 +11123,14 @@ ], "type": "object" }, - "provider_id": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_name": "Amplitude", "scope": "project", "service_id": "analytics", "updateable_to": [ "free", "plus-v3-50k-mtu-monthly", - "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-25k-mtu-monthly", "analytics" ] }, @@ -11138,11 +11138,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", @@ -11172,6 +11172,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_configuration_schema": { "properties": { "marketing": { @@ -11193,13 +11194,12 @@ ], "type": "object" }, - "provider_id": "prvdr_61UQYwVkrCANKYQdE5BLM", "provider_name": "Amplitude", "scope": "project", "service_id": "free", "updateable_to": [ - "plus-v3-25k-mtu-monthly", "plus-v3-50k-mtu-monthly", + "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", "free" ] @@ -11247,6 +11247,7 @@ ], "type": "paid" }, + "provider": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -11268,7 +11269,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_name": "PostHog", "scope": "project", "service_id": "pay_as_you_go", @@ -11308,6 +11308,7 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -11329,7 +11330,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_name": "PostHog", "scope": "project", "service_id": "free", @@ -11382,8 +11382,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "registrar:domain", @@ -11431,8 +11431,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_name": "Mixpanel", "scope": "account", "service_id": "growth", @@ -11469,8 +11469,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UTLwCr8KIRpEaZS54mu", "provider_name": "Mixpanel", "scope": "account", "service_id": "free", @@ -11523,8 +11523,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "workers:paid", @@ -11651,8 +11651,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_name": "Flyio", "scope": "project", "service_id": "mpg", @@ -11695,8 +11695,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_name": "Clerk", "scope": "project", "service_id": "pro", @@ -11758,8 +11758,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_name": "Flyio", "scope": "project", "service_id": "sprite", @@ -11802,10 +11802,10 @@ "type": "freeform" }, "parent_services": [ + "25K_emails+auto-replenish", "62.5K_emails+auto-replenish", "business", - "hobbyist", - "25K_emails+auto-replenish" + "hobbyist" ], "type": "paid" } @@ -11815,8 +11815,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQsPLOiNuyFxFP45ADo", "provider_name": "Twilio", "scope": "project", "service_id": "email", @@ -11870,8 +11870,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQUoA4NItxbLNIU5FF2", "provider_name": "Flyio", "scope": "project", "service_id": "app", @@ -11923,8 +11923,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQ7Ta2evjv111Sl5Tqa", "provider_name": "Inngest", "scope": "project", "service_id": "pro", @@ -11937,11 +11937,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -11992,14 +11992,14 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UQRSWMdrciFdBNs5Ipc", "provider_name": "Cloudflare", "scope": "project", "service_id": "workers", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "workers" ] }, @@ -12055,8 +12055,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UH8uNXFdoJUJOtT54AC", "provider_name": "Neon", "scope": "project", "service_id": "postgres", @@ -12115,8 +12115,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_configuration_schema": {}, - "provider_id": "prvdr_61ULUAr4zlQgZkvXY5LsG", "provider_name": "Vercel", "scope": "project", "service_id": "project", @@ -12175,8 +12175,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_name": "Runloop", "scope": "account", "service_id": "sandbox", @@ -12238,6 +12238,7 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_configuration_schema": { "additionalProperties": false, "properties": { @@ -12259,7 +12260,6 @@ ], "type": "object" }, - "provider_id": "prvdr_61UGMHNyOleb3A55m5Pg8", "provider_name": "PostHog", "scope": "project", "service_id": "analytics", @@ -12332,8 +12332,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_name": "Clerk", "scope": "project", "service_id": "auth", @@ -12369,8 +12369,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGOeSW4e0T9Etwn537w", "provider_name": "Clerk", "scope": "project", "service_id": "hobby", @@ -13601,8 +13601,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGL5sd8z0WkMArr5Jlo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGL5sd8z0WkMArr5Jlo", "provider_name": "PlanetScale", "scope": "project", "service_id": "mysql", @@ -15030,8 +15030,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGL5sd8z0WkMArr5Jlo", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGL5sd8z0WkMArr5Jlo", "provider_name": "PlanetScale", "scope": "project", "service_id": "postgresql", @@ -15098,8 +15098,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "bucket", @@ -15163,8 +15163,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "redis", @@ -15207,8 +15207,8 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "free", @@ -15273,8 +15273,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "postgres", @@ -15332,8 +15332,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "hosting", @@ -15396,8 +15396,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UK2uWsoydL7tUBp57Fg", "provider_name": "Railway", "scope": "project", "service_id": "mongo", @@ -15446,8 +15446,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_name": "Runloop", "scope": "account", "service_id": "pro", @@ -15497,8 +15497,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGhvzdmhefqNXre5WIS", "provider_name": "Runloop", "scope": "account", "service_id": "basic", @@ -15555,8 +15555,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UIblE5uGbHmAZLq5BgG", "provider_configuration_schema": null, - "provider_id": "prvdr_61UIblE5uGbHmAZLq5BgG", "provider_name": "Chroma", "scope": "project", "service_id": "database", @@ -15568,7 +15568,7 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler" + "service": "pro_overages" }, { "direction": "any", @@ -15576,15 +15576,15 @@ }, { "direction": "any", - "service": "pro" + "service": "developer_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" } ], "availability": "available", @@ -15631,17 +15631,17 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "developer", "updateable_to": [ - "scaler", + "pro_overages", "scaler_overages", - "pro", "developer_overages", - "pro_overages", + "scaler", + "pro", "developer" ] }, @@ -15700,8 +15700,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "scaler_overages", @@ -15762,8 +15762,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "pro", @@ -15831,8 +15831,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "scaler", @@ -15891,13 +15891,13 @@ "is_default": null, "paid": null, "parent_services": [ + "pro_overages", "scaler", "starter", "developer_overages", "developer", "pro", - "scaler_overages", - "pro_overages" + "scaler_overages" ], "type": "free" } @@ -15907,8 +15907,8 @@ "paid_pricing": [], "type": "component" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "project", "service_id": "database", @@ -15918,10 +15918,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "pro" - }, { "direction": "any", "service": "pro_overages" @@ -15933,6 +15929,10 @@ { "direction": "any", "service": "scaler_overages" + }, + { + "direction": "any", + "service": "pro" } ], "availability": "available", @@ -15979,16 +15979,16 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "pro", "pro_overages", "scaler", "scaler_overages", + "pro", "developer_overages" ] }, @@ -16038,8 +16038,8 @@ ], "type": "paid" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "pro_overages", @@ -16051,27 +16051,27 @@ "allowed_updates": [ { "direction": "any", - "service": "developer_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "developer_overages" }, { "direction": "any", - "service": "developer" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "pro" + "service": "developer" } ], "availability": "available", @@ -16106,18 +16106,18 @@ "paid_pricing": [], "type": "free" }, + "provider": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_configuration_schema": {}, - "provider_id": "prvdr_61UGLtrGjcXK8rTq15RWq", "provider_name": "Turso", "scope": "account", "service_id": "starter", "updateable_to": [ + "pro", "developer_overages", "scaler", - "developer", - "pro_overages", "scaler_overages", - "pro", + "pro_overages", + "developer", "starter" ] } diff --git a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt index 6f99b8b1..f25be47f 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt @@ -1,9 +1,9 @@ # stripe projects command surface -# plugin-version: 0.39.1 +# plugin-version: 0.40.0 # DO NOT EDIT — regenerated by CI (mise run stripe-refresh) ===== stripe projects --help ===== -Stripe Projects (v0.39.1) +Stripe Projects (v0.40.0) Provision third-party services, manage credentials, and pull environment variables. GET STARTED diff --git a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt index d2e2400e..9b0025a7 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt @@ -1 +1 @@ -0.39.1 +0.40.0 From 2de23e720dc70efe3d35dba13aa02903d1c26a40 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 10:21:49 +0000 Subject: [PATCH 03/26] chore(stripe-projects): re-bless catalog with Churnkey/retention Plugin stays at 0.40.0. Live catalog grew from 199 to 200 services. Command surface TRAVERSAL is unchanged. --- .../tests/fixtures/catalog.json | 816 +++++++++--------- 1 file changed, 428 insertions(+), 388 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 12015117..a137eb35 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -6,6 +6,46 @@ "provider": null, "provider_filter": null, "services": [ + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "payments" + ], + "configuration_schema": { + "properties": { + "company_name": { + "description": "Your company name as shown to customers in the cancel flow", + "type": "string" + } + }, + "type": "object" + }, + "constraints": [], + "created": null, + "description": "Cancel flows, failed payment recovery, and reactivation for Stripe subscriptions. Free 14-day trial, then billed by Churnkey (see churnkey.co/pricing). Returns Churnkey SDK credentials for one environment.", + "development": false, + "group": null, + "id": "prvsvc_61VPMO4IPcRRbwDld5UUq", + "kind": "deployable", + "livemode": true, + "llm_context": "https://sdk.churnkey.co/llm.md", + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": null, + "paid_pricing": [], + "type": "free" + }, + "provider": "prvdr_61VPMO2NNE73fBT3S5Ljc", + "provider_configuration_schema": {}, + "provider_name": "Churnkey", + "scope": "project", + "service_id": "retention", + "updateable_to": [ + "retention" + ] + }, { "allowed_updates": [ { @@ -99,15 +139,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -185,8 +225,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "developer" + "developer", + "hobby" ], "type": "free" } @@ -218,15 +258,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -377,15 +417,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -521,15 +561,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -654,15 +694,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -706,15 +746,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -833,8 +873,8 @@ "is_default": true, "paid": null, "parent_services": [ - "schematic-growth", - "schematic-free" + "schematic-free", + "schematic-growth" ], "type": "free" } @@ -1029,15 +1069,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1355,11 +1395,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", @@ -1405,8 +1445,8 @@ "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ - "free", "beginner-monthly", + "free", "pro-monthly", "enterprise-monthly" ] @@ -1415,11 +1455,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "free" }, { "direction": "any", @@ -1465,8 +1505,8 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ - "free", "pro-monthly", + "free", "enterprise-monthly", "beginner-monthly" ] @@ -1475,11 +1515,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", @@ -1525,8 +1565,8 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ - "free", "beginner-monthly", + "free", "enterprise-monthly", "pro-monthly" ] @@ -1535,11 +1575,11 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", @@ -1573,8 +1613,8 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "beginner-monthly", "pro-monthly", + "beginner-monthly", "enterprise-monthly", "free" ] @@ -1604,9 +1644,9 @@ "paid": null, "parent_services": [ "pro-monthly", - "enterprise-monthly", + "free", "beginner-monthly", - "free" + "enterprise-monthly" ], "type": "free" } @@ -1655,15 +1695,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1747,15 +1787,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1820,15 +1860,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1908,8 +1948,8 @@ "paid": null, "parent_services": [ "hobby", - "standard", - "pro" + "pro", + "standard" ], "type": "free" }, @@ -1945,11 +1985,11 @@ "allowed_updates": [ { "direction": "up", - "service": "pro" + "service": "standard" }, { "direction": "up", - "service": "standard" + "service": "pro" } ], "availability": "available", @@ -1958,15 +1998,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2005,8 +2045,8 @@ "scope": "account", "service_id": "hobby", "updateable_to": [ - "pro", "standard", + "pro", "hobby" ] }, @@ -2027,15 +2067,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2098,15 +2138,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2176,8 +2216,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer-plan", - "startup-plan" + "startup-plan", + "developer-plan" ], "type": "free" } @@ -2215,15 +2255,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2464,15 +2504,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2526,15 +2566,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3007,11 +3047,11 @@ "allowed_updates": [ { "direction": "up", - "service": "enterprise" + "service": "scale" }, { "direction": "up", - "service": "scale" + "service": "enterprise" } ], "availability": "available", @@ -3059,8 +3099,8 @@ "scope": "account", "service_id": "basic", "updateable_to": [ - "enterprise", "scale", + "enterprise", "basic" ] }, @@ -3278,11 +3318,11 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-2" + "service": "tier-6" }, { "direction": "up", - "service": "tier-3" + "service": "tier-5" }, { "direction": "up", @@ -3290,11 +3330,11 @@ }, { "direction": "up", - "service": "tier-5" + "service": "tier-3" }, { "direction": "up", - "service": "tier-6" + "service": "tier-2" } ], "availability": "available", @@ -3342,24 +3382,16 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-2", - "tier-3", - "tier-4", - "tier-5", "tier-6", + "tier-5", + "tier-4", + "tier-3", + "tier-2", "tier-1" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-2" - }, - { - "direction": "down", - "service": "tier-3" - }, { "direction": "up", "service": "tier-5" @@ -3368,6 +3400,14 @@ "direction": "up", "service": "tier-6" }, + { + "direction": "down", + "service": "tier-3" + }, + { + "direction": "down", + "service": "tier-2" + }, { "direction": "down", "service": "tier-1" @@ -3418,10 +3458,10 @@ "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-2", - "tier-3", "tier-5", "tier-6", + "tier-3", + "tier-2", "tier-1", "tier-4" ] @@ -3430,19 +3470,19 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-2" + "service": "tier-4" }, { - "direction": "down", - "service": "tier-3" + "direction": "up", + "service": "tier-6" }, { "direction": "down", - "service": "tier-4" + "service": "tier-3" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-2" }, { "direction": "down", @@ -3494,10 +3534,10 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-2", - "tier-3", "tier-4", "tier-6", + "tier-3", + "tier-2", "tier-1", "tier-5" ] @@ -3510,7 +3550,7 @@ }, { "direction": "up", - "service": "tier-4" + "service": "tier-6" }, { "direction": "up", @@ -3518,7 +3558,7 @@ }, { "direction": "up", - "service": "tier-6" + "service": "tier-4" }, { "direction": "down", @@ -3571,9 +3611,9 @@ "service_id": "tier-2", "updateable_to": [ "tier-3", - "tier-4", - "tier-5", "tier-6", + "tier-5", + "tier-4", "tier-1", "tier-2" ] @@ -3582,19 +3622,19 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-2" + "service": "tier-5" }, { "direction": "down", - "service": "tier-3" + "service": "tier-4" }, { "direction": "down", - "service": "tier-4" + "service": "tier-3" }, { "direction": "down", - "service": "tier-5" + "service": "tier-2" }, { "direction": "down", @@ -3646,10 +3686,10 @@ "scope": "account", "service_id": "tier-6", "updateable_to": [ - "tier-2", - "tier-3", - "tier-4", "tier-5", + "tier-4", + "tier-3", + "tier-2", "tier-1", "tier-6" ] @@ -3657,20 +3697,20 @@ { "allowed_updates": [ { - "direction": "down", - "service": "tier-2" + "direction": "up", + "service": "tier-5" }, { "direction": "up", - "service": "tier-4" + "service": "tier-6" }, { - "direction": "up", - "service": "tier-5" + "direction": "down", + "service": "tier-2" }, { "direction": "up", - "service": "tier-6" + "service": "tier-4" }, { "direction": "down", @@ -3722,10 +3762,10 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-2", - "tier-4", "tier-5", "tier-6", + "tier-2", + "tier-4", "tier-1", "tier-3" ] @@ -3946,15 +3986,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4007,15 +4047,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4195,8 +4235,8 @@ "paid": null, "parent_services": [ "hobbyist", - "developer", - "startup" + "startup", + "developer" ], "type": "free" } @@ -4232,15 +4272,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4286,15 +4326,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4337,13 +4377,13 @@ }, { "allowed_updates": [ - { - "direction": "up", - "service": "startup" - }, { "direction": "down", "service": "developer" + }, + { + "direction": "up", + "service": "startup" } ], "availability": "available", @@ -4352,15 +4392,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4396,8 +4436,8 @@ "scope": "account", "service_id": "hobbyist", "updateable_to": [ - "startup", "developer", + "startup", "hobbyist" ] }, @@ -4819,8 +4859,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -4921,8 +4961,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5004,8 +5044,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5331,9 +5371,9 @@ "paid": null, "parent_services": [ "pro", - "starter", + "free", "business", - "free" + "starter" ], "type": "free" } @@ -5356,19 +5396,19 @@ "allowed_updates": [ { "direction": "up", - "service": "business" + "service": "starter" }, { - "direction": "up", - "service": "starter" + "direction": "any", + "service": "free" }, { "direction": "up", - "service": "pro" + "service": "business" }, { - "direction": "any", - "service": "free" + "direction": "up", + "service": "pro" } ], "availability": "available", @@ -5398,10 +5438,10 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "business", "starter", - "pro", - "free" + "free", + "business", + "pro" ] }, { @@ -5470,10 +5510,6 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "free" - }, { "direction": "up", "service": "business" @@ -5482,6 +5518,10 @@ "direction": "any", "service": "pro" }, + { + "direction": "down", + "service": "free" + }, { "direction": "down", "service": "starter" @@ -5526,22 +5566,22 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "free", "business", "pro", + "free", "starter" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "free" - }, { "direction": "up", "service": "business" }, + { + "direction": "down", + "service": "free" + }, { "direction": "any", "service": "starter" @@ -5590,8 +5630,8 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "free", "business", + "free", "starter", "pro" ] @@ -5829,8 +5869,8 @@ "paid": null, "parent_services": [ "free", - "developer", - "startup" + "startup", + "developer" ], "type": "free" } @@ -6329,19 +6369,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2c-professional" + "service": "free" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-essentials" }, { "direction": "any", - "service": "free" + "service": "b2c-professional" } ], "availability": "available", @@ -6411,10 +6451,10 @@ "scope": "project", "service_id": "b2b-professional", "updateable_to": [ - "b2c-professional", - "b2b-essentials", - "b2c-essentials", "free", + "b2c-essentials", + "b2b-essentials", + "b2c-professional", "b2b-professional" ] }, @@ -6422,19 +6462,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "free" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "free" + "service": "b2b-professional" } ], "availability": "available", @@ -6504,10 +6544,10 @@ "scope": "project", "service_id": "b2b-essentials", "updateable_to": [ - "b2b-professional", - "b2c-professional", - "b2c-essentials", "free", + "b2c-essentials", + "b2c-professional", + "b2b-professional", "b2b-essentials" ] }, @@ -6515,19 +6555,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "free" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-essentials" }, { "direction": "any", - "service": "free" + "service": "b2b-professional" } ], "availability": "available", @@ -6597,10 +6637,10 @@ "scope": "project", "service_id": "b2c-professional", "updateable_to": [ - "b2b-professional", - "b2b-essentials", - "b2c-essentials", "free", + "b2c-essentials", + "b2b-essentials", + "b2b-professional", "b2c-professional" ] }, @@ -6608,19 +6648,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -6678,10 +6718,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2b-professional", - "b2c-professional", - "b2b-essentials", "b2c-essentials", + "b2b-essentials", + "b2c-professional", + "b2b-professional", "free" ] }, @@ -6689,19 +6729,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "free" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "free" + "service": "b2b-professional" } ], "availability": "available", @@ -6771,10 +6811,10 @@ "scope": "project", "service_id": "b2c-essentials", "updateable_to": [ - "b2b-professional", - "b2c-professional", - "b2b-essentials", "free", + "b2b-essentials", + "b2c-professional", + "b2b-professional", "b2c-essentials" ] }, @@ -7389,11 +7429,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" }, { "direction": "any", @@ -7441,8 +7481,8 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ - "top-up-1000", "top-up-0025", + "top-up-1000", "top-up-2000", "top-up-0500" ] @@ -7455,11 +7495,11 @@ }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" } ], "availability": "available", @@ -7504,8 +7544,8 @@ "service_id": "top-up-1000", "updateable_to": [ "top-up-0025", - "top-up-2000", "top-up-0500", + "top-up-2000", "top-up-1000" ] }, @@ -7517,11 +7557,11 @@ }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" } ], "availability": "available", @@ -7566,8 +7606,8 @@ "service_id": "top-up-0025", "updateable_to": [ "top-up-1000", - "top-up-2000", "top-up-0500", + "top-up-2000", "top-up-0025" ] }, @@ -7575,15 +7615,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" } ], "availability": "available", @@ -7627,9 +7667,9 @@ "scope": "project", "service_id": "top-up-2000", "updateable_to": [ - "top-up-1000", "top-up-0025", "top-up-0500", + "top-up-1000", "top-up-2000" ] }, @@ -7752,9 +7792,9 @@ }, "parent_services": [ "top-up-0025", - "top-up-0500", + "top-up-1000", "top-up-2000", - "top-up-1000" + "top-up-0500" ], "type": "paid" } @@ -7777,11 +7817,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "team" }, { "direction": "any", - "service": "team" + "service": "free" } ], "availability": "available", @@ -7825,8 +7865,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "free", "team", + "free", "pro" ] }, @@ -7834,11 +7874,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "free" } ], "availability": "available", @@ -7882,8 +7922,8 @@ "scope": "project", "service_id": "team", "updateable_to": [ - "free", "pro", + "free", "team" ] }, @@ -8747,10 +8787,10 @@ "is_default": null, "paid": null, "parent_services": [ - "core", - "enterprise", + "free", "scale", - "free" + "enterprise", + "core" ], "type": "free" } @@ -8785,11 +8825,11 @@ "allowed_updates": [ { "direction": "any", - "service": "startup" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "startup" } ], "availability": "available", @@ -8833,8 +8873,8 @@ "scope": "project", "service_id": "developer", "updateable_to": [ - "startup", "free", + "startup", "developer" ] }, @@ -8842,11 +8882,11 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "developer" } ], "availability": "available", @@ -8890,8 +8930,8 @@ "scope": "project", "service_id": "startup", "updateable_to": [ - "developer", "free", + "developer", "startup" ] }, @@ -8899,11 +8939,11 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "startup" }, { "direction": "any", - "service": "startup" + "service": "developer" } ], "availability": "available", @@ -8935,8 +8975,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "developer", "startup", + "developer", "free" ] }, @@ -9276,8 +9316,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -9342,11 +9382,11 @@ "allowed_updates": [ { "direction": "any", - "service": "team" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "team" } ], "availability": "available", @@ -9378,8 +9418,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "team", "pro", + "team", "free" ] }, @@ -9440,8 +9480,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "team" + "team", + "pro" ], "type": "paid" } @@ -10097,11 +10137,11 @@ "is_default": null, "paid": null, "parent_services": [ - "b2c-professional", "free", - "b2c-essentials", + "b2c-professional", + "b2b-professional", "b2b-essentials", - "b2b-professional" + "b2c-essentials" ], "type": "free" } @@ -10312,19 +10352,19 @@ "allowed_updates": [ { "direction": "any", - "service": "api" + "service": "free" }, { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10393,10 +10433,10 @@ "scope": "project", "service_id": "growth", "updateable_to": [ + "free", + "standard", "api", "hobby", - "standard", - "free", "growth" ] }, @@ -10404,19 +10444,19 @@ "allowed_updates": [ { "direction": "any", - "service": "api" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "growth" }, { "direction": "any", - "service": "free" + "service": "api" } ], "availability": "available", @@ -10485,10 +10525,10 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "api", - "growth", - "standard", "free", + "standard", + "growth", + "api", "hobby" ] }, @@ -10496,19 +10536,19 @@ "allowed_updates": [ { "direction": "any", - "service": "api" + "service": "free" }, { "direction": "any", - "service": "hobby" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10577,10 +10617,10 @@ "scope": "project", "service_id": "standard", "updateable_to": [ + "free", + "growth", "api", "hobby", - "growth", - "free", "standard" ] }, @@ -10626,19 +10666,19 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "growth" }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10680,8 +10720,8 @@ }, "parent_services": [ "hobby", - "standard", - "growth" + "growth", + "standard" ], "type": "paid" } @@ -10697,10 +10737,10 @@ "scope": "project", "service_id": "api", "updateable_to": [ - "hobby", - "growth", - "standard", "free", + "standard", + "growth", + "hobby", "api" ] }, @@ -10708,19 +10748,19 @@ "allowed_updates": [ { "direction": "any", - "service": "api" + "service": "standard" }, { "direction": "any", - "service": "hobby" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", - "service": "standard" + "service": "hobby" } ], "availability": "available", @@ -10754,10 +10794,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ + "standard", + "growth", "api", "hobby", - "growth", - "standard", "free" ] }, @@ -11016,7 +11056,7 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", @@ -11028,7 +11068,7 @@ }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -11127,10 +11167,10 @@ "scope": "project", "service_id": "analytics", "updateable_to": [ - "free", + "plus-v3-25k-mtu-monthly", "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", - "plus-v3-25k-mtu-monthly", + "free", "analytics" ] }, @@ -11802,10 +11842,10 @@ "type": "freeform" }, "parent_services": [ - "25K_emails+auto-replenish", "62.5K_emails+auto-replenish", - "business", - "hobbyist" + "25K_emails+auto-replenish", + "hobbyist", + "business" ], "type": "paid" } @@ -12104,8 +12144,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -15087,8 +15127,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15152,8 +15192,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15262,8 +15302,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15321,8 +15361,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15385,8 +15425,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15568,23 +15608,23 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "developer_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro" + "service": "scaler" } ], "availability": "available", @@ -15593,15 +15633,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15637,11 +15677,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ + "developer_overages", "pro_overages", + "pro", "scaler_overages", - "developer_overages", "scaler", - "pro", "developer" ] }, @@ -15649,11 +15689,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" } ], "availability": "available", @@ -15662,15 +15702,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15706,8 +15746,8 @@ "scope": "account", "service_id": "scaler_overages", "updateable_to": [ - "pro_overages", "pro", + "pro_overages", "scaler_overages" ] }, @@ -15724,15 +15764,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15776,7 +15816,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", @@ -15784,7 +15824,7 @@ }, { "direction": "any", - "service": "scaler_overages" + "service": "pro" } ], "availability": "available", @@ -15793,15 +15833,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15837,9 +15877,9 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "pro", - "pro_overages", "scaler_overages", + "pro_overages", + "pro", "scaler" ] }, @@ -15891,13 +15931,13 @@ "is_default": null, "paid": null, "parent_services": [ - "pro_overages", "scaler", - "starter", - "developer_overages", - "developer", + "pro_overages", + "scaler_overages", "pro", - "scaler_overages" + "developer", + "developer_overages", + "starter" ], "type": "free" } @@ -15920,19 +15960,19 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" } ], "availability": "available", @@ -15941,15 +15981,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15985,10 +16025,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "pro_overages", - "scaler", - "scaler_overages", "pro", + "scaler_overages", + "scaler", + "pro_overages", "developer_overages" ] }, @@ -16000,15 +16040,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16051,27 +16091,27 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "developer" }, { "direction": "any", - "service": "scaler" + "service": "pro_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "developer_overages" }, { "direction": "any", - "service": "developer" + "service": "pro" } ], "availability": "available", @@ -16080,15 +16120,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16112,12 +16152,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "pro", - "developer_overages", - "scaler", "scaler_overages", - "pro_overages", "developer", + "pro_overages", + "scaler", + "developer_overages", + "pro", "starter" ] } From 7ee7b97e6c6b43630757d72de1f5c6def351b844 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 10:21:51 +0000 Subject: [PATCH 04/26] feat(integrations): add churnkey/retention CatalogResource Register provider = "churnkey" with provisional OUTPUT_FIELDS from sdk.churnkey.co/llm.md until live discover can pin the envelope. --- .../provisional-allowlist.txt | 1 + .../src/providers/churnkey/mod.rs | 9 ++ .../src/providers/churnkey/retention.rs | 153 ++++++++++++++++++ .../src/providers/mod.rs | 12 +- crates/stackless-integrations/src/registry.rs | 1 + 5 files changed, 171 insertions(+), 5 deletions(-) create mode 100644 crates/stackless-integrations/src/providers/churnkey/mod.rs create mode 100644 crates/stackless-integrations/src/providers/churnkey/retention.rs diff --git a/crates/stackless-integrations/provisional-allowlist.txt b/crates/stackless-integrations/provisional-allowlist.txt index e76dceed..3b9b4453 100644 --- a/crates/stackless-integrations/provisional-allowlist.txt +++ b/crates/stackless-integrations/provisional-allowlist.txt @@ -7,6 +7,7 @@ # Externally blocked integrations keep source on disk but omit `pub mod` # + registry row and live in EXCL — see docs/ADDING-A-PROVIDER.md # § External pin blockers. Those files are not scanned here. +churnkey/retention herenow/hosting perplexity/api shopify/store diff --git a/crates/stackless-integrations/src/providers/churnkey/mod.rs b/crates/stackless-integrations/src/providers/churnkey/mod.rs new file mode 100644 index 00000000..32e77cd4 --- /dev/null +++ b/crates/stackless-integrations/src/providers/churnkey/mod.rs @@ -0,0 +1,9 @@ +//! Churnkey catalog resources via Stripe Projects. + +pub mod retention; + +#[allow(unused_imports)] +pub(crate) use crate::resource::{ + CatalogResource as FamilyResource, bool_optional, bool_required, int_optional, int_required, + integration_config, interp_optional, interp_required, +}; diff --git a/crates/stackless-integrations/src/providers/churnkey/retention.rs b/crates/stackless-integrations/src/providers/churnkey/retention.rs new file mode 100644 index 00000000..7cd8d4e1 --- /dev/null +++ b/crates/stackless-integrations/src/providers/churnkey/retention.rs @@ -0,0 +1,153 @@ +//! `churnkey/retention` integration. + +use std::collections::BTreeMap; + +use serde::Serialize; +use stackless_stripe_projects::catalog::verify::CatalogService; +use stackless_stripe_projects::provision::ProvisionContext; + +use super::FamilyResource; +use crate::error::IntegrationError; +use crate::hostable::{ConfigScope, Hostable, IntegrationHosting}; + +pub const RESOURCE_KIND: &str = "integration-churnkey"; + +#[derive(Debug, Serialize)] +pub struct ChurnkeyRetentionConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub company_name: Option, +} + +impl CatalogService for ChurnkeyRetentionConfig { + const REFERENCE: &'static str = "churnkey/retention"; +} + +#[derive(Debug)] +pub struct ChurnkeyRetention; + +impl Hostable for ChurnkeyRetention { + const PROVIDER: &'static str = "churnkey"; + const HOSTING: IntegrationHosting = IntegrationHosting::Managed; + const CONFIG_SCOPE: ConfigScope = ConfigScope::GlobalOnly; + const RESOURCE_KIND: &'static str = RESOURCE_KIND; + const OUTPUTS: &'static [&'static str] = &["app_id", "api_key", "data_api_key", "mode"]; +} + +impl FamilyResource for ChurnkeyRetention { + type Config = ChurnkeyRetentionConfig; + const PROVIDER_PREFIX: &'static str = "CHURNKEY"; + // Provisional until pinned by `mise run discover churnkey/retention`. + const OUTPUT_FIELDS: &'static [(&'static str, &'static str, bool)] = &[ + ("APP_ID", "app_id", true), + ("API_KEY", "api_key", true), + ("DATA_API_KEY", "data_api_key", true), + ("MODE", "mode", true), + ]; + + fn build_config( + ctx: &ProvisionContext<'_>, + ) -> Result { + let config = super::integration_config(ctx)?; + Ok(ChurnkeyRetentionConfig { + company_name: super::interp_optional(ctx, &config, "company_name")?, + }) + } +} + +pub fn validate_config( + name: &str, + config: &BTreeMap, +) -> Result<(), IntegrationError> { + let _ = (name, config); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ProviderOps; + use crate::resource::ResourcePayload; + use stackless_core::def::StackDef; + use stackless_stripe_projects::stripe::StripeProjects; + use stackless_stripe_projects::test_support; + + #[test] + fn config_matches_catalog() { + const FIXTURE: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../stackless-stripe-projects/tests/fixtures/catalog.json" + )); + let catalog = stackless_stripe_projects::Catalog::from_json_envelope(FIXTURE).unwrap(); + let failures = stackless_stripe_projects::verify_service( + &catalog, + &ChurnkeyRetentionConfig { company_name: None }, + ); + assert!( + failures.is_empty(), + "churnkey/retention catalog gaps:\n{}", + failures.join("\n") + ); + } + + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"id":"prvsvc_retention","object":"v2.provisioning.provider_service_detail","provider":"prvdr_churnkey","provider_name":"Churnkey","service_id":"retention","categories":["payments"],"kind":"deployable","scope":"project","availability":"available","development":false,"livemode":true,"pricing":{"type":"free"},"configuration_schema":{"properties":{"company_name":{"description":"Your company name as shown to customers in the cancel flow","type":"string"}},"type":"object"}}]}}"##; + + fn test_def() -> StackDef { + StackDef::parse( + r#" +[stack] +name = "atto" +[stack.projects.stripe] +project = "project_1" +[integrations.res] +provider = "churnkey" +[services.api] +source = { repo = "r", ref = "main" } +env = { OUT = "${integrations.res.api_key}" } +health = { path = "/health" } +[services.api.local] +run = "true" +"#, + ) + .unwrap() + } + + #[tokio::test] + async fn provision_records_outputs() { + let runner = test_support::provision_script( + CATALOG_ENVELOPE, + serde_json::json!({ + "CHURNKEY_APP_ID": "val_app_id", + "CHURNKEY_API_KEY": "val_api_key", + "CHURNKEY_DATA_API_KEY": "val_data_api_key", + "CHURNKEY_MODE": "val_mode" + }), + 0, + ); + let dir = tempfile::tempdir().unwrap(); + std::fs::write( + dir.path().join("stackless.toml"), + "[stack]\nname=\"atto\"\n", + ) + .unwrap(); + let stripe = StripeProjects::new(&runner, dir.path()); + + let resource = ChurnkeyRetention + .provision( + &stripe.as_dyn(), + &test_def(), + dir.path(), + "demo", + "res", + "local", + false, + ) + .await + .unwrap(); + assert_eq!(resource.resource_kind, "integration-churnkey"); + let payload: ResourcePayload = serde_json::from_str(&resource.payload).unwrap(); + assert_eq!(payload.outputs["app_id"], "val_app_id"); + assert_eq!(payload.outputs["api_key"], "val_api_key"); + assert_eq!(payload.outputs["data_api_key"], "val_data_api_key"); + assert_eq!(payload.outputs["mode"], "val_mode"); + } +} diff --git a/crates/stackless-integrations/src/providers/mod.rs b/crates/stackless-integrations/src/providers/mod.rs index 1d3b936f..d9114832 100644 --- a/crates/stackless-integrations/src/providers/mod.rs +++ b/crates/stackless-integrations/src/providers/mod.rs @@ -6,6 +6,7 @@ pub mod base44_projects; pub mod blaxel; pub mod browserbase; pub mod chatbase; +pub mod churnkey; pub mod clerk; pub mod clickhouse; pub mod cloudflare; @@ -58,11 +59,11 @@ mod tests { use crate::providers::{ agentmail, agentphone, amplitude, auth0, base44_projects, blaxel, browserbase, chatbase, - clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, elevenlabs, exa, - firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, metronome, mixpanel, - neon, openrouter, parallel, perplexity, planetscale, postalform, posthog, prisma, pydantic, - railway, render_db, revenuecat, runloop, schematic, sentry, shopify, steel, supabase, - supermemory, tabstack, turso, upstash, wix, wordpress_com, workos, + churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, elevenlabs, + exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, metronome, + mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, posthog, prisma, + pydantic, railway, render_db, revenuecat, runloop, schematic, sentry, shopify, steel, + supabase, supermemory, tabstack, turso, upstash, wix, wordpress_com, workos, }; fn assert_outputs_match() { @@ -94,6 +95,7 @@ mod tests { assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); + assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); diff --git a/crates/stackless-integrations/src/registry.rs b/crates/stackless-integrations/src/registry.rs index 90f7ce45..5afa3311 100644 --- a/crates/stackless-integrations/src/registry.rs +++ b/crates/stackless-integrations/src/registry.rs @@ -84,6 +84,7 @@ register_providers! { (blaxel::sandbox, BlaxelSandbox), (browserbase::project, BrowserbaseProject), (chatbase::agent, ChatbaseAgent), + (churnkey::retention, ChurnkeyRetention), (clickhouse::cluster, ClickHouseClickhouse), (clickhouse::postgres, ClickHousePostgres), (composio::project, ComposioProject), From d75c25a1b5522219e71e9b9dcb534b4dc6da0db7 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 10:25:47 +0000 Subject: [PATCH 05/26] refactor(integrations): deslop churnkey module imports Narrow the family re-exports so unused_imports allow is unnecessary. Protect the hand-written adapter from generator regen via SHORT_PROVIDER. --- .../stackless-integrations/src/providers/churnkey/mod.rs | 6 +----- .../src/providers/churnkey/retention.rs | 2 -- scripts/generate_catalog_integrations.py | 7 +++++++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/crates/stackless-integrations/src/providers/churnkey/mod.rs b/crates/stackless-integrations/src/providers/churnkey/mod.rs index 32e77cd4..1b87d84b 100644 --- a/crates/stackless-integrations/src/providers/churnkey/mod.rs +++ b/crates/stackless-integrations/src/providers/churnkey/mod.rs @@ -1,9 +1,5 @@ -//! Churnkey catalog resources via Stripe Projects. - pub mod retention; -#[allow(unused_imports)] pub(crate) use crate::resource::{ - CatalogResource as FamilyResource, bool_optional, bool_required, int_optional, int_required, - integration_config, interp_optional, interp_required, + CatalogResource as FamilyResource, integration_config, interp_optional, }; diff --git a/crates/stackless-integrations/src/providers/churnkey/retention.rs b/crates/stackless-integrations/src/providers/churnkey/retention.rs index 7cd8d4e1..0a6685a1 100644 --- a/crates/stackless-integrations/src/providers/churnkey/retention.rs +++ b/crates/stackless-integrations/src/providers/churnkey/retention.rs @@ -1,5 +1,3 @@ -//! `churnkey/retention` integration. - use std::collections::BTreeMap; use serde::Serialize; diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index 0f6e362d..d450511d 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -90,6 +90,7 @@ "turso/database": "turso", "prisma/database": "prisma", "chroma/database": "chroma", + "churnkey/retention": "churnkey", "algolia/application": "algolia", "openrouter/api": "openrouter", "exa/api": "exa", @@ -188,6 +189,12 @@ "clickhouse/clickhouse": [("CONNECTION_STRING", "connection_string", True)], "clickhouse/postgres": [("CONNECTION_STRING", "connection_string", True)], "chroma/database": [("API_KEY", "api_key", True)], + "churnkey/retention": [ + ("APP_ID", "app_id", True), + ("API_KEY", "api_key", True), + ("DATA_API_KEY", "data_api_key", True), + ("MODE", "mode", True), + ], "sentry/project": [ ("AUTH_TOKEN", "auth_token", True), ("DSN", "dsn", True), From 1c3e9674d9169538a21364416ce17c280b3dfc23 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 10:32:55 +0000 Subject: [PATCH 06/26] docs(providers): list churnkey, herenow, and perplexity Sync PROVIDERS.md with register_providers! so the catalog table matches the registry after Churnkey lands and after prior provisional adds. --- PROVIDERS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PROVIDERS.md b/PROVIDERS.md index 2de466e6..eec29fe2 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -51,6 +51,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `blaxel-sandbox` | `blaxel/sandbox` | | `browserbase` | `browserbase/project` | | `chatbase` | `chatbase/agent` | +| `churnkey` | `churnkey/retention` | | `clerk` | `clerk/auth` | | `clickhouse` | `clickhouse/clickhouse` | | `clickhouse-postgres` | `clickhouse/postgres` | @@ -73,6 +74,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `flyio-mpg` | `flyio/mpg` | | `flyio-sprite` | `flyio/sprite` | | `gitlab` | `gitlab/project` | +| `herenow` | `herenow/hosting` | | `inngest` | `inngest/app` | | `kernel` | `kernel/project` | | `laravel-cloud` | `laravel_cloud/application` | From 96927ff772e257f319b84f38993159ba1bc19a80 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 16 Sep 2026 10:34:04 +0000 Subject: [PATCH 07/26] docs(providers): add missing perplexity row Companion to the prior PROVIDERS.md sync; the perplexity line was left unstaged when pre-push stashed the working tree. --- PROVIDERS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/PROVIDERS.md b/PROVIDERS.md index eec29fe2..152df7ae 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -85,6 +85,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `neon` | `neon/postgres` | | `openrouter` | `openrouter/api` | | `parallel` | `parallel/api` | +| `perplexity` | `perplexity/api` | | `planetscale-mysql` | `planetscale/mysql` | | `planetscale-postgresql` | `planetscale/postgresql` | | `postalform` | `postalform/mail` | From c44be63120fd1378d0d08401fa75d8d09ac42373 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 17 Sep 2026 10:06:24 +0000 Subject: [PATCH 08/26] chore(stripe-projects): re-bless catalog with Athena/agents Server-side catalog at plugin 0.40.0 gained Athena/agents (free deployable). --- .../tests/fixtures/catalog.json | 967 ++++++++++-------- 1 file changed, 551 insertions(+), 416 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index a137eb35..9eda662d 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -46,6 +46,144 @@ "retention" ] }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "ai" + ], + "configuration_schema": { + "properties": { + "connect_mcp": { + "default": "no", + "description": "Connect one public HTTPS MCP server?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_coding": { + "default": "no", + "description": "Enable coding and deep thinking?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_deep_research": { + "default": "no", + "description": "Enable deep research?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_google_maps": { + "default": "no", + "description": "Enable Google Maps?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_image_generation": { + "default": "no", + "description": "Enable image generation?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_live": { + "default": "no", + "description": "Enable live voice sessions?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "enable_music_generation": { + "default": "no", + "description": "Enable music generation?", + "enum": [ + "no", + "yes" + ], + "type": "string" + }, + "google_maps_api_key": { + "description": "Google Maps API key. Required only when Google Maps is enabled.", + "type": "string" + }, + "instructions": { + "description": "Instructions for the Athena agent (maximum 2,000 characters).", + "type": "string" + }, + "mcp_url": { + "description": "Public HTTPS MCP server URL. Leave blank when no MCP server is connected.", + "type": "string" + }, + "name": { + "description": "Name for the Athena agent.", + "type": "string" + }, + "starter_1": { + "description": "Optional first conversation starter shown on the public agent.", + "type": "string" + }, + "starter_2": { + "description": "Optional second conversation starter shown on the public agent.", + "type": "string" + }, + "starter_3": { + "description": "Optional third conversation starter shown on the public agent.", + "type": "string" + } + }, + "required": [ + "name", + "instructions", + "connect_mcp", + "enable_image_generation", + "enable_music_generation", + "enable_live", + "enable_coding", + "enable_deep_research", + "enable_google_maps" + ], + "type": "object" + }, + "constraints": [], + "created": null, + "description": "Configurable Athena AI agent with an optional public HTTPS MCP server.", + "development": false, + "group": null, + "id": "prvsvc_61VNv58mq1zOThOYP5VZA", + "kind": "deployable", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": null, + "paid_pricing": [], + "type": "free" + }, + "provider": "prvdr_61VNueP9cELmCU01Z5DFA", + "provider_configuration_schema": {}, + "provider_name": "Athena", + "scope": "project", + "service_id": "agents", + "updateable_to": [ + "agents" + ] + }, { "allowed_updates": [ { @@ -139,15 +277,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -225,8 +363,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", - "hobby" + "hobby", + "developer" ], "type": "free" } @@ -258,15 +396,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -417,15 +555,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -561,15 +699,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -694,15 +832,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -746,15 +884,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -873,8 +1011,8 @@ "is_default": true, "paid": null, "parent_services": [ - "schematic-free", - "schematic-growth" + "schematic-growth", + "schematic-free" ], "type": "free" } @@ -1069,15 +1207,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1399,11 +1537,11 @@ }, { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "free" } ], "availability": "available", @@ -1446,8 +1584,8 @@ "service_id": "enterprise-monthly", "updateable_to": [ "beginner-monthly", - "free", "pro-monthly", + "free", "enterprise-monthly" ] }, @@ -1455,7 +1593,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" }, { "direction": "any", @@ -1463,7 +1601,7 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -1505,9 +1643,9 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ - "pro-monthly", - "free", "enterprise-monthly", + "free", + "pro-monthly", "beginner-monthly" ] }, @@ -1515,15 +1653,15 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "free" + "service": "beginner-monthly" }, { "direction": "any", - "service": "enterprise-monthly" + "service": "free" } ], "availability": "available", @@ -1565,9 +1703,9 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ + "enterprise-monthly", "beginner-monthly", "free", - "enterprise-monthly", "pro-monthly" ] }, @@ -1575,7 +1713,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" }, { "direction": "any", @@ -1583,7 +1721,7 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -1613,9 +1751,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "pro-monthly", - "beginner-monthly", "enterprise-monthly", + "beginner-monthly", + "pro-monthly", "free" ] }, @@ -1643,10 +1781,10 @@ "is_default": null, "paid": null, "parent_services": [ - "pro-monthly", - "free", + "enterprise-monthly", "beginner-monthly", - "enterprise-monthly" + "free", + "pro-monthly" ], "type": "free" } @@ -1695,15 +1833,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1787,15 +1925,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1847,11 +1985,11 @@ "allowed_updates": [ { "direction": "down", - "service": "standard" + "service": "hobby" }, { "direction": "down", - "service": "hobby" + "service": "standard" } ], "availability": "available", @@ -1860,15 +1998,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1907,8 +2045,8 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "standard", "hobby", + "standard", "pro" ] }, @@ -1947,9 +2085,9 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", + "standard", "pro", - "standard" + "hobby" ], "type": "free" }, @@ -1985,11 +2123,11 @@ "allowed_updates": [ { "direction": "up", - "service": "standard" + "service": "pro" }, { "direction": "up", - "service": "pro" + "service": "standard" } ], "availability": "available", @@ -1998,15 +2136,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2045,20 +2183,20 @@ "scope": "account", "service_id": "hobby", "updateable_to": [ - "standard", "pro", + "standard", "hobby" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "pro" - }, { "direction": "down", "service": "hobby" + }, + { + "direction": "up", + "service": "pro" } ], "availability": "available", @@ -2067,15 +2205,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2114,8 +2252,8 @@ "scope": "account", "service_id": "standard", "updateable_to": [ - "pro", "hobby", + "pro", "standard" ] }, @@ -2138,15 +2276,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2216,8 +2354,8 @@ "is_default": null, "paid": null, "parent_services": [ - "startup-plan", - "developer-plan" + "developer-plan", + "startup-plan" ], "type": "free" } @@ -2255,15 +2393,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2479,10 +2617,7 @@ "type": "free" }, "provider": "prvdr_61UvIBCNECigaYpha53zM", - "provider_configuration_schema": { - "properties": {}, - "type": "object" - }, + "provider_configuration_schema": {}, "provider_name": "RevenueCat", "scope": "project", "service_id": "app", @@ -2504,15 +2639,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2566,15 +2701,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2814,13 +2949,13 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "basic" - }, { "direction": "up", "service": "enterprise" + }, + { + "direction": "down", + "service": "basic" } ], "availability": "available", @@ -2868,8 +3003,8 @@ "scope": "account", "service_id": "scale", "updateable_to": [ - "basic", "enterprise", + "basic", "scale" ] }, @@ -3047,11 +3182,11 @@ "allowed_updates": [ { "direction": "up", - "service": "scale" + "service": "enterprise" }, { "direction": "up", - "service": "enterprise" + "service": "scale" } ], "availability": "available", @@ -3099,8 +3234,8 @@ "scope": "account", "service_id": "basic", "updateable_to": [ - "scale", "enterprise", + "scale", "basic" ] }, @@ -3108,11 +3243,11 @@ "allowed_updates": [ { "direction": "down", - "service": "basic" + "service": "scale" }, { "direction": "down", - "service": "scale" + "service": "basic" } ], "availability": "available", @@ -3160,8 +3295,8 @@ "scope": "account", "service_id": "enterprise", "updateable_to": [ - "basic", "scale", + "basic", "enterprise" ] }, @@ -3318,19 +3453,19 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-6" + "service": "tier-3" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { "direction": "up", - "service": "tier-3" + "service": "tier-6" }, { "direction": "up", @@ -3382,10 +3517,10 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-6", - "tier-5", - "tier-4", "tier-3", + "tier-4", + "tier-5", + "tier-6", "tier-2", "tier-1" ] @@ -3402,7 +3537,7 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" }, { "direction": "down", @@ -3410,7 +3545,7 @@ }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" } ], "availability": "available", @@ -3460,25 +3595,21 @@ "updateable_to": [ "tier-5", "tier-6", - "tier-3", - "tier-2", "tier-1", + "tier-2", + "tier-3", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-4" - }, { "direction": "up", "service": "tier-6" }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" }, { "direction": "down", @@ -3486,7 +3617,11 @@ }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" + }, + { + "direction": "down", + "service": "tier-4" } ], "availability": "available", @@ -3534,11 +3669,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-4", "tier-6", - "tier-3", - "tier-2", "tier-1", + "tier-2", + "tier-3", + "tier-4", "tier-5" ] }, @@ -3550,7 +3685,7 @@ }, { "direction": "up", - "service": "tier-6" + "service": "tier-4" }, { "direction": "up", @@ -3558,7 +3693,7 @@ }, { "direction": "up", - "service": "tier-4" + "service": "tier-6" }, { "direction": "down", @@ -3611,9 +3746,9 @@ "service_id": "tier-2", "updateable_to": [ "tier-3", - "tier-6", - "tier-5", "tier-4", + "tier-5", + "tier-6", "tier-1", "tier-2" ] @@ -3626,19 +3761,19 @@ }, { "direction": "down", - "service": "tier-4" + "service": "tier-1" }, { "direction": "down", - "service": "tier-3" + "service": "tier-2" }, { "direction": "down", - "service": "tier-2" + "service": "tier-3" }, { "direction": "down", - "service": "tier-1" + "service": "tier-4" } ], "availability": "available", @@ -3687,15 +3822,19 @@ "service_id": "tier-6", "updateable_to": [ "tier-5", - "tier-4", - "tier-3", - "tier-2", "tier-1", + "tier-2", + "tier-3", + "tier-4", "tier-6" ] }, { "allowed_updates": [ + { + "direction": "up", + "service": "tier-4" + }, { "direction": "up", "service": "tier-5" @@ -3706,15 +3845,11 @@ }, { "direction": "down", - "service": "tier-2" - }, - { - "direction": "up", - "service": "tier-4" + "service": "tier-1" }, { "direction": "down", - "service": "tier-1" + "service": "tier-2" } ], "availability": "available", @@ -3762,11 +3897,11 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ + "tier-4", "tier-5", "tier-6", - "tier-2", - "tier-4", "tier-1", + "tier-2", "tier-3" ] }, @@ -3986,15 +4121,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4047,15 +4182,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4234,9 +4369,9 @@ "is_default": null, "paid": null, "parent_services": [ - "hobbyist", + "developer", "startup", - "developer" + "hobbyist" ], "type": "free" } @@ -4259,11 +4394,11 @@ "allowed_updates": [ { "direction": "up", - "service": "hobbyist" + "service": "startup" }, { "direction": "up", - "service": "startup" + "service": "hobbyist" } ], "availability": "available", @@ -4272,15 +4407,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4304,8 +4439,8 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "hobbyist", "startup", + "hobbyist", "developer" ] }, @@ -4326,15 +4461,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4392,15 +4527,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4859,8 +4994,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -4961,8 +5096,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5044,8 +5179,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5370,10 +5505,10 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "free", + "starter", "business", - "starter" + "free", + "pro" ], "type": "free" } @@ -5394,10 +5529,6 @@ }, { "allowed_updates": [ - { - "direction": "up", - "service": "starter" - }, { "direction": "any", "service": "free" @@ -5406,6 +5537,10 @@ "direction": "up", "service": "business" }, + { + "direction": "up", + "service": "starter" + }, { "direction": "up", "service": "pro" @@ -5438,14 +5573,18 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "starter", "free", "business", + "starter", "pro" ] }, { "allowed_updates": [ + { + "direction": "down", + "service": "starter" + }, { "direction": "down", "service": "pro" @@ -5457,10 +5596,6 @@ { "direction": "any", "service": "business" - }, - { - "direction": "down", - "service": "starter" } ], "availability": "available", @@ -5502,17 +5637,17 @@ "scope": "account", "service_id": "business", "updateable_to": [ + "starter", "pro", "free", - "business", - "starter" + "business" ] }, { "allowed_updates": [ { - "direction": "up", - "service": "business" + "direction": "down", + "service": "starter" }, { "direction": "any", @@ -5523,8 +5658,8 @@ "service": "free" }, { - "direction": "down", - "service": "starter" + "direction": "up", + "service": "business" } ], "availability": "available", @@ -5566,29 +5701,29 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "business", + "starter", "pro", "free", - "starter" + "business" ] }, { "allowed_updates": [ { "direction": "up", - "service": "business" + "service": "pro" }, { "direction": "down", "service": "free" }, { - "direction": "any", - "service": "starter" + "direction": "up", + "service": "business" }, { - "direction": "up", - "service": "pro" + "direction": "any", + "service": "starter" } ], "availability": "available", @@ -5630,10 +5765,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "business", + "pro", "free", - "starter", - "pro" + "business", + "starter" ] }, { @@ -5868,9 +6003,9 @@ "is_default": null, "paid": null, "parent_services": [ - "free", + "developer", "startup", - "developer" + "free" ], "type": "free" } @@ -6137,11 +6272,11 @@ "allowed_updates": [ { "direction": "up", - "service": "core" + "service": "scale" }, { "direction": "up", - "service": "scale" + "service": "core" } ], "availability": "available", @@ -6184,8 +6319,8 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "core", "scale", + "core", "free" ] }, @@ -6373,7 +6508,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" }, { "direction": "any", @@ -6381,7 +6516,7 @@ }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -6452,9 +6587,9 @@ "service_id": "b2b-professional", "updateable_to": [ "free", - "b2c-essentials", - "b2b-essentials", "b2c-professional", + "b2b-essentials", + "b2c-essentials", "b2b-professional" ] }, @@ -6466,7 +6601,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -6474,7 +6609,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -6545,9 +6680,9 @@ "service_id": "b2b-essentials", "updateable_to": [ "free", - "b2c-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2c-essentials", "b2b-essentials" ] }, @@ -6559,7 +6694,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -6567,7 +6702,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -6638,9 +6773,9 @@ "service_id": "b2c-professional", "updateable_to": [ "free", - "b2c-essentials", - "b2b-essentials", "b2b-professional", + "b2b-essentials", + "b2c-essentials", "b2c-professional" ] }, @@ -6648,19 +6783,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -6718,10 +6853,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2c-essentials", - "b2b-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2b-essentials", + "b2c-essentials", "free" ] }, @@ -6733,7 +6868,7 @@ }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -6741,7 +6876,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2b-essentials" } ], "availability": "available", @@ -6812,9 +6947,9 @@ "service_id": "b2c-essentials", "updateable_to": [ "free", - "b2b-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2b-essentials", "b2c-essentials" ] }, @@ -7491,11 +7626,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" }, { "direction": "any", @@ -7543,8 +7678,8 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-0025", "top-up-0500", + "top-up-0025", "top-up-2000", "top-up-1000" ] @@ -7553,11 +7688,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" }, { "direction": "any", @@ -7605,8 +7740,8 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-1000", "top-up-0500", + "top-up-1000", "top-up-2000", "top-up-0025" ] @@ -7615,15 +7750,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" } ], "availability": "available", @@ -7667,9 +7802,9 @@ "scope": "project", "service_id": "top-up-2000", "updateable_to": [ - "top-up-0025", "top-up-0500", "top-up-1000", + "top-up-0025", "top-up-2000" ] }, @@ -7791,10 +7926,10 @@ "type": "freeform" }, "parent_services": [ - "top-up-0025", - "top-up-1000", + "top-up-0500", "top-up-2000", - "top-up-0500" + "top-up-1000", + "top-up-0025" ], "type": "paid" } @@ -7817,11 +7952,11 @@ "allowed_updates": [ { "direction": "any", - "service": "team" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "team" } ], "availability": "available", @@ -7865,8 +8000,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "team", "free", + "team", "pro" ] }, @@ -7874,11 +8009,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "pro" } ], "availability": "available", @@ -7922,8 +8057,8 @@ "scope": "project", "service_id": "team", "updateable_to": [ - "pro", "free", + "pro", "team" ] }, @@ -8370,11 +8505,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", @@ -8442,8 +8577,8 @@ "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ - "free", "plus-v3-50k-mtu-monthly", + "free", "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] @@ -8452,15 +8587,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -8524,9 +8659,9 @@ "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ - "free", "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "free", "plus-v3-25k-mtu-monthly" ] }, @@ -8534,15 +8669,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" } ], "availability": "available", @@ -8606,9 +8741,9 @@ "scope": "project", "service_id": "plus-v3-50k-mtu-monthly", "updateable_to": [ + "plus-v3-10k-mtu-monthly", "free", "plus-v3-25k-mtu-monthly", - "plus-v3-10k-mtu-monthly", "plus-v3-50k-mtu-monthly" ] }, @@ -8787,10 +8922,10 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "scale", + "core", "enterprise", - "core" + "scale", + "free" ], "type": "free" } @@ -8939,11 +9074,11 @@ "allowed_updates": [ { "direction": "any", - "service": "startup" + "service": "developer" }, { "direction": "any", - "service": "developer" + "service": "startup" } ], "availability": "available", @@ -8975,8 +9110,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "startup", "developer", + "startup", "free" ] }, @@ -9183,11 +9318,11 @@ "allowed_updates": [ { "direction": "any", - "service": "launch" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "launch" } ], "availability": "available", @@ -9229,19 +9364,19 @@ "scope": "project", "service_id": "launch", "updateable_to": [ - "launch", - "free" + "free", + "launch" ] }, { "allowed_updates": [ { "direction": "any", - "service": "launch" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "launch" } ], "availability": "available", @@ -9271,8 +9406,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "launch", - "free" + "free", + "launch" ] }, { @@ -9316,8 +9451,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -9340,11 +9475,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -9374,8 +9509,8 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { @@ -9480,8 +9615,8 @@ "type": "freeform" }, "parent_services": [ - "team", - "pro" + "pro", + "team" ], "type": "paid" } @@ -10138,10 +10273,10 @@ "paid": null, "parent_services": [ "free", - "b2c-professional", - "b2b-professional", + "b2c-essentials", "b2b-essentials", - "b2c-essentials" + "b2b-professional", + "b2c-professional" ], "type": "free" } @@ -10352,19 +10487,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "api" } ], "availability": "available", @@ -10433,10 +10568,10 @@ "scope": "project", "service_id": "growth", "updateable_to": [ - "free", "standard", - "api", + "free", "hobby", + "api", "growth" ] }, @@ -10444,19 +10579,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", - "service": "api" + "service": "growth" } ], "availability": "available", @@ -10525,10 +10660,10 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "free", "standard", - "growth", + "free", "api", + "growth", "hobby" ] }, @@ -10540,7 +10675,7 @@ }, { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", @@ -10548,7 +10683,7 @@ }, { "direction": "any", - "service": "hobby" + "service": "growth" } ], "availability": "available", @@ -10618,9 +10753,9 @@ "service_id": "standard", "updateable_to": [ "free", - "growth", - "api", "hobby", + "api", + "growth", "standard" ] }, @@ -10666,19 +10801,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "growth" } ], "availability": "available", @@ -10719,9 +10854,9 @@ "type": "freeform" }, "parent_services": [ - "hobby", + "standard", "growth", - "standard" + "hobby" ], "type": "paid" } @@ -10737,10 +10872,10 @@ "scope": "project", "service_id": "api", "updateable_to": [ - "free", "standard", - "growth", + "free", "hobby", + "growth", "api" ] }, @@ -10752,7 +10887,7 @@ }, { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", @@ -10760,7 +10895,7 @@ }, { "direction": "any", - "service": "hobby" + "service": "growth" } ], "availability": "available", @@ -10795,9 +10930,9 @@ "service_id": "free", "updateable_to": [ "standard", - "growth", - "api", "hobby", + "api", + "growth", "free" ] }, @@ -10905,11 +11040,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -10939,19 +11074,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -10993,8 +11128,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { @@ -11064,11 +11199,11 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -11169,8 +11304,8 @@ "updateable_to": [ "plus-v3-25k-mtu-monthly", "plus-v3-50k-mtu-monthly", - "plus-v3-10k-mtu-monthly", "free", + "plus-v3-10k-mtu-monthly", "analytics" ] }, @@ -11182,11 +11317,11 @@ }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" } ], "availability": "available", @@ -11239,8 +11374,8 @@ "service_id": "free", "updateable_to": [ "plus-v3-50k-mtu-monthly", - "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-25k-mtu-monthly", "free" ] }, @@ -11843,9 +11978,9 @@ }, "parent_services": [ "62.5K_emails+auto-replenish", - "25K_emails+auto-replenish", + "business", "hobbyist", - "business" + "25K_emails+auto-replenish" ], "type": "paid" } @@ -11923,11 +12058,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -11969,8 +12104,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { @@ -12144,8 +12279,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -15127,8 +15262,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15192,8 +15327,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15216,11 +15351,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -15253,8 +15388,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "hobby", "pro", + "hobby", "free" ] }, @@ -15302,8 +15437,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15361,8 +15496,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15425,8 +15560,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15608,23 +15743,23 @@ "allowed_updates": [ { "direction": "any", - "service": "developer_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro" + "service": "developer_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "scaler" + "service": "pro" } ], "availability": "available", @@ -15633,15 +15768,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15677,11 +15812,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ + "scaler", + "scaler_overages", "developer_overages", "pro_overages", "pro", - "scaler_overages", - "scaler", "developer" ] }, @@ -15702,15 +15837,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15764,15 +15899,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15816,7 +15951,7 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", @@ -15824,7 +15959,7 @@ }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" } ], "availability": "available", @@ -15833,15 +15968,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15877,9 +16012,9 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "scaler_overages", - "pro_overages", "pro", + "pro_overages", + "scaler_overages", "scaler" ] }, @@ -15931,13 +16066,13 @@ "is_default": null, "paid": null, "parent_services": [ - "scaler", "pro_overages", - "scaler_overages", - "pro", - "developer", + "scaler", + "starter", "developer_overages", - "starter" + "developer", + "pro", + "scaler_overages" ], "type": "free" } @@ -15964,7 +16099,7 @@ }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", @@ -15972,7 +16107,7 @@ }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" } ], "availability": "available", @@ -15981,15 +16116,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16026,9 +16161,9 @@ "service_id": "developer_overages", "updateable_to": [ "pro", - "scaler_overages", - "scaler", "pro_overages", + "scaler", + "scaler_overages", "developer_overages" ] }, @@ -16040,15 +16175,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16095,11 +16230,11 @@ }, { "direction": "any", - "service": "developer" + "service": "pro" }, { "direction": "any", - "service": "pro_overages" + "service": "developer_overages" }, { "direction": "any", @@ -16107,11 +16242,11 @@ }, { "direction": "any", - "service": "developer_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "pro" + "service": "developer" } ], "availability": "available", @@ -16120,15 +16255,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16153,11 +16288,11 @@ "service_id": "starter", "updateable_to": [ "scaler_overages", - "developer", - "pro_overages", - "scaler", - "developer_overages", "pro", + "developer_overages", + "scaler", + "pro_overages", + "developer", "starter" ] } From 135d156b731c1d29c8558fc0bdcea335d46ec842 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 17 Sep 2026 10:10:46 +0000 Subject: [PATCH 09/26] feat(integrations): add athena/agents CatalogResource --- PROVIDERS.md | 1 + .../provisional-allowlist.txt | 1 + .../src/providers/athena/agents.rs | 230 ++++++++++++++++++ .../src/providers/athena/mod.rs | 11 + .../src/providers/mod.rs | 15 +- crates/stackless-integrations/src/registry.rs | 1 + 6 files changed, 253 insertions(+), 6 deletions(-) create mode 100644 crates/stackless-integrations/src/providers/athena/agents.rs create mode 100644 crates/stackless-integrations/src/providers/athena/mod.rs diff --git a/PROVIDERS.md b/PROVIDERS.md index 152df7ae..42efb847 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -46,6 +46,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `agentmail` | `agentmail/api` | | `agentphone` | `agentphone/number` | | `amplitude` | `amplitude/analytics` | +| `athena` | `athena/agents` | | `auth0` | `auth0/client` | | `base44` | `base44_projects/app` | | `blaxel-sandbox` | `blaxel/sandbox` | diff --git a/crates/stackless-integrations/provisional-allowlist.txt b/crates/stackless-integrations/provisional-allowlist.txt index 3b9b4453..6be78bdb 100644 --- a/crates/stackless-integrations/provisional-allowlist.txt +++ b/crates/stackless-integrations/provisional-allowlist.txt @@ -7,6 +7,7 @@ # Externally blocked integrations keep source on disk but omit `pub mod` # + registry row and live in EXCL — see docs/ADDING-A-PROVIDER.md # § External pin blockers. Those files are not scanned here. +athena/agents churnkey/retention herenow/hosting perplexity/api diff --git a/crates/stackless-integrations/src/providers/athena/agents.rs b/crates/stackless-integrations/src/providers/athena/agents.rs new file mode 100644 index 00000000..c2fb7332 --- /dev/null +++ b/crates/stackless-integrations/src/providers/athena/agents.rs @@ -0,0 +1,230 @@ +//! `athena/agents` integration. + +use std::collections::BTreeMap; + +use serde::Serialize; +use stackless_stripe_projects::catalog::verify::CatalogService; +use stackless_stripe_projects::provision::ProvisionContext; + +use super::FamilyResource; +use crate::error::IntegrationError; +use crate::hostable::{ConfigScope, Hostable, IntegrationHosting}; +use crate::registry; + +pub const RESOURCE_KIND: &str = "integration-athena"; + +#[derive(Debug, Serialize)] +pub struct AthenaAgentsConfig { + pub name: String, + pub instructions: String, + pub connect_mcp: String, + pub enable_image_generation: String, + pub enable_music_generation: String, + pub enable_live: String, + pub enable_coding: String, + pub enable_deep_research: String, + pub enable_google_maps: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub mcp_url: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub google_maps_api_key: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub starter_1: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub starter_2: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub starter_3: Option, +} + +impl CatalogService for AthenaAgentsConfig { + const REFERENCE: &'static str = "athena/agents"; +} + +#[derive(Debug)] +pub struct AthenaAgents; + +impl Hostable for AthenaAgents { + const PROVIDER: &'static str = "athena"; + const HOSTING: IntegrationHosting = IntegrationHosting::Managed; + const CONFIG_SCOPE: ConfigScope = ConfigScope::GlobalOnly; + const RESOURCE_KIND: &'static str = RESOURCE_KIND; + const OUTPUTS: &'static [&'static str] = &["agent_id", "api_key", "api_url"]; +} + +impl FamilyResource for AthenaAgents { + type Config = AthenaAgentsConfig; + const PROVIDER_PREFIX: &'static str = "ATHENA"; + // Provisional until pinned by `mise run discover athena/agents`. + const OUTPUT_FIELDS: &'static [(&'static str, &'static str, bool)] = &[ + ("AGENT_ID", "agent_id", true), + ("API_KEY", "api_key", true), + ("API_URL", "api_url", true), + ]; + + fn build_config(ctx: &ProvisionContext<'_>) -> Result { + let config = super::integration_config(ctx)?; + Ok(AthenaAgentsConfig { + name: super::interp_required(ctx, &config, "name")?, + instructions: super::interp_required(ctx, &config, "instructions")?, + connect_mcp: super::interp_required(ctx, &config, "connect_mcp")?, + enable_image_generation: super::interp_required( + ctx, + &config, + "enable_image_generation", + )?, + enable_music_generation: super::interp_required( + ctx, + &config, + "enable_music_generation", + )?, + enable_live: super::interp_required(ctx, &config, "enable_live")?, + enable_coding: super::interp_required(ctx, &config, "enable_coding")?, + enable_deep_research: super::interp_required(ctx, &config, "enable_deep_research")?, + enable_google_maps: super::interp_required(ctx, &config, "enable_google_maps")?, + mcp_url: super::interp_optional(ctx, &config, "mcp_url")?, + google_maps_api_key: super::interp_optional(ctx, &config, "google_maps_api_key")?, + starter_1: super::interp_optional(ctx, &config, "starter_1")?, + starter_2: super::interp_optional(ctx, &config, "starter_2")?, + starter_3: super::interp_optional(ctx, &config, "starter_3")?, + }) + } +} + +const REQUIRED_CONFIG_KEYS: &[&str] = &[ + "name", + "instructions", + "connect_mcp", + "enable_image_generation", + "enable_music_generation", + "enable_live", + "enable_coding", + "enable_deep_research", + "enable_google_maps", +]; + +pub fn validate_config( + name: &str, + config: &BTreeMap, +) -> Result<(), IntegrationError> { + for key in REQUIRED_CONFIG_KEYS { + registry::config_string(config, key).map_err(|err| IntegrationError::ConfigInvalid { + location: format!("integrations.{name}.{key}"), + detail: err.to_string(), + })?; + } + let _ = (name, config); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ProviderOps; + use crate::resource::ResourcePayload; + use stackless_core::def::StackDef; + use stackless_stripe_projects::stripe::StripeProjects; + use stackless_stripe_projects::test_support; + + fn sample_config() -> AthenaAgentsConfig { + AthenaAgentsConfig { + name: "test-name".into(), + instructions: "test-instructions".into(), + connect_mcp: "no".into(), + enable_image_generation: "no".into(), + enable_music_generation: "no".into(), + enable_live: "no".into(), + enable_coding: "no".into(), + enable_deep_research: "no".into(), + enable_google_maps: "no".into(), + mcp_url: None, + google_maps_api_key: None, + starter_1: None, + starter_2: None, + starter_3: None, + } + } + + #[test] + fn config_matches_catalog() { + const FIXTURE: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../stackless-stripe-projects/tests/fixtures/catalog.json" + )); + let catalog = stackless_stripe_projects::Catalog::from_json_envelope(FIXTURE).unwrap(); + let failures = stackless_stripe_projects::verify_service(&catalog, &sample_config()); + assert!( + failures.is_empty(), + "athena/agents catalog gaps:\n{}", + failures.join("\n") + ); + } + + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"allowed_updates":[],"availability":"available","categories":["ai"],"configuration_schema":{"properties":{"connect_mcp":{"default":"no","description":"Connect one public HTTPS MCP server?","enum":["no","yes"],"type":"string"},"enable_coding":{"default":"no","description":"Enable coding and deep thinking?","enum":["no","yes"],"type":"string"},"enable_deep_research":{"default":"no","description":"Enable deep research?","enum":["no","yes"],"type":"string"},"enable_google_maps":{"default":"no","description":"Enable Google Maps?","enum":["no","yes"],"type":"string"},"enable_image_generation":{"default":"no","description":"Enable image generation?","enum":["no","yes"],"type":"string"},"enable_live":{"default":"no","description":"Enable live voice sessions?","enum":["no","yes"],"type":"string"},"enable_music_generation":{"default":"no","description":"Enable music generation?","enum":["no","yes"],"type":"string"},"google_maps_api_key":{"description":"Google Maps API key. Required only when Google Maps is enabled.","type":"string"},"instructions":{"description":"Instructions for the Athena agent (maximum 2,000 characters).","type":"string"},"mcp_url":{"description":"Public HTTPS MCP server URL. Leave blank when no MCP server is connected.","type":"string"},"name":{"description":"Name for the Athena agent.","type":"string"},"starter_1":{"description":"Optional first conversation starter shown on the public agent.","type":"string"},"starter_2":{"description":"Optional second conversation starter shown on the public agent.","type":"string"},"starter_3":{"description":"Optional third conversation starter shown on the public agent.","type":"string"}},"required":["name","instructions","connect_mcp","enable_image_generation","enable_music_generation","enable_live","enable_coding","enable_deep_research","enable_google_maps"],"type":"object"},"constraints":[],"created":null,"description":"Configurable Athena AI agent with an optional public HTTPS MCP server.","development":false,"group":null,"id":"prvsvc_61VNv58mq1zOThOYP5VZA","kind":"deployable","livemode":true,"llm_context":null,"object":"v2.provisioning.provider_service_detail","pricing":{"component":null,"paid":null,"paid_pricing":[],"type":"free"},"provider":"prvdr_61VNueP9cELmCU01Z5DFA","provider_configuration_schema":{},"provider_name":"Athena","scope":"project","service_id":"agents","updateable_to":["agents"]}]}}"##; + + fn test_def() -> StackDef { + StackDef::parse( + r#" +[stack] +name = "atto" +[stack.projects.stripe] +project = "project_1" +[integrations.res] +provider = "athena" +name = "demo-name" +instructions = "demo-instructions" +connect_mcp = "no" +enable_image_generation = "no" +enable_music_generation = "no" +enable_live = "no" +enable_coding = "no" +enable_deep_research = "no" +enable_google_maps = "no" +[services.api] +source = { repo = "r", ref = "main" } +env = { OUT = "${integrations.res.api_key}" } +health = { path = "/health" } +[services.api.local] +run = "true" +"#, + ) + .unwrap() + } + + #[tokio::test] + async fn provision_records_outputs() { + let runner = test_support::provision_script( + CATALOG_ENVELOPE, + serde_json::json!({ + "ATHENA_AGENT_ID": "val_agent_id", + "ATHENA_API_KEY": "val_api_key", + "ATHENA_API_URL": "val_api_url" + }), + 0, + ); + let dir = tempfile::tempdir().unwrap(); + std::fs::write( + dir.path().join("stackless.toml"), + "[stack]\nname=\"atto\"\n", + ) + .unwrap(); + let stripe = StripeProjects::new(&runner, dir.path()); + + let resource = AthenaAgents + .provision( + &stripe.as_dyn(), + &test_def(), + dir.path(), + "demo", + "res", + "local", + false, + ) + .await + .unwrap(); + assert_eq!(resource.resource_kind, "integration-athena"); + let payload: ResourcePayload = serde_json::from_str(&resource.payload).unwrap(); + assert_eq!(payload.outputs["agent_id"], "val_agent_id"); + assert_eq!(payload.outputs["api_key"], "val_api_key"); + assert_eq!(payload.outputs["api_url"], "val_api_url"); + } +} diff --git a/crates/stackless-integrations/src/providers/athena/mod.rs b/crates/stackless-integrations/src/providers/athena/mod.rs new file mode 100644 index 00000000..725083eb --- /dev/null +++ b/crates/stackless-integrations/src/providers/athena/mod.rs @@ -0,0 +1,11 @@ +//! Athena catalog resources via Stripe Projects. +//! +//! Output envelopes are provisional until pinned by `xtask discover`. + +pub mod agents; + +#[allow(unused_imports)] +pub(crate) use crate::resource::{ + CatalogResource as FamilyResource, bool_optional, bool_required, int_optional, int_required, + integration_config, interp_optional, interp_required, +}; diff --git a/crates/stackless-integrations/src/providers/mod.rs b/crates/stackless-integrations/src/providers/mod.rs index d9114832..2b7763d2 100644 --- a/crates/stackless-integrations/src/providers/mod.rs +++ b/crates/stackless-integrations/src/providers/mod.rs @@ -1,6 +1,7 @@ pub mod agentmail; pub mod agentphone; pub mod amplitude; +pub mod athena; pub mod auth0; pub mod base44_projects; pub mod blaxel; @@ -58,12 +59,13 @@ mod tests { use stackless_provider_sdk::Hostable; use crate::providers::{ - agentmail, agentphone, amplitude, auth0, base44_projects, blaxel, browserbase, chatbase, - churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, elevenlabs, - exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, metronome, - mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, posthog, prisma, - pydantic, railway, render_db, revenuecat, runloop, schematic, sentry, shopify, steel, - supabase, supermemory, tabstack, turso, upstash, wix, wordpress_com, workos, + agentmail, agentphone, amplitude, athena, auth0, base44_projects, blaxel, browserbase, + chatbase, churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, + elevenlabs, exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, + metronome, mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, + posthog, prisma, pydantic, railway, render_db, revenuecat, runloop, schematic, sentry, + shopify, steel, supabase, supermemory, tabstack, turso, upstash, wix, wordpress_com, + workos, }; fn assert_outputs_match() { @@ -90,6 +92,7 @@ mod tests { assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); + assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); diff --git a/crates/stackless-integrations/src/registry.rs b/crates/stackless-integrations/src/registry.rs index 5afa3311..9fa3f180 100644 --- a/crates/stackless-integrations/src/registry.rs +++ b/crates/stackless-integrations/src/registry.rs @@ -79,6 +79,7 @@ register_providers! { (agentmail::api, AgentMailApi), (agentphone::number, AgentPhoneNumber), (amplitude::analytics, AmplitudeAnalytics), + (athena::agents, AthenaAgents), (auth0::client, Auth0Client), (base44_projects::app, Base44ProjectsApp), (blaxel::sandbox, BlaxelSandbox), From 0485ee9b4cec1d51a53a3ff4755060c8910a69f2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 17 Sep 2026 10:16:47 +0000 Subject: [PATCH 10/26] chore(integrations): protect athena/chatbase from catalog generator regen Add SHORT_PROVIDER + OUTPUT_HINTS so mise catalog-integrations regen keeps the hand-written single-service provider keys. --- scripts/generate_catalog_integrations.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index d450511d..c3dff2ab 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -90,7 +90,9 @@ "turso/database": "turso", "prisma/database": "prisma", "chroma/database": "chroma", + "chatbase/agent": "chatbase", "churnkey/retention": "churnkey", + "athena/agents": "athena", "algolia/application": "algolia", "openrouter/api": "openrouter", "exa/api": "exa", @@ -189,6 +191,16 @@ "clickhouse/clickhouse": [("CONNECTION_STRING", "connection_string", True)], "clickhouse/postgres": [("CONNECTION_STRING", "connection_string", True)], "chroma/database": [("API_KEY", "api_key", True)], + "athena/agents": [ + ("AGENT_ID", "agent_id", True), + ("API_KEY", "api_key", True), + ("API_URL", "api_url", True), + ], + "chatbase/agent": [ + ("CHATBASE_AGENT_ID", "chatbase_agent_id", True), + ("CHATBASE_API_KEY", "chatbase_api_key", True), + ("CHATBASE_API_URL", "chatbase_api_url", True), + ], "churnkey/retention": [ ("APP_ID", "app_id", True), ("API_KEY", "api_key", True), From f4d82f0535cce2323287d1eda8069f2afe4959c0 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 17 Sep 2026 10:20:45 +0000 Subject: [PATCH 11/26] refactor(integrations): deslop athena comments and unused reexports Keep the provisional OUTPUT_FIELDS marker the allowlist scanner requires. --- .../stackless-integrations/src/providers/athena/agents.rs | 3 --- crates/stackless-integrations/src/providers/athena/mod.rs | 8 +------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/crates/stackless-integrations/src/providers/athena/agents.rs b/crates/stackless-integrations/src/providers/athena/agents.rs index c2fb7332..cad17585 100644 --- a/crates/stackless-integrations/src/providers/athena/agents.rs +++ b/crates/stackless-integrations/src/providers/athena/agents.rs @@ -1,5 +1,3 @@ -//! `athena/agents` integration. - use std::collections::BTreeMap; use serde::Serialize; @@ -112,7 +110,6 @@ pub fn validate_config( detail: err.to_string(), })?; } - let _ = (name, config); Ok(()) } diff --git a/crates/stackless-integrations/src/providers/athena/mod.rs b/crates/stackless-integrations/src/providers/athena/mod.rs index 725083eb..b37829c9 100644 --- a/crates/stackless-integrations/src/providers/athena/mod.rs +++ b/crates/stackless-integrations/src/providers/athena/mod.rs @@ -1,11 +1,5 @@ -//! Athena catalog resources via Stripe Projects. -//! -//! Output envelopes are provisional until pinned by `xtask discover`. - pub mod agents; -#[allow(unused_imports)] pub(crate) use crate::resource::{ - CatalogResource as FamilyResource, bool_optional, bool_required, int_optional, int_required, - integration_config, interp_optional, interp_required, + CatalogResource as FamilyResource, integration_config, interp_optional, interp_required, }; From 050f4c0d523300bc5d77f25d3d2b05d93d3faaef Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 10:20:58 +0000 Subject: [PATCH 12/26] chore(stripe-projects): bless plugin 0.41.0 fixtures Regenerate catalog.json, command-surface.txt, and plugin-version.txt via mise run stripe-refresh against the locally installed projects plugin. --- .../tests/fixtures/catalog.json | 632 +++++++++--------- .../tests/fixtures/command-surface.txt | 4 +- .../tests/fixtures/plugin-version.txt | 2 +- 3 files changed, 319 insertions(+), 319 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 9eda662d..c3ecefd9 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -1533,7 +1533,7 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", @@ -1541,7 +1541,7 @@ }, { "direction": "any", - "service": "free" + "service": "beginner-monthly" } ], "availability": "available", @@ -1583,9 +1583,9 @@ "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ - "beginner-monthly", - "pro-monthly", "free", + "pro-monthly", + "beginner-monthly", "enterprise-monthly" ] }, @@ -1593,15 +1593,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1643,9 +1643,9 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ - "enterprise-monthly", "free", "pro-monthly", + "enterprise-monthly", "beginner-monthly" ] }, @@ -1653,7 +1653,7 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", @@ -1661,7 +1661,7 @@ }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1703,9 +1703,9 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ - "enterprise-monthly", - "beginner-monthly", "free", + "beginner-monthly", + "enterprise-monthly", "pro-monthly" ] }, @@ -1713,15 +1713,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1751,9 +1751,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "enterprise-monthly", "beginner-monthly", "pro-monthly", + "enterprise-monthly", "free" ] }, @@ -1781,10 +1781,10 @@ "is_default": null, "paid": null, "parent_services": [ - "enterprise-monthly", - "beginner-monthly", "free", - "pro-monthly" + "pro-monthly", + "enterprise-monthly", + "beginner-monthly" ], "type": "free" } @@ -2085,9 +2085,9 @@ "is_default": null, "paid": null, "parent_services": [ + "hobby", "standard", - "pro", - "hobby" + "pro" ], "type": "free" }, @@ -3182,11 +3182,11 @@ "allowed_updates": [ { "direction": "up", - "service": "enterprise" + "service": "scale" }, { "direction": "up", - "service": "scale" + "service": "enterprise" } ], "availability": "available", @@ -3234,8 +3234,8 @@ "scope": "account", "service_id": "basic", "updateable_to": [ - "enterprise", "scale", + "enterprise", "basic" ] }, @@ -3453,7 +3453,7 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-3" + "service": "tier-5" }, { "direction": "up", @@ -3461,15 +3461,15 @@ }, { "direction": "up", - "service": "tier-5" + "service": "tier-3" }, { "direction": "up", - "service": "tier-6" + "service": "tier-2" }, { "direction": "up", - "service": "tier-2" + "service": "tier-6" } ], "availability": "available", @@ -3517,11 +3517,11 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-3", - "tier-4", "tier-5", - "tier-6", + "tier-4", + "tier-3", "tier-2", + "tier-6", "tier-1" ] }, @@ -3531,13 +3531,9 @@ "direction": "up", "service": "tier-5" }, - { - "direction": "up", - "service": "tier-6" - }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" }, { "direction": "down", @@ -3545,7 +3541,11 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" + }, + { + "direction": "up", + "service": "tier-6" } ], "availability": "available", @@ -3594,22 +3594,22 @@ "service_id": "tier-4", "updateable_to": [ "tier-5", - "tier-6", - "tier-1", - "tier-2", "tier-3", + "tier-2", + "tier-1", + "tier-6", "tier-4" ] }, { "allowed_updates": [ { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-4" }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" }, { "direction": "down", @@ -3617,11 +3617,11 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" }, { - "direction": "down", - "service": "tier-4" + "direction": "up", + "service": "tier-6" } ], "availability": "available", @@ -3669,11 +3669,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-6", - "tier-1", - "tier-2", - "tier-3", "tier-4", + "tier-3", + "tier-2", + "tier-1", + "tier-6", "tier-5" ] }, @@ -3681,7 +3681,7 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-3" + "service": "tier-5" }, { "direction": "up", @@ -3689,15 +3689,15 @@ }, { "direction": "up", - "service": "tier-5" - }, - { - "direction": "up", - "service": "tier-6" + "service": "tier-3" }, { "direction": "down", "service": "tier-1" + }, + { + "direction": "up", + "service": "tier-6" } ], "availability": "available", @@ -3745,11 +3745,11 @@ "scope": "account", "service_id": "tier-2", "updateable_to": [ - "tier-3", - "tier-4", "tier-5", - "tier-6", + "tier-4", + "tier-3", "tier-1", + "tier-6", "tier-2" ] }, @@ -3761,19 +3761,19 @@ }, { "direction": "down", - "service": "tier-1" + "service": "tier-4" }, { "direction": "down", - "service": "tier-2" + "service": "tier-3" }, { "direction": "down", - "service": "tier-3" + "service": "tier-2" }, { "direction": "down", - "service": "tier-4" + "service": "tier-1" } ], "availability": "available", @@ -3822,10 +3822,10 @@ "service_id": "tier-6", "updateable_to": [ "tier-5", - "tier-1", - "tier-2", - "tier-3", "tier-4", + "tier-3", + "tier-2", + "tier-1", "tier-6" ] }, @@ -3833,23 +3833,23 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-2" }, { "direction": "down", "service": "tier-1" }, { - "direction": "down", - "service": "tier-2" + "direction": "up", + "service": "tier-6" } ], "availability": "available", @@ -3897,11 +3897,11 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-4", "tier-5", - "tier-6", - "tier-1", + "tier-4", "tier-2", + "tier-1", + "tier-6", "tier-3" ] }, @@ -4121,15 +4121,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4182,15 +4182,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4369,9 +4369,9 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", + "hobbyist", "startup", - "hobbyist" + "developer" ], "type": "free" } @@ -4407,15 +4407,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4461,15 +4461,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4512,13 +4512,13 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "developer" - }, { "direction": "up", "service": "startup" + }, + { + "direction": "down", + "service": "developer" } ], "availability": "available", @@ -4527,15 +4527,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4571,8 +4571,8 @@ "scope": "account", "service_id": "hobbyist", "updateable_to": [ - "developer", "startup", + "developer", "hobbyist" ] }, @@ -4994,8 +4994,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5096,8 +5096,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5179,8 +5179,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5505,10 +5505,10 @@ "is_default": null, "paid": null, "parent_services": [ - "starter", "business", - "free", - "pro" + "starter", + "pro", + "free" ], "type": "free" } @@ -5530,16 +5530,16 @@ { "allowed_updates": [ { - "direction": "any", - "service": "free" + "direction": "up", + "service": "starter" }, { "direction": "up", "service": "business" }, { - "direction": "up", - "service": "starter" + "direction": "any", + "service": "free" }, { "direction": "up", @@ -5573,9 +5573,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "free", - "business", "starter", + "business", + "free", "pro" ] }, @@ -5587,11 +5587,11 @@ }, { "direction": "down", - "service": "pro" + "service": "free" }, { "direction": "down", - "service": "free" + "service": "pro" }, { "direction": "any", @@ -5638,8 +5638,8 @@ "service_id": "business", "updateable_to": [ "starter", - "pro", "free", + "pro", "business" ] }, @@ -5649,6 +5649,10 @@ "direction": "down", "service": "starter" }, + { + "direction": "up", + "service": "business" + }, { "direction": "any", "service": "pro" @@ -5656,10 +5660,6 @@ { "direction": "down", "service": "free" - }, - { - "direction": "up", - "service": "business" } ], "availability": "available", @@ -5702,28 +5702,28 @@ "service_id": "pro", "updateable_to": [ "starter", + "business", "pro", - "free", - "business" + "free" ] }, { "allowed_updates": [ { "direction": "up", - "service": "pro" + "service": "business" }, { "direction": "down", "service": "free" }, - { - "direction": "up", - "service": "business" - }, { "direction": "any", "service": "starter" + }, + { + "direction": "up", + "service": "pro" } ], "availability": "available", @@ -5765,10 +5765,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "pro", - "free", "business", - "starter" + "free", + "starter", + "pro" ] }, { @@ -6003,9 +6003,9 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", "startup", - "free" + "free", + "developer" ], "type": "free" } @@ -6272,11 +6272,11 @@ "allowed_updates": [ { "direction": "up", - "service": "scale" + "service": "core" }, { "direction": "up", - "service": "core" + "service": "scale" } ], "availability": "available", @@ -6319,8 +6319,8 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "scale", "core", + "scale", "free" ] }, @@ -7564,7 +7564,7 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", @@ -7572,7 +7572,7 @@ }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" } ], "availability": "available", @@ -7616,9 +7616,9 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ - "top-up-0025", - "top-up-1000", "top-up-2000", + "top-up-1000", + "top-up-0025", "top-up-0500" ] }, @@ -7626,7 +7626,7 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" }, { "direction": "any", @@ -7634,7 +7634,7 @@ }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" } ], "availability": "available", @@ -7678,9 +7678,9 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-0500", - "top-up-0025", "top-up-2000", + "top-up-0025", + "top-up-0500", "top-up-1000" ] }, @@ -7688,7 +7688,7 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" }, { "direction": "any", @@ -7696,7 +7696,7 @@ }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" } ], "availability": "available", @@ -7740,9 +7740,9 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-0500", - "top-up-1000", "top-up-2000", + "top-up-1000", + "top-up-0500", "top-up-0025" ] }, @@ -7750,15 +7750,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" } ], "availability": "available", @@ -7802,9 +7802,9 @@ "scope": "project", "service_id": "top-up-2000", "updateable_to": [ - "top-up-0500", "top-up-1000", "top-up-0025", + "top-up-0500", "top-up-2000" ] }, @@ -7926,9 +7926,9 @@ "type": "freeform" }, "parent_services": [ - "top-up-0500", - "top-up-2000", "top-up-1000", + "top-up-2000", + "top-up-0500", "top-up-0025" ], "type": "paid" @@ -7952,11 +7952,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "team" }, { "direction": "any", - "service": "team" + "service": "free" } ], "availability": "available", @@ -8000,8 +8000,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "free", "team", + "free", "pro" ] }, @@ -8009,11 +8009,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "free" } ], "availability": "available", @@ -8057,8 +8057,8 @@ "scope": "project", "service_id": "team", "updateable_to": [ - "free", "pro", + "free", "team" ] }, @@ -8591,11 +8591,11 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -8660,8 +8660,8 @@ "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ "plus-v3-50k-mtu-monthly", - "plus-v3-10k-mtu-monthly", "free", + "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] }, @@ -8669,15 +8669,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -8741,9 +8741,9 @@ "scope": "project", "service_id": "plus-v3-50k-mtu-monthly", "updateable_to": [ - "plus-v3-10k-mtu-monthly", "free", "plus-v3-25k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "plus-v3-50k-mtu-monthly" ] }, @@ -8922,10 +8922,10 @@ "is_default": null, "paid": null, "parent_services": [ - "core", - "enterprise", + "free", "scale", - "free" + "enterprise", + "core" ], "type": "free" } @@ -8960,11 +8960,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "startup" }, { "direction": "any", - "service": "startup" + "service": "free" } ], "availability": "available", @@ -9008,8 +9008,8 @@ "scope": "project", "service_id": "developer", "updateable_to": [ - "free", "startup", + "free", "developer" ] }, @@ -9017,11 +9017,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "developer" }, { "direction": "any", - "service": "developer" + "service": "free" } ], "availability": "available", @@ -9065,8 +9065,8 @@ "scope": "project", "service_id": "startup", "updateable_to": [ - "free", "developer", + "free", "startup" ] }, @@ -9451,8 +9451,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -9615,8 +9615,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "team" + "team", + "pro" ], "type": "paid" } @@ -9639,11 +9639,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -9696,8 +9696,8 @@ "scope": "project", "service_id": "workers-ai", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "workers-ai" ] }, @@ -9705,11 +9705,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -9766,8 +9766,8 @@ "scope": "project", "service_id": "browser-run", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "browser-run" ] }, @@ -9775,11 +9775,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -9921,8 +9921,8 @@ "scope": "project", "service_id": "hyperdrive", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "hyperdrive" ] }, @@ -9930,11 +9930,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10000,8 +10000,8 @@ "scope": "project", "service_id": "kv", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "kv" ] }, @@ -10009,11 +10009,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10091,8 +10091,8 @@ "scope": "project", "service_id": "d1", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "d1" ] }, @@ -10100,11 +10100,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10170,8 +10170,8 @@ "scope": "project", "service_id": "queues", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "queues" ] }, @@ -10179,11 +10179,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10232,8 +10232,8 @@ "scope": "project", "service_id": "containers", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "containers" ] }, @@ -10272,11 +10272,11 @@ "is_default": null, "paid": null, "parent_services": [ + "b2c-professional", "free", "b2c-essentials", "b2b-essentials", - "b2b-professional", - "b2c-professional" + "b2b-professional" ], "type": "free" } @@ -10491,15 +10491,15 @@ }, { "direction": "any", - "service": "free" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "api" }, { "direction": "any", - "service": "api" + "service": "free" } ], "availability": "available", @@ -10569,9 +10569,9 @@ "service_id": "growth", "updateable_to": [ "standard", - "free", "hobby", "api", + "free", "growth" ] }, @@ -10583,7 +10583,7 @@ }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", @@ -10591,7 +10591,7 @@ }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10661,9 +10661,9 @@ "service_id": "hobby", "updateable_to": [ "standard", - "free", - "api", "growth", + "api", + "free", "hobby" ] }, @@ -10671,7 +10671,7 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", @@ -10683,7 +10683,7 @@ }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10752,10 +10752,10 @@ "scope": "project", "service_id": "standard", "updateable_to": [ - "free", + "growth", "hobby", "api", - "growth", + "free", "standard" ] }, @@ -10805,7 +10805,7 @@ }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", @@ -10813,7 +10813,7 @@ }, { "direction": "any", - "service": "growth" + "service": "free" } ], "availability": "available", @@ -10854,8 +10854,8 @@ "type": "freeform" }, "parent_services": [ - "standard", "growth", + "standard", "hobby" ], "type": "paid" @@ -10873,9 +10873,9 @@ "service_id": "api", "updateable_to": [ "standard", - "free", - "hobby", "growth", + "hobby", + "free", "api" ] }, @@ -10887,15 +10887,15 @@ }, { "direction": "any", - "service": "hobby" + "service": "growth" }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "growth" + "service": "api" } ], "availability": "available", @@ -10930,9 +10930,9 @@ "service_id": "free", "updateable_to": [ "standard", + "growth", "hobby", "api", - "growth", "free" ] }, @@ -11189,10 +11189,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "plus-v3-25k-mtu-monthly" - }, { "direction": "any", "service": "plus-v3-50k-mtu-monthly" @@ -11204,6 +11200,10 @@ { "direction": "any", "service": "plus-v3-10k-mtu-monthly" + }, + { + "direction": "any", + "service": "plus-v3-25k-mtu-monthly" } ], "availability": "available", @@ -11302,10 +11302,10 @@ "scope": "project", "service_id": "analytics", "updateable_to": [ - "plus-v3-25k-mtu-monthly", "plus-v3-50k-mtu-monthly", "free", "plus-v3-10k-mtu-monthly", + "plus-v3-25k-mtu-monthly", "analytics" ] }, @@ -11317,11 +11317,11 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -11374,8 +11374,8 @@ "service_id": "free", "updateable_to": [ "plus-v3-50k-mtu-monthly", - "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "free" ] }, @@ -11977,9 +11977,9 @@ "type": "freeform" }, "parent_services": [ - "62.5K_emails+auto-replenish", - "business", "hobbyist", + "business", + "62.5K_emails+auto-replenish", "25K_emails+auto-replenish" ], "type": "paid" @@ -12112,11 +12112,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -12173,8 +12173,8 @@ "scope": "project", "service_id": "workers", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "workers" ] }, @@ -12279,8 +12279,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -15262,8 +15262,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15327,8 +15327,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15437,8 +15437,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15496,8 +15496,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15560,8 +15560,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15743,11 +15743,11 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler" + "service": "pro" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", @@ -15755,11 +15755,11 @@ }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro" + "service": "scaler" } ], "availability": "available", @@ -15768,15 +15768,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15812,11 +15812,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "scaler", - "scaler_overages", - "developer_overages", - "pro_overages", "pro", + "pro_overages", + "developer_overages", + "scaler_overages", + "scaler", "developer" ] }, @@ -15824,11 +15824,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" } ], "availability": "available", @@ -15837,15 +15837,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15881,8 +15881,8 @@ "scope": "account", "service_id": "scaler_overages", "updateable_to": [ - "pro", "pro_overages", + "pro", "scaler_overages" ] }, @@ -15899,15 +15899,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15951,11 +15951,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", @@ -15968,15 +15968,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16012,8 +16012,8 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "pro", "pro_overages", + "pro", "scaler_overages", "scaler" ] @@ -16066,13 +16066,13 @@ "is_default": null, "paid": null, "parent_services": [ - "pro_overages", - "scaler", "starter", - "developer_overages", - "developer", + "scaler", + "pro_overages", + "scaler_overages", "pro", - "scaler_overages" + "developer", + "developer_overages" ], "type": "free" } @@ -16095,19 +16095,19 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "scaler" } ], "availability": "available", @@ -16116,15 +16116,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16160,10 +16160,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "pro", "pro_overages", - "scaler", + "pro", "scaler_overages", + "scaler", "developer_overages" ] }, @@ -16175,15 +16175,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16226,27 +16226,27 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "developer" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "scaler" }, { "direction": "any", - "service": "scaler" + "service": "developer_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "developer" + "service": "scaler_overages" } ], "availability": "available", @@ -16255,15 +16255,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16287,12 +16287,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "scaler_overages", - "pro", - "developer_overages", - "scaler", - "pro_overages", "developer", + "pro_overages", + "scaler", + "developer_overages", + "pro", + "scaler_overages", "starter" ] } diff --git a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt index f25be47f..333d1633 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt @@ -1,9 +1,9 @@ # stripe projects command surface -# plugin-version: 0.40.0 +# plugin-version: 0.41.0 # DO NOT EDIT — regenerated by CI (mise run stripe-refresh) ===== stripe projects --help ===== -Stripe Projects (v0.40.0) +Stripe Projects (v0.41.0) Provision third-party services, manage credentials, and pull environment variables. GET STARTED diff --git a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt index 9b0025a7..72a8a631 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt @@ -1 +1 @@ -0.40.0 +0.41.0 From 5a5b945b637cde1eb53235173c86d0526e7475b6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 18 Sep 2026 10:21:01 +0000 Subject: [PATCH 13/26] chore(stripe-projects): pin STRIPE_PROJECTS_PINNED to 0.41.0 Keep doctor and the TRAVERSAL verified-against comment on the blessed plugin. --- crates/stackless-stripe-projects/src/surface.rs | 2 +- crates/stackless/src/authoring.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/stackless-stripe-projects/src/surface.rs b/crates/stackless-stripe-projects/src/surface.rs index 2dcf6241..fe297f1b 100644 --- a/crates/stackless-stripe-projects/src/surface.rs +++ b/crates/stackless-stripe-projects/src/surface.rs @@ -13,7 +13,7 @@ use crate::stripe::{CommandRunner, StripeProjects}; /// never self-reorders — a newly shipped command surfaces as a diff in the /// top-level `--help` block and is then added here in the same change. Groups /// (`services`/`env`/`billing`) are listed immediately before their children. -/// Verified against plugin 0.40.0. +/// Verified against plugin 0.41.0. const TRAVERSAL: &[&[&str]] = &[ &[], // GET STARTED diff --git a/crates/stackless/src/authoring.rs b/crates/stackless/src/authoring.rs index c10628dd..18c3ae5b 100644 --- a/crates/stackless/src/authoring.rs +++ b/crates/stackless/src/authoring.rs @@ -8,7 +8,7 @@ use stackless_core::types::DnsName; use crate::error::Error; /// The Stripe Projects plugin version stackless is tested against. -pub const STRIPE_PROJECTS_PINNED: &str = "0.40.0"; +pub const STRIPE_PROJECTS_PINNED: &str = "0.41.0"; pub fn default_output_path() -> PathBuf { PathBuf::from("stackless.toml") From 0a1b9c79a15e87513c4cdd20e5a3d543cf585a82 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 10:36:51 +0000 Subject: [PATCH 14/26] chore(stripe-projects): record four new catalog services The live catalog at plugin 0.41.0 lists 205 services. The fixture had 201. New entries are inngest/growth-2026-09-22, resend/free, resend/pro, and resend/email. A sorted compare of the other services found no field changes. The command surface and the pin stay at 0.41.0. --- .../tests/fixtures/catalog.json | 855 +++++++++++------- 1 file changed, 530 insertions(+), 325 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index c3ecefd9..0de9a0d9 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -6,6 +6,50 @@ "provider": null, "provider_filter": null, "services": [ + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "queue" + ], + "configuration_schema": {}, + "constraints": [], + "created": null, + "description": "Growth — Inngest billing plan.", + "development": false, + "group": null, + "id": "prvsvc_61VS1nQ1jlctikf5l5Mhs", + "kind": "plan", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": { + "description": null, + "freeform": "paid", + "type": "freeform" + }, + "paid_pricing": [ + { + "configuration": null, + "description": null, + "freeform": "paid", + "is_default": null, + "type": "freeform" + } + ], + "type": "paid" + }, + "provider": "prvdr_61UQ7Ta2evjv111Sl5Tqa", + "provider_configuration_schema": {}, + "provider_name": "Inngest", + "scope": "project", + "service_id": "growth-2026-09-22", + "updateable_to": [ + "growth-2026-09-22" + ] + }, { "allowed_updates": [], "availability": "available", @@ -264,6 +308,167 @@ "api" ] }, + { + "allowed_updates": [ + { + "direction": "up", + "service": "pro" + } + ], + "availability": "available", + "categories": [ + "email" + ], + "configuration_schema": {}, + "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Resend Free: 3,000 transactional emails per month, 3 domains.", + "development": false, + "group": "resend", + "id": "prvsvc_61VFx44fZQDj8o3cu5FCa", + "kind": "plan", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": null, + "paid_pricing": [], + "type": "free" + }, + "provider": "prvdr_61VFXTzsszWb1r1S25KMa", + "provider_configuration_schema": {}, + "provider_name": "Resend", + "scope": "account", + "service_id": "free", + "updateable_to": [ + "pro", + "free" + ] + }, + { + "allowed_updates": [ + { + "direction": "down", + "service": "free" + } + ], + "availability": "available", + "categories": [ + "email" + ], + "configuration_schema": {}, + "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Resend Pro: 50,000 transactional emails per month, 10 domains.", + "development": false, + "group": "resend", + "id": "prvsvc_61VFx44O170Djoah259to", + "kind": "plan", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": { + "description": null, + "freeform": "$20 per month", + "type": "freeform" + }, + "paid_pricing": [ + { + "configuration": null, + "description": null, + "freeform": "$20 per month", + "is_default": null, + "type": "freeform" + } + ], + "type": "paid" + }, + "provider": "prvdr_61VFXTzsszWb1r1S25KMa", + "provider_configuration_schema": {}, + "provider_name": "Resend", + "scope": "account", + "service_id": "pro", + "updateable_to": [ + "free", + "pro" + ] + }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "email" + ], + "configuration_schema": {}, + "constraints": [ + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Email for developers. One API key per project, one shared sending quota.", + "development": false, + "group": "resend", + "id": "prvsvc_61VFx44H4RKHoEjct5QIi", + "kind": "deployable", + "livemode": true, + "llm_context": "https://raw.githubusercontent.com/resend/resend-skills/main/skills/resend/SKILL.md", + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": { + "options": [ + { + "is_default": null, + "paid": null, + "parent_services": [ + "pro", + "free" + ], + "type": "free" + } + ] + }, + "paid": null, + "paid_pricing": [], + "type": "component" + }, + "provider": "prvdr_61VFXTzsszWb1r1S25KMa", + "provider_configuration_schema": {}, + "provider_name": "Resend", + "scope": "project", + "service_id": "email", + "updateable_to": [ + "email" + ] + }, { "allowed_updates": [ { @@ -1537,11 +1742,11 @@ }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -1584,8 +1789,8 @@ "service_id": "enterprise-monthly", "updateable_to": [ "free", - "pro-monthly", "beginner-monthly", + "pro-monthly", "enterprise-monthly" ] }, @@ -1781,10 +1986,10 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "pro-monthly", "enterprise-monthly", - "beginner-monthly" + "beginner-monthly", + "free", + "pro-monthly" ], "type": "free" } @@ -1985,11 +2190,11 @@ "allowed_updates": [ { "direction": "down", - "service": "hobby" + "service": "standard" }, { "direction": "down", - "service": "standard" + "service": "hobby" } ], "availability": "available", @@ -2045,8 +2250,8 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "hobby", "standard", + "hobby", "pro" ] }, @@ -2085,9 +2290,9 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", "standard", - "pro" + "pro", + "hobby" ], "type": "free" }, @@ -2123,11 +2328,11 @@ "allowed_updates": [ { "direction": "up", - "service": "pro" + "service": "standard" }, { "direction": "up", - "service": "standard" + "service": "pro" } ], "availability": "available", @@ -2183,8 +2388,8 @@ "scope": "account", "service_id": "hobby", "updateable_to": [ - "pro", "standard", + "pro", "hobby" ] }, @@ -3453,19 +3658,19 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-5" + "service": "tier-2" }, { "direction": "up", - "service": "tier-4" + "service": "tier-3" }, { "direction": "up", - "service": "tier-3" + "service": "tier-4" }, { "direction": "up", - "service": "tier-2" + "service": "tier-5" }, { "direction": "up", @@ -3517,35 +3722,35 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-5", - "tier-4", - "tier-3", "tier-2", + "tier-3", + "tier-4", + "tier-5", "tier-6", "tier-1" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "tier-5" - }, { "direction": "down", "service": "tier-3" }, { "direction": "down", - "service": "tier-2" + "service": "tier-1" }, { "direction": "down", - "service": "tier-1" + "service": "tier-2" }, { "direction": "up", "service": "tier-6" + }, + { + "direction": "up", + "service": "tier-5" } ], "availability": "available", @@ -3593,35 +3798,35 @@ "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-5", "tier-3", - "tier-2", "tier-1", + "tier-2", "tier-6", + "tier-5", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-4" - }, { "direction": "down", "service": "tier-3" }, { "direction": "down", - "service": "tier-2" + "service": "tier-1" }, { "direction": "down", - "service": "tier-1" + "service": "tier-2" }, { "direction": "up", "service": "tier-6" + }, + { + "direction": "down", + "service": "tier-4" } ], "availability": "available", @@ -3669,11 +3874,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-4", "tier-3", - "tier-2", "tier-1", + "tier-2", "tier-6", + "tier-4", "tier-5" ] }, @@ -3681,16 +3886,12 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-5" + "service": "tier-3" }, { "direction": "up", "service": "tier-4" }, - { - "direction": "up", - "service": "tier-3" - }, { "direction": "down", "service": "tier-1" @@ -3698,6 +3899,10 @@ { "direction": "up", "service": "tier-6" + }, + { + "direction": "up", + "service": "tier-5" } ], "availability": "available", @@ -3745,11 +3950,11 @@ "scope": "account", "service_id": "tier-2", "updateable_to": [ - "tier-5", - "tier-4", "tier-3", + "tier-4", "tier-1", "tier-6", + "tier-5", "tier-2" ] }, @@ -3761,19 +3966,19 @@ }, { "direction": "down", - "service": "tier-4" + "service": "tier-1" }, { "direction": "down", - "service": "tier-3" + "service": "tier-2" }, { "direction": "down", - "service": "tier-2" + "service": "tier-3" }, { "direction": "down", - "service": "tier-1" + "service": "tier-4" } ], "availability": "available", @@ -3822,34 +4027,34 @@ "service_id": "tier-6", "updateable_to": [ "tier-5", - "tier-4", - "tier-3", - "tier-2", "tier-1", + "tier-2", + "tier-3", + "tier-4", "tier-6" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "tier-5" - }, { "direction": "up", "service": "tier-4" }, { "direction": "down", - "service": "tier-2" + "service": "tier-1" }, { "direction": "down", - "service": "tier-1" + "service": "tier-2" }, { "direction": "up", "service": "tier-6" + }, + { + "direction": "up", + "service": "tier-5" } ], "availability": "available", @@ -3897,11 +4102,11 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-5", "tier-4", - "tier-2", "tier-1", + "tier-2", "tier-6", + "tier-5", "tier-3" ] }, @@ -4121,15 +4326,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4182,15 +4387,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4369,9 +4574,9 @@ "is_default": null, "paid": null, "parent_services": [ - "hobbyist", + "developer", "startup", - "developer" + "hobbyist" ], "type": "free" } @@ -4407,15 +4612,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4448,11 +4653,11 @@ "allowed_updates": [ { "direction": "down", - "service": "developer" + "service": "hobbyist" }, { "direction": "down", - "service": "hobbyist" + "service": "developer" } ], "availability": "available", @@ -4461,15 +4666,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4505,8 +4710,8 @@ "scope": "account", "service_id": "startup", "updateable_to": [ - "developer", "hobbyist", + "developer", "startup" ] }, @@ -4527,15 +4732,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4994,8 +5199,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5096,8 +5301,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5179,8 +5384,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5505,10 +5710,10 @@ "is_default": null, "paid": null, "parent_services": [ - "business", - "starter", + "free", "pro", - "free" + "starter", + "business" ], "type": "free" } @@ -5529,10 +5734,6 @@ }, { "allowed_updates": [ - { - "direction": "up", - "service": "starter" - }, { "direction": "up", "service": "business" @@ -5541,6 +5742,10 @@ "direction": "any", "service": "free" }, + { + "direction": "up", + "service": "starter" + }, { "direction": "up", "service": "pro" @@ -5573,17 +5778,17 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "starter", "business", "free", + "starter", "pro" ] }, { "allowed_updates": [ { - "direction": "down", - "service": "starter" + "direction": "any", + "service": "business" }, { "direction": "down", @@ -5591,11 +5796,11 @@ }, { "direction": "down", - "service": "pro" + "service": "starter" }, { - "direction": "any", - "service": "business" + "direction": "down", + "service": "pro" } ], "availability": "available", @@ -5637,29 +5842,29 @@ "scope": "account", "service_id": "business", "updateable_to": [ - "starter", + "business", "free", - "pro", - "business" + "starter", + "pro" ] }, { "allowed_updates": [ { "direction": "down", - "service": "starter" - }, - { - "direction": "up", - "service": "business" + "service": "free" }, { "direction": "any", "service": "pro" }, + { + "direction": "up", + "service": "business" + }, { "direction": "down", - "service": "free" + "service": "starter" } ], "availability": "available", @@ -5701,18 +5906,14 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "starter", - "business", + "free", "pro", - "free" + "business", + "starter" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "business" - }, { "direction": "down", "service": "free" @@ -5721,6 +5922,10 @@ "direction": "any", "service": "starter" }, + { + "direction": "up", + "service": "business" + }, { "direction": "up", "service": "pro" @@ -5765,9 +5970,9 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "business", "free", "starter", + "business", "pro" ] }, @@ -6003,9 +6208,9 @@ "is_default": null, "paid": null, "parent_services": [ + "developer", "startup", - "free", - "developer" + "free" ], "type": "free" } @@ -6504,19 +6709,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "free" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" } ], "availability": "available", @@ -6586,10 +6791,10 @@ "scope": "project", "service_id": "b2b-professional", "updateable_to": [ - "free", - "b2c-professional", "b2b-essentials", "b2c-essentials", + "free", + "b2c-professional", "b2b-professional" ] }, @@ -6597,19 +6802,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2b-professional" + "service": "free" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-professional" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" } ], "availability": "available", @@ -6679,10 +6884,10 @@ "scope": "project", "service_id": "b2b-essentials", "updateable_to": [ + "b2c-essentials", "free", "b2b-professional", "b2c-professional", - "b2c-essentials", "b2b-essentials" ] }, @@ -6690,19 +6895,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "free" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -6772,10 +6977,10 @@ "scope": "project", "service_id": "b2c-professional", "updateable_to": [ - "free", - "b2b-professional", "b2b-essentials", "b2c-essentials", + "free", + "b2b-professional", "b2c-professional" ] }, @@ -6783,19 +6988,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2b-professional" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" } ], "availability": "available", @@ -6853,10 +7058,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2b-professional", - "b2c-professional", "b2b-essentials", "b2c-essentials", + "b2b-professional", + "b2c-professional", "free" ] }, @@ -6864,19 +7069,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-professional" + "service": "free" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-professional" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" } ], "availability": "available", @@ -6946,10 +7151,10 @@ "scope": "project", "service_id": "b2c-essentials", "updateable_to": [ + "b2b-essentials", "free", "b2b-professional", "b2c-professional", - "b2b-essentials", "b2c-essentials" ] }, @@ -7564,15 +7769,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" } ], "availability": "available", @@ -7616,9 +7821,9 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ + "top-up-0025", "top-up-2000", "top-up-1000", - "top-up-0025", "top-up-0500" ] }, @@ -7626,11 +7831,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", @@ -7678,8 +7883,8 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-2000", "top-up-0025", + "top-up-2000", "top-up-0500", "top-up-1000" ] @@ -7688,11 +7893,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", @@ -7740,8 +7945,8 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-2000", "top-up-1000", + "top-up-2000", "top-up-0500", "top-up-0025" ] @@ -7750,11 +7955,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" }, { "direction": "any", @@ -7802,8 +8007,8 @@ "scope": "project", "service_id": "top-up-2000", "updateable_to": [ - "top-up-1000", "top-up-0025", + "top-up-1000", "top-up-0500", "top-up-2000" ] @@ -7927,9 +8132,9 @@ }, "parent_services": [ "top-up-1000", - "top-up-2000", + "top-up-0025", "top-up-0500", - "top-up-0025" + "top-up-2000" ], "type": "paid" } @@ -8505,11 +8710,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", @@ -8577,8 +8782,8 @@ "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ - "plus-v3-50k-mtu-monthly", "free", + "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] @@ -8587,11 +8792,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", @@ -8659,8 +8864,8 @@ "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ - "plus-v3-50k-mtu-monthly", "free", + "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] @@ -8922,9 +9127,9 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "scale", "enterprise", + "scale", + "free", "core" ], "type": "free" @@ -9074,11 +9279,11 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "startup" }, { "direction": "any", - "service": "startup" + "service": "developer" } ], "availability": "available", @@ -9110,8 +9315,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "developer", "startup", + "developer", "free" ] }, @@ -9318,11 +9523,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "launch" }, { "direction": "any", - "service": "launch" + "service": "free" } ], "availability": "available", @@ -9364,19 +9569,19 @@ "scope": "project", "service_id": "launch", "updateable_to": [ - "free", - "launch" + "launch", + "free" ] }, { "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "launch" }, { "direction": "any", - "service": "launch" + "service": "free" } ], "availability": "available", @@ -9406,8 +9611,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "free", - "launch" + "launch", + "free" ] }, { @@ -9451,8 +9656,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -9475,11 +9680,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -9509,19 +9714,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "team" }, { "direction": "any", - "service": "team" + "service": "pro" } ], "availability": "available", @@ -9553,8 +9758,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "pro", "team", + "pro", "free" ] }, @@ -9615,8 +9820,8 @@ "type": "freeform" }, "parent_services": [ - "team", - "pro" + "pro", + "team" ], "type": "paid" } @@ -10272,11 +10477,11 @@ "is_default": null, "paid": null, "parent_services": [ + "b2b-professional", "b2c-professional", "free", "b2c-essentials", - "b2b-essentials", - "b2b-professional" + "b2b-essentials" ], "type": "free" } @@ -10491,7 +10696,7 @@ }, { "direction": "any", - "service": "hobby" + "service": "free" }, { "direction": "any", @@ -10499,7 +10704,7 @@ }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10569,9 +10774,9 @@ "service_id": "growth", "updateable_to": [ "standard", - "hobby", - "api", "free", + "api", + "hobby", "growth" ] }, @@ -10579,19 +10784,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "standard" }, { "direction": "any", - "service": "api" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "api" } ], "availability": "available", @@ -10660,10 +10865,10 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "standard", "growth", - "api", + "standard", "free", + "api", "hobby" ] }, @@ -10675,7 +10880,7 @@ }, { "direction": "any", - "service": "hobby" + "service": "free" }, { "direction": "any", @@ -10683,7 +10888,7 @@ }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10753,9 +10958,9 @@ "service_id": "standard", "updateable_to": [ "growth", - "hobby", - "api", "free", + "api", + "hobby", "standard" ] }, @@ -10801,19 +11006,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "standard" }, { "direction": "any", - "service": "hobby" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "hobby" } ], "availability": "available", @@ -10854,8 +11059,8 @@ "type": "freeform" }, "parent_services": [ - "growth", "standard", + "growth", "hobby" ], "type": "paid" @@ -10872,10 +11077,10 @@ "scope": "project", "service_id": "api", "updateable_to": [ - "standard", "growth", - "hobby", + "standard", "free", + "hobby", "api" ] }, @@ -10883,19 +11088,19 @@ "allowed_updates": [ { "direction": "any", - "service": "standard" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "standard" }, { "direction": "any", - "service": "hobby" + "service": "api" }, { "direction": "any", - "service": "api" + "service": "hobby" } ], "availability": "available", @@ -10929,10 +11134,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "standard", "growth", - "hobby", + "standard", "api", + "hobby", "free" ] }, @@ -11040,11 +11245,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -11074,19 +11279,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -11128,8 +11333,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { @@ -11191,19 +11396,19 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -11302,10 +11507,10 @@ "scope": "project", "service_id": "analytics", "updateable_to": [ - "plus-v3-50k-mtu-monthly", - "free", "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly", + "free", + "plus-v3-50k-mtu-monthly", "analytics" ] }, @@ -11978,9 +12183,9 @@ }, "parent_services": [ "hobbyist", - "business", + "25K_emails+auto-replenish", "62.5K_emails+auto-replenish", - "25K_emails+auto-replenish" + "business" ], "type": "paid" } @@ -12058,11 +12263,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -12104,8 +12309,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { @@ -12279,8 +12484,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -15262,8 +15467,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15327,8 +15532,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15351,11 +15556,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -15388,8 +15593,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "pro", "hobby", + "pro", "free" ] }, @@ -15437,8 +15642,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15496,8 +15701,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15560,8 +15765,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15743,23 +15948,23 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "scaler" + "service": "developer_overages" } ], "availability": "available", @@ -15768,15 +15973,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15812,11 +16017,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ + "scaler", + "scaler_overages", "pro", "pro_overages", "developer_overages", - "scaler_overages", - "scaler", "developer" ] }, @@ -15824,11 +16029,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" } ], "availability": "available", @@ -15837,15 +16042,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15881,8 +16086,8 @@ "scope": "account", "service_id": "scaler_overages", "updateable_to": [ - "pro_overages", "pro", + "pro_overages", "scaler_overages" ] }, @@ -15899,15 +16104,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -15951,7 +16156,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", @@ -15959,7 +16164,7 @@ }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" } ], "availability": "available", @@ -15968,15 +16173,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16012,9 +16217,9 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "pro_overages", - "pro", "scaler_overages", + "pro", + "pro_overages", "scaler" ] }, @@ -16066,13 +16271,13 @@ "is_default": null, "paid": null, "parent_services": [ - "starter", - "scaler", - "pro_overages", - "scaler_overages", - "pro", + "developer_overages", "developer", - "developer_overages" + "pro", + "scaler_overages", + "pro_overages", + "scaler", + "starter" ], "type": "free" } @@ -16095,19 +16300,19 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "pro_overages" } ], "availability": "available", @@ -16116,15 +16321,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16160,10 +16365,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "pro_overages", - "pro", - "scaler_overages", "scaler", + "scaler_overages", + "pro", + "pro_overages", "developer_overages" ] }, @@ -16175,15 +16380,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16226,27 +16431,27 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "developer_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "developer" } ], "availability": "available", @@ -16255,15 +16460,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16287,12 +16492,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "developer", - "pro_overages", - "scaler", - "developer_overages", - "pro", "scaler_overages", + "pro", + "developer_overages", + "scaler", + "pro_overages", + "developer", "starter" ] } From 944c7b763adc7e23e6de205b6d68d9d16a61b163 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 23 Sep 2026 10:36:52 +0000 Subject: [PATCH 15/26] feat(integrations): register resend/email resend/email is the only new deployable in the 0.41.0 catalog. ResendEmail declares a provisional API_KEY output. Plan services resend/free, resend/pro, and inngest/growth-2026-09-22 stay out of the registry. --- PROVIDERS.md | 1 + .../provisional-allowlist.txt | 1 + .../src/providers/mod.rs | 8 +- .../src/providers/resend/email.rs | 129 ++++++++++++++++++ .../src/providers/resend/mod.rs | 3 + crates/stackless-integrations/src/registry.rs | 1 + scripts/generate_catalog_integrations.py | 2 + 7 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 crates/stackless-integrations/src/providers/resend/email.rs create mode 100644 crates/stackless-integrations/src/providers/resend/mod.rs diff --git a/PROVIDERS.md b/PROVIDERS.md index 42efb847..309c16af 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -99,6 +99,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `railway-postgres` | `railway/postgres` | | `railway-redis` | `railway/redis` | | `render-postgres` | `render/postgres` | +| `resend` | `resend/email` | | `revenuecat` | `revenuecat/app` | | `runloop` | `runloop/sandbox` | | `schematic` | `schematic/schematic-environment` | diff --git a/crates/stackless-integrations/provisional-allowlist.txt b/crates/stackless-integrations/provisional-allowlist.txt index 6be78bdb..8b130e8f 100644 --- a/crates/stackless-integrations/provisional-allowlist.txt +++ b/crates/stackless-integrations/provisional-allowlist.txt @@ -11,4 +11,5 @@ athena/agents churnkey/retention herenow/hosting perplexity/api +resend/email shopify/store diff --git a/crates/stackless-integrations/src/providers/mod.rs b/crates/stackless-integrations/src/providers/mod.rs index 2b7763d2..4d6aab64 100644 --- a/crates/stackless-integrations/src/providers/mod.rs +++ b/crates/stackless-integrations/src/providers/mod.rs @@ -38,6 +38,7 @@ pub mod prisma; pub mod pydantic; pub mod railway; pub mod render_db; +pub mod resend; pub mod revenuecat; pub mod runloop; pub mod schematic; @@ -63,9 +64,9 @@ mod tests { chatbase, churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, elevenlabs, exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, metronome, mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, - posthog, prisma, pydantic, railway, render_db, revenuecat, runloop, schematic, sentry, - shopify, steel, supabase, supermemory, tabstack, turso, upstash, wix, wordpress_com, - workos, + posthog, prisma, pydantic, railway, render_db, resend, revenuecat, runloop, schematic, + sentry, shopify, steel, supabase, supermemory, tabstack, turso, upstash, wix, + wordpress_com, workos, }; fn assert_outputs_match() { @@ -136,6 +137,7 @@ mod tests { assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); + assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); diff --git a/crates/stackless-integrations/src/providers/resend/email.rs b/crates/stackless-integrations/src/providers/resend/email.rs new file mode 100644 index 00000000..35aaaea1 --- /dev/null +++ b/crates/stackless-integrations/src/providers/resend/email.rs @@ -0,0 +1,129 @@ +use std::collections::BTreeMap; + +use serde::Serialize; +use stackless_stripe_projects::catalog::verify::CatalogService; +use stackless_stripe_projects::provision::ProvisionContext; + +use super::FamilyResource; +use crate::error::IntegrationError; +use crate::hostable::{ConfigScope, Hostable, IntegrationHosting}; + +pub const RESOURCE_KIND: &str = "integration-resend"; + +#[derive(Debug, Serialize)] +pub struct ResendEmailConfig {} + +impl CatalogService for ResendEmailConfig { + const REFERENCE: &'static str = "resend/email"; +} + +#[derive(Debug)] +pub struct ResendEmail; + +impl Hostable for ResendEmail { + const PROVIDER: &'static str = "resend"; + const HOSTING: IntegrationHosting = IntegrationHosting::Managed; + const CONFIG_SCOPE: ConfigScope = ConfigScope::GlobalOnly; + const RESOURCE_KIND: &'static str = RESOURCE_KIND; + const OUTPUTS: &'static [&'static str] = &["api_key"]; +} + +impl FamilyResource for ResendEmail { + type Config = ResendEmailConfig; + const PROVIDER_PREFIX: &'static str = "RESEND"; + // Provisional until pinned by `mise run discover resend/email`. + const OUTPUT_FIELDS: &'static [(&'static str, &'static str, bool)] = + &[("API_KEY", "api_key", true)]; + + fn build_config(ctx: &ProvisionContext<'_>) -> Result { + let _ = super::integration_config(ctx)?; + Ok(ResendEmailConfig {}) + } +} + +pub fn validate_config( + name: &str, + config: &BTreeMap, +) -> Result<(), IntegrationError> { + let _ = (name, config); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ProviderOps; + use crate::resource::ResourcePayload; + use stackless_core::def::StackDef; + use stackless_stripe_projects::stripe::StripeProjects; + use stackless_stripe_projects::test_support; + + #[test] + fn config_matches_catalog() { + const FIXTURE: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../stackless-stripe-projects/tests/fixtures/catalog.json" + )); + let catalog = stackless_stripe_projects::Catalog::from_json_envelope(FIXTURE).unwrap(); + let failures = stackless_stripe_projects::verify_service(&catalog, &ResendEmailConfig {}); + assert!( + failures.is_empty(), + "resend/email catalog gaps:\n{}", + failures.join("\n") + ); + } + + const CATALOG_ENVELOPE: &str = r##"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"allowed_updates":[],"availability":"available","categories":["email"],"configuration_schema":{},"constraints":[{"count":{"at_most":1},"type":"count"}],"created":null,"description":"Email for developers. One API key per project, one shared sending quota.","development":false,"group":"resend","id":"prvsvc_61VFx44H4RKHoEjct5QIi","kind":"deployable","livemode":true,"llm_context":"https://raw.githubusercontent.com/resend/resend-skills/main/skills/resend/SKILL.md","object":"v2.provisioning.provider_service_detail","pricing":{"component":{"options":[{"is_default":null,"paid":null,"parent_services":["pro","free"],"type":"free"}]},"paid":null,"paid_pricing":[],"type":"component"},"provider":"prvdr_61VFXTzsszWb1r1S25KMa","provider_configuration_schema":{},"provider_name":"Resend","scope":"project","service_id":"email","updateable_to":["email"]}]}}"##; + + fn test_def() -> StackDef { + StackDef::parse( + r#" +[stack] +name = "atto" +[stack.projects.stripe] +project = "project_1" +[integrations.res] +provider = "resend" +[services.api] +source = { repo = "r", ref = "main" } +env = { OUT = "${integrations.res.api_key}" } +health = { path = "/health" } +[services.api.local] +run = "true" +"#, + ) + .unwrap() + } + + #[tokio::test] + async fn provision_records_outputs() { + let runner = test_support::provision_script( + CATALOG_ENVELOPE, + serde_json::json!({"RESEND_API_KEY": "val_api_key"}), + 0, + ); + let dir = tempfile::tempdir().unwrap(); + std::fs::write( + dir.path().join("stackless.toml"), + "[stack]\nname=\"atto\"\n", + ) + .unwrap(); + let stripe = StripeProjects::new(&runner, dir.path()); + + let resource = ResendEmail + .provision( + &stripe.as_dyn(), + &test_def(), + dir.path(), + "demo", + "res", + "local", + false, + ) + .await + .unwrap(); + assert_eq!(resource.resource_kind, "integration-resend"); + let payload: ResourcePayload = serde_json::from_str(&resource.payload).unwrap(); + assert_eq!(payload.outputs["api_key"], "val_api_key"); + } +} diff --git a/crates/stackless-integrations/src/providers/resend/mod.rs b/crates/stackless-integrations/src/providers/resend/mod.rs new file mode 100644 index 00000000..d8c1b7e1 --- /dev/null +++ b/crates/stackless-integrations/src/providers/resend/mod.rs @@ -0,0 +1,3 @@ +pub mod email; + +pub(crate) use crate::resource::{CatalogResource as FamilyResource, integration_config}; diff --git a/crates/stackless-integrations/src/registry.rs b/crates/stackless-integrations/src/registry.rs index 9fa3f180..8b8e231f 100644 --- a/crates/stackless-integrations/src/registry.rs +++ b/crates/stackless-integrations/src/registry.rs @@ -123,6 +123,7 @@ register_providers! { (railway::postgres, RailwayPostgres), (railway::redis, RailwayRedis), (render_db::postgres, RenderPostgres), + (resend::email, ResendEmail), (revenuecat::app, RevenuecatApp), (runloop::sandbox, RunloopSandbox), (schematic::schematic_environment, SchematicEnvironment), diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index c3dff2ab..a8c939df 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -124,6 +124,7 @@ "sentry/project": "sentry", "sentry/seer": "sentry-seer", "render/postgres": "render-postgres", + "resend/email": "resend", "railway/hosting": "railway-hosting", "railway/postgres": "railway-postgres", "railway/redis": "railway-redis", @@ -253,6 +254,7 @@ "metronome/sandbox": [("API_KEY", "api_key", True)], "supermemory/memory": [("API_KEY", "api_key", True)], "render/postgres": [("DATABASE_URL", "database_url", True)], + "resend/email": [("API_KEY", "api_key", True)], "flyio/mpg": [("DATABASE_URL", "database_url", True)], "flyio/sprite": [("SPRITE_URL", "sprite_url", True)], } From 1a2f5d3463dd309af81d886b91e9df19b2d6f92b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 25 Sep 2026 10:27:10 +0000 Subject: [PATCH 16/26] chore(stripe-projects): bless plugin 0.42.0 fixtures Refresh plugin-version.txt, catalog.json, and command-surface.txt from the installed plugin. inngest/growth-2026-09-22 freeform price is now "$499.00 per month". allowed_updates and parent_services lists changed order only. init and add help now include --testmode. --- .../tests/fixtures/catalog.json | 422 +++++++++--------- .../tests/fixtures/command-surface.txt | 8 +- .../tests/fixtures/plugin-version.txt | 2 +- 3 files changed, 218 insertions(+), 214 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 0de9a0d9..451b5759 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -27,14 +27,14 @@ "component": null, "paid": { "description": null, - "freeform": "paid", + "freeform": "$499.00 per month", "type": "freeform" }, "paid_pricing": [ { "configuration": null, "description": null, - "freeform": "paid", + "freeform": "$499.00 per month", "is_default": null, "type": "freeform" } @@ -1738,15 +1738,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" } ], "availability": "available", @@ -1788,9 +1788,9 @@ "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ + "pro-monthly", "free", "beginner-monthly", - "pro-monthly", "enterprise-monthly" ] }, @@ -1798,15 +1798,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "free" }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -1848,9 +1848,9 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ + "enterprise-monthly", "free", "pro-monthly", - "enterprise-monthly", "beginner-monthly" ] }, @@ -1858,15 +1858,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" } ], "availability": "available", @@ -1908,9 +1908,9 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ + "enterprise-monthly", "free", "beginner-monthly", - "enterprise-monthly", "pro-monthly" ] }, @@ -1918,15 +1918,15 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -1956,9 +1956,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ + "enterprise-monthly", "beginner-monthly", "pro-monthly", - "enterprise-monthly", "free" ] }, @@ -1986,10 +1986,10 @@ "is_default": null, "paid": null, "parent_services": [ - "enterprise-monthly", - "beginner-monthly", "free", - "pro-monthly" + "pro-monthly", + "enterprise-monthly", + "beginner-monthly" ], "type": "free" } @@ -2190,11 +2190,11 @@ "allowed_updates": [ { "direction": "down", - "service": "standard" + "service": "hobby" }, { "direction": "down", - "service": "hobby" + "service": "standard" } ], "availability": "available", @@ -2250,8 +2250,8 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "standard", "hobby", + "standard", "pro" ] }, @@ -2290,9 +2290,9 @@ "is_default": null, "paid": null, "parent_services": [ - "standard", "pro", - "hobby" + "hobby", + "standard" ], "type": "free" }, @@ -2395,13 +2395,13 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "hobby" - }, { "direction": "up", "service": "pro" + }, + { + "direction": "down", + "service": "hobby" } ], "availability": "available", @@ -2457,8 +2457,8 @@ "scope": "account", "service_id": "standard", "updateable_to": [ - "hobby", "pro", + "hobby", "standard" ] }, @@ -3733,8 +3733,8 @@ { "allowed_updates": [ { - "direction": "down", - "service": "tier-3" + "direction": "up", + "service": "tier-5" }, { "direction": "down", @@ -3745,12 +3745,12 @@ "service": "tier-2" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-3" }, { "direction": "up", - "service": "tier-5" + "service": "tier-6" } ], "availability": "available", @@ -3798,20 +3798,16 @@ "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-3", + "tier-5", "tier-1", "tier-2", + "tier-3", "tier-6", - "tier-5", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-3" - }, { "direction": "down", "service": "tier-1" @@ -3821,12 +3817,16 @@ "service": "tier-2" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-3" }, { "direction": "down", "service": "tier-4" + }, + { + "direction": "up", + "service": "tier-6" } ], "availability": "available", @@ -3874,11 +3874,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-3", "tier-1", "tier-2", - "tier-6", + "tier-3", "tier-4", + "tier-6", "tier-5" ] }, @@ -3892,6 +3892,10 @@ "direction": "up", "service": "tier-4" }, + { + "direction": "up", + "service": "tier-5" + }, { "direction": "down", "service": "tier-1" @@ -3899,10 +3903,6 @@ { "direction": "up", "service": "tier-6" - }, - { - "direction": "up", - "service": "tier-5" } ], "availability": "available", @@ -3952,18 +3952,14 @@ "updateable_to": [ "tier-3", "tier-4", + "tier-5", "tier-1", "tier-6", - "tier-5", "tier-2" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-5" - }, { "direction": "down", "service": "tier-1" @@ -3979,6 +3975,10 @@ { "direction": "down", "service": "tier-4" + }, + { + "direction": "down", + "service": "tier-5" } ], "availability": "available", @@ -4026,11 +4026,11 @@ "scope": "account", "service_id": "tier-6", "updateable_to": [ - "tier-5", "tier-1", "tier-2", "tier-3", "tier-4", + "tier-5", "tier-6" ] }, @@ -4040,6 +4040,10 @@ "direction": "up", "service": "tier-4" }, + { + "direction": "up", + "service": "tier-5" + }, { "direction": "down", "service": "tier-1" @@ -4051,10 +4055,6 @@ { "direction": "up", "service": "tier-6" - }, - { - "direction": "up", - "service": "tier-5" } ], "availability": "available", @@ -4103,10 +4103,10 @@ "service_id": "tier-3", "updateable_to": [ "tier-4", + "tier-5", "tier-1", "tier-2", "tier-6", - "tier-5", "tier-3" ] }, @@ -5736,19 +5736,19 @@ "allowed_updates": [ { "direction": "up", - "service": "business" + "service": "starter" }, { - "direction": "any", - "service": "free" + "direction": "up", + "service": "pro" }, { - "direction": "up", - "service": "starter" + "direction": "any", + "service": "free" }, { "direction": "up", - "service": "pro" + "service": "business" } ], "availability": "available", @@ -5778,18 +5778,14 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "business", - "free", "starter", - "pro" + "pro", + "free", + "business" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "business" - }, { "direction": "down", "service": "free" @@ -5801,6 +5797,10 @@ { "direction": "down", "service": "pro" + }, + { + "direction": "any", + "service": "business" } ], "availability": "available", @@ -5842,10 +5842,10 @@ "scope": "account", "service_id": "business", "updateable_to": [ - "business", "free", "starter", - "pro" + "pro", + "business" ] }, { @@ -5858,13 +5858,13 @@ "direction": "any", "service": "pro" }, - { - "direction": "up", - "service": "business" - }, { "direction": "down", "service": "starter" + }, + { + "direction": "up", + "service": "business" } ], "availability": "available", @@ -5908,27 +5908,27 @@ "updateable_to": [ "free", "pro", - "business", - "starter" + "starter", + "business" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "free" - }, { "direction": "any", "service": "starter" }, { - "direction": "up", - "service": "business" + "direction": "down", + "service": "free" }, { "direction": "up", "service": "pro" + }, + { + "direction": "up", + "service": "business" } ], "availability": "available", @@ -5970,10 +5970,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "free", "starter", - "business", - "pro" + "free", + "pro", + "business" ] }, { @@ -6707,10 +6707,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2b-essentials" - }, { "direction": "any", "service": "b2c-essentials" @@ -6722,6 +6718,10 @@ { "direction": "any", "service": "b2c-professional" + }, + { + "direction": "any", + "service": "b2b-essentials" } ], "availability": "available", @@ -6791,10 +6791,10 @@ "scope": "project", "service_id": "b2b-professional", "updateable_to": [ - "b2b-essentials", "b2c-essentials", "free", "b2c-professional", + "b2b-essentials", "b2b-professional" ] }, @@ -6893,10 +6893,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2b-essentials" - }, { "direction": "any", "service": "b2c-essentials" @@ -6908,6 +6904,10 @@ { "direction": "any", "service": "b2b-professional" + }, + { + "direction": "any", + "service": "b2b-essentials" } ], "availability": "available", @@ -6977,19 +6977,15 @@ "scope": "project", "service_id": "b2c-professional", "updateable_to": [ - "b2b-essentials", "b2c-essentials", "free", "b2b-professional", + "b2b-essentials", "b2c-professional" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2b-essentials" - }, { "direction": "any", "service": "b2c-essentials" @@ -7001,6 +6997,10 @@ { "direction": "any", "service": "b2c-professional" + }, + { + "direction": "any", + "service": "b2b-essentials" } ], "availability": "available", @@ -7058,19 +7058,15 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2b-essentials", "b2c-essentials", "b2b-professional", "b2c-professional", + "b2b-essentials", "free" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2b-essentials" - }, { "direction": "any", "service": "free" @@ -7082,6 +7078,10 @@ { "direction": "any", "service": "b2c-professional" + }, + { + "direction": "any", + "service": "b2b-essentials" } ], "availability": "available", @@ -7151,10 +7151,10 @@ "scope": "project", "service_id": "b2c-essentials", "updateable_to": [ - "b2b-essentials", "free", "b2b-professional", "b2c-professional", + "b2b-essentials", "b2c-essentials" ] }, @@ -7769,11 +7769,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", @@ -7821,8 +7821,8 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ - "top-up-0025", "top-up-2000", + "top-up-0025", "top-up-1000", "top-up-0500" ] @@ -7831,15 +7831,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" } ], "availability": "available", @@ -7883,9 +7883,9 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-0025", "top-up-2000", "top-up-0500", + "top-up-0025", "top-up-1000" ] }, @@ -7893,15 +7893,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" } ], "availability": "available", @@ -7945,9 +7945,9 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-1000", "top-up-2000", "top-up-0500", + "top-up-1000", "top-up-0025" ] }, @@ -7959,11 +7959,11 @@ }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" } ], "availability": "available", @@ -8008,8 +8008,8 @@ "service_id": "top-up-2000", "updateable_to": [ "top-up-0025", - "top-up-1000", "top-up-0500", + "top-up-1000", "top-up-2000" ] }, @@ -8131,10 +8131,10 @@ "type": "freeform" }, "parent_services": [ - "top-up-1000", "top-up-0025", "top-up-0500", - "top-up-2000" + "top-up-2000", + "top-up-1000" ], "type": "paid" } @@ -8157,11 +8157,11 @@ "allowed_updates": [ { "direction": "any", - "service": "team" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "team" } ], "availability": "available", @@ -8205,8 +8205,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "team", "free", + "team", "pro" ] }, @@ -8214,11 +8214,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "pro" } ], "availability": "available", @@ -8262,8 +8262,8 @@ "scope": "project", "service_id": "team", "updateable_to": [ - "pro", "free", + "pro", "team" ] }, @@ -8710,15 +8710,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -8782,9 +8782,9 @@ "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ + "plus-v3-25k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly", - "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] }, @@ -8792,15 +8792,15 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -8864,9 +8864,9 @@ "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ + "plus-v3-10k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly", - "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] }, @@ -8874,7 +8874,7 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", @@ -8882,7 +8882,7 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -8946,9 +8946,9 @@ "scope": "project", "service_id": "plus-v3-50k-mtu-monthly", "updateable_to": [ - "free", - "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-25k-mtu-monthly", + "free", "plus-v3-50k-mtu-monthly" ] }, @@ -9127,10 +9127,10 @@ "is_default": null, "paid": null, "parent_services": [ - "enterprise", - "scale", "free", - "core" + "core", + "enterprise", + "scale" ], "type": "free" } @@ -9523,11 +9523,11 @@ "allowed_updates": [ { "direction": "any", - "service": "launch" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "launch" } ], "availability": "available", @@ -9569,19 +9569,19 @@ "scope": "project", "service_id": "launch", "updateable_to": [ - "launch", - "free" + "free", + "launch" ] }, { "allowed_updates": [ { "direction": "any", - "service": "launch" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "launch" } ], "availability": "available", @@ -9611,8 +9611,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "launch", - "free" + "free", + "launch" ] }, { @@ -9722,11 +9722,11 @@ "allowed_updates": [ { "direction": "any", - "service": "team" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "team" } ], "availability": "available", @@ -9758,8 +9758,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "team", "pro", + "team", "free" ] }, @@ -10477,11 +10477,11 @@ "is_default": null, "paid": null, "parent_services": [ - "b2b-professional", "b2c-professional", "free", "b2c-essentials", - "b2b-essentials" + "b2b-essentials", + "b2b-professional" ], "type": "free" } @@ -10700,11 +10700,11 @@ }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "api" } ], "availability": "available", @@ -10775,8 +10775,8 @@ "updateable_to": [ "standard", "free", - "api", "hobby", + "api", "growth" ] }, @@ -10884,11 +10884,11 @@ }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "api" } ], "availability": "available", @@ -10959,8 +10959,8 @@ "updateable_to": [ "growth", "free", - "api", "hobby", + "api", "standard" ] }, @@ -11059,9 +11059,9 @@ "type": "freeform" }, "parent_services": [ - "standard", "growth", - "hobby" + "hobby", + "standard" ], "type": "paid" } @@ -11096,11 +11096,11 @@ }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "api" } ], "availability": "available", @@ -11136,8 +11136,8 @@ "updateable_to": [ "growth", "standard", - "api", "hobby", + "api", "free" ] }, @@ -11396,19 +11396,19 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -11507,10 +11507,10 @@ "scope": "project", "service_id": "analytics", "updateable_to": [ - "plus-v3-10k-mtu-monthly", - "plus-v3-25k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly", + "plus-v3-25k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "analytics" ] }, @@ -11518,7 +11518,7 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", @@ -11526,7 +11526,7 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -11578,9 +11578,9 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "plus-v3-50k-mtu-monthly", - "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-25k-mtu-monthly", + "plus-v3-50k-mtu-monthly", "free" ] }, @@ -12182,10 +12182,10 @@ "type": "freeform" }, "parent_services": [ - "hobbyist", "25K_emails+auto-replenish", "62.5K_emails+auto-replenish", - "business" + "business", + "hobbyist" ], "type": "paid" } @@ -15948,23 +15948,23 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler" + "service": "pro" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "developer_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "scaler" } ], "availability": "available", @@ -16017,11 +16017,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "scaler", - "scaler_overages", "pro", "pro_overages", + "scaler_overages", "developer_overages", + "scaler", "developer" ] }, @@ -16029,11 +16029,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" } ], "availability": "available", @@ -16086,8 +16086,8 @@ "scope": "account", "service_id": "scaler_overages", "updateable_to": [ - "pro", "pro_overages", + "pro", "scaler_overages" ] }, @@ -16156,11 +16156,11 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", @@ -16217,8 +16217,8 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "scaler_overages", "pro", + "scaler_overages", "pro_overages", "scaler" ] @@ -16298,10 +16298,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "scaler" - }, { "direction": "any", "service": "scaler_overages" @@ -16313,6 +16309,10 @@ { "direction": "any", "service": "pro_overages" + }, + { + "direction": "any", + "service": "scaler" } ], "availability": "available", @@ -16365,10 +16365,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "scaler", "scaler_overages", "pro", "pro_overages", + "scaler", "developer_overages" ] }, @@ -16431,27 +16431,27 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "developer" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "developer_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "developer_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler" }, { "direction": "any", - "service": "developer" + "service": "scaler_overages" } ], "availability": "available", @@ -16492,12 +16492,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "scaler_overages", + "developer", + "pro_overages", "pro", "developer_overages", "scaler", - "pro_overages", - "developer", + "scaler_overages", "starter" ] } diff --git a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt index 333d1633..4253643a 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt @@ -1,9 +1,9 @@ # stripe projects command surface -# plugin-version: 0.41.0 +# plugin-version: 0.42.0 # DO NOT EDIT — regenerated by CI (mise run stripe-refresh) ===== stripe projects --help ===== -Stripe Projects (v0.41.0) +Stripe Projects (v0.42.0) Provision third-party services, manage credentials, and pull environment variables. GET STARTED @@ -115,6 +115,8 @@ Options: CLAUDE.md) [boolean] --template Template entry ID or template slug to use directly and skip interactive template selection [string] + --testmode Create provisioned Resources in Stripe test mode + [boolean] --mode Initialization mode: `manual` scaffolds a workspace, `guided` creates a starter app, and `template` browses templates directly. @@ -418,6 +420,8 @@ Options: --stream Enable streaming output animations [boolean] --debug Enable debug logging for Stripe API requests [boolean] + --testmode Create provisioned Resources in Stripe test mode + [boolean] --name Logical resource name used for local resource references and environment variable prefixes [string] diff --git a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt index 72a8a631..787ffc30 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt @@ -1 +1 @@ -0.41.0 +0.42.0 From 4e8a7851cf512a3dc94be92ebc3e76d1872de22a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 25 Sep 2026 10:27:10 +0000 Subject: [PATCH 17/26] chore(stripe-projects): pin STRIPE_PROJECTS_PINNED to 0.42.0 Match the doctor pin and the TRAVERSAL note to plugin-version.txt. --- crates/stackless-stripe-projects/src/surface.rs | 2 +- crates/stackless/src/authoring.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/stackless-stripe-projects/src/surface.rs b/crates/stackless-stripe-projects/src/surface.rs index fe297f1b..847328e9 100644 --- a/crates/stackless-stripe-projects/src/surface.rs +++ b/crates/stackless-stripe-projects/src/surface.rs @@ -13,7 +13,7 @@ use crate::stripe::{CommandRunner, StripeProjects}; /// never self-reorders — a newly shipped command surfaces as a diff in the /// top-level `--help` block and is then added here in the same change. Groups /// (`services`/`env`/`billing`) are listed immediately before their children. -/// Verified against plugin 0.41.0. +/// Verified against plugin 0.42.0. const TRAVERSAL: &[&[&str]] = &[ &[], // GET STARTED diff --git a/crates/stackless/src/authoring.rs b/crates/stackless/src/authoring.rs index 18c3ae5b..99b3240a 100644 --- a/crates/stackless/src/authoring.rs +++ b/crates/stackless/src/authoring.rs @@ -8,7 +8,7 @@ use stackless_core::types::DnsName; use crate::error::Error; /// The Stripe Projects plugin version stackless is tested against. -pub const STRIPE_PROJECTS_PINNED: &str = "0.41.0"; +pub const STRIPE_PROJECTS_PINNED: &str = "0.42.0"; pub fn default_output_path() -> PathBuf { PathBuf::from("stackless.toml") From 6ddc722feabc41a7c39bec90c49c5faef6248562 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Fri, 25 Sep 2026 10:49:00 +0000 Subject: [PATCH 18/26] refactor(stripe-projects): drop surface narration comments Remove the TRAVERSAL version stamp, section labels, and test narration. The pinned plugin version stays in plugin-version.txt. --- crates/stackless-stripe-projects/src/surface.rs | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/crates/stackless-stripe-projects/src/surface.rs b/crates/stackless-stripe-projects/src/surface.rs index 847328e9..365e78f2 100644 --- a/crates/stackless-stripe-projects/src/surface.rs +++ b/crates/stackless-stripe-projects/src/surface.rs @@ -8,15 +8,8 @@ use crate::error::ProjectsError; use crate::stripe::{CommandRunner, StripeProjects}; -/// Every `stripe projects` invocation we snapshot, as the argv *after* `projects`. -/// The order is fixed in code, not discovered from the plugin, so the snapshot -/// never self-reorders — a newly shipped command surfaces as a diff in the -/// top-level `--help` block and is then added here in the same change. Groups -/// (`services`/`env`/`billing`) are listed immediately before their children. -/// Verified against plugin 0.42.0. const TRAVERSAL: &[&[&str]] = &[ &[], - // GET STARTED &["init"], &["build"], &["list"], @@ -27,7 +20,6 @@ const TRAVERSAL: &[&[&str]] = &[ &["catalog"], &["search"], &["switch-account"], - // MANAGE SERVICES &["add"], &["update"], &["upgrade"], @@ -37,7 +29,6 @@ const TRAVERSAL: &[&[&str]] = &[ &["link"], &["unlink"], &["open"], - // ENVIRONMENT &["env"], &["env", "list"], &["env", "show"], @@ -52,13 +43,11 @@ const TRAVERSAL: &[&[&str]] = &[ &["variables", "list"], &["variables", "delete"], &["llm-context"], - // BILLING &["billing"], &["billing", "show"], &["billing", "add"], &["billing", "update"], &["spend"], - // FEEDBACK &["feedback"], ]; @@ -186,8 +175,6 @@ mod tests { use async_trait::async_trait; use std::path::Path; - /// Returns canned help text echoing the argv it was called with, so we can - /// assert the assembly logic without scripting one output per command. struct EchoRunner; #[async_trait] @@ -195,7 +182,6 @@ mod tests { async fn run(&self, args: &[String], _cwd: &Path) -> Result { Ok(CommandOutput { status: 0, - // Pad with blank lines + trailing spaces to exercise normalization. stdout: format!("\n\nhelp for: {} \n\n", args.join(" ")), stderr: String::new(), }) @@ -257,11 +243,9 @@ GET STARTED\n init [name] Initialize a new project\n"; let body = command_surface(&driver()).await.unwrap(); let seps: Vec<&str> = body.lines().filter(|l| l.starts_with("===== ")).collect(); assert_eq!(seps, command_separators()); - // Top-level uses the bare label and the echo carries the normalized args. assert!(body.starts_with("===== stripe projects --help =====\n")); assert!(body.contains("help for: --help --color off")); assert!(body.contains("help for: env list --help --color off")); - // Trimmed: no trailing blank line. assert!(!body.ends_with('\n')); } } From bfc791cb5d018c46fb45cd23459ab1033656187a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 26 Sep 2026 10:14:46 +0000 Subject: [PATCH 19/26] chore(stripe-projects): bless pydantic organization descriptions The live catalog changed the organization field copy on pydantic/logfire, pydantic/growth, and pydantic/team. Array order in allowed_updates is unchanged. --- .../stackless-stripe-projects/tests/fixtures/catalog.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 451b5759..30cb0d0d 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -1467,7 +1467,7 @@ "configuration_schema": { "properties": { "organization": { - "description": "Name of an existing organization you administer to create the new project in. Defaults to your personal organization.", + "description": "Name of an existing organization you administer to create the new project in. Defaults to your default organization.", "maxLength": 50, "minLength": 2, "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", @@ -2025,7 +2025,7 @@ "configuration_schema": { "properties": { "organization": { - "description": "Name of an existing organization you administer to put on this paid plan. A paid plan is not applied to your personal organization through provisioning; upgrade that in the Logfire app.", + "description": "Name of an existing organization you administer to put on this paid plan. Legacy personal organizations must still be upgraded in the Logfire app.", "maxLength": 50, "minLength": 2, "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", @@ -2111,7 +2111,7 @@ "configuration_schema": { "properties": { "organization": { - "description": "Name of an existing organization you administer to put on this paid plan. A paid plan is not applied to your personal organization through provisioning; upgrade that in the Logfire app.", + "description": "Name of an existing organization you administer to put on this paid plan. Legacy personal organizations must still be upgraded in the Logfire app.", "maxLength": 50, "minLength": 2, "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", From 761677e6201c63bb2ad2cda465e03676e5d72c57 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 29 Sep 2026 10:34:08 +0000 Subject: [PATCH 20/26] chore(stripe-projects): bless plugin 0.45.0 fixtures The live catalog adds quo/app and quo/starter. Existing services change pricing and update edges. init gains --account. The typed catalog already covers the wire format. --- .../tests/fixtures/catalog.json | 533 +++++++++++------- .../tests/fixtures/command-surface.txt | 8 +- .../tests/fixtures/plugin-version.txt | 2 +- 3 files changed, 324 insertions(+), 219 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 30cb0d0d..6eed51b0 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -90,6 +90,107 @@ "retention" ] }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "communications" + ], + "configuration_schema": {}, + "constraints": [ + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Business phone numbers, calling, and messaging. Paid Starter plan with a 7-day free trial.", + "development": false, + "group": "workspace", + "id": "prvsvc_61VP2qveAWh4hu16A5KvA", + "kind": "deployable", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": { + "options": [ + { + "is_default": null, + "paid": null, + "parent_services": [ + "starter" + ], + "type": "free" + } + ] + }, + "paid": null, + "paid_pricing": [], + "type": "component" + }, + "provider": "prvdr_61VKP6RyKXtCSxNAo55ns", + "provider_configuration_schema": {}, + "provider_name": "Quo", + "scope": "project", + "service_id": "app", + "updateable_to": [ + "app" + ] + }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "communications" + ], + "configuration_schema": {}, + "constraints": [ + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Starter plan for a Quo workspace", + "development": false, + "group": "plan", + "id": "prvsvc_61VP2qu8TNanWtQrR5QzY", + "kind": "plan", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": { + "description": null, + "freeform": "$19 per seat / month, 7-day free trial", + "type": "freeform" + }, + "paid_pricing": [ + { + "configuration": null, + "description": null, + "freeform": "$19 per seat / month, 7-day free trial", + "is_default": true, + "type": "freeform" + } + ], + "type": "paid" + }, + "provider": "prvdr_61VKP6RyKXtCSxNAo55ns", + "provider_configuration_schema": {}, + "provider_name": "Quo", + "scope": "account", + "service_id": "starter", + "updateable_to": [ + "starter" + ] + }, { "allowed_updates": [], "availability": "available", @@ -1738,15 +1839,15 @@ "allowed_updates": [ { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "free" + "service": "pro-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" } ], "availability": "available", @@ -1788,9 +1889,9 @@ "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ + "beginner-monthly", "pro-monthly", "free", - "beginner-monthly", "enterprise-monthly" ] }, @@ -1798,15 +1899,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "free" } ], "availability": "available", @@ -1848,9 +1949,9 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ + "pro-monthly", "enterprise-monthly", "free", - "pro-monthly", "beginner-monthly" ] }, @@ -1858,15 +1959,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" } ], "availability": "available", @@ -1908,9 +2009,9 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ + "beginner-monthly", "enterprise-monthly", "free", - "beginner-monthly", "pro-monthly" ] }, @@ -1918,15 +2019,15 @@ "allowed_updates": [ { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "enterprise-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" } ], "availability": "available", @@ -1956,9 +2057,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ + "pro-monthly", "enterprise-monthly", "beginner-monthly", - "pro-monthly", "free" ] }, @@ -1986,10 +2087,10 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "pro-monthly", "enterprise-monthly", - "beginner-monthly" + "beginner-monthly", + "free", + "pro-monthly" ], "type": "free" } @@ -2290,9 +2391,9 @@ "is_default": null, "paid": null, "parent_services": [ + "standard", "pro", - "hobby", - "standard" + "hobby" ], "type": "free" }, @@ -2328,11 +2429,11 @@ "allowed_updates": [ { "direction": "up", - "service": "standard" + "service": "pro" }, { "direction": "up", - "service": "pro" + "service": "standard" } ], "availability": "available", @@ -2388,20 +2489,20 @@ "scope": "account", "service_id": "hobby", "updateable_to": [ - "standard", "pro", + "standard", "hobby" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "pro" - }, { "direction": "down", "service": "hobby" + }, + { + "direction": "up", + "service": "pro" } ], "availability": "available", @@ -2457,8 +2558,8 @@ "scope": "account", "service_id": "standard", "updateable_to": [ - "pro", "hobby", + "pro", "standard" ] }, @@ -3387,11 +3488,11 @@ "allowed_updates": [ { "direction": "up", - "service": "scale" + "service": "enterprise" }, { "direction": "up", - "service": "enterprise" + "service": "scale" } ], "availability": "available", @@ -3439,8 +3540,8 @@ "scope": "account", "service_id": "basic", "updateable_to": [ - "scale", "enterprise", + "scale", "basic" ] }, @@ -3736,6 +3837,10 @@ "direction": "up", "service": "tier-5" }, + { + "direction": "up", + "service": "tier-6" + }, { "direction": "down", "service": "tier-1" @@ -3747,10 +3852,6 @@ { "direction": "down", "service": "tier-3" - }, - { - "direction": "up", - "service": "tier-6" } ], "availability": "available", @@ -3799,10 +3900,10 @@ "service_id": "tier-4", "updateable_to": [ "tier-5", + "tier-6", "tier-1", "tier-2", "tier-3", - "tier-6", "tier-4" ] }, @@ -3810,23 +3911,23 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-1" + "service": "tier-4" }, { - "direction": "down", - "service": "tier-2" + "direction": "up", + "service": "tier-6" }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" }, { "direction": "down", - "service": "tier-4" + "service": "tier-2" }, { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-3" } ], "availability": "available", @@ -3874,11 +3975,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ + "tier-4", + "tier-6", "tier-1", "tier-2", "tier-3", - "tier-4", - "tier-6", "tier-5" ] }, @@ -3896,13 +3997,13 @@ "direction": "up", "service": "tier-5" }, - { - "direction": "down", - "service": "tier-1" - }, { "direction": "up", "service": "tier-6" + }, + { + "direction": "down", + "service": "tier-1" } ], "availability": "available", @@ -3953,8 +4054,8 @@ "tier-3", "tier-4", "tier-5", - "tier-1", "tier-6", + "tier-1", "tier-2" ] }, @@ -3962,23 +4063,23 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-1" + "service": "tier-4" }, { "direction": "down", - "service": "tier-2" + "service": "tier-5" }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" }, { "direction": "down", - "service": "tier-4" + "service": "tier-2" }, { "direction": "down", - "service": "tier-5" + "service": "tier-3" } ], "availability": "available", @@ -4026,11 +4127,11 @@ "scope": "account", "service_id": "tier-6", "updateable_to": [ + "tier-4", + "tier-5", "tier-1", "tier-2", "tier-3", - "tier-4", - "tier-5", "tier-6" ] }, @@ -4044,6 +4145,10 @@ "direction": "up", "service": "tier-5" }, + { + "direction": "up", + "service": "tier-6" + }, { "direction": "down", "service": "tier-1" @@ -4051,10 +4156,6 @@ { "direction": "down", "service": "tier-2" - }, - { - "direction": "up", - "service": "tier-6" } ], "availability": "available", @@ -4104,9 +4205,9 @@ "updateable_to": [ "tier-4", "tier-5", + "tier-6", "tier-1", "tier-2", - "tier-6", "tier-3" ] }, @@ -4599,11 +4700,11 @@ "allowed_updates": [ { "direction": "up", - "service": "startup" + "service": "hobbyist" }, { "direction": "up", - "service": "hobbyist" + "service": "startup" } ], "availability": "available", @@ -4644,8 +4745,8 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "startup", "hobbyist", + "startup", "developer" ] }, @@ -4717,13 +4818,13 @@ }, { "allowed_updates": [ - { - "direction": "up", - "service": "startup" - }, { "direction": "down", "service": "developer" + }, + { + "direction": "up", + "service": "startup" } ], "availability": "available", @@ -4776,8 +4877,8 @@ "scope": "account", "service_id": "hobbyist", "updateable_to": [ - "startup", "developer", + "startup", "hobbyist" ] }, @@ -5710,10 +5811,10 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "pro", "starter", - "business" + "business", + "free", + "pro" ], "type": "free" } @@ -5735,20 +5836,20 @@ { "allowed_updates": [ { - "direction": "up", - "service": "starter" + "direction": "any", + "service": "free" }, { "direction": "up", - "service": "pro" + "service": "business" }, { - "direction": "any", - "service": "free" + "direction": "up", + "service": "starter" }, { "direction": "up", - "service": "business" + "service": "pro" } ], "availability": "available", @@ -5778,29 +5879,29 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "starter", - "pro", "free", - "business" + "business", + "starter", + "pro" ] }, { "allowed_updates": [ { "direction": "down", - "service": "free" + "service": "starter" }, { - "direction": "down", - "service": "starter" + "direction": "any", + "service": "business" }, { "direction": "down", "service": "pro" }, { - "direction": "any", - "service": "business" + "direction": "down", + "service": "free" } ], "availability": "available", @@ -5842,29 +5943,29 @@ "scope": "account", "service_id": "business", "updateable_to": [ - "free", "starter", + "business", "pro", - "business" + "free" ] }, { "allowed_updates": [ { - "direction": "down", - "service": "free" + "direction": "up", + "service": "business" }, { - "direction": "any", - "service": "pro" + "direction": "down", + "service": "starter" }, { "direction": "down", - "service": "starter" + "service": "free" }, { - "direction": "up", - "service": "business" + "direction": "any", + "service": "pro" } ], "availability": "available", @@ -5906,29 +6007,29 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "free", - "pro", + "business", "starter", - "business" + "free", + "pro" ] }, { "allowed_updates": [ { - "direction": "any", - "service": "starter" - }, - { - "direction": "down", - "service": "free" + "direction": "up", + "service": "business" }, { "direction": "up", "service": "pro" }, { - "direction": "up", - "service": "business" + "direction": "down", + "service": "free" + }, + { + "direction": "any", + "service": "starter" } ], "availability": "available", @@ -5970,10 +6071,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "starter", - "free", + "business", "pro", - "business" + "free", + "starter" ] }, { @@ -6707,10 +6808,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2c-essentials" - }, { "direction": "any", "service": "free" @@ -6722,6 +6819,10 @@ { "direction": "any", "service": "b2b-essentials" + }, + { + "direction": "any", + "service": "b2c-essentials" } ], "availability": "available", @@ -6791,19 +6892,15 @@ "scope": "project", "service_id": "b2b-professional", "updateable_to": [ - "b2c-essentials", "free", "b2c-professional", "b2b-essentials", + "b2c-essentials", "b2b-professional" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2c-essentials" - }, { "direction": "any", "service": "free" @@ -6815,6 +6912,10 @@ { "direction": "any", "service": "b2c-professional" + }, + { + "direction": "any", + "service": "b2c-essentials" } ], "availability": "available", @@ -6884,19 +6985,15 @@ "scope": "project", "service_id": "b2b-essentials", "updateable_to": [ - "b2c-essentials", "free", "b2b-professional", "b2c-professional", + "b2c-essentials", "b2b-essentials" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2c-essentials" - }, { "direction": "any", "service": "free" @@ -6908,6 +7005,10 @@ { "direction": "any", "service": "b2b-essentials" + }, + { + "direction": "any", + "service": "b2c-essentials" } ], "availability": "available", @@ -6977,19 +7078,15 @@ "scope": "project", "service_id": "b2c-professional", "updateable_to": [ - "b2c-essentials", "free", "b2b-professional", "b2b-essentials", + "b2c-essentials", "b2c-professional" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "b2c-essentials" - }, { "direction": "any", "service": "b2b-professional" @@ -7001,6 +7098,10 @@ { "direction": "any", "service": "b2b-essentials" + }, + { + "direction": "any", + "service": "b2c-essentials" } ], "availability": "available", @@ -7058,10 +7159,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2c-essentials", "b2b-professional", "b2c-professional", "b2b-essentials", + "b2c-essentials", "free" ] }, @@ -7769,15 +7870,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" } ], "availability": "available", @@ -7821,9 +7922,9 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ + "top-up-1000", "top-up-2000", "top-up-0025", - "top-up-1000", "top-up-0500" ] }, @@ -7831,15 +7932,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" } ], "availability": "available", @@ -7883,9 +7984,9 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ + "top-up-0025", "top-up-2000", "top-up-0500", - "top-up-0025", "top-up-1000" ] }, @@ -7893,15 +7994,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-2000" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0500" } ], "availability": "available", @@ -7945,9 +8046,9 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ + "top-up-1000", "top-up-2000", "top-up-0500", - "top-up-1000", "top-up-0025" ] }, @@ -7955,15 +8056,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0500" } ], "availability": "available", @@ -8007,9 +8108,9 @@ "scope": "project", "service_id": "top-up-2000", "updateable_to": [ + "top-up-1000", "top-up-0025", "top-up-0500", - "top-up-1000", "top-up-2000" ] }, @@ -8131,10 +8232,10 @@ "type": "freeform" }, "parent_services": [ - "top-up-0025", "top-up-0500", "top-up-2000", - "top-up-1000" + "top-up-1000", + "top-up-0025" ], "type": "paid" } @@ -8710,15 +8811,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -8782,9 +8883,9 @@ "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ + "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly", "free", - "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] }, @@ -8792,15 +8893,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -8864,9 +8965,9 @@ "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ + "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", "free", - "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] }, @@ -9127,10 +9228,10 @@ "is_default": null, "paid": null, "parent_services": [ - "free", "core", "enterprise", - "scale" + "scale", + "free" ], "type": "free" } @@ -10690,10 +10791,6 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "standard" - }, { "direction": "any", "service": "free" @@ -10705,6 +10802,10 @@ { "direction": "any", "service": "api" + }, + { + "direction": "any", + "service": "standard" } ], "availability": "available", @@ -10773,10 +10874,10 @@ "scope": "project", "service_id": "growth", "updateable_to": [ - "standard", "free", "hobby", "api", + "standard", "growth" ] }, @@ -10784,19 +10885,19 @@ "allowed_updates": [ { "direction": "any", - "service": "growth" + "service": "free" }, { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", - "service": "api" + "service": "standard" } ], "availability": "available", @@ -10865,19 +10966,15 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "growth", - "standard", "free", "api", + "growth", + "standard", "hobby" ] }, { "allowed_updates": [ - { - "direction": "any", - "service": "growth" - }, { "direction": "any", "service": "free" @@ -10889,6 +10986,10 @@ { "direction": "any", "service": "api" + }, + { + "direction": "any", + "service": "growth" } ], "availability": "available", @@ -10957,10 +11058,10 @@ "scope": "project", "service_id": "standard", "updateable_to": [ - "growth", "free", "hobby", "api", + "growth", "standard" ] }, @@ -11006,19 +11107,19 @@ "allowed_updates": [ { "direction": "any", - "service": "growth" + "service": "free" }, { "direction": "any", - "service": "standard" + "service": "hobby" }, { "direction": "any", - "service": "free" + "service": "growth" }, { "direction": "any", - "service": "hobby" + "service": "standard" } ], "availability": "available", @@ -11059,9 +11160,9 @@ "type": "freeform" }, "parent_services": [ + "standard", "growth", - "hobby", - "standard" + "hobby" ], "type": "paid" } @@ -11077,10 +11178,10 @@ "scope": "project", "service_id": "api", "updateable_to": [ - "growth", - "standard", "free", "hobby", + "growth", + "standard", "api" ] }, @@ -11088,19 +11189,19 @@ "allowed_updates": [ { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", - "service": "standard" + "service": "api" }, { "direction": "any", - "service": "hobby" + "service": "growth" }, { "direction": "any", - "service": "api" + "service": "standard" } ], "availability": "available", @@ -11134,10 +11235,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "growth", - "standard", "hobby", "api", + "growth", + "standard", "free" ] }, @@ -12182,10 +12283,10 @@ "type": "freeform" }, "parent_services": [ - "25K_emails+auto-replenish", "62.5K_emails+auto-replenish", "business", - "hobbyist" + "hobbyist", + "25K_emails+auto-replenish" ], "type": "paid" } @@ -15948,15 +16049,15 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", @@ -15964,7 +16065,7 @@ }, { "direction": "any", - "service": "scaler" + "service": "pro_overages" } ], "availability": "available", @@ -16017,11 +16118,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "pro", - "pro_overages", + "scaler", "scaler_overages", + "pro", "developer_overages", - "scaler", + "pro_overages", "developer" ] }, @@ -16156,11 +16257,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", @@ -16217,8 +16318,8 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "pro", "scaler_overages", + "pro", "pro_overages", "scaler" ] @@ -16271,13 +16372,13 @@ "is_default": null, "paid": null, "parent_services": [ + "pro_overages", + "scaler", + "starter", "developer_overages", "developer", "pro", - "scaler_overages", - "pro_overages", - "scaler", - "starter" + "scaler_overages" ], "type": "free" } @@ -16300,19 +16401,19 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", - "service": "pro" + "service": "scaler" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler" + "service": "pro" } ], "availability": "available", @@ -16365,10 +16466,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "scaler_overages", - "pro", "pro_overages", "scaler", + "scaler_overages", + "pro", "developer_overages" ] }, @@ -16431,11 +16532,11 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" }, { "direction": "any", @@ -16451,7 +16552,7 @@ }, { "direction": "any", - "service": "scaler_overages" + "service": "developer" } ], "availability": "available", @@ -16492,12 +16593,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "developer", "pro_overages", + "scaler_overages", "pro", "developer_overages", "scaler", - "scaler_overages", + "developer", "starter" ] } diff --git a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt index 4253643a..d891b364 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/command-surface.txt @@ -1,9 +1,9 @@ # stripe projects command surface -# plugin-version: 0.42.0 +# plugin-version: 0.45.0 # DO NOT EDIT — regenerated by CI (mise run stripe-refresh) ===== stripe projects --help ===== -Stripe Projects (v0.42.0) +Stripe Projects (v0.45.0) Provision third-party services, manage credentials, and pull environment variables. GET STARTED @@ -129,10 +129,14 @@ Options: --preflight Check all preconditions (auth, eligibility, confirmation) without executing. Reports all blockers at once. [boolean] + --account Live-mode account to use, when the signed-in + session is authorized for more than one [string] Examples: stripe projects init Initialize a project workspace in the current directory + stripe projects init --account acct_123 Initialize using a specific + authorized account stripe projects init --mode guided Create a starter app with guided setup stripe projects init --mode template Browse starter templates directly diff --git a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt index 787ffc30..bcce5d06 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt +++ b/crates/stackless-stripe-projects/tests/fixtures/plugin-version.txt @@ -1 +1 @@ -0.42.0 +0.45.0 From aafeddf8e28a7470d5bf861e2fb1876dddcf52ab Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 29 Sep 2026 10:34:08 +0000 Subject: [PATCH 21/26] feat(integrations): register quo/app quo/app is the new deployable. Credential fields stay provisional until discover runs against a linked project. quo/starter is a paid plan and stays unregistered. --- PROVIDERS.md | 1 + .../provisional-allowlist.txt | 1 + .../src/providers/mod.rs | 4 +- .../src/providers/quo/app.rs | 128 ++++++++++++++++++ .../src/providers/quo/mod.rs | 3 + crates/stackless-integrations/src/registry.rs | 1 + scripts/generate_catalog_integrations.py | 2 + 7 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 crates/stackless-integrations/src/providers/quo/app.rs create mode 100644 crates/stackless-integrations/src/providers/quo/mod.rs diff --git a/PROVIDERS.md b/PROVIDERS.md index 309c16af..bd09a76e 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -93,6 +93,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `posthog` | `posthog/analytics` | | `prisma` | `prisma/database` | | `pydantic` | `pydantic/logfire` | +| `quo-app` | `quo/app` | | `railway-bucket` | `railway/bucket` | | `railway-hosting` | `railway/hosting` | | `railway-mongo` | `railway/mongo` | diff --git a/crates/stackless-integrations/provisional-allowlist.txt b/crates/stackless-integrations/provisional-allowlist.txt index 8b130e8f..922d58e2 100644 --- a/crates/stackless-integrations/provisional-allowlist.txt +++ b/crates/stackless-integrations/provisional-allowlist.txt @@ -11,5 +11,6 @@ athena/agents churnkey/retention herenow/hosting perplexity/api +quo/app resend/email shopify/store diff --git a/crates/stackless-integrations/src/providers/mod.rs b/crates/stackless-integrations/src/providers/mod.rs index 4d6aab64..1977e237 100644 --- a/crates/stackless-integrations/src/providers/mod.rs +++ b/crates/stackless-integrations/src/providers/mod.rs @@ -36,6 +36,7 @@ pub mod postalform; pub mod posthog; pub mod prisma; pub mod pydantic; +pub mod quo; pub mod railway; pub mod render_db; pub mod resend; @@ -64,7 +65,7 @@ mod tests { chatbase, churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, elevenlabs, exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, metronome, mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, - posthog, prisma, pydantic, railway, render_db, resend, revenuecat, runloop, schematic, + posthog, prisma, pydantic, quo, railway, render_db, resend, revenuecat, runloop, schematic, sentry, shopify, steel, supabase, supermemory, tabstack, turso, upstash, wix, wordpress_com, workos, }; @@ -131,6 +132,7 @@ mod tests { assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); + assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); diff --git a/crates/stackless-integrations/src/providers/quo/app.rs b/crates/stackless-integrations/src/providers/quo/app.rs new file mode 100644 index 00000000..8edcab39 --- /dev/null +++ b/crates/stackless-integrations/src/providers/quo/app.rs @@ -0,0 +1,128 @@ +use std::collections::BTreeMap; + +use serde::Serialize; +use stackless_stripe_projects::catalog::verify::CatalogService; +use stackless_stripe_projects::provision::ProvisionContext; + +use super::FamilyResource; +use crate::error::IntegrationError; +use crate::hostable::{ConfigScope, Hostable, IntegrationHosting}; + +pub const RESOURCE_KIND: &str = "integration-quo-app"; + +#[derive(Debug, Serialize)] +pub struct QuoAppConfig {} + +impl CatalogService for QuoAppConfig { + const REFERENCE: &'static str = "quo/app"; +} + +#[derive(Debug)] +pub struct QuoApp; + +impl Hostable for QuoApp { + const PROVIDER: &'static str = "quo-app"; + const HOSTING: IntegrationHosting = IntegrationHosting::Managed; + const CONFIG_SCOPE: ConfigScope = ConfigScope::GlobalOnly; + const RESOURCE_KIND: &'static str = RESOURCE_KIND; + const OUTPUTS: &'static [&'static str] = &["api_key"]; +} + +impl FamilyResource for QuoApp { + type Config = QuoAppConfig; + const PROVIDER_PREFIX: &'static str = "QUO"; + // Provisional until pinned by `mise run discover quo/app`. + const OUTPUT_FIELDS: &'static [(&'static str, &'static str, bool)] = + &[("API_KEY", "api_key", true)]; + + fn build_config(ctx: &ProvisionContext<'_>) -> Result { + super::integration_config(ctx)?; + Ok(QuoAppConfig {}) + } +} + +pub fn validate_config( + _name: &str, + _config: &BTreeMap, +) -> Result<(), IntegrationError> { + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ProviderOps; + use crate::resource::ResourcePayload; + use stackless_core::def::StackDef; + use stackless_stripe_projects::stripe::StripeProjects; + use stackless_stripe_projects::test_support; + + #[test] + fn config_matches_catalog() { + const FIXTURE: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../stackless-stripe-projects/tests/fixtures/catalog.json" + )); + let catalog = stackless_stripe_projects::Catalog::from_json_envelope(FIXTURE).unwrap(); + let failures = stackless_stripe_projects::verify_service(&catalog, &QuoAppConfig {}); + assert!( + failures.is_empty(), + "quo/app catalog gaps:\n{}", + failures.join("\n") + ); + } + + const CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"allowed_updates":[],"availability":"available","categories":["communications"],"configuration_schema":{},"constraints":[{"count":{"at_most":1},"type":"count"}],"created":null,"description":"Business phone numbers, calling, and messaging. Paid Starter plan with a 7-day free trial.","development":false,"group":"workspace","id":"prvsvc_61VP2qveAWh4hu16A5KvA","kind":"deployable","livemode":true,"llm_context":null,"object":"v2.provisioning.provider_service_detail","pricing":{"component":{"options":[{"is_default":null,"paid":null,"parent_services":["starter"],"type":"free"}]},"paid":null,"paid_pricing":[],"type":"component"},"provider":"prvdr_61VKP6RyKXtCSxNAo55ns","provider_configuration_schema":{},"provider_name":"Quo","scope":"project","service_id":"app","updateable_to":["app"]},{"allowed_updates":[],"availability":"available","categories":["communications"],"configuration_schema":{},"constraints":[{"count":{"at_most":1},"type":"count"}],"created":null,"description":"Starter plan for a Quo workspace","development":false,"group":"plan","id":"prvsvc_61VP2qu8TNanWtQrR5QzY","kind":"plan","livemode":true,"llm_context":null,"object":"v2.provisioning.provider_service_detail","pricing":{"component":null,"paid":{"description":null,"freeform":"$19 per seat / month, 7-day free trial","type":"freeform"},"paid_pricing":[{"configuration":null,"description":null,"freeform":"$19 per seat / month, 7-day free trial","is_default":true,"type":"freeform"}],"type":"paid"},"provider":"prvdr_61VKP6RyKXtCSxNAo55ns","provider_configuration_schema":{},"provider_name":"Quo","scope":"account","service_id":"starter","updateable_to":["starter"]}]}}"#; + + fn test_def() -> StackDef { + StackDef::parse( + r#" +[stack] +name = "atto" +[stack.projects.stripe] +project = "project_1" +[integrations.phone] +provider = "quo-app" +[services.api] +source = { repo = "r", ref = "main" } +env = { OUT = "${integrations.phone.api_key}" } +health = { path = "/health" } +[services.api.local] +run = "true" +"#, + ) + .unwrap() + } + + #[tokio::test] + async fn provision_records_outputs() { + let runner = test_support::provision_script( + CATALOG_ENVELOPE, + serde_json::json!({"QUO_API_KEY": "val_api_key"}), + 1, + ); + let dir = tempfile::tempdir().unwrap(); + std::fs::write( + dir.path().join("stackless.toml"), + "[stack]\nname=\"atto\"\n", + ) + .unwrap(); + let stripe = StripeProjects::new(&runner, dir.path()); + + let resource = QuoApp + .provision( + &stripe.as_dyn(), + &test_def(), + dir.path(), + "demo", + "phone", + "local", + false, + ) + .await + .unwrap(); + assert_eq!(resource.resource_kind, "integration-quo-app"); + let payload: ResourcePayload = serde_json::from_str(&resource.payload).unwrap(); + assert_eq!(payload.outputs["api_key"], "val_api_key"); + } +} diff --git a/crates/stackless-integrations/src/providers/quo/mod.rs b/crates/stackless-integrations/src/providers/quo/mod.rs new file mode 100644 index 00000000..4d5d9d67 --- /dev/null +++ b/crates/stackless-integrations/src/providers/quo/mod.rs @@ -0,0 +1,3 @@ +pub mod app; + +pub(crate) use crate::resource::{CatalogResource as FamilyResource, integration_config}; diff --git a/crates/stackless-integrations/src/registry.rs b/crates/stackless-integrations/src/registry.rs index 8b8e231f..ea6a00a7 100644 --- a/crates/stackless-integrations/src/registry.rs +++ b/crates/stackless-integrations/src/registry.rs @@ -117,6 +117,7 @@ register_providers! { (posthog::analytics, PostHogAnalytics), (prisma::database, PrismaDatabase), (pydantic::logfire, PydanticLogfire), + (quo::app, QuoApp), (railway::bucket, RailwayBucket), (railway::hosting, RailwayHosting), (railway::mongo, RailwayMongo), diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index a8c939df..51ec6433 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -125,6 +125,7 @@ "sentry/seer": "sentry-seer", "render/postgres": "render-postgres", "resend/email": "resend", + "quo/app": "quo-app", "railway/hosting": "railway-hosting", "railway/postgres": "railway-postgres", "railway/redis": "railway-redis", @@ -255,6 +256,7 @@ "supermemory/memory": [("API_KEY", "api_key", True)], "render/postgres": [("DATABASE_URL", "database_url", True)], "resend/email": [("API_KEY", "api_key", True)], + "quo/app": [("API_KEY", "api_key", True)], "flyio/mpg": [("DATABASE_URL", "database_url", True)], "flyio/sprite": [("SPRITE_URL", "sprite_url", True)], } From 2f493fa32df4eb8a4889e1eb5904da976031b5a2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 29 Sep 2026 10:34:08 +0000 Subject: [PATCH 22/26] chore(stripe-projects): pin STRIPE_PROJECTS_PINNED to 0.45.0 Doctor compares the installed plugin with this constant. --- crates/stackless/src/authoring.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/stackless/src/authoring.rs b/crates/stackless/src/authoring.rs index 99b3240a..14b39360 100644 --- a/crates/stackless/src/authoring.rs +++ b/crates/stackless/src/authoring.rs @@ -8,7 +8,7 @@ use stackless_core::types::DnsName; use crate::error::Error; /// The Stripe Projects plugin version stackless is tested against. -pub const STRIPE_PROJECTS_PINNED: &str = "0.42.0"; +pub const STRIPE_PROJECTS_PINNED: &str = "0.45.0"; pub fn default_output_path() -> PathBuf { PathBuf::from("stackless.toml") From 36b00e5e36edffb4fb67fd364b1bba8cb9991b61 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 30 Sep 2026 10:56:39 +0000 Subject: [PATCH 23/26] chore(stripe-projects): bless squarespace/website into the 0.45.0 catalog The live catalog adds one deployable. mise run stripe-refresh rewrote catalog.json after drift_report came back empty. --- .../tests/fixtures/catalog.json | 991 ++++++++++-------- 1 file changed, 544 insertions(+), 447 deletions(-) diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index 6eed51b0..bd4957b1 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -6,6 +6,103 @@ "provider": null, "provider_filter": null, "services": [ + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "ecommerce" + ], + "configuration_schema": {}, + "constraints": [], + "created": null, + "description": "Subscribe to a Squarespace website — hosting, professional templates, unlimited pages, SEO tools, and integrated commerce. Pick a plan and billing term when you provision. See https://www.squarespace.com/pricing", + "development": false, + "group": null, + "id": "prvsvc_61VUQiD3p5cKuX93B53eC", + "kind": "deployable", + "livemode": true, + "llm_context": "https://production.squarespace.thisdotstripeapps.com/stripe/provisioning/llm/website", + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": { + "description": "Templates, unlimited pages, SEO, and a standard online store", + "freeform": "USD 220.80 / year", + "type": "freeform" + }, + "paid_pricing": [ + { + "configuration": { + "plan": "CORE", + "term": "ANNUAL" + }, + "description": "Templates, unlimited pages, SEO, and a standard online store", + "freeform": "USD 220.80 / year", + "is_default": true, + "type": "freeform" + }, + { + "configuration": { + "plan": "CORE", + "term": "MONTHLY" + }, + "description": "Templates, unlimited pages, SEO, and a standard online store", + "freeform": "USD 28.80 / month", + "is_default": false, + "type": "freeform" + }, + { + "configuration": { + "plan": "PLUS", + "term": "ANNUAL" + }, + "description": "Adds commerce — subscriptions, advanced discounts, and video", + "freeform": "USD 374.40 / year", + "is_default": false, + "type": "freeform" + }, + { + "configuration": { + "plan": "PLUS", + "term": "MONTHLY" + }, + "description": "Adds commerce — subscriptions, advanced discounts, and video", + "freeform": "USD 44.80 / month", + "is_default": false, + "type": "freeform" + }, + { + "configuration": { + "plan": "ADVANCED", + "term": "ANNUAL" + }, + "description": "Adds point of sale, top AI credits, and premium integrations", + "freeform": "USD 950.40 / year", + "is_default": false, + "type": "freeform" + }, + { + "configuration": { + "plan": "ADVANCED", + "term": "MONTHLY" + }, + "description": "Adds point of sale, top AI credits, and premium integrations", + "freeform": "USD 111.20 / month", + "is_default": false, + "type": "freeform" + } + ], + "type": "paid" + }, + "provider": "prvdr_61UacoeBnJSHilBZJ5FIm", + "provider_configuration_schema": {}, + "provider_name": "Squarespace", + "scope": "project", + "service_id": "website", + "updateable_to": [ + "website" + ] + }, { "allowed_updates": [], "availability": "available", @@ -422,15 +519,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -471,15 +568,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -550,8 +647,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "free" + "free", + "pro" ], "type": "free" } @@ -583,15 +680,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -669,8 +766,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "developer" + "developer", + "hobby" ], "type": "free" } @@ -702,15 +799,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -861,15 +958,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1005,15 +1102,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1138,15 +1235,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1190,15 +1287,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1317,8 +1414,8 @@ "is_default": true, "paid": null, "parent_services": [ - "schematic-growth", - "schematic-free" + "schematic-free", + "schematic-growth" ], "type": "free" } @@ -1513,15 +1610,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1839,11 +1936,11 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "pro-monthly" }, { "direction": "any", - "service": "pro-monthly" + "service": "beginner-monthly" }, { "direction": "any", @@ -1889,8 +1986,8 @@ "scope": "account", "service_id": "enterprise-monthly", "updateable_to": [ - "beginner-monthly", "pro-monthly", + "beginner-monthly", "free", "enterprise-monthly" ] @@ -1903,11 +2000,11 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" } ], "availability": "available", @@ -1950,8 +2047,8 @@ "service_id": "beginner-monthly", "updateable_to": [ "pro-monthly", - "enterprise-monthly", "free", + "enterprise-monthly", "beginner-monthly" ] }, @@ -1963,11 +2060,11 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "enterprise-monthly" } ], "availability": "available", @@ -2010,8 +2107,8 @@ "service_id": "pro-monthly", "updateable_to": [ "beginner-monthly", - "enterprise-monthly", "free", + "enterprise-monthly", "pro-monthly" ] }, @@ -2023,11 +2120,11 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" }, { "direction": "any", - "service": "beginner-monthly" + "service": "enterprise-monthly" } ], "availability": "available", @@ -2058,8 +2155,8 @@ "service_id": "free", "updateable_to": [ "pro-monthly", - "enterprise-monthly", "beginner-monthly", + "enterprise-monthly", "free" ] }, @@ -2087,10 +2184,10 @@ "is_default": null, "paid": null, "parent_services": [ - "enterprise-monthly", - "beginner-monthly", + "pro-monthly", "free", - "pro-monthly" + "beginner-monthly", + "enterprise-monthly" ], "type": "free" } @@ -2139,15 +2236,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2231,15 +2328,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2291,11 +2388,11 @@ "allowed_updates": [ { "direction": "down", - "service": "hobby" + "service": "standard" }, { "direction": "down", - "service": "standard" + "service": "hobby" } ], "availability": "available", @@ -2304,15 +2401,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2351,8 +2448,8 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "hobby", "standard", + "hobby", "pro" ] }, @@ -2391,8 +2488,8 @@ "is_default": null, "paid": null, "parent_services": [ - "standard", "pro", + "standard", "hobby" ], "type": "free" @@ -2442,15 +2539,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2496,13 +2593,13 @@ }, { "allowed_updates": [ - { - "direction": "down", - "service": "hobby" - }, { "direction": "up", "service": "pro" + }, + { + "direction": "down", + "service": "hobby" } ], "availability": "available", @@ -2511,15 +2608,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2558,8 +2655,8 @@ "scope": "account", "service_id": "standard", "updateable_to": [ - "hobby", "pro", + "hobby", "standard" ] }, @@ -2582,15 +2679,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2660,8 +2757,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer-plan", - "startup-plan" + "startup-plan", + "developer-plan" ], "type": "free" } @@ -2699,15 +2796,15 @@ "type": "object" }, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2945,15 +3042,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3007,15 +3104,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3759,11 +3856,11 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-2" + "service": "tier-6" }, { "direction": "up", - "service": "tier-3" + "service": "tier-5" }, { "direction": "up", @@ -3771,11 +3868,11 @@ }, { "direction": "up", - "service": "tier-5" + "service": "tier-3" }, { "direction": "up", - "service": "tier-6" + "service": "tier-2" } ], "availability": "available", @@ -3823,11 +3920,11 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-2", - "tier-3", - "tier-4", - "tier-5", "tier-6", + "tier-5", + "tier-4", + "tier-3", + "tier-2", "tier-1" ] }, @@ -3835,15 +3932,15 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-5" + "service": "tier-6" }, { "direction": "up", - "service": "tier-6" + "service": "tier-5" }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" }, { "direction": "down", @@ -3851,7 +3948,7 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" } ], "availability": "available", @@ -3899,27 +3996,27 @@ "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-5", "tier-6", - "tier-1", - "tier-2", + "tier-5", "tier-3", + "tier-2", + "tier-1", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "tier-4" - }, { "direction": "up", "service": "tier-6" }, { "direction": "down", - "service": "tier-1" + "service": "tier-4" + }, + { + "direction": "down", + "service": "tier-3" }, { "direction": "down", @@ -3927,7 +4024,7 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" } ], "availability": "available", @@ -3975,11 +4072,11 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-4", "tier-6", - "tier-1", - "tier-2", + "tier-4", "tier-3", + "tier-2", + "tier-1", "tier-5" ] }, @@ -3987,19 +4084,19 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-3" + "service": "tier-6" }, { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { "direction": "up", - "service": "tier-6" + "service": "tier-3" }, { "direction": "down", @@ -4051,10 +4148,10 @@ "scope": "account", "service_id": "tier-2", "updateable_to": [ - "tier-3", - "tier-4", - "tier-5", "tier-6", + "tier-5", + "tier-4", + "tier-3", "tier-1", "tier-2" ] @@ -4063,15 +4160,15 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-4" + "service": "tier-5" }, { "direction": "down", - "service": "tier-5" + "service": "tier-4" }, { "direction": "down", - "service": "tier-1" + "service": "tier-3" }, { "direction": "down", @@ -4079,7 +4176,7 @@ }, { "direction": "down", - "service": "tier-3" + "service": "tier-1" } ], "availability": "available", @@ -4127,11 +4224,11 @@ "scope": "account", "service_id": "tier-6", "updateable_to": [ - "tier-4", "tier-5", - "tier-1", - "tier-2", + "tier-4", "tier-3", + "tier-2", + "tier-1", "tier-6" ] }, @@ -4139,7 +4236,7 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-4" + "service": "tier-6" }, { "direction": "up", @@ -4147,15 +4244,15 @@ }, { "direction": "up", - "service": "tier-6" + "service": "tier-4" }, { "direction": "down", - "service": "tier-1" + "service": "tier-2" }, { "direction": "down", - "service": "tier-2" + "service": "tier-1" } ], "availability": "available", @@ -4203,11 +4300,11 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-4", - "tier-5", "tier-6", - "tier-1", + "tier-5", + "tier-4", "tier-2", + "tier-1", "tier-3" ] }, @@ -4427,15 +4524,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4488,15 +4585,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4675,8 +4772,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", "startup", + "developer", "hobbyist" ], "type": "free" @@ -4700,11 +4797,11 @@ "allowed_updates": [ { "direction": "up", - "service": "hobbyist" + "service": "startup" }, { "direction": "up", - "service": "startup" + "service": "hobbyist" } ], "availability": "available", @@ -4713,15 +4810,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4745,8 +4842,8 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "hobbyist", "startup", + "hobbyist", "developer" ] }, @@ -4754,11 +4851,11 @@ "allowed_updates": [ { "direction": "down", - "service": "hobbyist" + "service": "developer" }, { "direction": "down", - "service": "developer" + "service": "hobbyist" } ], "availability": "available", @@ -4767,15 +4864,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4811,20 +4908,20 @@ "scope": "account", "service_id": "startup", "updateable_to": [ - "hobbyist", "developer", + "hobbyist", "startup" ] }, { "allowed_updates": [ - { - "direction": "down", - "service": "developer" - }, { "direction": "up", "service": "startup" + }, + { + "direction": "down", + "service": "developer" } ], "availability": "available", @@ -4833,15 +4930,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4877,8 +4974,8 @@ "scope": "account", "service_id": "hobbyist", "updateable_to": [ - "developer", "startup", + "developer", "hobbyist" ] }, @@ -5300,8 +5397,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5402,8 +5499,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5485,8 +5582,8 @@ "type": "freeform" }, "parent_services": [ - "growth", - "starter" + "starter", + "growth" ], "type": "paid" } @@ -5811,10 +5908,10 @@ "is_default": null, "paid": null, "parent_services": [ - "starter", - "business", + "pro", "free", - "pro" + "business", + "starter" ], "type": "free" } @@ -5841,11 +5938,11 @@ }, { "direction": "up", - "service": "business" + "service": "starter" }, { "direction": "up", - "service": "starter" + "service": "business" }, { "direction": "up", @@ -5880,8 +5977,8 @@ "service_id": "free", "updateable_to": [ "free", - "business", "starter", + "business", "pro" ] }, @@ -5889,19 +5986,19 @@ "allowed_updates": [ { "direction": "down", - "service": "starter" - }, - { - "direction": "any", - "service": "business" + "service": "free" }, { "direction": "down", "service": "pro" }, + { + "direction": "any", + "service": "business" + }, { "direction": "down", - "service": "free" + "service": "starter" } ], "availability": "available", @@ -5943,29 +6040,29 @@ "scope": "account", "service_id": "business", "updateable_to": [ - "starter", - "business", + "free", "pro", - "free" + "business", + "starter" ] }, { "allowed_updates": [ { - "direction": "up", - "service": "business" + "direction": "any", + "service": "pro" }, { "direction": "down", - "service": "starter" + "service": "free" }, { - "direction": "down", - "service": "free" + "direction": "up", + "service": "business" }, { - "direction": "any", - "service": "pro" + "direction": "down", + "service": "starter" } ], "availability": "available", @@ -6007,29 +6104,29 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "business", - "starter", + "pro", "free", - "pro" + "business", + "starter" ] }, { "allowed_updates": [ { "direction": "up", - "service": "business" + "service": "pro" }, { - "direction": "up", - "service": "pro" + "direction": "any", + "service": "starter" }, { "direction": "down", "service": "free" }, { - "direction": "any", - "service": "starter" + "direction": "up", + "service": "business" } ], "availability": "available", @@ -6071,10 +6168,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "business", "pro", + "starter", "free", - "starter" + "business" ] }, { @@ -6309,8 +6406,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", "startup", + "developer", "free" ], "type": "free" @@ -6814,7 +6911,7 @@ }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" }, { "direction": "any", @@ -6822,7 +6919,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" } ], "availability": "available", @@ -6893,9 +6990,9 @@ "service_id": "b2b-professional", "updateable_to": [ "free", - "b2c-professional", - "b2b-essentials", "b2c-essentials", + "b2b-essentials", + "b2c-professional", "b2b-professional" ] }, @@ -6907,7 +7004,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" }, { "direction": "any", @@ -6915,7 +7012,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -6986,9 +7083,9 @@ "service_id": "b2b-essentials", "updateable_to": [ "free", - "b2b-professional", - "b2c-professional", "b2c-essentials", + "b2c-professional", + "b2b-professional", "b2b-essentials" ] }, @@ -7000,7 +7097,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" }, { "direction": "any", @@ -7008,7 +7105,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -7079,9 +7176,9 @@ "service_id": "b2c-professional", "updateable_to": [ "free", - "b2b-professional", - "b2b-essentials", "b2c-essentials", + "b2b-essentials", + "b2b-professional", "b2c-professional" ] }, @@ -7089,19 +7186,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -7159,10 +7256,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2b-professional", - "b2c-professional", - "b2b-essentials", "b2c-essentials", + "b2b-essentials", + "b2c-professional", + "b2b-professional", "free" ] }, @@ -7174,7 +7271,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2b-essentials" }, { "direction": "any", @@ -7182,7 +7279,7 @@ }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2b-professional" } ], "availability": "available", @@ -7253,9 +7350,9 @@ "service_id": "b2c-essentials", "updateable_to": [ "free", - "b2b-professional", - "b2c-professional", "b2b-essentials", + "b2c-professional", + "b2b-professional", "b2c-essentials" ] }, @@ -7870,15 +7967,15 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" } ], "availability": "available", @@ -7922,9 +8019,9 @@ "scope": "project", "service_id": "top-up-0500", "updateable_to": [ - "top-up-1000", "top-up-2000", "top-up-0025", + "top-up-1000", "top-up-0500" ] }, @@ -7932,11 +8029,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-0025" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-0025" }, { "direction": "any", @@ -7984,8 +8081,8 @@ "scope": "project", "service_id": "top-up-1000", "updateable_to": [ - "top-up-0025", "top-up-2000", + "top-up-0025", "top-up-0500", "top-up-1000" ] @@ -7994,11 +8091,11 @@ "allowed_updates": [ { "direction": "any", - "service": "top-up-1000" + "service": "top-up-2000" }, { "direction": "any", - "service": "top-up-2000" + "service": "top-up-1000" }, { "direction": "any", @@ -8046,8 +8143,8 @@ "scope": "project", "service_id": "top-up-0025", "updateable_to": [ - "top-up-1000", "top-up-2000", + "top-up-1000", "top-up-0500", "top-up-0025" ] @@ -8232,10 +8329,10 @@ "type": "freeform" }, "parent_services": [ - "top-up-0500", - "top-up-2000", + "top-up-0025", "top-up-1000", - "top-up-0025" + "top-up-2000", + "top-up-0500" ], "type": "paid" } @@ -8258,11 +8355,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "team" }, { "direction": "any", - "service": "team" + "service": "free" } ], "availability": "available", @@ -8306,8 +8403,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "free", "team", + "free", "pro" ] }, @@ -8315,11 +8412,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "free" } ], "availability": "available", @@ -8363,8 +8460,8 @@ "scope": "project", "service_id": "team", "updateable_to": [ - "free", "pro", + "free", "team" ] }, @@ -8811,11 +8908,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", @@ -8883,8 +8980,8 @@ "scope": "project", "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ - "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly", + "plus-v3-50k-mtu-monthly", "free", "plus-v3-10k-mtu-monthly" ] @@ -8975,11 +9072,11 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", @@ -9047,8 +9144,8 @@ "scope": "project", "service_id": "plus-v3-50k-mtu-monthly", "updateable_to": [ - "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "free", "plus-v3-50k-mtu-monthly" ] @@ -9228,10 +9325,10 @@ "is_default": null, "paid": null, "parent_services": [ - "core", - "enterprise", + "free", "scale", - "free" + "enterprise", + "core" ], "type": "free" } @@ -9266,11 +9363,11 @@ "allowed_updates": [ { "direction": "any", - "service": "startup" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "startup" } ], "availability": "available", @@ -9314,8 +9411,8 @@ "scope": "project", "service_id": "developer", "updateable_to": [ - "startup", "free", + "startup", "developer" ] }, @@ -9323,11 +9420,11 @@ "allowed_updates": [ { "direction": "any", - "service": "developer" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "developer" } ], "availability": "available", @@ -9371,8 +9468,8 @@ "scope": "project", "service_id": "startup", "updateable_to": [ - "developer", "free", + "developer", "startup" ] }, @@ -9624,11 +9721,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "launch" }, { "direction": "any", - "service": "launch" + "service": "free" } ], "availability": "available", @@ -9670,19 +9767,19 @@ "scope": "project", "service_id": "launch", "updateable_to": [ - "free", - "launch" + "launch", + "free" ] }, { "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "launch" }, { "direction": "any", - "service": "launch" + "service": "free" } ], "availability": "available", @@ -9712,8 +9809,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "free", - "launch" + "launch", + "free" ] }, { @@ -9757,8 +9854,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -9781,11 +9878,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -9815,8 +9912,8 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { @@ -9921,8 +10018,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "team" + "team", + "pro" ], "type": "paid" } @@ -9945,11 +10042,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10002,8 +10099,8 @@ "scope": "project", "service_id": "workers-ai", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "workers-ai" ] }, @@ -10011,11 +10108,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10072,8 +10169,8 @@ "scope": "project", "service_id": "browser-run", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "browser-run" ] }, @@ -10081,11 +10178,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10227,8 +10324,8 @@ "scope": "project", "service_id": "hyperdrive", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "hyperdrive" ] }, @@ -10236,11 +10333,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10306,8 +10403,8 @@ "scope": "project", "service_id": "kv", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "kv" ] }, @@ -10315,11 +10412,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10397,8 +10494,8 @@ "scope": "project", "service_id": "d1", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "d1" ] }, @@ -10406,11 +10503,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10476,8 +10573,8 @@ "scope": "project", "service_id": "queues", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "queues" ] }, @@ -10485,11 +10582,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -10538,8 +10635,8 @@ "scope": "project", "service_id": "containers", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "containers" ] }, @@ -10578,11 +10675,11 @@ "is_default": null, "paid": null, "parent_services": [ - "b2c-professional", - "free", - "b2c-essentials", + "b2b-professional", "b2b-essentials", - "b2b-professional" + "b2c-essentials", + "free", + "b2c-professional" ], "type": "free" } @@ -10797,15 +10894,15 @@ }, { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "standard" + "service": "api" } ], "availability": "available", @@ -10875,9 +10972,9 @@ "service_id": "growth", "updateable_to": [ "free", + "standard", "hobby", "api", - "standard", "growth" ] }, @@ -10889,7 +10986,7 @@ }, { "direction": "any", - "service": "api" + "service": "standard" }, { "direction": "any", @@ -10897,7 +10994,7 @@ }, { "direction": "any", - "service": "standard" + "service": "api" } ], "availability": "available", @@ -10967,9 +11064,9 @@ "service_id": "hobby", "updateable_to": [ "free", - "api", - "growth", "standard", + "growth", + "api", "hobby" ] }, @@ -10981,15 +11078,15 @@ }, { "direction": "any", - "service": "hobby" + "service": "growth" }, { "direction": "any", - "service": "api" + "service": "hobby" }, { "direction": "any", - "service": "growth" + "service": "api" } ], "availability": "available", @@ -11059,9 +11156,9 @@ "service_id": "standard", "updateable_to": [ "free", + "growth", "hobby", "api", - "growth", "standard" ] }, @@ -11111,7 +11208,7 @@ }, { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", @@ -11119,7 +11216,7 @@ }, { "direction": "any", - "service": "standard" + "service": "hobby" } ], "availability": "available", @@ -11160,8 +11257,8 @@ "type": "freeform" }, "parent_services": [ - "standard", "growth", + "standard", "hobby" ], "type": "paid" @@ -11179,9 +11276,9 @@ "service_id": "api", "updateable_to": [ "free", - "hobby", - "growth", "standard", + "growth", + "hobby", "api" ] }, @@ -11189,19 +11286,19 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "standard" }, { "direction": "any", - "service": "api" + "service": "growth" }, { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", - "service": "standard" + "service": "api" } ], "availability": "available", @@ -11235,10 +11332,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ + "standard", + "growth", "hobby", "api", - "growth", - "standard", "free" ] }, @@ -11346,11 +11443,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -11380,19 +11477,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -11434,8 +11531,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { @@ -11497,19 +11594,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" } ], "availability": "available", @@ -11608,10 +11705,10 @@ "scope": "project", "service_id": "analytics", "updateable_to": [ - "free", - "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-50k-mtu-monthly", + "free", "analytics" ] }, @@ -11619,15 +11716,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-25k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-25k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -11679,9 +11776,9 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "plus-v3-10k-mtu-monthly", "plus-v3-25k-mtu-monthly", "plus-v3-50k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "free" ] }, @@ -12283,10 +12380,10 @@ "type": "freeform" }, "parent_services": [ - "62.5K_emails+auto-replenish", - "business", + "25K_emails+auto-replenish", "hobbyist", - "25K_emails+auto-replenish" + "business", + "62.5K_emails+auto-replenish" ], "type": "paid" } @@ -12364,11 +12461,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -12410,19 +12507,19 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "hobby", - "pro" + "pro", + "hobby" ] }, { "allowed_updates": [ { "direction": "any", - "service": "workers:paid" + "service": "workers:free" }, { "direction": "any", - "service": "workers:free" + "service": "workers:paid" } ], "availability": "available", @@ -12479,8 +12576,8 @@ "scope": "project", "service_id": "workers", "updateable_to": [ - "workers:paid", "workers:free", + "workers:paid", "workers" ] }, @@ -12585,8 +12682,8 @@ "is_default": null, "paid": null, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "free" } @@ -15568,8 +15665,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15633,8 +15730,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15657,11 +15754,11 @@ "allowed_updates": [ { "direction": "any", - "service": "hobby" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "hobby" } ], "availability": "available", @@ -15694,8 +15791,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "hobby", "pro", + "hobby", "free" ] }, @@ -15743,8 +15840,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15802,8 +15899,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -15866,8 +15963,8 @@ "type": "freeform" }, "parent_services": [ - "hobby", - "pro" + "pro", + "hobby" ], "type": "paid" } @@ -16047,17 +16144,13 @@ }, { "allowed_updates": [ - { - "direction": "any", - "service": "scaler" - }, { "direction": "any", "service": "scaler_overages" }, { "direction": "any", - "service": "pro" + "service": "scaler" }, { "direction": "any", @@ -16066,6 +16159,10 @@ { "direction": "any", "service": "pro_overages" + }, + { + "direction": "any", + "service": "pro" } ], "availability": "available", @@ -16074,15 +16171,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16118,11 +16215,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "scaler", "scaler_overages", - "pro", + "scaler", "developer_overages", "pro_overages", + "pro", "developer" ] }, @@ -16130,11 +16227,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" } ], "availability": "available", @@ -16143,15 +16240,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16187,8 +16284,8 @@ "scope": "account", "service_id": "scaler_overages", "updateable_to": [ - "pro_overages", "pro", + "pro_overages", "scaler_overages" ] }, @@ -16205,15 +16302,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16261,11 +16358,11 @@ }, { "direction": "any", - "service": "pro" + "service": "pro_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" } ], "availability": "available", @@ -16274,15 +16371,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16319,8 +16416,8 @@ "service_id": "scaler", "updateable_to": [ "scaler_overages", - "pro", "pro_overages", + "pro", "scaler" ] }, @@ -16372,13 +16469,13 @@ "is_default": null, "paid": null, "parent_services": [ - "pro_overages", - "scaler", - "starter", - "developer_overages", - "developer", + "scaler_overages", "pro", - "scaler_overages" + "developer", + "developer_overages", + "starter", + "scaler", + "pro_overages" ], "type": "free" } @@ -16401,19 +16498,19 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "scaler_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro" + "service": "pro_overages" } ], "availability": "available", @@ -16422,15 +16519,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16466,10 +16563,10 @@ "scope": "account", "service_id": "developer_overages", "updateable_to": [ - "pro_overages", - "scaler", - "scaler_overages", "pro", + "scaler_overages", + "scaler", + "pro_overages", "developer_overages" ] }, @@ -16481,15 +16578,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16532,19 +16629,19 @@ "allowed_updates": [ { "direction": "any", - "service": "pro_overages" + "service": "developer_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", - "service": "pro" + "service": "developer" }, { "direction": "any", - "service": "developer_overages" + "service": "scaler_overages" }, { "direction": "any", @@ -16552,7 +16649,7 @@ }, { "direction": "any", - "service": "developer" + "service": "pro_overages" } ], "availability": "available", @@ -16561,15 +16658,15 @@ ], "configuration_schema": {}, "constraints": [ - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" - }, { "count": { "at_most": 1 }, "type": "count" + }, + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16593,12 +16690,12 @@ "scope": "account", "service_id": "starter", "updateable_to": [ - "pro_overages", - "scaler_overages", - "pro", "developer_overages", - "scaler", + "pro", "developer", + "scaler_overages", + "scaler", + "pro_overages", "starter" ] } From 61736cc89e501de35e5c030bf80503462fa94d03 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 30 Sep 2026 10:56:41 +0000 Subject: [PATCH 24/26] chore(integrations): exclude squarespace/website from catalog ownership Provision pauses on needs_information to buy a domain. That purchase stays out of the leased lifecycle, so the service is EXCL rather than a CatalogResource. --- docs/ADDING-A-PROVIDER.md | 6 ++++-- scripts/generate_catalog_integrations.py | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/ADDING-A-PROVIDER.md b/docs/ADDING-A-PROVIDER.md index 62e00a5a..42f07b0f 100644 --- a/docs/ADDING-A-PROVIDER.md +++ b/docs/ADDING-A-PROVIDER.md @@ -186,8 +186,10 @@ fixture dir (see "One-time setup" above) — the smoke fails at the first `mise run catalog-orphans` (also part of `mise run check`) fails on new unowned deployables. Current exclusions: - `cloudflare/containers` — `PRICE_CONFIRMATION_REQUIRED` / unknown cost - - `cloudflare/registrar:domain`, `squarespace/domain`, `wordpress.com/domain`, - `spaceship/domain` — non-refundable domain purchases + - `cloudflare/registrar:domain`, `squarespace/domain`, `squarespace/website`, + `wordpress.com/domain`, `spaceship/domain` — non-refundable domain purchases. + `squarespace/website` is the subscription, and its provision still pauses to + buy a domain (`needs_information`), which this lifecycle does not handle - `createos/project` — catalog orphan; no stackless surface (do not register) - External pin blockers below (unregistered so users cannot select them) diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index 51ec6433..2e6b2e5a 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -29,6 +29,10 @@ "squarespace/domain": ( "Non-refundable domain purchase; never in the leased lifecycle" ), + "squarespace/website": ( + "Provision pauses on needs_information to buy a domain; " + "non-refundable domain purchases stay out of the leased lifecycle" + ), "wordpress.com/domain": ( "Non-refundable domain purchase; never in the leased lifecycle" ), From 92ee7495391005fca5f16a610c6774494cbcd186 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 1 Oct 2026 10:27:25 +0000 Subject: [PATCH 25/26] feat(stripe-projects): model the media catalog category Category::Media matches the wire value media. The fallback filter list includes media so an empty unfiltered catalog still requests that category. --- crates/stackless-stripe-projects/src/catalog.rs | 1 + crates/stackless-stripe-projects/src/stripe.rs | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/crates/stackless-stripe-projects/src/catalog.rs b/crates/stackless-stripe-projects/src/catalog.rs index 530aa7ef..f78d934c 100644 --- a/crates/stackless-stripe-projects/src/catalog.rs +++ b/crates/stackless-stripe-projects/src/catalog.rs @@ -283,6 +283,7 @@ pub enum Category { Ecommerce, Email, FeatureFlags, + Media, Messaging, Notification, Observability, diff --git a/crates/stackless-stripe-projects/src/stripe.rs b/crates/stackless-stripe-projects/src/stripe.rs index 0ece664c..99305db5 100644 --- a/crates/stackless-stripe-projects/src/stripe.rs +++ b/crates/stackless-stripe-projects/src/stripe.rs @@ -32,6 +32,7 @@ const CATALOG_CATEGORY_FILTERS: &[&str] = &[ "ecommerce", "email", "feature_flags", + "media", "messaging", "notification", "observability", @@ -868,6 +869,13 @@ mod tests { assert!(catalog.category_filter.is_none()); } + #[test] + fn media_category_is_a_fallback_filter() { + assert!(CATALOG_CATEGORY_FILTERS.contains(&"media")); + let category: crate::catalog::Category = serde_json::from_str("\"media\"").unwrap(); + assert_eq!(category, crate::catalog::Category::Media); + } + #[tokio::test] async fn unauthenticated_envelope_is_auth_fault() { let d = driver(vec![out( From 7134a05ef7202a72d696b51ecec7a3ddb0e7e040 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 1 Oct 2026 10:27:27 +0000 Subject: [PATCH 26/26] feat(integrations): register cloudinary/media The blessed 0.45.0 catalog includes cloudinary/media. OUTPUT_FIELDS stays provisional until discover pins the credential names. The cloudinary/free plan stays unregistered. --- PROVIDERS.md | 1 + .../provisional-allowlist.txt | 1 + .../src/providers/cloudinary/media.rs | 129 +++ .../src/providers/cloudinary/mod.rs | 3 + .../src/providers/mod.rs | 14 +- crates/stackless-integrations/src/registry.rs | 1 + .../tests/fixtures/catalog.json | 949 ++++++++++-------- scripts/generate_catalog_integrations.py | 2 + 8 files changed, 666 insertions(+), 434 deletions(-) create mode 100644 crates/stackless-integrations/src/providers/cloudinary/media.rs create mode 100644 crates/stackless-integrations/src/providers/cloudinary/mod.rs diff --git a/PROVIDERS.md b/PROVIDERS.md index bd09a76e..5df44248 100644 --- a/PROVIDERS.md +++ b/PROVIDERS.md @@ -64,6 +64,7 @@ Stripe Projects catalog reference. Offline catalog detail: | `cloudflare-r2` | `cloudflare/r2:bucket` | | `cloudflare-workers` | `cloudflare/workers` | | `cloudflare-workers-ai` | `cloudflare/workers-ai` | +| `cloudinary` | `cloudinary/media` | | `composio` | `composio/project` | | `customerio` | `customerio/workspace` | | `datadog-observability` | `datadog/observability` | diff --git a/crates/stackless-integrations/provisional-allowlist.txt b/crates/stackless-integrations/provisional-allowlist.txt index 922d58e2..5636b33b 100644 --- a/crates/stackless-integrations/provisional-allowlist.txt +++ b/crates/stackless-integrations/provisional-allowlist.txt @@ -9,6 +9,7 @@ # § External pin blockers. Those files are not scanned here. athena/agents churnkey/retention +cloudinary/media herenow/hosting perplexity/api quo/app diff --git a/crates/stackless-integrations/src/providers/cloudinary/media.rs b/crates/stackless-integrations/src/providers/cloudinary/media.rs new file mode 100644 index 00000000..ed081254 --- /dev/null +++ b/crates/stackless-integrations/src/providers/cloudinary/media.rs @@ -0,0 +1,129 @@ +use std::collections::BTreeMap; + +use serde::Serialize; +use stackless_stripe_projects::catalog::verify::CatalogService; +use stackless_stripe_projects::provision::ProvisionContext; + +use super::FamilyResource; +use crate::error::IntegrationError; +use crate::hostable::{ConfigScope, Hostable, IntegrationHosting}; + +pub const RESOURCE_KIND: &str = "integration-cloudinary"; + +#[derive(Debug, Serialize)] +pub struct CloudinaryMediaConfig {} + +impl CatalogService for CloudinaryMediaConfig { + const REFERENCE: &'static str = "cloudinary/media"; +} + +#[derive(Debug)] +pub struct CloudinaryMedia; + +impl Hostable for CloudinaryMedia { + const PROVIDER: &'static str = "cloudinary"; + const HOSTING: IntegrationHosting = IntegrationHosting::Managed; + const CONFIG_SCOPE: ConfigScope = ConfigScope::GlobalOnly; + const RESOURCE_KIND: &'static str = RESOURCE_KIND; + const OUTPUTS: &'static [&'static str] = &["api_key"]; +} + +impl FamilyResource for CloudinaryMedia { + type Config = CloudinaryMediaConfig; + const PROVIDER_PREFIX: &'static str = "CLOUDINARY"; + // Provisional until pinned by `mise run discover cloudinary/media`. + const OUTPUT_FIELDS: &'static [(&'static str, &'static str, bool)] = + &[("API_KEY", "api_key", true)]; + + fn build_config(ctx: &ProvisionContext<'_>) -> Result { + super::integration_config(ctx)?; + Ok(CloudinaryMediaConfig {}) + } +} + +pub fn validate_config( + _name: &str, + _config: &BTreeMap, +) -> Result<(), IntegrationError> { + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::ProviderOps; + use crate::resource::ResourcePayload; + use stackless_core::def::StackDef; + use stackless_stripe_projects::stripe::StripeProjects; + use stackless_stripe_projects::test_support; + + #[test] + fn config_matches_catalog() { + const FIXTURE: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../stackless-stripe-projects/tests/fixtures/catalog.json" + )); + let catalog = stackless_stripe_projects::Catalog::from_json_envelope(FIXTURE).unwrap(); + let failures = + stackless_stripe_projects::verify_service(&catalog, &CloudinaryMediaConfig {}); + assert!( + failures.is_empty(), + "cloudinary/media catalog gaps:\n{}", + failures.join("\n") + ); + } + + const CATALOG_ENVELOPE: &str = r#"{"ok":true,"command":"projects catalog","data":{"last_updated":"2026-07-11T00:00:00Z","services":[{"allowed_updates":[],"availability":"available","categories":["media","storage","cdn"],"configuration_schema":{},"constraints":[{"count":{"at_most":1},"type":"count"}],"created":null,"description":"Cloudinary product environment — upload, transform, and deliver images and video","development":false,"group":null,"id":"prvsvc_61VSG5gQU2NuLsMao5T44","kind":"deployable","livemode":true,"llm_context":"https://cloudinary.com/documentation/llms.txt","object":"v2.provisioning.provider_service_detail","pricing":{"component":{"options":[{"is_default":null,"paid":null,"parent_services":["free"],"type":"free"}]},"paid":null,"paid_pricing":[],"type":"component"},"provider":"prvdr_61VSFOA6422ML3Mmh5WDg","provider_configuration_schema":{},"provider_name":"Cloudinary","scope":"project","service_id":"media","updateable_to":["media"]},{"allowed_updates":[],"availability":"available","categories":["media","storage","cdn"],"configuration_schema":{},"constraints":[{"count":{"at_most":1},"type":"count"}],"created":null,"description":"Cloudinary Free plan — programmable media for one product environment","development":false,"group":null,"id":"prvsvc_61VSG5gP3OkypdZYT5EbY","kind":"plan","livemode":true,"llm_context":null,"object":"v2.provisioning.provider_service_detail","pricing":{"component":null,"paid":null,"paid_pricing":[],"type":"free"},"provider":"prvdr_61VSFOA6422ML3Mmh5WDg","provider_configuration_schema":{},"provider_name":"Cloudinary","scope":"account","service_id":"free","updateable_to":["free"]}]}}"#; + + fn test_def() -> StackDef { + StackDef::parse( + r#" +[stack] +name = "atto" +[stack.projects.stripe] +project = "project_1" +[integrations.media] +provider = "cloudinary" +[services.api] +source = { repo = "r", ref = "main" } +env = { OUT = "${integrations.media.api_key}" } +health = { path = "/health" } +[services.api.local] +run = "true" +"#, + ) + .unwrap() + } + + #[tokio::test] + async fn provision_records_outputs() { + let runner = test_support::provision_script( + CATALOG_ENVELOPE, + serde_json::json!({"CLOUDINARY_API_KEY": "val_api_key"}), + 1, + ); + let dir = tempfile::tempdir().unwrap(); + std::fs::write( + dir.path().join("stackless.toml"), + "[stack]\nname=\"atto\"\n", + ) + .unwrap(); + let stripe = StripeProjects::new(&runner, dir.path()); + + let resource = CloudinaryMedia + .provision( + &stripe.as_dyn(), + &test_def(), + dir.path(), + "demo", + "media", + "local", + false, + ) + .await + .unwrap(); + assert_eq!(resource.resource_kind, "integration-cloudinary"); + let payload: ResourcePayload = serde_json::from_str(&resource.payload).unwrap(); + assert_eq!(payload.outputs["api_key"], "val_api_key"); + } +} diff --git a/crates/stackless-integrations/src/providers/cloudinary/mod.rs b/crates/stackless-integrations/src/providers/cloudinary/mod.rs new file mode 100644 index 00000000..21613a0f --- /dev/null +++ b/crates/stackless-integrations/src/providers/cloudinary/mod.rs @@ -0,0 +1,3 @@ +pub mod media; + +pub(crate) use crate::resource::{CatalogResource as FamilyResource, integration_config}; diff --git a/crates/stackless-integrations/src/providers/mod.rs b/crates/stackless-integrations/src/providers/mod.rs index 1977e237..62a02146 100644 --- a/crates/stackless-integrations/src/providers/mod.rs +++ b/crates/stackless-integrations/src/providers/mod.rs @@ -11,6 +11,7 @@ pub mod churnkey; pub mod clerk; pub mod clickhouse; pub mod cloudflare; +pub mod cloudinary; pub mod composio; pub mod customerio; pub mod datadog; @@ -62,12 +63,12 @@ mod tests { use crate::providers::{ agentmail, agentphone, amplitude, athena, auth0, base44_projects, blaxel, browserbase, - chatbase, churnkey, clickhouse, cloudflare, composio, customerio, datadog, depot, e2b, - elevenlabs, exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, laravel_cloud, - metronome, mixpanel, neon, openrouter, parallel, perplexity, planetscale, postalform, - posthog, prisma, pydantic, quo, railway, render_db, resend, revenuecat, runloop, schematic, - sentry, shopify, steel, supabase, supermemory, tabstack, turso, upstash, wix, - wordpress_com, workos, + chatbase, churnkey, clickhouse, cloudflare, cloudinary, composio, customerio, datadog, + depot, e2b, elevenlabs, exa, firecrawl, flyio, gitlab, herenow, inngest, kernel, + laravel_cloud, metronome, mixpanel, neon, openrouter, parallel, perplexity, planetscale, + postalform, posthog, prisma, pydantic, quo, railway, render_db, resend, revenuecat, + runloop, schematic, sentry, shopify, steel, supabase, supermemory, tabstack, turso, + upstash, wix, wordpress_com, workos, }; fn assert_outputs_match() { @@ -103,6 +104,7 @@ mod tests { assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); + assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); assert_outputs_match::(); diff --git a/crates/stackless-integrations/src/registry.rs b/crates/stackless-integrations/src/registry.rs index ea6a00a7..dffc8fd4 100644 --- a/crates/stackless-integrations/src/registry.rs +++ b/crates/stackless-integrations/src/registry.rs @@ -88,6 +88,7 @@ register_providers! { (churnkey::retention, ChurnkeyRetention), (clickhouse::cluster, ClickHouseClickhouse), (clickhouse::postgres, ClickHousePostgres), + (cloudinary::media, CloudinaryMedia), (composio::project, ComposioProject), (customerio::workspace, CustomerioWorkspace), (datadog::observability, DatadogObservability), diff --git a/crates/stackless-stripe-projects/tests/fixtures/catalog.json b/crates/stackless-stripe-projects/tests/fixtures/catalog.json index bd4957b1..12a894cd 100644 --- a/crates/stackless-stripe-projects/tests/fixtures/catalog.json +++ b/crates/stackless-stripe-projects/tests/fixtures/catalog.json @@ -103,6 +103,99 @@ "website" ] }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "media", + "storage", + "cdn" + ], + "configuration_schema": {}, + "constraints": [ + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Cloudinary product environment — upload, transform, and deliver images and video", + "development": false, + "group": null, + "id": "prvsvc_61VSG5gQU2NuLsMao5T44", + "kind": "deployable", + "livemode": true, + "llm_context": "https://cloudinary.com/documentation/llms.txt", + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": { + "options": [ + { + "is_default": null, + "paid": null, + "parent_services": [ + "free" + ], + "type": "free" + } + ] + }, + "paid": null, + "paid_pricing": [], + "type": "component" + }, + "provider": "prvdr_61VSFOA6422ML3Mmh5WDg", + "provider_configuration_schema": {}, + "provider_name": "Cloudinary", + "scope": "project", + "service_id": "media", + "updateable_to": [ + "media" + ] + }, + { + "allowed_updates": [], + "availability": "available", + "categories": [ + "media", + "storage", + "cdn" + ], + "configuration_schema": {}, + "constraints": [ + { + "count": { + "at_most": 1 + }, + "type": "count" + } + ], + "created": null, + "description": "Cloudinary Free plan — programmable media for one product environment", + "development": false, + "group": null, + "id": "prvsvc_61VSG5gP3OkypdZYT5EbY", + "kind": "plan", + "livemode": true, + "llm_context": null, + "object": "v2.provisioning.provider_service_detail", + "pricing": { + "component": null, + "paid": null, + "paid_pricing": [], + "type": "free" + }, + "provider": "prvdr_61VSFOA6422ML3Mmh5WDg", + "provider_configuration_schema": {}, + "provider_name": "Cloudinary", + "scope": "account", + "service_id": "free", + "updateable_to": [ + "free" + ] + }, { "allowed_updates": [], "availability": "available", @@ -519,15 +612,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -568,15 +661,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -647,8 +740,8 @@ "is_default": null, "paid": null, "parent_services": [ - "free", - "pro" + "pro", + "free" ], "type": "free" } @@ -680,15 +773,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -766,8 +859,8 @@ "is_default": null, "paid": null, "parent_services": [ - "developer", - "hobby" + "hobby", + "developer" ], "type": "free" } @@ -799,15 +892,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -958,15 +1051,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1102,15 +1195,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1235,15 +1328,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1287,15 +1380,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1414,8 +1507,8 @@ "is_default": true, "paid": null, "parent_services": [ - "schematic-free", - "schematic-growth" + "schematic-growth", + "schematic-free" ], "type": "free" } @@ -1610,15 +1703,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -1940,11 +2033,11 @@ }, { "direction": "any", - "service": "beginner-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "beginner-monthly" } ], "availability": "available", @@ -1987,8 +2080,8 @@ "service_id": "enterprise-monthly", "updateable_to": [ "pro-monthly", - "beginner-monthly", "free", + "beginner-monthly", "enterprise-monthly" ] }, @@ -1996,7 +2089,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" }, { "direction": "any", @@ -2004,7 +2097,7 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -2046,9 +2139,9 @@ "scope": "account", "service_id": "beginner-monthly", "updateable_to": [ - "pro-monthly", - "free", "enterprise-monthly", + "free", + "pro-monthly", "beginner-monthly" ] }, @@ -2056,7 +2149,7 @@ "allowed_updates": [ { "direction": "any", - "service": "beginner-monthly" + "service": "enterprise-monthly" }, { "direction": "any", @@ -2064,7 +2157,7 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "beginner-monthly" } ], "availability": "available", @@ -2106,9 +2199,9 @@ "scope": "account", "service_id": "pro-monthly", "updateable_to": [ - "beginner-monthly", - "free", "enterprise-monthly", + "free", + "beginner-monthly", "pro-monthly" ] }, @@ -2116,7 +2209,7 @@ "allowed_updates": [ { "direction": "any", - "service": "pro-monthly" + "service": "enterprise-monthly" }, { "direction": "any", @@ -2124,7 +2217,7 @@ }, { "direction": "any", - "service": "enterprise-monthly" + "service": "pro-monthly" } ], "availability": "available", @@ -2154,9 +2247,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ - "pro-monthly", - "beginner-monthly", "enterprise-monthly", + "beginner-monthly", + "pro-monthly", "free" ] }, @@ -2184,10 +2277,10 @@ "is_default": null, "paid": null, "parent_services": [ - "pro-monthly", "free", - "beginner-monthly", - "enterprise-monthly" + "pro-monthly", + "enterprise-monthly", + "beginner-monthly" ], "type": "free" } @@ -2236,15 +2329,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2328,15 +2421,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2388,11 +2481,11 @@ "allowed_updates": [ { "direction": "down", - "service": "standard" + "service": "hobby" }, { "direction": "down", - "service": "hobby" + "service": "standard" } ], "availability": "available", @@ -2401,15 +2494,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2448,8 +2541,8 @@ "scope": "account", "service_id": "pro", "updateable_to": [ - "standard", "hobby", + "standard", "pro" ] }, @@ -2488,9 +2581,9 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", + "hobby", "standard", - "hobby" + "pro" ], "type": "free" }, @@ -2539,15 +2632,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2608,15 +2701,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2679,15 +2772,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -2757,8 +2850,8 @@ "is_default": null, "paid": null, "parent_services": [ - "startup-plan", - "developer-plan" + "developer-plan", + "startup-plan" ], "type": "free" } @@ -2796,15 +2889,15 @@ "type": "object" }, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3042,15 +3135,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3104,15 +3197,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -3856,11 +3949,11 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-6" + "service": "tier-2" }, { "direction": "up", - "service": "tier-5" + "service": "tier-3" }, { "direction": "up", @@ -3868,11 +3961,11 @@ }, { "direction": "up", - "service": "tier-3" + "service": "tier-5" }, { "direction": "up", - "service": "tier-2" + "service": "tier-6" } ], "availability": "available", @@ -3920,31 +4013,31 @@ "scope": "account", "service_id": "tier-1", "updateable_to": [ - "tier-6", - "tier-5", - "tier-4", - "tier-3", "tier-2", + "tier-3", + "tier-4", + "tier-5", + "tier-6", "tier-1" ] }, { "allowed_updates": [ { - "direction": "up", - "service": "tier-6" - }, - { - "direction": "up", - "service": "tier-5" + "direction": "down", + "service": "tier-2" }, { "direction": "down", "service": "tier-3" }, { - "direction": "down", - "service": "tier-2" + "direction": "up", + "service": "tier-5" + }, + { + "direction": "up", + "service": "tier-6" }, { "direction": "down", @@ -3996,23 +4089,19 @@ "scope": "account", "service_id": "tier-4", "updateable_to": [ - "tier-6", - "tier-5", - "tier-3", "tier-2", + "tier-3", + "tier-5", + "tier-6", "tier-1", "tier-4" ] }, { "allowed_updates": [ - { - "direction": "up", - "service": "tier-6" - }, { "direction": "down", - "service": "tier-4" + "service": "tier-2" }, { "direction": "down", @@ -4020,7 +4109,11 @@ }, { "direction": "down", - "service": "tier-2" + "service": "tier-4" + }, + { + "direction": "up", + "service": "tier-6" }, { "direction": "down", @@ -4072,10 +4165,10 @@ "scope": "account", "service_id": "tier-5", "updateable_to": [ - "tier-6", - "tier-4", - "tier-3", "tier-2", + "tier-3", + "tier-4", + "tier-6", "tier-1", "tier-5" ] @@ -4084,19 +4177,19 @@ "allowed_updates": [ { "direction": "up", - "service": "tier-6" + "service": "tier-3" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { "direction": "up", - "service": "tier-3" + "service": "tier-6" }, { "direction": "down", @@ -4148,10 +4241,10 @@ "scope": "account", "service_id": "tier-2", "updateable_to": [ - "tier-6", - "tier-5", - "tier-4", "tier-3", + "tier-4", + "tier-5", + "tier-6", "tier-1", "tier-2" ] @@ -4160,19 +4253,19 @@ "allowed_updates": [ { "direction": "down", - "service": "tier-5" + "service": "tier-2" }, { "direction": "down", - "service": "tier-4" + "service": "tier-3" }, { "direction": "down", - "service": "tier-3" + "service": "tier-4" }, { "direction": "down", - "service": "tier-2" + "service": "tier-5" }, { "direction": "down", @@ -4224,10 +4317,10 @@ "scope": "account", "service_id": "tier-6", "updateable_to": [ - "tier-5", - "tier-4", - "tier-3", "tier-2", + "tier-3", + "tier-4", + "tier-5", "tier-1", "tier-6" ] @@ -4235,20 +4328,20 @@ { "allowed_updates": [ { - "direction": "up", - "service": "tier-6" + "direction": "down", + "service": "tier-2" }, { "direction": "up", - "service": "tier-5" + "service": "tier-4" }, { "direction": "up", - "service": "tier-4" + "service": "tier-5" }, { - "direction": "down", - "service": "tier-2" + "direction": "up", + "service": "tier-6" }, { "direction": "down", @@ -4300,10 +4393,10 @@ "scope": "account", "service_id": "tier-3", "updateable_to": [ - "tier-6", - "tier-5", - "tier-4", "tier-2", + "tier-4", + "tier-5", + "tier-6", "tier-1", "tier-3" ] @@ -4524,15 +4617,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4585,15 +4678,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4773,8 +4866,8 @@ "paid": null, "parent_services": [ "startup", - "developer", - "hobbyist" + "hobbyist", + "developer" ], "type": "free" } @@ -4810,15 +4903,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4851,11 +4944,11 @@ "allowed_updates": [ { "direction": "down", - "service": "developer" + "service": "hobbyist" }, { "direction": "down", - "service": "hobbyist" + "service": "developer" } ], "availability": "available", @@ -4864,15 +4957,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -4908,8 +5001,8 @@ "scope": "account", "service_id": "startup", "updateable_to": [ - "developer", "hobbyist", + "developer", "startup" ] }, @@ -4930,15 +5023,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -5397,8 +5490,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5499,8 +5592,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5582,8 +5675,8 @@ "type": "freeform" }, "parent_services": [ - "starter", - "growth" + "growth", + "starter" ], "type": "paid" } @@ -5908,10 +6001,10 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", "free", - "business", - "starter" + "pro", + "starter", + "business" ], "type": "free" } @@ -5932,6 +6025,10 @@ }, { "allowed_updates": [ + { + "direction": "up", + "service": "business" + }, { "direction": "any", "service": "free" @@ -5940,10 +6037,6 @@ "direction": "up", "service": "starter" }, - { - "direction": "up", - "service": "business" - }, { "direction": "up", "service": "pro" @@ -5976,9 +6069,9 @@ "scope": "account", "service_id": "free", "updateable_to": [ + "business", "free", "starter", - "business", "pro" ] }, @@ -5986,11 +6079,7 @@ "allowed_updates": [ { "direction": "down", - "service": "free" - }, - { - "direction": "down", - "service": "pro" + "service": "starter" }, { "direction": "any", @@ -5998,7 +6087,11 @@ }, { "direction": "down", - "service": "starter" + "service": "pro" + }, + { + "direction": "down", + "service": "free" } ], "availability": "available", @@ -6040,10 +6133,10 @@ "scope": "account", "service_id": "business", "updateable_to": [ - "free", - "pro", + "starter", "business", - "starter" + "pro", + "free" ] }, { @@ -6052,10 +6145,6 @@ "direction": "any", "service": "pro" }, - { - "direction": "down", - "service": "free" - }, { "direction": "up", "service": "business" @@ -6063,6 +6152,10 @@ { "direction": "down", "service": "starter" + }, + { + "direction": "down", + "service": "free" } ], "availability": "available", @@ -6105,13 +6198,17 @@ "service_id": "pro", "updateable_to": [ "pro", - "free", "business", - "starter" + "starter", + "free" ] }, { "allowed_updates": [ + { + "direction": "up", + "service": "business" + }, { "direction": "up", "service": "pro" @@ -6123,10 +6220,6 @@ { "direction": "down", "service": "free" - }, - { - "direction": "up", - "service": "business" } ], "availability": "available", @@ -6168,10 +6261,10 @@ "scope": "account", "service_id": "starter", "updateable_to": [ + "business", "pro", "starter", - "free", - "business" + "free" ] }, { @@ -6407,8 +6500,8 @@ "paid": null, "parent_services": [ "startup", - "developer", - "free" + "free", + "developer" ], "type": "free" } @@ -6911,7 +7004,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2c-professional" }, { "direction": "any", @@ -6919,7 +7012,7 @@ }, { "direction": "any", - "service": "b2c-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -6990,9 +7083,9 @@ "service_id": "b2b-professional", "updateable_to": [ "free", - "b2c-essentials", - "b2b-essentials", "b2c-professional", + "b2b-essentials", + "b2c-essentials", "b2b-professional" ] }, @@ -7004,7 +7097,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -7012,7 +7105,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -7083,9 +7176,9 @@ "service_id": "b2b-essentials", "updateable_to": [ "free", - "b2c-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2c-essentials", "b2b-essentials" ] }, @@ -7097,7 +7190,7 @@ }, { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -7105,7 +7198,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -7176,9 +7269,9 @@ "service_id": "b2c-professional", "updateable_to": [ "free", - "b2c-essentials", - "b2b-essentials", "b2b-professional", + "b2b-essentials", + "b2c-essentials", "b2c-professional" ] }, @@ -7186,19 +7279,19 @@ "allowed_updates": [ { "direction": "any", - "service": "b2c-essentials" + "service": "b2b-professional" }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2c-professional" }, { "direction": "any", - "service": "b2c-professional" + "service": "b2b-essentials" }, { "direction": "any", - "service": "b2b-professional" + "service": "b2c-essentials" } ], "availability": "available", @@ -7256,10 +7349,10 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "b2c-essentials", - "b2b-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2b-essentials", + "b2c-essentials", "free" ] }, @@ -7271,7 +7364,7 @@ }, { "direction": "any", - "service": "b2b-essentials" + "service": "b2b-professional" }, { "direction": "any", @@ -7279,7 +7372,7 @@ }, { "direction": "any", - "service": "b2b-professional" + "service": "b2b-essentials" } ], "availability": "available", @@ -7350,9 +7443,9 @@ "service_id": "b2c-essentials", "updateable_to": [ "free", - "b2b-essentials", - "b2c-professional", "b2b-professional", + "b2c-professional", + "b2b-essentials", "b2c-essentials" ] }, @@ -7971,11 +8064,11 @@ }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-1000" }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0025" } ], "availability": "available", @@ -8020,8 +8113,8 @@ "service_id": "top-up-0500", "updateable_to": [ "top-up-2000", - "top-up-0025", "top-up-1000", + "top-up-0025", "top-up-0500" ] }, @@ -8033,11 +8126,11 @@ }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" } ], "availability": "available", @@ -8082,8 +8175,8 @@ "service_id": "top-up-1000", "updateable_to": [ "top-up-2000", - "top-up-0025", "top-up-0500", + "top-up-0025", "top-up-1000" ] }, @@ -8095,11 +8188,11 @@ }, { "direction": "any", - "service": "top-up-1000" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-1000" } ], "availability": "available", @@ -8144,8 +8237,8 @@ "service_id": "top-up-0025", "updateable_to": [ "top-up-2000", - "top-up-1000", "top-up-0500", + "top-up-1000", "top-up-0025" ] }, @@ -8157,11 +8250,11 @@ }, { "direction": "any", - "service": "top-up-0025" + "service": "top-up-0500" }, { "direction": "any", - "service": "top-up-0500" + "service": "top-up-0025" } ], "availability": "available", @@ -8206,8 +8299,8 @@ "service_id": "top-up-2000", "updateable_to": [ "top-up-1000", - "top-up-0025", "top-up-0500", + "top-up-0025", "top-up-2000" ] }, @@ -8330,9 +8423,9 @@ }, "parent_services": [ "top-up-0025", - "top-up-1000", + "top-up-0500", "top-up-2000", - "top-up-0500" + "top-up-1000" ], "type": "paid" } @@ -8912,11 +9005,11 @@ }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -8981,8 +9074,8 @@ "service_id": "plus-v3-10k-mtu-monthly", "updateable_to": [ "plus-v3-25k-mtu-monthly", - "plus-v3-50k-mtu-monthly", "free", + "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly" ] }, @@ -8990,15 +9083,15 @@ "allowed_updates": [ { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", - "service": "free" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -9062,9 +9155,9 @@ "scope": "project", "service_id": "plus-v3-25k-mtu-monthly", "updateable_to": [ - "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", "free", + "plus-v3-50k-mtu-monthly", "plus-v3-25k-mtu-monthly" ] }, @@ -9326,9 +9419,9 @@ "paid": null, "parent_services": [ "free", - "scale", + "core", "enterprise", - "core" + "scale" ], "type": "free" } @@ -9363,11 +9456,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "startup" }, { "direction": "any", - "service": "startup" + "service": "free" } ], "availability": "available", @@ -9411,8 +9504,8 @@ "scope": "project", "service_id": "developer", "updateable_to": [ - "free", "startup", + "free", "developer" ] }, @@ -9420,11 +9513,11 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "developer" }, { "direction": "any", - "service": "developer" + "service": "free" } ], "availability": "available", @@ -9468,8 +9561,8 @@ "scope": "project", "service_id": "startup", "updateable_to": [ - "free", "developer", + "free", "startup" ] }, @@ -9854,8 +9947,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -9878,11 +9971,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -9912,19 +10005,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "team" }, { "direction": "any", - "service": "team" + "service": "pro" } ], "availability": "available", @@ -9956,8 +10049,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "pro", "team", + "pro", "free" ] }, @@ -10018,8 +10111,8 @@ "type": "freeform" }, "parent_services": [ - "team", - "pro" + "pro", + "team" ], "type": "paid" } @@ -10042,11 +10135,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10099,8 +10192,8 @@ "scope": "project", "service_id": "workers-ai", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "workers-ai" ] }, @@ -10108,11 +10201,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10169,8 +10262,8 @@ "scope": "project", "service_id": "browser-run", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "browser-run" ] }, @@ -10178,11 +10271,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10324,8 +10417,8 @@ "scope": "project", "service_id": "hyperdrive", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "hyperdrive" ] }, @@ -10333,11 +10426,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10403,8 +10496,8 @@ "scope": "project", "service_id": "kv", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "kv" ] }, @@ -10412,11 +10505,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10494,8 +10587,8 @@ "scope": "project", "service_id": "d1", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "d1" ] }, @@ -10503,11 +10596,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10573,8 +10666,8 @@ "scope": "project", "service_id": "queues", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "queues" ] }, @@ -10582,11 +10675,11 @@ "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -10635,8 +10728,8 @@ "scope": "project", "service_id": "containers", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "containers" ] }, @@ -10675,11 +10768,11 @@ "is_default": null, "paid": null, "parent_services": [ - "b2b-professional", - "b2b-essentials", - "b2c-essentials", + "b2c-professional", "free", - "b2c-professional" + "b2c-essentials", + "b2b-essentials", + "b2b-professional" ], "type": "free" } @@ -10890,19 +10983,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "hobby" + "service": "api" }, { "direction": "any", - "service": "api" + "service": "hobby" } ], "availability": "available", @@ -10971,10 +11064,10 @@ "scope": "project", "service_id": "growth", "updateable_to": [ - "free", "standard", - "hobby", + "free", "api", + "hobby", "growth" ] }, @@ -10982,19 +11075,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", - "service": "api" + "service": "growth" } ], "availability": "available", @@ -11063,10 +11156,10 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "free", "standard", - "growth", + "free", "api", + "growth", "hobby" ] }, @@ -11078,7 +11171,7 @@ }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", @@ -11086,7 +11179,7 @@ }, { "direction": "any", - "service": "api" + "service": "growth" } ], "availability": "available", @@ -11156,9 +11249,9 @@ "service_id": "standard", "updateable_to": [ "free", - "growth", - "hobby", "api", + "hobby", + "growth", "standard" ] }, @@ -11204,19 +11297,19 @@ "allowed_updates": [ { "direction": "any", - "service": "free" + "service": "standard" }, { "direction": "any", - "service": "standard" + "service": "free" }, { "direction": "any", - "service": "growth" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "growth" } ], "availability": "available", @@ -11258,8 +11351,8 @@ }, "parent_services": [ "growth", - "standard", - "hobby" + "hobby", + "standard" ], "type": "paid" } @@ -11275,10 +11368,10 @@ "scope": "project", "service_id": "api", "updateable_to": [ - "free", "standard", - "growth", + "free", "hobby", + "growth", "api" ] }, @@ -11290,7 +11383,7 @@ }, { "direction": "any", - "service": "growth" + "service": "api" }, { "direction": "any", @@ -11298,7 +11391,7 @@ }, { "direction": "any", - "service": "api" + "service": "growth" } ], "availability": "available", @@ -11333,9 +11426,9 @@ "service_id": "free", "updateable_to": [ "standard", - "growth", - "hobby", "api", + "hobby", + "growth", "free" ] }, @@ -11443,11 +11536,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -11477,19 +11570,19 @@ "scope": "project", "service_id": "hobby", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -11531,8 +11624,8 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { @@ -11598,7 +11691,7 @@ }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "free" }, { "direction": "any", @@ -11606,7 +11699,7 @@ }, { "direction": "any", - "service": "free" + "service": "plus-v3-10k-mtu-monthly" } ], "availability": "available", @@ -11706,9 +11799,9 @@ "service_id": "analytics", "updateable_to": [ "plus-v3-25k-mtu-monthly", - "plus-v3-10k-mtu-monthly", - "plus-v3-50k-mtu-monthly", "free", + "plus-v3-50k-mtu-monthly", + "plus-v3-10k-mtu-monthly", "analytics" ] }, @@ -11720,11 +11813,11 @@ }, { "direction": "any", - "service": "plus-v3-50k-mtu-monthly" + "service": "plus-v3-10k-mtu-monthly" }, { "direction": "any", - "service": "plus-v3-10k-mtu-monthly" + "service": "plus-v3-50k-mtu-monthly" } ], "availability": "available", @@ -11777,8 +11870,8 @@ "service_id": "free", "updateable_to": [ "plus-v3-25k-mtu-monthly", - "plus-v3-50k-mtu-monthly", "plus-v3-10k-mtu-monthly", + "plus-v3-50k-mtu-monthly", "free" ] }, @@ -12381,9 +12474,9 @@ }, "parent_services": [ "25K_emails+auto-replenish", - "hobbyist", + "62.5K_emails+auto-replenish", "business", - "62.5K_emails+auto-replenish" + "hobbyist" ], "type": "paid" } @@ -12461,11 +12554,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -12507,19 +12600,19 @@ "scope": "project", "service_id": "pro", "updateable_to": [ - "pro", - "hobby" + "hobby", + "pro" ] }, { "allowed_updates": [ { "direction": "any", - "service": "workers:free" + "service": "workers:paid" }, { "direction": "any", - "service": "workers:paid" + "service": "workers:free" } ], "availability": "available", @@ -12576,8 +12669,8 @@ "scope": "project", "service_id": "workers", "updateable_to": [ - "workers:free", "workers:paid", + "workers:free", "workers" ] }, @@ -12682,8 +12775,8 @@ "is_default": null, "paid": null, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "free" } @@ -15665,8 +15758,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15730,8 +15823,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15754,11 +15847,11 @@ "allowed_updates": [ { "direction": "any", - "service": "pro" + "service": "hobby" }, { "direction": "any", - "service": "hobby" + "service": "pro" } ], "availability": "available", @@ -15791,8 +15884,8 @@ "scope": "project", "service_id": "free", "updateable_to": [ - "pro", "hobby", + "pro", "free" ] }, @@ -15840,8 +15933,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15899,8 +15992,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -15963,8 +16056,8 @@ "type": "freeform" }, "parent_services": [ - "pro", - "hobby" + "hobby", + "pro" ], "type": "paid" } @@ -16146,11 +16239,11 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", - "service": "scaler" + "service": "pro_overages" }, { "direction": "any", @@ -16158,11 +16251,11 @@ }, { "direction": "any", - "service": "pro_overages" + "service": "scaler" }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" } ], "availability": "available", @@ -16171,15 +16264,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16215,11 +16308,11 @@ "scope": "account", "service_id": "developer", "updateable_to": [ - "scaler_overages", - "scaler", - "developer_overages", - "pro_overages", "pro", + "pro_overages", + "developer_overages", + "scaler", + "scaler_overages", "developer" ] }, @@ -16240,15 +16333,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16302,15 +16395,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16354,7 +16447,7 @@ "allowed_updates": [ { "direction": "any", - "service": "scaler_overages" + "service": "pro" }, { "direction": "any", @@ -16362,7 +16455,7 @@ }, { "direction": "any", - "service": "pro" + "service": "scaler_overages" } ], "availability": "available", @@ -16371,15 +16464,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16415,9 +16508,9 @@ "scope": "account", "service_id": "scaler", "updateable_to": [ - "scaler_overages", - "pro_overages", "pro", + "pro_overages", + "scaler_overages", "scaler" ] }, @@ -16469,13 +16562,13 @@ "is_default": null, "paid": null, "parent_services": [ - "scaler_overages", "pro", - "developer", - "developer_overages", - "starter", + "scaler_overages", + "pro_overages", "scaler", - "pro_overages" + "starter", + "developer_overages", + "developer" ], "type": "free" } @@ -16502,7 +16595,7 @@ }, { "direction": "any", - "service": "scaler_overages" + "service": "pro_overages" }, { "direction": "any", @@ -16510,7 +16603,7 @@ }, { "direction": "any", - "service": "pro_overages" + "service": "scaler_overages" } ], "availability": "available", @@ -16519,15 +16612,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16564,9 +16657,9 @@ "service_id": "developer_overages", "updateable_to": [ "pro", - "scaler_overages", - "scaler", "pro_overages", + "scaler", + "scaler_overages", "developer_overages" ] }, @@ -16578,15 +16671,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16633,23 +16726,23 @@ }, { "direction": "any", - "service": "pro" + "service": "scaler" }, { "direction": "any", - "service": "developer" + "service": "pro_overages" }, { "direction": "any", - "service": "scaler_overages" + "service": "developer" }, { "direction": "any", - "service": "scaler" + "service": "scaler_overages" }, { "direction": "any", - "service": "pro_overages" + "service": "pro" } ], "availability": "available", @@ -16658,15 +16751,15 @@ ], "configuration_schema": {}, "constraints": [ + { + "mutual_exclusion_allowed_updates": true, + "type": "mutual_exclusion_allowed_updates" + }, { "count": { "at_most": 1 }, "type": "count" - }, - { - "mutual_exclusion_allowed_updates": true, - "type": "mutual_exclusion_allowed_updates" } ], "created": null, @@ -16691,11 +16784,11 @@ "service_id": "starter", "updateable_to": [ "developer_overages", - "pro", - "developer", - "scaler_overages", "scaler", "pro_overages", + "developer", + "scaler_overages", + "pro", "starter" ] } diff --git a/scripts/generate_catalog_integrations.py b/scripts/generate_catalog_integrations.py index 2e6b2e5a..7aeff531 100644 --- a/scripts/generate_catalog_integrations.py +++ b/scripts/generate_catalog_integrations.py @@ -143,6 +143,7 @@ "planetscale/postgresql": "planetscale-postgresql", "clickhouse/clickhouse": "clickhouse", "clickhouse/postgres": "clickhouse-postgres", + "cloudinary/media": "cloudinary", "blaxel/agent-drive": "blaxel-agent-drive", "blaxel/sandbox": "blaxel-sandbox", "laravel_cloud/application": "laravel-cloud", @@ -196,6 +197,7 @@ "planetscale/postgresql": [("DATABASE_URL", "database_url", True)], "clickhouse/clickhouse": [("CONNECTION_STRING", "connection_string", True)], "clickhouse/postgres": [("CONNECTION_STRING", "connection_string", True)], + "cloudinary/media": [("API_KEY", "api_key", True)], "chroma/database": [("API_KEY", "api_key", True)], "athena/agents": [ ("AGENT_ID", "agent_id", True),