gtm-now 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +11493 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../logging/src/logger.ts","../../logging/src/status-code.ts","../../logging/src/index.ts","../src/config.ts","../src/constants.ts","../src/context.ts","../src/providers/registry.ts","../../integrations/src/base-client.ts","../../integrations/src/plusvibe/client.ts","../../integrations/src/plusvibe/types.ts","../../integrations/src/heyreach/client.ts","../../integrations/src/instantly/client.ts","../../integrations/src/instantly/types.ts","../../integrations/src/enrichment/client.ts","../../integrations/src/enrichment/adapters/leadmagic.ts","../../integrations/src/enrichment/adapters/prospeo.ts","../../integrations/src/enrichment/adapters/blitz.ts","../../integrations/src/enrichment/adapters/zerobounce.ts","../../integrations/src/enrichment/adapters/bounceban.ts","../../integrations/src/attio/client.ts","../../integrations/src/resend/client.ts","../../integrations/src/blueprint/client.ts","../../integrations/src/apify/client.ts","../../integrations/src/brightdata/client.ts","../../integrations/src/webhooks/providers/hmac-sha256.ts","../../integrations/src/webhooks/providers/stripe.ts","../../integrations/src/webhooks/providers/slack.ts","../../integrations/src/webhooks/verify.ts","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/crypto/CryptoProvider.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/crypto/NodeCryptoProvider.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/net/HttpClient.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/net/NodeHttpClient.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/utils.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/net/FetchHttpClient.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/crypto/SubtleCryptoProvider.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/platform/PlatformFunctions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/Error.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/platform/NodePlatformFunctions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/RequestSender.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/autoPagination.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/StripeMethod.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/StripeResource.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/StripeContext.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/Webhooks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/apiVersion.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/ResourceNamespace.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/AccountLinks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/AccountTokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/FinancialConnections/Accounts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/Accounts/Persons.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/Accounts/PersonTokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/Accounts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Entitlements/ActiveEntitlements.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/Alerts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tax/Associations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Authorizations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Issuing/Authorizations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tax/Calculations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Cardholders.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Cards.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Issuing/Cards.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/BillingPortal/Configurations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Terminal/Configurations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/ConfirmationTokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Terminal/ConnectionTokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/CreditBalanceSummary.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/CreditBalanceTransactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/CreditGrants.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/CreditReversals.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Customers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/DebitReversals.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Disputes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Radar/EarlyFraudWarnings.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/EventDestinations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Core/Events.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Entitlements/Features.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/FinancialAccounts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Treasury/InboundTransfers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/InboundTransfers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Terminal/Locations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/MeterEventAdjustments.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Billing/MeterEventAdjustments.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Billing/MeterEventSession.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Billing/MeterEventStream.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/MeterEvents.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/V2/Billing/MeterEvents.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Billing/Meters.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Terminal/OnboardingLinks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Climate/Orders.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Treasury/OutboundPayments.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/OutboundPayments.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Treasury/OutboundTransfers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/OutboundTransfers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Radar/PaymentEvaluations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/PersonalizationDesigns.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Issuing/PersonalizationDesigns.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/PhysicalBundles.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Climate/Products.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Terminal/Readers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Terminal/Readers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Treasury/ReceivedCredits.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/ReceivedCredits.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Treasury/ReceivedDebits.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/ReceivedDebits.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Refunds.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tax/Registrations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Reporting/ReportRuns.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Reporting/ReportTypes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Forwarding/Requests.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Sigma/ScheduledQueryRuns.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Apps/Secrets.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/BillingPortal/Sessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Checkout/Sessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/FinancialConnections/Sessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tax/Settings.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Climate/Suppliers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/TestClocks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Tokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/TransactionEntries.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/FinancialConnections/Transactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Issuing/Transactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tax/Transactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TestHelpers/Issuing/Transactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Treasury/Transactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Radar/ValueListItems.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Radar/ValueLists.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Identity/VerificationReports.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Identity/VerificationSessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Accounts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/AccountLinks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/AccountSessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/ApplePayDomains.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/ApplicationFees.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Balance.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/BalanceSettings.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/BalanceTransactions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Charges.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/ConfirmationTokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/CountrySpecs.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Coupons.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/CreditNotes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/CustomerSessions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Customers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Disputes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/EphemeralKeys.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Events.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/ExchangeRates.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/FileLinks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/multipart.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Files.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/InvoiceItems.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/InvoicePayments.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/InvoiceRenderingTemplates.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Invoices.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Mandates.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/OAuth.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentAttemptRecords.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentIntents.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentLinks.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentMethodConfigurations.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentMethodDomains.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentMethods.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PaymentRecords.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Payouts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Plans.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Prices.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Products.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/PromotionCodes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Quotes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Refunds.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Reviews.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/SetupAttempts.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/SetupIntents.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/ShippingRates.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Sources.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/SubscriptionItems.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/SubscriptionSchedules.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Subscriptions.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TaxCodes.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TaxIds.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/TaxRates.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Tokens.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Topups.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/Transfers.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources/WebhookEndpoints.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/resources.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/stripe.core.js","../../../node_modules/.pnpm/stripe@20.4.1_@types+node@25.4.0/node_modules/stripe/esm/stripe.esm.node.js","../../integrations/src/stripe/client.ts","../../integrations/src/bettercontact/client.ts","../../integrations/src/disco/client.ts","../../integrations/src/apollo/client.ts","../../integrations/src/smartlead/client.ts","../../integrations/src/slack/client.ts","../../integrations/src/calcom/client.ts","../../integrations/src/gemini/client.ts","../../integrations/src/unipile/client.ts","../../integrations/src/twilio/client.ts","../../integrations/src/linear/client.ts","../../integrations/src/zapmail/client.ts","../../integrations/src/kondo/parser.ts","../../integrations/src/helicone/factory.ts","../../integrations/src/index.ts","../src/providers/adapters/bettercontact.ts","../src/providers/adapters/disco.ts","../src/providers/adapters/prospeo.ts","../src/providers/adapters/plusvibe.ts","../src/providers/adapters/heyreach.ts","../src/providers/adapters/attio.ts","../src/providers/adapters/apollo.ts","../src/providers/adapters/instantly.ts","../src/providers/adapters/smartlead.ts","../src/providers/adapters/index.ts","../src/providers/factory.ts","../src/handlers/prospect.ts","../src/providers/waterfall.ts","../src/handlers/enrich.ts","../src/handlers/extract.ts","../src/handlers/fetch.ts","../src/handlers/ai.ts","../src/handlers/campaign.ts","../src/handlers/outreach.ts","../src/handlers/crm.ts","../src/handlers/status.ts","../src/handlers/configure.ts","../src/handlers/index.ts","../src/tools/prospect.ts","../src/tools/enrich.ts","../src/tools/extract.ts","../src/tools/fetch.ts","../src/tools/ai.ts","../src/tools/campaign.ts","../src/tools/outreach.ts","../src/tools/crm.ts","../src/tools/status.ts","../src/tools/configure.ts","../src/tools/index.ts","../src/validation.ts","../src/server.ts","../src/cli-commands.ts","../src/cli.ts","../src/index.ts"],"sourcesContent":["/** Structured JSON logger for the MAS platform.\n * Outputs JSON in production, human-readable in dev.\n * Optional Sentry integration — call configureSentry() at app startup.\n * Constraint: No framework imports. Works in Node, browser, and test environments. */\n\n// ─── Sentry Integration ──────────────────────────────────────────────────────\n\ninterface SentryLike {\n captureException: (error: unknown, context?: Record<string, unknown>) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Accepts any Sentry-compatible captureMessage signature\n captureMessage: (message: string, level?: any) => void;\n}\n\nlet sentryInstance: SentryLike | null = null;\n\n/** Configure Sentry for error capture. Call once at app startup. Pass null to disable. */\nexport function configureSentry(sentry: SentryLike | null): void {\n sentryInstance = sentry;\n}\n\n// ─── Log Entry ───────────────────────────────────────────────────────────────\n\ninterface LogEntry {\n level: 'error' | 'warn' | 'info' | 'debug';\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n [key: string]: unknown;\n}\n\nfunction buildEntry(\n level: LogEntry['level'],\n context: string,\n messageOrError: unknown,\n metadata?: Record<string, unknown>\n): LogEntry {\n const timestamp = new Date().toISOString();\n\n if (messageOrError instanceof Error) {\n return {\n level,\n context,\n message: messageOrError.message,\n stack: messageOrError.stack,\n timestamp,\n ...metadata,\n };\n }\n\n return {\n level,\n context,\n message: String(messageOrError),\n timestamp,\n ...metadata,\n };\n}\n\nfunction emit(entry: LogEntry): void {\n const output = JSON.stringify(entry);\n\n switch (entry.level) {\n case 'error':\n console.error(output);\n break;\n case 'warn':\n console.warn(output);\n break;\n case 'info':\n console.info(output);\n break;\n case 'debug':\n console.debug(output);\n break;\n }\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/** Log an error with structured context. Captures to Sentry if configured. */\nexport function logError(\n context: string,\n error: unknown,\n metadata?: Record<string, unknown>\n): void {\n const entry = buildEntry('error', context, error, metadata);\n emit(entry);\n\n if (sentryInstance) {\n sentryInstance.captureException(error instanceof Error ? error : new Error(String(error)), {\n tags: { context },\n ...metadata,\n });\n }\n}\n\n/** Log a warning with structured context. */\nexport function logWarn(\n context: string,\n message: string,\n metadata?: Record<string, unknown>\n): void {\n emit(buildEntry('warn', context, message, metadata));\n}\n\n/** Log an info message with structured context. */\nexport function logInfo(\n context: string,\n message: string,\n metadata?: Record<string, unknown>\n): void {\n emit(buildEntry('info', context, message, metadata));\n}\n\n/** Log a debug message with structured context. Useful for development. */\nexport function logDebug(\n context: string,\n message: string,\n metadata?: Record<string, unknown>\n): void {\n emit(buildEntry('debug', context, message, metadata));\n}\n","/** Status code extraction helper for route error handling.\n * Services throw errors with statusCode attached. Routes use this to extract it.\n * Constraint: No framework imports. Pure utility function. */\n\n/**\n * Extract HTTP status code from an error thrown by a service.\n * Services attach status codes via: Object.assign(new Error(msg), { statusCode: N })\n * Returns 500 if no valid statusCode found.\n */\nexport function getStatusCode(err: unknown): number {\n if (err && typeof err === 'object' && 'statusCode' in err) {\n const code = (err as { statusCode: unknown }).statusCode;\n if (typeof code === 'number') return code;\n }\n return 500;\n}\n","/** @mas/logging — Structured logging and error handling utilities.\n * Constraint: No framework imports. Works in Node, browser, and test environments. */\n\nexport { logError, logWarn, logInfo, logDebug, configureSentry } from './logger';\nexport { getStatusCode } from './status-code';\n","/** Config. Loads and merges config from YAML string + env vars.\n * Constraint: No Supabase. loadConfig is pure (caller provides YAML).\n * loadYamlFromDisk is the only filesystem accessor — shared by server.ts and cli.ts. */\n\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\nimport { logWarn } from '@mas/logging';\n\nimport type { AiProvider } from './constants.js';\n\n// ─── YAML Disk Loader ───────────────────────────────────\n\n/** Read ~/.gtm/config.yaml (or .yml) from disk. Returns null if not found. */\nexport function loadYamlFromDisk(): string | null {\n const configPath = join(homedir(), '.gtm', 'config.yaml');\n if (existsSync(configPath)) {\n return readFileSync(configPath, 'utf-8');\n }\n\n const altPath = join(homedir(), '.gtm', 'config.yml');\n if (existsSync(altPath)) {\n return readFileSync(altPath, 'utf-8');\n }\n\n return null;\n}\n\n// ─── Types ───────────────────────────────────────────────\n\nexport interface GtmConfig {\n defaults: ClientConfig;\n default_client: string;\n clients: Record<string, Partial<ClientConfig>>;\n}\n\nexport interface ClientConfig {\n providers: Record<string, ProviderConfig>;\n waterfall: WaterfallPreset;\n ai: AiConfig;\n campaigns?: Record<string, string>;\n}\n\nexport interface ProviderConfig {\n api_key: string;\n workspace_id?: string;\n account_id?: string;\n}\n\nexport interface WaterfallPreset {\n email: string[];\n phone: string[];\n}\n\nexport interface AiConfig {\n provider: AiProvider;\n api_key: string;\n model?: string;\n}\n\n// ─── Env Var Mapping ─────────────────────────────────────\n\nconst ENV_PROVIDER_MAP: Record<string, string> = {\n GTM_BETTERCONTACT_API_KEY: 'bettercontact',\n GTM_DISCO_API_KEY: 'disco',\n GTM_PROSPEO_API_KEY: 'prospeo',\n GTM_PLUSVIBE_API_KEY: 'plusvibe',\n GTM_HEYREACH_API_KEY: 'heyreach',\n GTM_ATTIO_API_KEY: 'attio',\n GTM_APOLLO_API_KEY: 'apollo',\n GTM_INSTANTLY_API_KEY: 'instantly',\n GTM_SMARTLEAD_API_KEY: 'smartlead',\n};\n\nconst ENV_WORKSPACE_MAP: Record<string, string> = {\n GTM_PLUSVIBE_WORKSPACE_ID: 'plusvibe',\n};\n\n// ─── Config Schema ──────────────────────────────────────\n\nconst providerConfigSchema = z.object({\n api_key: z.string(),\n workspace_id: z.string().optional(),\n account_id: z.string().optional(),\n});\n\nconst clientConfigSchema = z.object({\n providers: z.record(providerConfigSchema).optional(),\n waterfall: z\n .object({ email: z.array(z.string()).optional(), phone: z.array(z.string()).optional() })\n .optional(),\n ai: z\n .object({\n provider: z.enum(['anthropic', 'openai']),\n api_key: z.string(),\n model: z.string().optional(),\n })\n .optional(),\n campaigns: z.record(z.string()).optional(),\n});\n\nconst yamlConfigSchema = z.object({\n defaults: clientConfigSchema.optional(),\n default_client: z.string().optional(),\n clients: z.record(clientConfigSchema).optional(),\n});\n\n// ─── Loading ─────────────────────────────────────────────\n\nexport function loadConfig(yamlContent: string | null): GtmConfig {\n const envDefaults = buildEnvDefaults();\n\n if (!yamlContent) {\n return {\n defaults: envDefaults,\n default_client: 'default',\n clients: { default: {} },\n };\n }\n\n const rawParsed = parseYaml(yamlContent);\n const validated = yamlConfigSchema.safeParse(rawParsed);\n if (!validated.success) {\n const issues = validated.error.issues\n .map((e) => (e.path.length > 0 ? `${e.path.join('.')}: ${e.message}` : e.message))\n .join('; ');\n logWarn('config:load', `Config validation issues (using defaults): ${issues}`);\n return {\n defaults: envDefaults,\n default_client: 'default',\n clients: { default: {} },\n };\n }\n\n const parsed = validated.data;\n\n const defaults: ClientConfig = {\n providers: {\n ...envDefaults.providers,\n ...(parsed.defaults?.providers ?? {}),\n },\n waterfall: {\n email: parsed.defaults?.waterfall?.email ?? envDefaults.waterfall.email,\n phone: parsed.defaults?.waterfall?.phone ?? envDefaults.waterfall.phone,\n },\n ai: parsed.defaults?.ai ?? envDefaults.ai,\n campaigns: parsed.defaults?.campaigns,\n };\n\n // Zod allows partial waterfall (email without phone). Cast is safe because\n // resolveClient merges each field individually via ?. chaining + ?? defaults.\n const clients = (parsed.clients ?? {}) as Record<string, Partial<ClientConfig>>;\n\n return {\n defaults,\n default_client: parsed.default_client ?? 'default',\n clients: Object.keys(clients).length > 0 ? clients : { default: {} },\n };\n}\n\n// ─── Client Resolution ──────────────────────────────────\n\nexport function resolveClient(config: GtmConfig, name: string): ClientConfig {\n const clientOverrides = config.clients[name];\n if (clientOverrides === undefined) {\n throw new Error(\n `Unknown client: \"${name}\". Available: ${Object.keys(config.clients).join(', ')}`\n );\n }\n\n return {\n providers: {\n ...config.defaults.providers,\n ...(clientOverrides.providers ?? {}),\n },\n waterfall: {\n email: clientOverrides.waterfall?.email ?? config.defaults.waterfall.email,\n phone: clientOverrides.waterfall?.phone ?? config.defaults.waterfall.phone,\n },\n ai: clientOverrides.ai ?? config.defaults.ai,\n campaigns: {\n ...config.defaults.campaigns,\n ...(clientOverrides.campaigns ?? {}),\n },\n };\n}\n\n// ─── Helpers ─────────────────────────────────────────────\n\nfunction buildEnvDefaults(): ClientConfig {\n const providers: Record<string, ProviderConfig> = {};\n\n for (const [envKey, providerName] of Object.entries(ENV_PROVIDER_MAP)) {\n const apiKey = process.env[envKey];\n if (apiKey) {\n providers[providerName] = { api_key: apiKey };\n }\n }\n\n for (const [envKey, providerName] of Object.entries(ENV_WORKSPACE_MAP)) {\n const value = process.env[envKey];\n if (value && providers[providerName]) {\n providers[providerName].workspace_id = value;\n }\n }\n\n const aiApiKey = process.env.GTM_ANTHROPIC_API_KEY ?? process.env.GTM_OPENAI_API_KEY ?? '';\n const aiProvider: AiProvider =\n process.env.GTM_OPENAI_API_KEY && !process.env.GTM_ANTHROPIC_API_KEY ? 'openai' : 'anthropic';\n\n return {\n providers,\n waterfall: { email: [], phone: [] },\n ai: { provider: aiProvider, api_key: aiApiKey },\n };\n}\n","/** Constants. Shared union types and version for @mas/mcp.\n * Constraint: Pure types and constants. No runtime logic.\n * Tool names are derived from validation.ts (single source of truth). */\n\n// ─── Version ──────────────────────────────────────────────\n\nexport const SERVER_VERSION = '0.1.0';\n\n// ─── Capabilities ────────────────────────────────────────\n\nexport type Capability =\n | 'find_companies'\n | 'find_people'\n | 'enrich_email'\n | 'enrich_phone'\n | 'verify_email'\n | 'verify_phone'\n | 'extract_linkedin'\n | 'extract_web'\n | 'campaign_email'\n | 'outreach_linkedin'\n | 'crm_read'\n | 'crm_write';\n\n// ─── AI Providers ────────────────────────────────────────\n\nexport type AiProvider = 'anthropic' | 'openai';\n","/** SessionContext. Manages active client state for the MCP session.\n * Constraint: In-memory only. No persistence beyond session. Class-based for testability. */\n\nimport { resolveClient } from './config.js';\n\nimport type { GtmConfig, ClientConfig } from './config.js';\n\n// ─── Types ───────────────────────────────────────────────\n\nexport interface ActiveContext {\n clientName: string;\n config: ClientConfig;\n}\n\nexport interface SwitchResult {\n success: boolean;\n clientName?: string;\n error?: string;\n}\n\nexport interface ClientSummary {\n name: string;\n active: boolean;\n providerCount: number;\n}\n\n// ─── Session Context ─────────────────────────────────────\n\nexport class SessionContext {\n private activeClientName: string;\n private activeClientConfig: ClientConfig;\n private config: GtmConfig;\n\n constructor(config: GtmConfig) {\n this.config = config;\n this.activeClientName = config.default_client;\n this.activeClientConfig = resolveClient(config, config.default_client);\n }\n\n // ─── Queries ───────────────────────────────────────────\n\n getActiveContext(): ActiveContext {\n return {\n clientName: this.activeClientName,\n config: this.activeClientConfig,\n };\n }\n\n listClients(): ClientSummary[] {\n return Object.keys(this.config.clients).map((name) => {\n const resolved = resolveClient(this.config, name);\n return {\n name,\n active: name === this.activeClientName,\n providerCount: Object.keys(resolved.providers).length,\n };\n });\n }\n\n // ─── Mutations ─────────────────────────────────────────\n\n switchClient(name: string): SwitchResult {\n try {\n const resolved = resolveClient(this.config, name);\n this.activeClientName = name;\n this.activeClientConfig = resolved;\n return { success: true, clientName: name };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n addClient(name: string, overrides: Partial<ClientConfig>): void {\n this.config.clients[name] = overrides;\n }\n}\n","/** ProviderRegistry. Central registry for all configured providers.\n * Constraint: No side effects. Class-based for testability. */\n\nimport type { Capability } from '../constants.js';\nimport type { Provider, ProviderSummary } from './types.js';\n\n// ─── Registry ────────────────────────────────────────────\n\nexport class ProviderRegistry {\n private providers = new Map<string, Provider>();\n\n register(provider: Provider): void {\n this.providers.set(provider.name, provider);\n }\n\n get(name: string): Provider | undefined {\n return this.providers.get(name);\n }\n\n getForCapability(capability: Capability): Provider[] {\n return [...this.providers.values()].filter((p) => p.capabilities.includes(capability));\n }\n\n list(): ProviderSummary[] {\n return [...this.providers.values()].map((p) => ({\n name: p.name,\n capabilities: p.capabilities,\n }));\n }\n\n deregisterAll(): void {\n this.providers.clear();\n }\n}\n","/** BaseApiClient — shared base class for all third-party API clients.\n * Provides: timeout, error handling, typed responses, structured logging.\n * Constraint: No framework imports. Uses global fetch(). */\n\nimport { logError } from '@mas/logging';\n\n// ─── Error Class ─────────────────────────────────────────────────────────────\n\nexport class ApiClientError extends Error {\n constructor(\n public readonly clientName: string,\n public readonly statusCode: number,\n message: string,\n public readonly responseBody?: unknown\n ) {\n super(`[${clientName}] ${message}`);\n this.name = 'ApiClientError';\n }\n}\n\n// ─── Config ──────────────────────────────────────────────────────────────────\n\nexport interface ApiClientConfig {\n name: string;\n baseUrl: string;\n headers: Record<string, string>;\n timeoutMs?: number;\n}\n\n// ─── Base Client ─────────────────────────────────────────────────────────────\n\nexport abstract class BaseApiClient {\n protected readonly config: Required<ApiClientConfig>;\n\n constructor(config: ApiClientConfig) {\n this.config = {\n ...config,\n timeoutMs: config.timeoutMs ?? 30_000,\n };\n }\n\n protected async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.config.baseUrl}${path}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n try {\n const res = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...this.config.headers,\n ...init?.headers,\n },\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({}));\n throw new ApiClientError(\n this.config.name,\n res.status,\n body.error || body.message || `Request failed: ${res.status}`,\n body\n );\n }\n\n return (await res.json()) as T;\n } catch (err) {\n if (err instanceof ApiClientError) throw err;\n\n const message = err instanceof Error ? err.message : String(err);\n logError(`${this.config.name}:request`, err instanceof Error ? err : new Error(message), {\n url,\n method: init?.method ?? 'GET',\n });\n throw new ApiClientError(this.config.name, 0, message);\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n","/** PlusVibe cold email integration client.\n * Wraps the PlusVibe API (https://developer.plusvibe.ai).\n * Base URL: https://api.plusvibe.ai/api/v1 — Auth: x-api-key header.\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n PlusVibeLead,\n PlusVibeCampaign,\n CreateCampaignRequest,\n AddLeadsResponse,\n GetEmailsParams,\n ReplyToEmailParams,\n} from './types';\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst VARIABLE_UPDATE_MAX_RETRIES = 3;\nconst VARIABLE_UPDATE_BASE_DELAY_MS = 500;\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class PlusVibeClient extends BaseApiClient {\n private readonly workspaceId: string;\n\n constructor(apiKey: string, workspaceId: string) {\n super({\n name: 'PlusVibe',\n baseUrl: 'https://api.plusvibe.ai',\n headers: { 'x-api-key': apiKey },\n timeoutMs: 30_000,\n });\n this.workspaceId = workspaceId;\n }\n\n // ─── Campaigns ──────────────────────────────────────────────────────────────\n\n async listCampaigns(): Promise<PlusVibeCampaign[]> {\n const data = await this.request<Array<Record<string, unknown>>>(\n `/api/v1/campaign/list-all?workspace_id=${this.workspaceId}&limit=100`\n );\n return (data ?? []).map((c) => ({\n id: String(c.id || c._id || ''),\n name: String(c.camp_name || c.name || ''),\n status: String(c.status || 'draft').toLowerCase() as PlusVibeCampaign['status'],\n workspace_id: String(c.workspace_id || ''),\n created_at: String(c.created_at || ''),\n }));\n }\n\n async getCampaign(campaignId: string): Promise<PlusVibeCampaign | null> {\n try {\n const data = await this.request<Record<string, unknown>>(\n `/api/v1/campaign/get/name?workspace_id=${this.workspaceId}&campaign_id=${campaignId}`\n );\n if (!data) return null;\n return {\n id: String(data.id || data._id || campaignId),\n name: String(data.camp_name || data.name || ''),\n status: String(data.status || 'draft').toLowerCase() as PlusVibeCampaign['status'],\n created_at: String(data.created_at || ''),\n };\n } catch {\n return null;\n }\n }\n\n async createCampaign(data: CreateCampaignRequest): Promise<PlusVibeCampaign> {\n const result = await this.request<Record<string, unknown>>('/api/v1/campaign/add/campaign', {\n method: 'POST',\n body: JSON.stringify({ workspace_id: this.workspaceId, camp_name: data.camp_name }),\n });\n return {\n id: String(result.id || result._id || ''),\n name: String(result.camp_name || result.name || data.camp_name),\n status: 'draft',\n created_at: String(result.created_at || new Date().toISOString()),\n };\n }\n\n async activateCampaign(campaignId: string): Promise<void> {\n await this.request('/api/v1/campaign/activate', {\n method: 'POST',\n body: JSON.stringify({ workspace_id: this.workspaceId, campaign_id: campaignId }),\n });\n }\n\n async pauseCampaign(campaignId: string): Promise<void> {\n await this.request('/api/v1/campaign/pause', {\n method: 'POST',\n body: JSON.stringify({ workspace_id: this.workspaceId, campaign_id: campaignId }),\n });\n }\n\n async getCampaignSummary(campaignId: string): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(\n `/api/v1/analytics/campaign/summary?campaign_id=${campaignId}&workspace_id=${this.workspaceId}`\n );\n }\n\n // ─── Leads ──────────────────────────────────────────────────────────────────\n\n /**\n * Add leads to a campaign. Supports custom_variables inline.\n * Note: PlusVibe rejects 'company' and 'variables' legacy field names.\n */\n async addLeadsToCampaign(campaignId: string, leads: PlusVibeLead[]): Promise<AddLeadsResponse> {\n return this.request<AddLeadsResponse>('/api/v1/lead/add', {\n method: 'POST',\n body: JSON.stringify({\n workspace_id: this.workspaceId,\n campaign_id: campaignId,\n leads: leads.map(({ variables, company, linkedin_url, ...rest }) => ({\n ...rest,\n ...(company && !rest.company_name ? { company_name: company } : {}),\n ...(linkedin_url && !rest.linkedin_person_url\n ? { linkedin_person_url: linkedin_url }\n : {}),\n ...(variables && !rest.custom_variables ? { custom_variables: variables } : {}),\n })),\n }),\n });\n }\n\n /**\n * Add leads with custom variable updates (two-step: add then update variables).\n * PlusVibe separates lead creation from variable updates.\n */\n async addLeadsToCampaignWithVariables(\n campaignId: string,\n leads: PlusVibeLead[],\n options?: { failOnVariableError?: boolean; retryVariables?: boolean }\n ): Promise<{\n added: number;\n duplicates: number;\n variablesUpdated: number;\n variableErrors?: string[];\n }> {\n const { failOnVariableError = true, retryVariables = true } = options ?? {};\n\n // Step 1: Add leads without variables (API rejects them in the add call)\n const cleanedLeads = leads.map(\n ({ variables: _variables, custom_variables: _customVars, ...rest }) => rest\n );\n const addResult = await this.request<AddLeadsResponse>('/api/v1/lead/add', {\n method: 'POST',\n body: JSON.stringify({\n workspace_id: this.workspaceId,\n campaign_id: campaignId,\n leads: cleanedLeads,\n }),\n });\n\n // Step 2: Update variables for leads that have them\n let variablesUpdated = 0;\n const variableErrors: string[] = [];\n const leadsWithVars = leads.filter(\n (l) =>\n (l.variables && Object.keys(l.variables).length > 0) ||\n (l.custom_variables && Object.keys(l.custom_variables).length > 0)\n );\n\n for (let i = 0; i < leadsWithVars.length; i += 5) {\n const batch = leadsWithVars.slice(i, i + 5);\n const batchResults = await Promise.allSettled(\n batch.map(async (lead) => {\n const vars = lead.variables ?? lead.custom_variables ?? {};\n let lastError: string | null = null;\n const maxAttempts = retryVariables ? VARIABLE_UPDATE_MAX_RETRIES : 1;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n await this.updateLeadVariables(campaignId, lead.email, vars);\n return true;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n if (attempt < maxAttempts) {\n const delay = VARIABLE_UPDATE_BASE_DELAY_MS * Math.pow(2, attempt - 1);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n throw new Error(`${lead.email}: ${lastError}`);\n })\n );\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') variablesUpdated++;\n else variableErrors.push(result.reason?.message || String(result.reason));\n }\n\n if (i + 5 < leadsWithVars.length) {\n await new Promise((r) => setTimeout(r, VARIABLE_UPDATE_BASE_DELAY_MS));\n }\n }\n\n if (failOnVariableError && variableErrors.length > 0) {\n throw new Error(\n `Variable updates failed for ${variableErrors.length} lead(s): ${variableErrors.join('; ')}`\n );\n }\n\n return {\n added: addResult.leads_uploaded ?? addResult.added ?? 0,\n duplicates: addResult.duplicate_email_count ?? addResult.duplicates ?? 0,\n variablesUpdated,\n variableErrors: variableErrors.length > 0 ? variableErrors : undefined,\n };\n }\n\n /**\n * Update custom variables for a lead in a campaign.\n * Endpoint: POST /api/v1/lead/data/update\n */\n async updateLeadVariables(\n campaignId: string,\n email: string,\n variables: Record<string, unknown>\n ): Promise<void> {\n await this.request('/api/v1/lead/data/update', {\n method: 'POST',\n body: JSON.stringify({\n workspace_id: this.workspaceId,\n campaign_id: campaignId,\n email,\n variables,\n }),\n });\n }\n\n /**\n * Get leads from workspace, optionally filtered by campaign.\n */\n async getWorkspaceLeads(params?: {\n campaign_id?: string;\n limit?: number;\n offset?: number;\n }): Promise<{ data: PlusVibeLead[]; total: number }> {\n const query = new URLSearchParams({ workspace_id: this.workspaceId });\n if (params?.campaign_id) query.set('campaign_id', params.campaign_id);\n if (params?.limit !== undefined) query.set('limit', String(params.limit));\n if (params?.offset !== undefined) query.set('offset', String(params.offset));\n const result = await this.request<{ data: PlusVibeLead[]; total: number }>(\n `/api/v1/leads?${query.toString()}`\n );\n return result ?? { data: [], total: 0 };\n }\n\n // ─── Analytics ──────────────────────────────────────────────────────────────\n\n async getCampaignStats(campaignId: string): Promise<{\n emails_sent: number;\n emails_opened: number;\n emails_replied: number;\n emails_bounced: number;\n open_rate: number;\n reply_rate: number;\n }> {\n const query = new URLSearchParams({\n workspace_id: this.workspaceId,\n campaign_id: campaignId,\n });\n const raw = await this.request<Record<string, unknown>>(\n `/api/v1/analytics/campaign/summary?${query.toString()}`\n );\n\n const sent = Number((raw as Record<string, unknown>).contacted ?? 0);\n const opened = Number((raw as Record<string, unknown>).leads_who_read ?? 0);\n const replied = Number((raw as Record<string, unknown>).leads_who_replied ?? 0);\n const bounced = Number((raw as Record<string, unknown>).bounced ?? 0);\n\n return {\n emails_sent: sent,\n emails_opened: opened,\n emails_replied: replied,\n emails_bounced: bounced,\n open_rate: sent > 0 ? opened / sent : 0,\n reply_rate: sent > 0 ? replied / sent : 0,\n };\n }\n\n // ─── Webhooks ───────────────────────────────────────────────────────────────\n\n async createWebhook(url: string, events: string[]): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>('/api/v1/webhook/create', {\n method: 'POST',\n body: JSON.stringify({ workspace_id: this.workspaceId, url, event_types: events }),\n });\n }\n\n // ─── Unibox ──────────────────────────────────────────────────────────────────\n\n /**\n * Get emails from the unibox.\n * Note: Endpoint MUST use /api/v1/ prefix or API returns 200 with empty data.\n */\n async getEmails(params: GetEmailsParams = {}): Promise<Array<Record<string, unknown>>> {\n const query = new URLSearchParams({ workspace_id: this.workspaceId });\n if (params.lead) query.set('lead', params.lead);\n if (params.campaign_id) query.set('campaign_id', params.campaign_id);\n if (params.email_type) query.set('email_type', params.email_type);\n if (params.label) query.set('label', params.label);\n if (params.preview_only) query.set('preview_only', 'true');\n if (params.offset !== undefined) query.set('offset', String(params.offset));\n if (params.limit !== undefined) query.set('limit', String(params.limit));\n const result = await this.request<Array<Record<string, unknown>> | Record<string, unknown>>(\n `/api/v1/unibox/emails?${query.toString()}`\n );\n if (Array.isArray(result)) return result;\n if (\n result &&\n typeof result === 'object' &&\n 'data' in result &&\n Array.isArray((result as Record<string, unknown>).data)\n ) {\n return (result as Record<string, unknown>).data as Array<Record<string, unknown>>;\n }\n return [];\n }\n\n /**\n * Reply to an email thread.\n * Note: workspace_id MUST be a query param — putting it in the body causes 400.\n */\n async replyToEmail(\n params: ReplyToEmailParams\n ): Promise<{ success: boolean; message_id?: string }> {\n const result = await this.request<{ success: boolean; message_id?: string }>(\n `/api/v1/unibox/emails/reply?workspace_id=${this.workspaceId}`,\n {\n method: 'POST',\n body: JSON.stringify({\n reply_to_id: params.reply_to_id,\n body: params.body,\n ...(params.subject ? { subject: params.subject } : {}),\n ...(params.from ? { from: params.from } : {}),\n ...(params.to ? { to: params.to } : {}),\n ...(params.cc ? { cc: params.cc } : {}),\n ...(params.bcc ? { bcc: params.bcc } : {}),\n }),\n }\n );\n return result ?? { success: false };\n }\n}\n","/** PlusVibe API types.\n * Constraint: No runtime code — types only. */\n\n// ─── Lead Types ─────────────────────────────────────────────────────────────\n\nexport interface PlusVibeLead {\n email: string;\n first_name?: string;\n last_name?: string;\n company_name?: string;\n linkedin_person_url?: string;\n custom_variables?: Record<string, string>;\n variables?: Record<string, string>;\n labels?: string[];\n [key: string]: unknown;\n}\n\n// ─── Campaign Types ──────────────────────────────────────────────────────────\n\nexport interface PlusVibeCampaign {\n id: string;\n name: string;\n status: 'active' | 'paused' | 'draft' | 'completed';\n workspace_id?: string;\n created_at: string;\n [key: string]: unknown;\n}\n\n// ─── Request Types ───────────────────────────────────────────────────────────\n\nexport interface CreateCampaignRequest {\n camp_name: string;\n}\n\nexport interface AddLeadsResponse {\n status?: string;\n total_sent?: number;\n leads_uploaded?: number;\n added?: number;\n duplicate_email_count?: number;\n duplicates?: number;\n already_in_campaign?: number;\n invalid_email_count?: number;\n skipped?: number;\n remaining_in_plan?: number;\n overflowed_lead_count?: number;\n}\n\nexport interface GetEmailsParams {\n lead?: string;\n campaign_id?: string;\n email_type?: 'all' | 'received' | 'sent';\n label?: string;\n preview_only?: boolean;\n offset?: number;\n limit?: number;\n}\n\nexport interface ReplyToEmailParams {\n reply_to_id: string;\n subject?: string;\n body: string;\n from?: string;\n to?: string;\n cc?: string;\n bcc?: string;\n}\n\n// ─── Variable Name Constants ────────────────────────────────────────────────\n// PlusVibe auto-prefixes with 'custom_' for templates.\n// Send 'first_name', template uses '{{custom_first_name}}'.\n\nexport const PLUSVIBE_VARIABLES = {\n FIRST_NAME: 'first_name',\n FOLLOWER_COUNT: 'follower_count',\n POST_SUMMARY: 'post_summary',\n ENGAGEMENT_RATE: 'engagment_rate', // intentional typo to match existing templates\n COMPANY_NAME: 'company_name',\n LINKEDIN_URL: 'linkedin_url',\n REPORT_URL: 'report_url',\n} as const;\n","/** HeyReach integration client. Manages LinkedIn outreach campaigns via HeyReach API.\n * Base URL: https://api.heyreach.io/api/public — Auth: X-API-KEY header.\n * Constraint: No framework imports. Uses BaseApiClient. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n HeyReachCampaign,\n HeyReachContact,\n HeyReachAddLeadsResponse,\n HeyReachLeadStatus,\n HeyReachAnalytics,\n} from './types';\n\n// ─── Internal Types ───────────────────────────────────────────────────────────\n\ninterface HeyReachCampaignListResponse {\n items?: HeyReachCampaign[];\n [key: string]: unknown;\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class HeyReachClient extends BaseApiClient {\n constructor(apiKey: string) {\n super({\n name: 'HeyReach',\n baseUrl: 'https://api.heyreach.io/api/public',\n headers: { 'X-API-KEY': apiKey },\n timeoutMs: 15_000,\n });\n }\n\n // ─── Campaigns ───────────────────────────────────────────────────────────\n\n /**\n * List all campaigns (up to 100).\n * POST /campaign/GetAll with pagination body.\n */\n async listCampaigns(): Promise<HeyReachCampaign[]> {\n const result = await this.request<HeyReachCampaignListResponse>('/campaign/GetAll', {\n method: 'POST',\n body: JSON.stringify({ offset: 0, limit: 100 }),\n });\n\n return result.items ?? (Array.isArray(result) ? (result as HeyReachCampaign[]) : []);\n }\n\n /**\n * Get a single campaign by ID.\n * GET /campaign/GetById?campaignId={id}\n */\n async getCampaign(campaignId: number): Promise<HeyReachCampaign> {\n return this.request<HeyReachCampaign>(`/campaign/GetById?campaignId=${campaignId}`);\n }\n\n /**\n * Get overall analytics for a campaign.\n * POST /stats/GetOverall\n */\n async getCampaignAnalytics(campaignId: number): Promise<HeyReachAnalytics> {\n return this.request<HeyReachAnalytics>('/stats/GetOverall', {\n method: 'POST',\n body: JSON.stringify({ campaignId }),\n });\n }\n\n /**\n * Pause an active campaign.\n * POST /campaign/Pause\n */\n async pauseCampaign(campaignId: number): Promise<void> {\n await this.request<unknown>('/campaign/Pause', {\n method: 'POST',\n body: JSON.stringify({ campaignId }),\n });\n }\n\n /**\n * Resume a paused campaign.\n * POST /campaign/Resume\n */\n async resumeCampaign(campaignId: number): Promise<void> {\n await this.request<unknown>('/campaign/Resume', {\n method: 'POST',\n body: JSON.stringify({ campaignId }),\n });\n }\n\n // ─── Leads ───────────────────────────────────────────────────────────────\n\n /**\n * Add contacts to a campaign.\n * POST /campaign/AddLeadsToCampaign — max 100 contacts per call.\n * NOTE: Do NOT use AddLeadsToListV2 — it returns 404.\n */\n async addContactsToCampaign(\n campaignId: number,\n contacts: HeyReachContact[]\n ): Promise<HeyReachAddLeadsResponse> {\n return this.request<HeyReachAddLeadsResponse>('/campaign/AddLeadsToCampaign', {\n method: 'POST',\n body: JSON.stringify({\n campaignId,\n leadList: contacts.map((c) => ({\n linkedInUrl: c.linkedInUrl,\n firstName: c.firstName ?? '',\n lastName: c.lastName ?? '',\n customUserFields: c.customUserFields ?? [],\n })),\n }),\n });\n }\n\n /**\n * Get the status of a lead in a campaign.\n * POST /campaign/GetLeadStatus\n */\n async getLeadStatus(campaignId: number, email: string): Promise<HeyReachLeadStatus> {\n return this.request<HeyReachLeadStatus>('/campaign/GetLeadStatus', {\n method: 'POST',\n body: JSON.stringify({ campaignId, email }),\n });\n }\n\n /**\n * Add leads to a list (for exclude lists, etc.).\n * Uses the same AddLeadsToCampaign endpoint with a listId.\n * POST /AddLeadsToCampaign\n */\n async addLeadsToList(\n listId: number,\n leads: Array<{\n profileUrl: string;\n firstName?: string;\n lastName?: string;\n }>\n ): Promise<void> {\n await this.request<unknown>('/AddLeadsToCampaign', {\n method: 'POST',\n body: JSON.stringify({\n listId,\n leads: leads.map((l) => ({\n profileUrl: l.profileUrl,\n firstName: l.firstName ?? '',\n lastName: l.lastName ?? '',\n })),\n }),\n });\n }\n\n /**\n * Stop a lead in a specific campaign.\n * POST /StopLeadInCampaign\n */\n async stopLeadInCampaign(\n campaignId: number,\n leadUrl: string,\n leadMemberId?: string\n ): Promise<void> {\n await this.request<unknown>('/StopLeadInCampaign', {\n method: 'POST',\n body: JSON.stringify({\n campaignId,\n leadUrl,\n ...(leadMemberId ? { leadMemberId } : {}),\n }),\n });\n }\n}\n","/** Instantly cold email integration client.\n * Wraps the Instantly v2 API (https://api.instantly.ai/api/v2).\n * Base URL: https://api.instantly.ai/api/v2 — Auth: Bearer token header.\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n InstantlyCampaign,\n InstantlyAnalytics,\n InstantlyLead,\n InstantlyAddLeadsResponse,\n InstantlyListResponse,\n} from './types';\n\n// ─── Constants ──────────────────────────────────────────────────────────────\n\nconst MAX_LEADS_PER_REQUEST = 1000;\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class InstantlyClient extends BaseApiClient {\n constructor(apiKey: string) {\n super({\n name: 'Instantly',\n baseUrl: 'https://api.instantly.ai/api/v2',\n headers: { Authorization: `Bearer ${apiKey}` },\n timeoutMs: 30_000,\n });\n }\n\n // ─── Campaigns ──────────────────────────────────────────────────────────────\n\n /**\n * List all campaigns with cursor-based pagination.\n * GET /campaigns?limit=100&starting_after={cursor}\n */\n async listCampaigns(): Promise<InstantlyCampaign[]> {\n const allCampaigns: InstantlyCampaign[] = [];\n let cursor: string | undefined;\n\n do {\n const query = new URLSearchParams({ limit: '100' });\n if (cursor) query.set('starting_after', cursor);\n\n const page = await this.request<InstantlyListResponse>(`/campaigns?${query.toString()}`);\n\n allCampaigns.push(...(page.items ?? []));\n cursor = page.next_starting_after ?? undefined;\n } while (cursor);\n\n return allCampaigns;\n }\n\n /**\n * Get analytics for a specific campaign.\n * GET /campaigns/analytics?id={campaign_id}\n * Returns an array — we return the first item for the requested campaign.\n */\n async getCampaignAnalytics(campaignId: string): Promise<InstantlyAnalytics> {\n const data = await this.request<InstantlyAnalytics[]>(\n `/campaigns/analytics?id=${encodeURIComponent(campaignId)}`\n );\n\n const match = (data ?? []).find((a) => a.campaign_id === campaignId);\n if (!match) {\n return {\n campaign_id: campaignId,\n campaign_name: '',\n leads_count: 0,\n contacted_count: 0,\n emails_sent_count: 0,\n open_count: 0,\n reply_count: 0,\n bounced_count: 0,\n unsubscribed_count: 0,\n link_click_count: 0,\n };\n }\n\n return match;\n }\n\n /**\n * Activate a campaign.\n * POST /campaigns/{campaign_id}/activate\n */\n async activateCampaign(campaignId: string): Promise<void> {\n await this.request<unknown>(`/campaigns/${encodeURIComponent(campaignId)}/activate`, {\n method: 'POST',\n });\n }\n\n /**\n * Pause a campaign.\n * POST /campaigns/{campaign_id}/pause\n */\n async pauseCampaign(campaignId: string): Promise<void> {\n await this.request<unknown>(`/campaigns/${encodeURIComponent(campaignId)}/pause`, {\n method: 'POST',\n });\n }\n\n // ─── Leads ────────────────────────────────────────────────────────────────\n\n /**\n * Add leads to a campaign. Automatically batches in chunks of 1000.\n * POST /leads/add\n */\n async addLeadsToCampaign(\n campaignId: string,\n leads: InstantlyLead[]\n ): Promise<InstantlyAddLeadsResponse> {\n if (leads.length <= MAX_LEADS_PER_REQUEST) {\n return this.request<InstantlyAddLeadsResponse>('/leads/add', {\n method: 'POST',\n body: JSON.stringify({\n leads,\n campaign_id: campaignId,\n skip_if_in_workspace: false,\n skip_if_in_campaign: false,\n }),\n });\n }\n\n // Batch large requests\n let lastResponse: InstantlyAddLeadsResponse = { status: 'ok' };\n for (let i = 0; i < leads.length; i += MAX_LEADS_PER_REQUEST) {\n const batch = leads.slice(i, i + MAX_LEADS_PER_REQUEST);\n lastResponse = await this.request<InstantlyAddLeadsResponse>('/leads/add', {\n method: 'POST',\n body: JSON.stringify({\n leads: batch,\n campaign_id: campaignId,\n skip_if_in_workspace: false,\n skip_if_in_campaign: false,\n }),\n });\n }\n\n return lastResponse;\n }\n}\n","/** Instantly API types.\n * Constraint: No runtime code — types only. */\n\n// ─── Status ─────────────────────────────────────────────────────────────────\n\n/** Instantly campaign status codes. 0=Draft, 1=Active, 2=Paused, 3=Completed, 4=Scheduled. */\nexport type InstantlyCampaignStatus = 0 | 1 | 2 | 3 | 4;\n\nexport const INSTANTLY_STATUS_LABELS: Record<InstantlyCampaignStatus, string> = {\n 0: 'draft',\n 1: 'active',\n 2: 'paused',\n 3: 'completed',\n 4: 'scheduled',\n} as const;\n\n// ─── Campaign Types ─────────────────────────────────────────────────────────\n\nexport interface InstantlyCampaign {\n id: string;\n name: string;\n status: InstantlyCampaignStatus;\n [key: string]: unknown;\n}\n\n// ─── Analytics Types ────────────────────────────────────────────────────────\n\nexport interface InstantlyAnalytics {\n campaign_id: string;\n campaign_name: string;\n leads_count: number;\n contacted_count: number;\n emails_sent_count: number;\n open_count: number;\n reply_count: number;\n bounced_count: number;\n unsubscribed_count: number;\n link_click_count: number;\n}\n\n// ─── Lead Types ─────────────────────────────────────────────────────────────\n\nexport interface InstantlyLead {\n email: string;\n first_name?: string;\n last_name?: string;\n company_name?: string;\n custom_variables?: Record<string, string>;\n}\n\n// ─── Request/Response Types ─────────────────────────────────────────────────\n\nexport interface InstantlyAddLeadsRequest {\n leads: InstantlyLead[];\n campaign_id: string;\n skip_if_in_workspace?: boolean;\n skip_if_in_campaign?: boolean;\n}\n\nexport interface InstantlyAddLeadsResponse {\n status: string;\n [key: string]: unknown;\n}\n\nexport interface InstantlyListResponse {\n items: InstantlyCampaign[];\n next_starting_after?: string;\n}\n","/** Enrichment waterfall client.\n * Orchestrates email finding across multiple providers in priority order.\n * Returns best result above minConfidence, or best low-confidence result.\n * Constraint: No framework imports. Attempts array always populated for observability. */\n\nimport { logError, logInfo } from '@mas/logging';\nimport type {\n EnrichmentClientOptions,\n EnrichmentResult,\n EnrichmentAttempt,\n EmailFinderAdapter,\n EmailFinderParams,\n EmailFinderResult,\n EmailValidatorAdapter,\n} from './types';\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst DEFAULT_MIN_CONFIDENCE = 70;\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class EnrichmentClient {\n private readonly finders: EmailFinderAdapter[];\n private readonly validator: EmailValidatorAdapter | null;\n private readonly minConfidence: number;\n\n constructor(options: EnrichmentClientOptions) {\n this.finders = options.finders;\n this.validator = options.validator ?? null;\n this.minConfidence = options.minConfidence ?? DEFAULT_MIN_CONFIDENCE;\n }\n\n // ─── Find Email ──────────────────────────────────────────────────────────\n\n async findEmail(params: EmailFinderParams): Promise<EnrichmentResult | null> {\n const attempts: EnrichmentAttempt[] = [];\n let bestLowConfidence: EmailFinderResult | null = null;\n\n for (const finder of this.finders) {\n if (!finder.isConfigured()) {\n attempts.push({\n provider: finder.name,\n status: 'skipped',\n durationMs: 0,\n });\n continue;\n }\n\n const start = Date.now();\n try {\n const result = await finder.findEmail(params);\n const durationMs = Date.now() - start;\n\n if (!result) {\n attempts.push({ provider: finder.name, status: 'not_found', durationMs });\n continue;\n }\n\n if (result.confidence >= this.minConfidence) {\n attempts.push({\n provider: finder.name,\n status: 'success',\n confidence: result.confidence,\n email: result.email,\n durationMs,\n });\n\n return {\n email: result.email,\n confidence: result.confidence,\n provider: result.provider,\n verified: true,\n attempts,\n };\n }\n\n // Below threshold — track as low confidence, keep as fallback\n attempts.push({\n provider: finder.name,\n status: 'low_confidence',\n confidence: result.confidence,\n email: result.email,\n durationMs,\n });\n\n if (!bestLowConfidence || result.confidence > bestLowConfidence.confidence) {\n bestLowConfidence = result;\n }\n } catch (err) {\n const durationMs = Date.now() - start;\n const message = err instanceof Error ? err.message : String(err);\n logError(`Enrichment:${finder.name}`, err instanceof Error ? err : new Error(message));\n attempts.push({ provider: finder.name, status: 'error', error: message, durationMs });\n }\n }\n\n // All high-confidence attempts failed — return best low-confidence if available\n if (bestLowConfidence) {\n logInfo(\n 'Enrichment:fallback',\n `Using low-confidence result from ${bestLowConfidence.provider}`,\n {\n confidence: bestLowConfidence.confidence,\n }\n );\n return {\n email: bestLowConfidence.email,\n confidence: bestLowConfidence.confidence,\n provider: bestLowConfidence.provider,\n verified: false,\n attempts,\n };\n }\n\n return null;\n }\n\n // ─── Verify Email ────────────────────────────────────────────────────────\n\n async verifyEmail(email: string): Promise<{\n valid: boolean;\n provider: string;\n details?: Record<string, unknown>;\n }> {\n if (!this.validator?.isConfigured()) {\n return { valid: true, provider: 'none', details: { reason: 'no validator configured' } };\n }\n\n const result = await this.validator.validateEmail(email);\n return {\n valid: result.valid,\n provider: result.provider,\n details: { status: result.status },\n };\n }\n}\n","/** LeadMagic email finder adapter.\n * API: POST https://api.leadmagic.io/v1/people/email-finder\n * Auth: X-API-Key header.\n * Constraint: Internal adapter — not exported from package. */\n\nimport { logError } from '@mas/logging';\nimport type { EmailFinderAdapter, EmailFinderParams, EmailFinderResult } from '../types';\n\nexport class LeadMagicAdapter implements EmailFinderAdapter {\n readonly name = 'leadmagic' as const;\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n isConfigured(): boolean {\n return this.apiKey.length > 0;\n }\n\n async findEmail(params: EmailFinderParams): Promise<EmailFinderResult | null> {\n const domain = params.domain ?? this.extractDomain(params.company);\n if (!domain) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch('https://api.leadmagic.io/v1/people/email-finder', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-API-Key': this.apiKey,\n },\n body: JSON.stringify({\n first_name: params.firstName,\n last_name: params.lastName,\n domain,\n }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n logError('LeadMagic:findEmail', new Error(`HTTP ${res.status}`), { domain });\n return null;\n }\n\n const data = (await res.json()) as { email?: string | null; status?: string };\n if (!data.email) return null;\n\n return {\n email: data.email,\n confidence: this.mapConfidence(data.status),\n provider: 'leadmagic',\n };\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private mapConfidence(status?: string): number {\n switch (status) {\n case 'valid':\n return 95;\n case 'valid_catch_all':\n return 80;\n case 'catch_all':\n return 60;\n default:\n return 50;\n }\n }\n\n private extractDomain(company: string): string | undefined {\n const cleaned = company.toLowerCase().replace(/[^a-z0-9]/g, '');\n return cleaned ? `${cleaned}.com` : undefined;\n }\n}\n","/** Prospeo email finder adapter.\n * API: POST https://api.prospeo.io/enrich-person\n * Auth: X-KEY header.\n * Constraint: Internal adapter — not exported from package. */\n\nimport { logError } from '@mas/logging';\nimport type { EmailFinderAdapter, EmailFinderParams, EmailFinderResult } from '../types';\n\nexport class ProspeoAdapter implements EmailFinderAdapter {\n readonly name = 'prospeo' as const;\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n isConfigured(): boolean {\n return this.apiKey.length > 0;\n }\n\n async findEmail(params: EmailFinderParams): Promise<EmailFinderResult | null> {\n const domain = params.domain ?? `${params.company.toLowerCase().replace(/[^a-z0-9]/g, '')}.com`;\n if (!params.firstName || !params.lastName || !domain) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch('https://api.prospeo.io/enrich-person', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-KEY': this.apiKey,\n },\n body: JSON.stringify({\n only_verified_email: true,\n data: {\n first_name: params.firstName,\n last_name: params.lastName,\n company_website: domain,\n ...(params.linkedinUrl ? { linkedin_url: params.linkedinUrl } : {}),\n },\n }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n logError('Prospeo:findEmail', new Error(`HTTP ${res.status}`), { domain });\n return null;\n }\n\n const data = (await res.json()) as {\n error?: boolean;\n person?: { email?: { email?: string; status?: string } };\n };\n\n if (data.error || !data.person?.email?.email) return null;\n\n return {\n email: data.person.email.email,\n confidence: data.person.email.status === 'verified' ? 95 : 70,\n provider: 'prospeo',\n };\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n","/** BlitzAPI email finder adapter.\n * API: POST https://api.blitz-api.ai/v2/enrichment/email\n * Auth: x-api-key header. Requires LinkedIn URL.\n * Constraint: Internal adapter — not exported from package. */\n\nimport { logError } from '@mas/logging';\nimport type { EmailFinderAdapter, EmailFinderParams, EmailFinderResult } from '../types';\n\nexport class BlitzAdapter implements EmailFinderAdapter {\n readonly name = 'blitz' as const;\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n isConfigured(): boolean {\n return this.apiKey.length > 0;\n }\n\n async findEmail(params: EmailFinderParams): Promise<EmailFinderResult | null> {\n if (!params.linkedinUrl) return null; // BlitzAPI requires LinkedIn URL\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch('https://api.blitz-api.ai/v2/enrichment/email', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: JSON.stringify({ person_linkedin_url: params.linkedinUrl }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n logError('BlitzAPI:findEmail', new Error(`HTTP ${res.status}`), {\n linkedinUrl: params.linkedinUrl,\n });\n return null;\n }\n\n const data = (await res.json()) as { found?: boolean; email?: string | null };\n if (!data.found || !data.email) return null;\n\n return {\n email: data.email,\n confidence: 90,\n provider: 'blitz',\n };\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n","/** ZeroBounce email validation adapter.\n * API: GET https://api.zerobounce.net/v2/validate?api_key=X&email=Y\n * Auth: api_key query parameter.\n * Constraint: Internal adapter — not exported from package. */\n\nimport { logError } from '@mas/logging';\nimport type { EmailValidatorAdapter, EmailValidationResult } from '../types';\n\nexport class ZeroBounceAdapter implements EmailValidatorAdapter {\n readonly name = 'zerobounce';\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n isConfigured(): boolean {\n return this.apiKey.length > 0;\n }\n\n async validateEmail(email: string): Promise<EmailValidationResult> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const url = `https://api.zerobounce.net/v2/validate?api_key=${encodeURIComponent(this.apiKey)}&email=${encodeURIComponent(email)}`;\n const res = await fetch(url, { signal: controller.signal });\n\n if (!res.ok) {\n logError('ZeroBounce:validateEmail', new Error(`HTTP ${res.status}`), { email });\n return { valid: true, status: 'unknown', provider: 'zerobounce' };\n }\n\n const data = (await res.json()) as { status?: string };\n\n switch (data.status) {\n case 'valid':\n return { valid: true, status: 'valid', provider: 'zerobounce' };\n case 'catch-all':\n return { valid: true, status: 'catch_all', provider: 'zerobounce' };\n case 'invalid':\n return { valid: false, status: 'invalid', provider: 'zerobounce' };\n default:\n return { valid: false, status: 'unknown', provider: 'zerobounce' };\n }\n } catch (err) {\n logError('ZeroBounce:validateEmail', err instanceof Error ? err : new Error(String(err)), {\n email,\n });\n return { valid: true, status: 'unknown', provider: 'zerobounce' };\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n","/** BounceBan email validation adapter.\n * API: GET https://api-waterfall.bounceban.com/v1/verify/single?email=X&timeout=80\n * Auth: Authorization header with API key.\n * Used as secondary validator for catch-all emails that ZeroBounce can't resolve.\n * Constraint: Internal adapter — not exported from package root. */\n\nimport { logError } from '@mas/logging';\nimport type { EmailValidatorAdapter, EmailValidationResult } from '../types';\n\n// ─── Adapter ────────────────────────────────────────────────────────────────\n\nexport class BouncebanAdapter implements EmailValidatorAdapter {\n readonly name = 'bounceban';\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n isConfigured(): boolean {\n return this.apiKey.length > 0;\n }\n\n async validateEmail(email: string): Promise<EmailValidationResult> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 80_000);\n try {\n const url = `https://api-waterfall.bounceban.com/v1/verify/single?email=${encodeURIComponent(email)}&timeout=80`;\n const res = await fetch(url, {\n headers: { Authorization: this.apiKey },\n signal: controller.signal,\n });\n\n if (res.status === 408) {\n // Timeout — can't determine, treat as unknown (valid)\n return { valid: true, status: 'unknown', provider: 'bounceban' };\n }\n\n if (!res.ok) {\n logError('Bounceban:validateEmail', new Error(`HTTP ${res.status}`), { email });\n return { valid: true, status: 'unknown', provider: 'bounceban' };\n }\n\n const data = (await res.json()) as { result?: string };\n\n // BounceBan results: deliverable | risky | undeliverable | unknown\n const result = data.result;\n const status =\n result === 'deliverable'\n ? 'valid'\n : result === 'undeliverable'\n ? 'invalid'\n : result === 'risky'\n ? 'catch_all'\n : 'unknown';\n\n return {\n valid: status === 'valid' || status === 'catch_all',\n status,\n provider: 'bounceban',\n };\n } catch (err) {\n logError('Bounceban:validateEmail', err instanceof Error ? err : new Error(String(err)), {\n email,\n });\n // If validation fails, assume valid (don't block pipeline)\n return { valid: true, status: 'unknown', provider: 'bounceban' };\n } finally {\n clearTimeout(timeout);\n }\n }\n}\n","/** Attio CRM integration client.\n * Merges gtm-system (sync, deals, tags, notes) + magnetlab (calls, meetings).\n * Base URL: https://api.attio.com/v2 — Auth: Bearer token.\n * Constraint: No framework imports. Uses BaseApiClient.\n * GOTCHAS: company not primary_company, {status:title} for deals,\n * tags are multiselect (PATCH replaces ALL), $contains filter syntax. */\n\nimport { BaseApiClient, ApiClientError } from '../base-client';\nimport { logWarn } from '@mas/logging';\nimport type {\n AttioPerson,\n AttioCompany,\n AttioDeal,\n AttioMeeting,\n AttioPersonInput,\n AttioCompanyInput,\n AttioDealInput,\n AttioSyncInput,\n AttioCallData,\n AttioMeetingInput,\n} from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class AttioClient extends BaseApiClient {\n constructor(apiKey: string) {\n super({\n name: 'Attio',\n baseUrl: 'https://api.attio.com/v2',\n headers: { Authorization: `Bearer ${apiKey}` },\n timeoutMs: 15_000,\n });\n }\n\n // ─── People ──────────────────────────────────────────────────────────────\n\n async findPersonByEmail(email: string): Promise<AttioPerson | null> {\n const { data } = await this.query<AttioPerson>('people', {\n email_addresses: { $contains: email },\n });\n return data[0] ?? null;\n }\n\n async findPersonByLinkedIn(url: string): Promise<AttioPerson | null> {\n const { data } = await this.query<AttioPerson>('people', { linkedin: { $contains: url } });\n return data[0] ?? null;\n }\n\n async createPerson(input: AttioPersonInput): Promise<AttioPerson> {\n const values = this.buildPersonValues(input);\n const res = await this.request<{ data: AttioPerson }>('/objects/people/records', {\n method: 'POST',\n body: JSON.stringify({ data: { values } }),\n });\n return res.data;\n }\n\n async updatePerson(recordId: string, input: Partial<AttioPersonInput>): Promise<AttioPerson> {\n const values = this.buildPersonValues(input);\n const res = await this.request<{ data: AttioPerson }>(`/objects/people/records/${recordId}`, {\n method: 'PATCH',\n body: JSON.stringify({ data: { values } }),\n });\n return res.data;\n }\n\n /**\n * Get a person record by Attio record ID.\n * Returns the full person record or null if not found.\n */\n async getPersonById(recordId: string): Promise<AttioPerson | null> {\n try {\n const res = await this.request<{ data: AttioPerson }>(`/objects/people/records/${recordId}`);\n return res.data;\n } catch (e) {\n if (e instanceof ApiClientError && e.statusCode === 404) return null;\n throw e;\n }\n }\n\n // ─── Companies ───────────────────────────────────────────────────────────\n\n async findCompany(name: string): Promise<AttioCompany | null> {\n const { data } = await this.query<AttioCompany>('companies', { name: { $contains: name } });\n return data[0] ?? null;\n }\n\n /**\n * Get a company record by Attio record ID.\n * Returns the full company record or null if not found.\n */\n async getCompanyById(recordId: string): Promise<AttioCompany | null> {\n try {\n const res = await this.request<{ data: AttioCompany }>(\n `/objects/companies/records/${recordId}`\n );\n return res.data;\n } catch (e) {\n if (e instanceof ApiClientError && e.statusCode === 404) return null;\n throw e;\n }\n }\n\n async createCompany(input: AttioCompanyInput): Promise<AttioCompany> {\n const res = await this.request<{ data: AttioCompany }>('/objects/companies/records', {\n method: 'POST',\n body: JSON.stringify({\n data: {\n values: {\n name: [{ value: input.name }],\n ...(input.domains ? { domains: input.domains.map((d) => ({ domain: d })) } : {}),\n },\n },\n }),\n });\n return res.data;\n }\n\n // ─── Deals ───────────────────────────────────────────────────────────────\n\n async createDeal(input: AttioDealInput): Promise<AttioDeal> {\n const values: Record<string, unknown[]> = {\n name: [{ value: input.name }],\n stage: [{ status: input.stage }], // status type, NOT option\n owner: [{ referenced_actor_type: 'workspace-member', referenced_actor_id: input.owner_id }],\n };\n if (input.associated_company) {\n values.associated_company = [input.associated_company];\n }\n if (input.associated_person) {\n values.associated_person = [input.associated_person];\n }\n\n try {\n const res = await this.request<{ data: AttioDeal }>('/objects/deals/records', {\n method: 'POST',\n body: JSON.stringify({ data: { values } }),\n });\n return res.data;\n } catch (err) {\n if (err instanceof ApiClientError && err.statusCode === 404) {\n logWarn('Attio:createDeal', 'Deals object not enabled in workspace');\n throw err;\n }\n throw err;\n }\n }\n\n async updateDealStage(recordId: string, stage: string): Promise<AttioDeal> {\n const res = await this.request<{ data: AttioDeal }>(`/objects/deals/records/${recordId}`, {\n method: 'PATCH',\n body: JSON.stringify({ data: { values: { stage: [{ status: stage }] } } }),\n });\n return res.data;\n }\n\n /**\n * Find deals associated with a person record.\n * Queries deals whose associated_person field references the given person ID.\n * Returns null if deals object is not enabled (404).\n */\n async findDealsByPerson(personRecordId: string): Promise<AttioDeal[] | null> {\n try {\n const res = await this.request<{ data: AttioDeal[] }>('/objects/deals/records/query', {\n method: 'POST',\n body: JSON.stringify({\n filter: {\n associated_person: { target_object: 'people', target_record_id: personRecordId },\n },\n }),\n });\n return res.data;\n } catch (err) {\n if (err instanceof ApiClientError && err.statusCode === 404) {\n logWarn('Attio:findDealsByPerson', 'Deals object not enabled in workspace');\n return null;\n }\n throw err;\n }\n }\n\n // ─── Tags ────────────────────────────────────────────────────────────────\n\n async ensureTagOptions(tags: string[]): Promise<void> {\n const existing = await this.listSelectOptions('people', 'tags');\n const existingTitles = new Set(existing.map((o) => o.title));\n\n for (const tag of tags) {\n if (!existingTitles.has(tag)) {\n await this.createSelectOption('people', 'tags', tag);\n }\n }\n }\n\n async setPersonTags(recordId: string, tags: string[]): Promise<void> {\n await this.request(`/objects/people/records/${recordId}`, {\n method: 'PATCH',\n body: JSON.stringify({\n data: { values: { tags: tags.map((t) => ({ option: t })) } },\n }),\n });\n }\n\n // ─── Sync ────────────────────────────────────────────────────────────────\n\n async syncContact(input: AttioSyncInput): Promise<AttioPerson> {\n let person = await this.findPersonByEmail(input.email);\n\n if (!person) {\n person = await this.createPerson({\n email_addresses: [input.email],\n first_name: input.firstName,\n last_name: input.lastName,\n linkedin: input.linkedinUrl,\n job_title: input.jobTitle,\n lead_source: input.leadSource,\n blueprint_url: input.blueprintUrl,\n });\n } else {\n person = await this.updatePerson(person.id.record_id, {\n first_name: input.firstName,\n last_name: input.lastName,\n linkedin: input.linkedinUrl,\n job_title: input.jobTitle,\n blueprint_url: input.blueprintUrl,\n });\n }\n\n if (input.tags?.length) {\n await this.ensureTagOptions(input.tags);\n await this.setPersonTags(person.id.record_id, input.tags);\n }\n\n return person;\n }\n\n // ─── Calls/Meetings ─────────────────────────────────────────────────────\n\n async trackCallAttendance(personId: string, callData: AttioCallData): Promise<void> {\n if (callData.notes) {\n await this.request('/notes', {\n method: 'POST',\n body: JSON.stringify({\n data: {\n parent_object: 'people',\n parent_record_id: personId,\n title: 'Call Notes',\n format: 'plaintext',\n content: [{ type: 'paragraph', children: [{ text: callData.notes }] }],\n },\n }),\n });\n }\n }\n\n async findOrCreateMeeting(params: AttioMeetingInput): Promise<AttioMeeting | null> {\n try {\n const res = await this.request<{ data: AttioMeeting }>('/meetings', {\n method: 'POST',\n body: JSON.stringify({\n data: {\n title: params.title,\n start_time: params.startTime,\n end_time: params.endTime,\n participants: params.participantEmails.map((e) => ({ email_address: e })),\n },\n }),\n });\n return res.data;\n } catch (err) {\n if (err instanceof ApiClientError && err.statusCode === 404) {\n logWarn('Attio:findOrCreateMeeting', 'Meetings object not enabled in workspace');\n return null;\n }\n throw err;\n }\n }\n\n // ─── Helpers ─────────────────────────────────────────────────────────────\n\n private async query<T = Record<string, unknown>>(\n object: string,\n filter: Record<string, unknown>\n ): Promise<{ data: T[] }> {\n return this.request(`/objects/${object}/records/query`, {\n method: 'POST',\n body: JSON.stringify({ filter }),\n });\n }\n\n private async listSelectOptions(\n object: string,\n attribute: string\n ): Promise<Array<{ title: string }>> {\n const res = await this.request<{ data: Array<{ title: string }> }>(\n `/objects/${object}/attributes/${attribute}/options`\n );\n return res.data;\n }\n\n private async createSelectOption(\n object: string,\n attribute: string,\n title: string\n ): Promise<void> {\n await this.request(`/objects/${object}/attributes/${attribute}/options`, {\n method: 'POST',\n body: JSON.stringify({ title }),\n });\n }\n\n private buildPersonValues(input: Partial<AttioPersonInput>): Record<string, unknown[]> {\n const values: Record<string, unknown[]> = {};\n if (input.email_addresses)\n values.email_addresses = input.email_addresses.map((e) => ({ email_address: e }));\n if (input.first_name)\n values.name = [{ first_name: input.first_name, last_name: input.last_name ?? '' }];\n if (input.linkedin) values.linkedin = [{ value: input.linkedin }];\n if (input.job_title) values.job_title = [{ value: input.job_title }];\n if (input.company) values.company = [input.company];\n if (input.lead_source) values.lead_source = [{ value: input.lead_source }];\n if (input.blueprint_url) values.blueprint_url = [{ value: input.blueprint_url }];\n return values;\n }\n}\n","/** Resend email platform client.\n * Wraps the Resend REST API (https://resend.com/docs/api-reference).\n * Base URL: https://api.resend.com — Auth: Bearer token.\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n ResendConfig,\n SendEmailParams,\n EmailResponse,\n BatchEmailResponse,\n Audience,\n AudienceListResponse,\n AddContactParams,\n UpdateContactParams,\n Contact,\n ContactListResponse,\n BroadcastParams,\n BroadcastResponse,\n EmailDetail,\n EmailListResponse,\n ResendDomain,\n DomainListResponse,\n ResendWebhookResponse,\n WebhookListResponse,\n LeadMagnetEmailParams,\n BlueprintEmailParams,\n DailyContentEmailParams,\n} from './types';\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class ResendClient extends BaseApiClient {\n constructor(config: ResendConfig) {\n super({\n name: 'Resend',\n baseUrl: 'https://api.resend.com',\n headers: { Authorization: `Bearer ${config.apiKey}` },\n timeoutMs: 30_000,\n });\n }\n\n // ─── Emails ─────────────────────────────────────────────────────────────\n\n /** Send a single email. */\n async sendEmail(params: SendEmailParams): Promise<EmailResponse> {\n const { replyTo, scheduledAt, ...rest } = params;\n const payload: Record<string, unknown> = { ...rest };\n if (replyTo) payload.reply_to = replyTo;\n if (scheduledAt) payload.scheduled_at = scheduledAt;\n\n return this.request('/emails', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /** Send batch emails (up to 100 at once). */\n async sendBatch(emails: SendEmailParams[]): Promise<BatchEmailResponse> {\n return this.request('/emails/batch', {\n method: 'POST',\n body: JSON.stringify(emails),\n });\n }\n\n // ─── Audiences ──────────────────────────────────────────────────────────\n\n /** Create a new audience. */\n async createAudience(name: string): Promise<Audience> {\n return this.request('/audiences', {\n method: 'POST',\n body: JSON.stringify({ name }),\n });\n }\n\n /** List all audiences. */\n async listAudiences(): Promise<AudienceListResponse> {\n return this.request('/audiences');\n }\n\n /** Get a specific audience. */\n async getAudience(audienceId: string): Promise<Audience> {\n return this.request(`/audiences/${audienceId}`);\n }\n\n /** Delete an audience. */\n async deleteAudience(audienceId: string): Promise<{ deleted: boolean }> {\n return this.request(`/audiences/${audienceId}`, { method: 'DELETE' });\n }\n\n // ─── Contacts ───────────────────────────────────────────────────────────\n\n /** Add a contact to an audience. */\n async addContact(audienceId: string, contact: AddContactParams): Promise<Contact> {\n const payload: Record<string, unknown> = { email: contact.email };\n if (contact.firstName !== undefined) payload.first_name = contact.firstName;\n if (contact.lastName !== undefined) payload.last_name = contact.lastName;\n if (contact.unsubscribed !== undefined) payload.unsubscribed = contact.unsubscribed;\n if (contact.data !== undefined) payload.data = contact.data;\n\n return this.request(`/audiences/${audienceId}/contacts`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /** Get all contacts in an audience. */\n async getContacts(audienceId: string): Promise<ContactListResponse> {\n return this.request(`/audiences/${audienceId}/contacts`);\n }\n\n /** Remove a contact from an audience. */\n async removeContact(audienceId: string, contactId: string): Promise<{ deleted: boolean }> {\n return this.request(`/audiences/${audienceId}/contacts/${contactId}`, { method: 'DELETE' });\n }\n\n /** Update a contact in an audience. */\n async updateContact(\n audienceId: string,\n contactId: string,\n updates: UpdateContactParams\n ): Promise<Contact> {\n const payload: Record<string, unknown> = {};\n if (updates.firstName !== undefined) payload.first_name = updates.firstName;\n if (updates.lastName !== undefined) payload.last_name = updates.lastName;\n if (updates.unsubscribed !== undefined) payload.unsubscribed = updates.unsubscribed;\n if (updates.data !== undefined) payload.data = updates.data;\n\n return this.request(`/audiences/${audienceId}/contacts/${contactId}`, {\n method: 'PATCH',\n body: JSON.stringify(payload),\n });\n }\n\n // ─── Broadcasts ─────────────────────────────────────────────────────────\n\n /**\n * Create a broadcast email for an audience.\n * Returns a broadcast ID — call sendBroadcast() to trigger delivery.\n * Supports {{{FIRST_NAME|fallback}}}, {{{LAST_NAME|fallback}}}, {{{EMAIL}}},\n * {{{RESEND_UNSUBSCRIBE_URL}}} in HTML/text body.\n */\n async createBroadcast(params: BroadcastParams): Promise<BroadcastResponse> {\n const payload: Record<string, unknown> = {\n segment_id: params.audienceId,\n from: params.from,\n subject: params.subject,\n };\n if (params.html) payload.html = params.html;\n if (params.text) payload.text = params.text;\n if (params.replyTo) payload.reply_to = params.replyTo;\n if (params.name) payload.name = params.name;\n\n return this.request('/broadcasts', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n /** Send a previously created broadcast. */\n async sendBroadcast(broadcastId: string, scheduledAt?: string): Promise<BroadcastResponse> {\n const payload: Record<string, unknown> = {};\n if (scheduledAt) payload.scheduled_at = scheduledAt;\n\n return this.request(`/broadcasts/${broadcastId}/send`, {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n }\n\n // ─── GTM Helper Methods ─────────────────────────────────────────────────\n\n /** Send lead magnet delivery email with styled HTML template. */\n async sendLeadMagnetEmail(params: LeadMagnetEmailParams): Promise<EmailResponse> {\n const greeting = params.firstName ? `Hi ${params.firstName},` : 'Hi there,';\n const html = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>\n<body style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;\">\n <p>${greeting}</p>\n <p>Thank you for your interest! Here's your download:</p>\n <h2 style=\"color: #1a1a1a; margin: 24px 0 16px;\">${params.leadMagnetTitle}</h2>\n <p style=\"margin: 24px 0;\">\n <a href=\"${params.downloadUrl}\" style=\"display: inline-block; background-color: #0066cc; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; font-weight: 500;\">Download Now</a>\n </p>\n <p style=\"color: #666; font-size: 14px;\">\n If the button doesn't work, copy and paste this link into your browser:<br>\n <a href=\"${params.downloadUrl}\" style=\"color: #0066cc;\">${params.downloadUrl}</a>\n </p>\n</body>\n</html>`;\n\n return this.sendEmail({\n from: params.from,\n to: params.to,\n subject: `Your download: ${params.leadMagnetTitle}`,\n html,\n replyTo: params.replyTo,\n });\n }\n\n /** Send blueprint report delivery email with styled HTML template. */\n async sendBlueprintEmail(params: BlueprintEmailParams): Promise<EmailResponse> {\n const greeting = params.firstName ? `Hi ${params.firstName},` : 'Hi there,';\n const html = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>\n<body style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;\">\n <p>${greeting}</p>\n <p>Your personalized LinkedIn Blueprint is ready! Based on a thorough analysis of your profile, we've put together a tailored report with actionable recommendations to strengthen your LinkedIn presence.</p>\n <p style=\"margin: 24px 0;\">\n <a href=\"${params.reportUrl}\" style=\"display: inline-block; background-color: #0066cc; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; font-weight: 500;\">View Your Blueprint</a>\n </p>\n <p style=\"color: #666; font-size: 14px;\">\n If the button doesn't work, copy and paste this link into your browser:<br>\n <a href=\"${params.reportUrl}\" style=\"color: #0066cc;\">${params.reportUrl}</a>\n </p>\n</body>\n</html>`;\n\n return this.sendEmail({\n from: params.from,\n to: params.to,\n subject: 'Your LinkedIn Blueprint Report is Ready',\n html,\n replyTo: params.replyTo,\n });\n }\n\n /** Send daily content digest email with styled HTML template. */\n async sendDailyContentEmail(params: DailyContentEmailParams): Promise<EmailResponse> {\n const greeting = params.firstName ? `Hi ${params.firstName},` : 'Hi there,';\n\n const contentHtml =\n params.contentItems.length > 0\n ? params.contentItems\n .map(\n (item) => `\n <div style=\"margin: 20px 0; padding: 16px; border: 1px solid #e5e5e5; border-radius: 8px;\">\n <h3 style=\"margin: 0 0 8px; color: #1a1a1a;\">\n <a href=\"${item.url}\" style=\"color: #1a1a1a; text-decoration: none;\">${item.title}</a>\n </h3>\n <p style=\"margin: 0; color: #666; font-size: 14px;\">${item.excerpt}</p>\n <p style=\"margin: 12px 0 0;\">\n <a href=\"${item.url}\" style=\"color: #0066cc; text-decoration: none; font-size: 14px;\">Read more →</a>\n </p>\n </div>`\n )\n .join('')\n : '<p style=\"color: #666;\">No new content today. Check back tomorrow!</p>';\n\n const html = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>\n<body style=\"font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; padding: 20px;\">\n <p>${greeting}</p>\n <p>Here's your daily content digest:</p>\n ${contentHtml}\n <hr style=\"border: none; border-top: 1px solid #e5e5e5; margin: 24px 0;\">\n <p style=\"color: #999; font-size: 12px;\">You're receiving this because you subscribed to our daily digest.</p>\n</body>\n</html>`;\n\n return this.sendEmail({\n from: params.from,\n to: params.to,\n subject: params.subject,\n html,\n replyTo: params.replyTo,\n });\n }\n\n // ─── Email Retrieval (monitoring) ───────────────────────────────────────\n\n /** Get a single email by ID — returns delivery status. */\n async getEmail(emailId: string): Promise<EmailDetail> {\n return this.request(`/emails/${emailId}`);\n }\n\n /** List sent emails (most recent first). */\n async listEmails(): Promise<EmailListResponse> {\n return this.request('/emails');\n }\n\n // ─── Domains (monitoring) ───────────────────────────────────────────────\n\n /** List all domains with verification status. */\n async listDomains(): Promise<DomainListResponse> {\n return this.request('/domains');\n }\n\n /** Get a single domain by ID. */\n async getDomain(domainId: string): Promise<ResendDomain> {\n return this.request(`/domains/${domainId}`);\n }\n\n // ─── Webhooks (management) ──────────────────────────────────────────────\n\n /** Register a webhook endpoint with Resend. */\n async createWebhook(url: string, events: string[]): Promise<ResendWebhookResponse> {\n return this.request('/webhooks', {\n method: 'POST',\n body: JSON.stringify({ url, events }),\n });\n }\n\n /** List registered webhooks. */\n async listWebhooks(): Promise<WebhookListResponse> {\n return this.request('/webhooks');\n }\n\n // ─── Connection Verification ────────────────────────────────────────────\n\n /** Verify connection for health checks. */\n async verifyConnection(): Promise<{ connected: boolean; error?: string }> {\n try {\n await this.listAudiences();\n return { connected: true };\n } catch (err) {\n return {\n connected: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n }\n}\n","/** Blueprint Generator API client.\n * Wraps the leadmagnet-backend intake API for submitting profiles and polling status.\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n BlueprintConfig,\n BlueprintIntakeRequest,\n BlueprintIntakeResponse,\n BlueprintProspectStatus,\n} from './types';\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class BlueprintGeneratorClient extends BaseApiClient {\n constructor(config: BlueprintConfig) {\n super({\n name: 'BlueprintGenerator',\n baseUrl: config.apiUrl,\n headers: {},\n timeoutMs: 30_000,\n });\n }\n\n /**\n * Submit a LinkedIn profile for Blueprint generation.\n * Returns prospect_id + report_url. Status 409 = prospect already exists.\n */\n async submit(data: BlueprintIntakeRequest): Promise<BlueprintIntakeResponse> {\n try {\n return await this.request<BlueprintIntakeResponse>('/api/intake', {\n method: 'POST',\n body: JSON.stringify(data),\n });\n } catch (err) {\n // Handle 409 Conflict — prospect already exists\n if (isApiClientError(err) && err.statusCode === 409) {\n const body = err.responseBody as Record<string, string> | undefined;\n return {\n success: true,\n prospect_id: body?.existing_prospect_id,\n report_url: body?.report_url,\n status: 'existing',\n message: 'Prospect already exists',\n };\n }\n throw err;\n }\n }\n\n /**\n * Poll the status of a prospect's Blueprint generation.\n * Returns current processing step and completion status.\n */\n async pollStatus(prospectId: string): Promise<BlueprintProspectStatus> {\n return this.request<BlueprintProspectStatus>(`/api/prospect/${prospectId}`);\n }\n}\n\n// ─── Slug Utilities ─────────────────────────────────────────────────────────\n\n/**\n * Generate a unique slug for a prospect's blueprint page.\n * Format: name-slug-xxxx (lowercase, no special chars, 4-char suffix).\n * Example: \"Grant Hushek\" -> \"grant-hushek-meqz\"\n */\nexport function generateBlueprintSlug(fullName: string): string {\n const nameSlug = fullName\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n const chars = 'abcdefghjkmnpqrstuvwxyz23456789';\n const suffix = Array.from(\n { length: 4 },\n () => chars[Math.floor(Math.random() * chars.length)]\n ).join('');\n\n return `${nameSlug}-${suffix}`;\n}\n\n/**\n * Determine recommended offer based on monthly income.\n * Default -> gc ($3,500). Only explicitly low revenue -> bootcamp ($997).\n */\nexport function recommendOfferFromIncome(monthlyIncome: string | null): 'bootcamp' | 'gc' {\n if (!monthlyIncome) return 'gc';\n const income = monthlyIncome.trim().toLowerCase();\n const bootcampPatterns = ['under $5k', '$5k-$10k'];\n if (bootcampPatterns.some((p) => income.includes(p))) {\n return 'bootcamp';\n }\n return 'gc';\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction isApiClientError(err: unknown): err is { statusCode: number; responseBody?: unknown } {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'statusCode' in err &&\n typeof (err as { statusCode: unknown }).statusCode === 'number'\n );\n}\n","/** Apify LinkedIn scraper client.\n * Wraps the Apify REST API for LinkedIn post and profile scraping.\n * Base URL: https://api.apify.com/v2 — Auth: token query parameter.\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n ApifyConfig,\n ApifyLinkedInPost,\n ApifyLinkedInProfile,\n ApifyRunResponse,\n ApifyPostScrapeOptions,\n ApifyProfileScrapeOptions,\n ApifySyncScrapeOptions,\n} from './types';\n\n// ─── Constants ──────────────────────────────────────────────────────────────\n\nconst DEFAULT_POST_ACTOR_ID = 'supreme_coder~linkedin-post';\nconst DEFAULT_PROFILE_ACTOR_ID = 'supreme_coder~linkedin-profile-scraper';\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class ApifyClient extends BaseApiClient {\n private readonly token: string;\n private readonly postActorId: string;\n private readonly profileActorId: string;\n\n constructor(config: ApifyConfig) {\n super({\n name: 'Apify',\n baseUrl: 'https://api.apify.com/v2',\n headers: {},\n timeoutMs: 30_000,\n });\n this.token = config.token;\n this.postActorId = config.postActorId ?? DEFAULT_POST_ACTOR_ID;\n this.profileActorId = config.profileActorId ?? DEFAULT_PROFILE_ACTOR_ID;\n }\n\n // ─── Post Scraping ──────────────────────────────────────────────────────\n\n /**\n * Start an async post scraping run.\n * Returns the run ID and dataset ID for later retrieval.\n */\n async triggerPostRun(\n urls: string[],\n opts?: ApifyPostScrapeOptions\n ): Promise<{ runId: string; datasetId: string }> {\n const result = await this.request<ApifyRunResponse>(\n `/acts/${this.postActorId}/runs?token=${this.token}`,\n {\n method: 'POST',\n body: JSON.stringify({\n urls,\n limitPerSource: opts?.limitPerSource ?? 1,\n deepScrape: opts?.deepScrape ?? true,\n }),\n }\n );\n\n return {\n runId: result.data.id,\n datasetId: result.data.defaultDatasetId,\n };\n }\n\n /**\n * Poll a run until it finishes, then fetch dataset items.\n * Throws on failure, timeout, or abort.\n */\n async waitForRunResults(\n runId: string,\n maxWaitMs: number = 300_000,\n pollIntervalMs: number = 5_000\n ): Promise<ApifyLinkedInPost[]> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n const statusResult = await this.request<{\n data: { status: string; defaultDatasetId: string };\n }>(`/actor-runs/${runId}?token=${this.token}`);\n\n const status = statusResult.data.status;\n\n if (status === 'SUCCEEDED') {\n return this.request<ApifyLinkedInPost[]>(\n `/datasets/${statusResult.data.defaultDatasetId}/items?token=${this.token}&format=json`\n );\n }\n\n if (status === 'FAILED' || status === 'ABORTED' || status === 'TIMED-OUT') {\n throw new Error(`Actor run ${status}`);\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new Error('Actor run timed out waiting');\n }\n\n /**\n * Scrape posts synchronously (blocks until complete, returns items).\n * Good for small batches.\n */\n async scrapePostsSync(\n urls: string[],\n opts?: ApifySyncScrapeOptions\n ): Promise<ApifyLinkedInPost[]> {\n const timeout = opts?.timeoutSecs ?? 300;\n return this.request<ApifyLinkedInPost[]>(\n `/acts/${this.postActorId}/run-sync-get-dataset-items?token=${this.token}&timeout=${timeout}`,\n {\n method: 'POST',\n body: JSON.stringify({\n urls,\n limitPerSource: opts?.limitPerSource ?? 1,\n deepScrape: opts?.deepScrape ?? true,\n }),\n }\n );\n }\n\n // ─── Profile Scraping ───────────────────────────────────────────────────\n\n /**\n * Scrape full LinkedIn profile data (location, headline, experience, etc.).\n * Uses the profile scraper actor which requires {url} object format.\n */\n async scrapeProfilesSync(\n urls: string[],\n opts?: ApifyProfileScrapeOptions\n ): Promise<ApifyLinkedInProfile[]> {\n const timeout = opts?.timeoutSecs ?? 120;\n return this.request<ApifyLinkedInProfile[]>(\n `/acts/${this.profileActorId}/run-sync-get-dataset-items?token=${this.token}&timeout=${timeout}`,\n {\n method: 'POST',\n body: JSON.stringify({\n urls: urls.map((url) => ({ url })),\n }),\n }\n );\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/** Bright Data LinkedIn scraper client.\n * Wraps the Bright Data Web Scraper API for LinkedIn data extraction.\n * Base URL: https://api.brightdata.com/datasets/v3 — Auth: Bearer token.\n * Docs: https://docs.brightdata.com/scraping-automation/web-data-apis\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n BrightDataConfig,\n ScrapeLinkedInRequest,\n ScrapeSearchUrlRequest,\n BrightDataSnapshotResponse,\n BrightDataJobStatus,\n BrightDataLinkedInPost,\n} from './types';\n\n// ─── Constants ──────────────────────────────────────────────────────────────\n\nconst DATASET_IDS = {\n /** Posts by individual from their profile URL. */\n PROFILE_POSTS: 'gd_lyy3tktm25m4avu764',\n /** LinkedIn search results (for viral post discovery). */\n SEARCH_POSTS: 'gd_l7q7dkf244hwjntr0',\n} as const;\n\n// ─── Client ─────────────────────────────────────────────────────────────────\n\nexport class BrightDataClient extends BaseApiClient {\n constructor(config: BrightDataConfig) {\n super({\n name: 'BrightData',\n baseUrl: 'https://api.brightdata.com/datasets/v3',\n headers: { Authorization: `Bearer ${config.apiKey}` },\n timeoutMs: 30_000,\n });\n }\n\n // ─── Profile Post Scraping ──────────────────────────────────────────────\n\n /**\n * Trigger an async scraping job for LinkedIn profile posts.\n * Returns a snapshot_id to poll with getJobStatus()/getScrapingResults().\n */\n async scrapeLinkedInPosts(params: ScrapeLinkedInRequest): Promise<BrightDataSnapshotResponse> {\n if (!params.profile_url) {\n throw new Error('profile_url is required');\n }\n\n const endDate = new Date();\n const startDate = new Date();\n startDate.setFullYear(startDate.getFullYear() - 2);\n\n const input: Record<string, unknown> = {\n url: params.profile_url,\n start_date: startDate.toISOString(),\n end_date: endDate.toISOString(),\n };\n\n return this.request<BrightDataSnapshotResponse>(\n `/scrape?dataset_id=${DATASET_IDS.PROFILE_POSTS}&include_errors=true&type=discover_new&discover_by=profile_url`,\n {\n method: 'POST',\n body: JSON.stringify({ input: [input] }),\n }\n );\n }\n\n /**\n * Scrape posts synchronously — the /scrape endpoint waits and returns data directly.\n */\n async scrapeAndWait(params: ScrapeLinkedInRequest): Promise<BrightDataLinkedInPost[]> {\n if (!params.profile_url) {\n throw new Error('profile_url is required');\n }\n\n const endDate = new Date();\n const startDate = new Date();\n startDate.setFullYear(startDate.getFullYear() - 2);\n\n const input: Record<string, unknown> = {\n url: params.profile_url,\n start_date: startDate.toISOString(),\n end_date: endDate.toISOString(),\n };\n\n return this.request<BrightDataLinkedInPost[]>(\n `/scrape?dataset_id=${DATASET_IDS.PROFILE_POSTS}&include_errors=true&type=discover_new&discover_by=profile_url`,\n {\n method: 'POST',\n body: JSON.stringify({ input: [input] }),\n }\n );\n }\n\n // ─── Search URL Scraping ────────────────────────────────────────────────\n\n /**\n * Trigger a LinkedIn search URL scraping job.\n * Used for lead magnet post discovery.\n */\n async scrapeSearchUrl(params: ScrapeSearchUrlRequest): Promise<BrightDataSnapshotResponse> {\n const datasetId = params.dataset_id || DATASET_IDS.SEARCH_POSTS;\n\n return this.request<BrightDataSnapshotResponse>(\n `/trigger?dataset_id=${datasetId}&format=json&uncompressed_webhook=true`,\n {\n method: 'POST',\n body: JSON.stringify([\n {\n url: params.search_url,\n limit_per_input: params.limit || 50,\n include_errors: false,\n },\n ]),\n }\n );\n }\n\n // ─── Batch Profile Scraping ─────────────────────────────────────────────\n\n /**\n * Trigger a batch profile scrape for multiple LinkedIn URLs.\n * Uses the async /trigger endpoint — returns a snapshot_id to poll.\n */\n async triggerBatchProfileScrape(profileUrls: string[]): Promise<BrightDataSnapshotResponse> {\n if (profileUrls.length === 0) {\n throw new Error('No profile URLs provided');\n }\n\n const input = profileUrls.map((url) => ({ url }));\n\n return this.request<BrightDataSnapshotResponse>(\n `/trigger?dataset_id=${DATASET_IDS.PROFILE_POSTS}&include_errors=true&type=discover_new&discover_by=profile_url`,\n {\n method: 'POST',\n body: JSON.stringify(input),\n }\n );\n }\n\n // ─── Job Status + Results ───────────────────────────────────────────────\n\n /** Check the status of a scraping job. */\n async getJobStatus(snapshotId: string): Promise<BrightDataJobStatus> {\n return this.request<BrightDataJobStatus>(`/progress/${snapshotId}`);\n }\n\n /** Get the results of a completed scraping job. */\n async getScrapingResults(snapshotId: string): Promise<BrightDataLinkedInPost[]> {\n return this.request<BrightDataLinkedInPost[]>(`/snapshot/${snapshotId}?format=json`);\n }\n\n /**\n * Poll /progress until ready, then fetch /snapshot results.\n * Returns the full array of LinkedInPost objects.\n */\n async waitForResults(\n snapshotId: string,\n maxWaitMs: number = 300_000,\n pollIntervalMs: number = 10_000\n ): Promise<BrightDataLinkedInPost[]> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < maxWaitMs) {\n const status = await this.getJobStatus(snapshotId);\n\n if (status.status === 'ready') {\n return this.getScrapingResults(snapshotId);\n }\n\n if (status.status === 'failed') {\n throw new Error('Scraping job failed');\n }\n\n await delay(pollIntervalMs);\n }\n\n throw new Error('Scraping job timed out');\n }\n\n /**\n * Scrape a search URL and wait for results.\n * Used for viral post discovery (lead magnet posts).\n */\n async scrapeSearchUrlAndWait(\n params: ScrapeSearchUrlRequest,\n maxWaitMs: number = 180_000\n ): Promise<BrightDataLinkedInPost[]> {\n const triggerResult = await this.scrapeSearchUrl(params);\n return this.waitForResults(triggerResult.snapshot_id, maxWaitMs, 5_000);\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/** Generic HMAC-SHA256 webhook verification.\n * Used by most providers (Clay, HeyReach, Attio, Zapmail, Unipile).\n * Constraint: Pure function, no framework imports. Always timing-safe. */\n\nimport crypto from 'node:crypto';\nimport { logDebug } from '@mas/logging';\n\nexport function verifyHmacSha256(\n payload: string | Buffer,\n signature: string,\n secret: string\n): boolean {\n if (!signature) return false;\n\n const expected = crypto.createHmac('sha256', secret).update(payload).digest('hex');\n\n try {\n return crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'));\n } catch (_err) {\n logDebug('verifyHmacSha256', 'Signature comparison failed (length mismatch)', {\n sigLength: signature.length,\n expectedLength: expected.length,\n });\n return false;\n }\n}\n","/** Stripe webhook verification.\n * Parses \"t=timestamp,v1=signature\" header format.\n * Verifies HMAC-SHA256 of \"timestamp.payload\" and checks timestamp freshness (300s).\n * Constraint: Pure function, no framework imports. Always timing-safe. */\n\nimport crypto from 'node:crypto';\nimport { logDebug } from '@mas/logging';\n\nconst MAX_AGE_SECONDS = 300;\n\nexport function verifyStripeWebhook(\n payload: string | Buffer,\n signatureHeader: string,\n secret: string\n): boolean {\n if (!signatureHeader) return false;\n\n const parts = signatureHeader.split(',');\n const timestampPart = parts.find((p) => p.startsWith('t='));\n const sigPart = parts.find((p) => p.startsWith('v1='));\n\n if (!timestampPart || !sigPart) return false;\n\n const timestamp = timestampPart.slice(2);\n const signature = sigPart.slice(3);\n\n // Check timestamp freshness — reject future timestamps and stale ones\n const age = Math.floor(Date.now() / 1000) - parseInt(timestamp, 10);\n if (isNaN(age) || age < 0 || age > MAX_AGE_SECONDS) return false;\n\n // Compute expected signature\n const signedPayload = `${timestamp}.${typeof payload === 'string' ? payload : payload.toString('utf8')}`;\n const expected = crypto.createHmac('sha256', secret).update(signedPayload).digest('hex');\n\n try {\n return crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'));\n } catch (_err) {\n logDebug('verifyStripeWebhook', 'Signature comparison failed', {\n sigLength: signature.length,\n expectedLength: expected.length,\n });\n return false;\n }\n}\n","/** Slack webhook signature verification.\n * Signs v0:{timestamp}:{body} with HMAC-SHA256 and compares to X-Slack-Signature.\n * Constraint: Pure function. Always timing-safe comparison. */\n\nimport crypto from 'node:crypto';\nimport { logDebug } from '@mas/logging';\n\nexport function verifySlackWebhook(\n payload: string,\n signature: string,\n secret: string,\n timestamp: string\n): boolean {\n if (!signature || !timestamp) return false;\n\n const baseString = `v0:${timestamp}:${payload}`;\n const expected = 'v0=' + crypto.createHmac('sha256', secret).update(baseString).digest('hex');\n\n try {\n return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));\n } catch (_err) {\n logDebug('verifySlackWebhook', 'Signature comparison failed (length mismatch)', {\n sigLength: signature.length,\n expectedLength: expected.length,\n });\n return false;\n }\n}\n","/** Webhook verification — main entry point.\n * Routes to provider-specific verification. Pure functions, no framework deps.\n * Constraint: Always uses timing-safe comparison. Never === for signatures. */\n\nimport crypto from 'node:crypto';\nimport { verifyHmacSha256 as hmacVerify } from './providers/hmac-sha256';\nimport { verifyStripeWebhook } from './providers/stripe';\nimport { verifySlackWebhook } from './providers/slack';\nimport type { WebhookVerifyOptions } from './types';\n\n// ─── Re-exports ──────────────────────────────────────────────────────────────\n\nexport { verifyHmacSha256 } from './providers/hmac-sha256';\nexport { verifyStripeWebhook } from './providers/stripe';\nexport { verifySlackWebhook } from './providers/slack';\nexport type { WebhookProvider, WebhookVerifyOptions } from './types';\n\n// ─── Providers that use standard HMAC-SHA256 ─────────────────────────────────\n\nconst HMAC_PROVIDERS = new Set([\n 'heyreach',\n 'clay',\n 'attio',\n 'zapmail',\n 'unipile',\n 'instantly',\n 'smartlead',\n 'kondo',\n 'linear',\n]);\n\n// ─── Providers that pass through when no signature is provided ───────────────\n\nconst OPTIONAL_SIGNATURE_PROVIDERS = new Set(['plusvibe']);\n\n// ─── Main Verify ─────────────────────────────────────────────────────────────\n\nexport function verifyWebhook(options: WebhookVerifyOptions): boolean {\n const { provider, payload, signature, secret } = options;\n const payloadStr = typeof payload === 'string' ? payload : payload.toString('utf8');\n\n // Stripe: custom format with timestamp\n if (provider === 'stripe') {\n if (!signature) return false;\n return verifyStripeWebhook(payloadStr, signature, secret);\n }\n\n // Cal.com: sha256= prefix\n if (provider === 'calcom') {\n if (!signature) return false;\n const sig = signature.startsWith('sha256=') ? signature.slice(7) : signature;\n return hmacVerify(payloadStr, sig, secret);\n }\n\n // Grain/Fireflies/Clarify: shared secret comparison (not HMAC)\n if (provider === 'grain' || provider === 'fireflies' || provider === 'clarify') {\n if (!signature) return false;\n try {\n return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(secret));\n } catch (_err) {\n // Length mismatch causes timingSafeEqual to throw\n return false;\n }\n }\n\n // Slack: v0 prefixed HMAC with timestamp\n if (provider === 'slack') {\n if (!signature || !options.timestamp) return false;\n return verifySlackWebhook(payloadStr, signature, secret, options.timestamp);\n }\n\n // PlusVibe: optional signature\n if (OPTIONAL_SIGNATURE_PROVIDERS.has(provider)) {\n if (!signature) return true; // pass through\n return hmacVerify(payloadStr, signature, secret);\n }\n\n // Standard HMAC-SHA256 providers\n if (HMAC_PROVIDERS.has(provider)) {\n if (!signature) return false;\n return hmacVerify(payloadStr, signature, secret);\n }\n\n // Unknown provider: reject\n return false;\n}\n","/**\n * Interface encapsulating the various crypto computations used by the library,\n * allowing pluggable underlying crypto implementations.\n */\nexport class CryptoProvider {\n /**\n * Computes a SHA-256 HMAC given a secret and a payload (encoded in UTF-8).\n * The output HMAC should be encoded in hexadecimal.\n *\n * Sample values for implementations:\n * - computeHMACSignature('', 'test_secret') => 'f7f9bd47fb987337b5796fdc1fdb9ba221d0d5396814bfcaf9521f43fd8927fd'\n * - computeHMACSignature('\\ud83d\\ude00', 'test_secret') => '837da296d05c4fe31f61d5d7ead035099d9585a5bcde87de952012a78f0b0c43\n */\n computeHMACSignature(payload, secret) {\n throw new Error('computeHMACSignature not implemented.');\n }\n /**\n * Asynchronous version of `computeHMACSignature`. Some implementations may\n * only allow support async signature computation.\n *\n * Computes a SHA-256 HMAC given a secret and a payload (encoded in UTF-8).\n * The output HMAC should be encoded in hexadecimal.\n *\n * Sample values for implementations:\n * - computeHMACSignature('', 'test_secret') => 'f7f9bd47fb987337b5796fdc1fdb9ba221d0d5396814bfcaf9521f43fd8927fd'\n * - computeHMACSignature('\\ud83d\\ude00', 'test_secret') => '837da296d05c4fe31f61d5d7ead035099d9585a5bcde87de952012a78f0b0c43\n */\n computeHMACSignatureAsync(payload, secret) {\n throw new Error('computeHMACSignatureAsync not implemented.');\n }\n /**\n * Computes a SHA-256 hash of the data.\n */\n computeSHA256Async(data) {\n throw new Error('computeSHA256 not implemented.');\n }\n}\n/**\n * If the crypto provider only supports asynchronous operations,\n * throw CryptoProviderOnlySupportsAsyncError instead of\n * a generic error so that the caller can choose to provide\n * a more helpful error message to direct the user to use\n * an asynchronous pathway.\n */\nexport class CryptoProviderOnlySupportsAsyncError extends Error {\n}\n","import * as crypto from 'crypto';\nimport { CryptoProvider } from './CryptoProvider.js';\n/**\n * `CryptoProvider which uses the Node `crypto` package for its computations.\n */\nexport class NodeCryptoProvider extends CryptoProvider {\n /** @override */\n computeHMACSignature(payload, secret) {\n return crypto\n .createHmac('sha256', secret)\n .update(payload, 'utf8')\n .digest('hex');\n }\n /** @override */\n async computeHMACSignatureAsync(payload, secret) {\n const signature = await this.computeHMACSignature(payload, secret);\n return signature;\n }\n /** @override */\n async computeSHA256Async(data) {\n return new Uint8Array(await crypto\n .createHash('sha256')\n .update(data)\n .digest());\n }\n}\n","/**\n * Encapsulates the logic for issuing a request to the Stripe API.\n *\n * A custom HTTP client should should implement:\n * 1. A response class which extends HttpClientResponse and wraps around their\n * own internal representation of a response.\n * 2. A client class which extends HttpClient and implements all methods,\n * returning their own response class when making requests.\n */\nexport class HttpClient {\n /** The client name used for diagnostics. */\n getClientName() {\n throw new Error('getClientName not implemented.');\n }\n makeRequest(host, port, path, method, headers, requestData, protocol, timeout) {\n throw new Error('makeRequest not implemented.');\n }\n /** Helper to make a consistent timeout error across implementations. */\n static makeTimeoutError() {\n const timeoutErr = new TypeError(HttpClient.TIMEOUT_ERROR_CODE);\n timeoutErr.code = HttpClient.TIMEOUT_ERROR_CODE;\n return timeoutErr;\n }\n}\n// Public API accessible via Stripe.HttpClient\nHttpClient.CONNECTION_CLOSED_ERROR_CODES = ['ECONNRESET', 'EPIPE'];\nHttpClient.TIMEOUT_ERROR_CODE = 'ETIMEDOUT';\nexport class HttpClientResponse {\n constructor(statusCode, headers) {\n this._statusCode = statusCode;\n this._headers = headers;\n }\n getStatusCode() {\n return this._statusCode;\n }\n getHeaders() {\n return this._headers;\n }\n getRawResponse() {\n throw new Error('getRawResponse not implemented.');\n }\n toStream(streamCompleteCallback) {\n throw new Error('toStream not implemented.');\n }\n toJSON() {\n throw new Error('toJSON not implemented.');\n }\n}\n","import * as http_ from 'http';\nimport * as https_ from 'https';\nimport { HttpClient, HttpClientResponse, } from './HttpClient.js';\n// `import * as http_ from 'http'` creates a \"Module Namespace Exotic Object\"\n// which is immune to monkey-patching, whereas http_.default (in an ES Module context)\n// will resolve to the same thing as require('http'), which is\n// monkey-patchable. We care about this because users in their test\n// suites might be using a library like \"nock\" which relies on the ability\n// to monkey-patch and intercept calls to http.request.\nconst http = http_.default || http_;\nconst https = https_.default || https_;\nconst defaultHttpAgent = new http.Agent({ keepAlive: true });\nconst defaultHttpsAgent = new https.Agent({ keepAlive: true });\n/**\n * HTTP client which uses the Node `http` and `https` packages to issue\n * requests.`\n */\nexport class NodeHttpClient extends HttpClient {\n constructor(agent) {\n super();\n this._agent = agent;\n }\n /** @override. */\n getClientName() {\n return 'node';\n }\n makeRequest(host, port, path, method, headers, requestData, protocol, timeout) {\n const isInsecureConnection = protocol === 'http';\n let agent = this._agent;\n if (!agent) {\n agent = isInsecureConnection ? defaultHttpAgent : defaultHttpsAgent;\n }\n const requestPromise = new Promise((resolve, reject) => {\n const req = (isInsecureConnection ? http : https).request({\n host: host,\n port: port,\n path,\n method,\n agent,\n headers,\n ciphers: 'DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:!MD5',\n });\n req.setTimeout(timeout, () => {\n req.destroy(HttpClient.makeTimeoutError());\n });\n req.on('response', (res) => {\n resolve(new NodeHttpClientResponse(res));\n });\n req.on('error', (error) => {\n reject(error);\n });\n req.once('socket', (socket) => {\n if (socket.connecting) {\n socket.once(isInsecureConnection ? 'connect' : 'secureConnect', () => {\n // Send payload; we're safe:\n req.write(requestData);\n req.end();\n });\n }\n else {\n // we're already connected\n req.write(requestData);\n req.end();\n }\n });\n });\n return requestPromise;\n }\n}\nexport class NodeHttpClientResponse extends HttpClientResponse {\n constructor(res) {\n // @ts-ignore\n super(res.statusCode, res.headers || {});\n this._res = res;\n }\n getRawResponse() {\n return this._res;\n }\n toStream(streamCompleteCallback) {\n // The raw response is itself the stream, so we just return that. To be\n // backwards compatible, we should invoke the streamCompleteCallback only\n // once the stream has been fully consumed.\n this._res.once('end', () => streamCompleteCallback());\n return this._res;\n }\n toJSON() {\n return new Promise((resolve, reject) => {\n let response = '';\n this._res.setEncoding('utf8');\n this._res.on('data', (chunk) => {\n response += chunk;\n });\n this._res.once('end', () => {\n try {\n resolve(JSON.parse(response));\n }\n catch (e) {\n reject(e);\n }\n });\n });\n }\n}\n","const OPTIONS_KEYS = [\n 'apiKey',\n 'idempotencyKey',\n 'stripeAccount',\n 'apiVersion',\n 'maxNetworkRetries',\n 'timeout',\n 'host',\n 'authenticator',\n 'stripeContext',\n 'headers',\n 'additionalHeaders',\n 'streaming',\n];\nexport function isOptionsHash(o) {\n return (o &&\n typeof o === 'object' &&\n OPTIONS_KEYS.some((prop) => Object.prototype.hasOwnProperty.call(o, prop)));\n}\n/**\n * Stringifies an Object, accommodating nested objects\n * (forming the conventional key 'parent[child]=value')\n */\nexport function queryStringifyRequestData(data, \n/** @deprecated Will be removed in a future release. */\n_apiMode) {\n return stringifyRequestData(data);\n}\n/**\n * Encodes a value for use in a query string, keeping brackets unencoded\n * for readability (the server accepts both encoded and unencoded brackets).\n */\nfunction encodeQueryValue(value) {\n return (encodeURIComponent(value)\n // Encode characters not encoded by encodeURIComponent but encoded by qs\n .replace(/!/g, '%21')\n .replace(/\\*/g, '%2A')\n .replace(/\\(/g, '%28')\n .replace(/\\)/g, '%29')\n .replace(/'/g, '%27')\n // Decode brackets for readability (server accepts both)\n .replace(/%5B/g, '[')\n .replace(/%5D/g, ']'));\n}\n/**\n * Converts a value to a string representation for query string encoding.\n * Dates are converted to Unix timestamps.\n */\nfunction valueToString(value) {\n if (value instanceof Date) {\n return Math.floor(value.getTime() / 1000).toString();\n }\n if (value === null) {\n return '';\n }\n return String(value);\n}\n/**\n * Custom query string stringifier that handles nested objects and arrays.\n * Produces output compatible with the qs library's indexed array format.\n */\nfunction stringifyRequestData(data) {\n const pairs = [];\n function encode(key, value) {\n if (value === undefined) {\n return;\n }\n if (value === null || typeof value !== 'object' || value instanceof Date) {\n // Primitive value (including null and Date)\n pairs.push(encodeQueryValue(key) + '=' + encodeQueryValue(valueToString(value)));\n return;\n }\n if (Array.isArray(value)) {\n // Array: use indexed format arr[0], arr[1], etc.\n for (let i = 0; i < value.length; i++) {\n if (value[i] !== undefined) {\n encode(key + '[' + i + ']', value[i]);\n }\n }\n return;\n }\n // Object: recurse with bracket notation\n for (const k of Object.keys(value)) {\n encode(key + '[' + k + ']', value[k]);\n }\n }\n // Handle top-level object\n if (typeof data === 'object' && data !== null) {\n for (const key of Object.keys(data)) {\n encode(key, data[key]);\n }\n }\n return pairs.join('&');\n}\n/**\n * Outputs a new function with interpolated object property values.\n * Use like so:\n * const fn = makeURLInterpolator('some/url/{param1}/{param2}');\n * fn({ param1: 123, param2: 456 }); // => 'some/url/123/456'\n */\nexport const makeURLInterpolator = (() => {\n const rc = {\n '\\n': '\\\\n',\n '\"': '\\\\\"',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n return (str) => {\n const cleanString = str.replace(/[\"\\n\\r\\u2028\\u2029]/g, ($0) => rc[$0]);\n return (outputs) => {\n return cleanString.replace(/\\{([\\s\\S]+?)\\}/g, ($0, $1) => {\n const output = outputs[$1];\n if (isValidEncodeUriComponentType(output))\n return encodeURIComponent(output);\n return '';\n });\n };\n };\n})();\nfunction isValidEncodeUriComponentType(value) {\n return ['number', 'string', 'boolean'].includes(typeof value);\n}\nexport function extractUrlParams(path) {\n const params = path.match(/\\{\\w+\\}/g);\n if (!params) {\n return [];\n }\n return params.map((param) => param.replace(/[{}]/g, ''));\n}\n/**\n * Return the data argument from a list of arguments\n *\n * @param {object[]} args\n * @returns {object}\n */\nexport function getDataFromArgs(args) {\n if (!Array.isArray(args) || !args[0] || typeof args[0] !== 'object') {\n return {};\n }\n if (!isOptionsHash(args[0])) {\n return args.shift();\n }\n const argKeys = Object.keys(args[0]);\n const optionKeysInArgs = argKeys.filter((key) => OPTIONS_KEYS.includes(key));\n // In some cases options may be the provided as the first argument.\n // Here we're detecting a case where there are two distinct arguments\n // (the first being args and the second options) and with known\n // option keys in the first so that we can warn the user about it.\n if (optionKeysInArgs.length > 0 &&\n optionKeysInArgs.length !== argKeys.length) {\n emitWarning(`Options found in arguments (${optionKeysInArgs.join(', ')}). Did you mean to pass an options object? See https://github.com/stripe/stripe-node/wiki/Passing-Options.`);\n }\n return {};\n}\n/**\n * Return the options hash from a list of arguments\n */\nexport function getOptionsFromArgs(args) {\n const opts = {\n host: null,\n headers: {},\n settings: {},\n streaming: false,\n };\n if (args.length > 0) {\n const arg = args[args.length - 1];\n if (typeof arg === 'string') {\n opts.authenticator = createApiKeyAuthenticator(args.pop());\n }\n else if (isOptionsHash(arg)) {\n const params = Object.assign({}, args.pop());\n const extraKeys = Object.keys(params).filter((key) => !OPTIONS_KEYS.includes(key));\n if (extraKeys.length) {\n emitWarning(`Invalid options found (${extraKeys.join(', ')}); ignoring.`);\n }\n if (params.apiKey) {\n opts.authenticator = createApiKeyAuthenticator(params.apiKey);\n }\n if (params.idempotencyKey) {\n opts.headers['Idempotency-Key'] = params.idempotencyKey;\n }\n if (params.stripeAccount) {\n opts.headers['Stripe-Account'] = params.stripeAccount;\n }\n if (params.stripeContext) {\n if (opts.headers['Stripe-Account']) {\n throw new Error(\"Can't specify both stripeAccount and stripeContext.\");\n }\n opts.headers['Stripe-Context'] = params.stripeContext;\n }\n if (params.apiVersion) {\n opts.headers['Stripe-Version'] = params.apiVersion;\n }\n if (Number.isInteger(params.maxNetworkRetries)) {\n opts.settings.maxNetworkRetries = params.maxNetworkRetries;\n }\n if (Number.isInteger(params.timeout)) {\n opts.settings.timeout = params.timeout;\n }\n if (params.host) {\n opts.host = params.host;\n }\n if (params.authenticator) {\n if (params.apiKey) {\n throw new Error(\"Can't specify both apiKey and authenticator.\");\n }\n if (typeof params.authenticator !== 'function') {\n throw new Error('The authenticator must be a function ' +\n 'receiving a request as the first parameter.');\n }\n opts.authenticator = params.authenticator;\n }\n // these are sent by us from _rawRequest, which is what powers all generated requests\n if (params.headers) {\n Object.assign(opts.headers, params.headers);\n }\n // these are sent from the user-facing RawRequest\n if (params.additionalHeaders) {\n Object.assign(opts.headers, params.additionalHeaders);\n }\n if (params.streaming) {\n opts.streaming = true;\n }\n }\n }\n return opts;\n}\n/**\n * Provide simple \"Class\" extension mechanism.\n * <!-- Public API accessible via Stripe.StripeResource.extend -->\n */\nexport function protoExtend(sub) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const Super = this;\n const Constructor = Object.prototype.hasOwnProperty.call(sub, 'constructor')\n ? sub.constructor\n : function (...args) {\n Super.apply(this, args);\n };\n // This initialization logic is somewhat sensitive to be compatible with\n // divergent JS implementations like the one found in Qt. See here for more\n // context:\n //\n // https://github.com/stripe/stripe-node/pull/334\n Object.assign(Constructor, Super);\n Constructor.prototype = Object.create(Super.prototype);\n Object.assign(Constructor.prototype, sub);\n return Constructor;\n}\n/**\n * Remove empty values from an object\n */\nexport function removeNullish(obj) {\n if (typeof obj !== 'object') {\n throw new Error('Argument must be an object');\n }\n return Object.keys(obj).reduce((result, key) => {\n if (obj[key] != null) {\n result[key] = obj[key];\n }\n return result;\n }, {});\n}\n/**\n * Normalize standard HTTP Headers:\n * {'foo-bar': 'hi'}\n * becomes\n * {'Foo-Bar': 'hi'}\n */\nexport function normalizeHeaders(obj) {\n if (!(obj && typeof obj === 'object')) {\n return obj;\n }\n return Object.keys(obj).reduce((result, header) => {\n result[normalizeHeader(header)] = obj[header];\n return result;\n }, {});\n}\n/**\n * Stolen from https://github.com/marten-de-vries/header-case-normalizer/blob/master/index.js#L36-L41\n * without the exceptions which are irrelevant to us.\n */\nexport function normalizeHeader(header) {\n return header\n .split('-')\n .map((text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase())\n .join('-');\n}\nexport function callbackifyPromiseWithTimeout(promise, callback) {\n if (callback) {\n // Ensure callback is called outside of promise stack.\n return promise.then((res) => {\n setTimeout(() => {\n callback(null, res);\n }, 0);\n }, (err) => {\n setTimeout(() => {\n callback(err, null);\n }, 0);\n });\n }\n return promise;\n}\n/**\n * Allow for special capitalization cases (such as OAuth)\n */\nexport function pascalToCamelCase(name) {\n if (name === 'OAuth') {\n return 'oauth';\n }\n else {\n return name[0].toLowerCase() + name.substring(1);\n }\n}\nexport function emitWarning(warning) {\n if (typeof process.emitWarning !== 'function') {\n return console.warn(`Stripe: ${warning}`); /* eslint-disable-line no-console */\n }\n return process.emitWarning(warning, 'Stripe');\n}\nexport function isObject(obj) {\n const type = typeof obj;\n return (type === 'function' || type === 'object') && !!obj;\n}\n// For use in multipart requests\nexport function flattenAndStringify(data) {\n const result = {};\n const step = (obj, prevKey) => {\n Object.entries(obj).forEach(([key, value]) => {\n const newKey = prevKey ? `${prevKey}[${key}]` : key;\n if (isObject(value)) {\n if (!(value instanceof Uint8Array) &&\n !Object.prototype.hasOwnProperty.call(value, 'data')) {\n // Non-buffer non-file Objects are recursively flattened\n return step(value, newKey);\n }\n else {\n // Buffers and file objects are stored without modification\n result[newKey] = value;\n }\n }\n else {\n // Primitives are converted to strings\n result[newKey] = String(value);\n }\n });\n };\n step(data, null);\n return result;\n}\nexport function validateInteger(name, n, defaultVal) {\n if (!Number.isInteger(n)) {\n if (defaultVal !== undefined) {\n return defaultVal;\n }\n else {\n throw new Error(`${name} must be an integer`);\n }\n }\n return n;\n}\nexport function determineProcessUserAgentProperties() {\n return typeof process === 'undefined'\n ? {}\n : {\n lang_version: process.version,\n platform: process.platform,\n };\n}\nexport const AI_AGENTS = [\n // The beginning of the section generated from our OpenAPI spec\n ['ANTIGRAVITY_CLI_ALIAS', 'antigravity'],\n ['CLAUDECODE', 'claude_code'],\n ['CLINE_ACTIVE', 'cline'],\n ['CODEX_SANDBOX', 'codex_cli'],\n ['CODEX_THREAD_ID', 'codex_cli'],\n ['CODEX_SANDBOX_NETWORK_DISABLED', 'codex_cli'],\n ['CODEX_CI', 'codex_cli'],\n ['CURSOR_AGENT', 'cursor'],\n ['GEMINI_CLI', 'gemini_cli'],\n ['OPENCODE', 'open_code'],\n // The end of the section generated from our OpenAPI spec\n];\nexport function detectAIAgent(env) {\n for (const [envVar, agentName] of AI_AGENTS) {\n if (env[envVar]) {\n return agentName;\n }\n }\n return '';\n}\nexport function createApiKeyAuthenticator(apiKey) {\n const authenticator = (request) => {\n request.headers.Authorization = 'Bearer ' + apiKey;\n return Promise.resolve();\n };\n // For testing\n authenticator._apiKey = apiKey;\n return authenticator;\n}\n/**\n * Joins an array of Uint8Arrays into a single Uint8Array\n */\nexport function concat(arrays) {\n const totalLength = arrays.reduce((len, array) => len + array.length, 0);\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n arrays.forEach((array) => {\n merged.set(array, offset);\n offset += array.length;\n });\n return merged;\n}\n/**\n * Replaces Date objects with Unix timestamps\n */\nfunction dateTimeReplacer(key, value) {\n if (this[key] instanceof Date) {\n return Math.floor(this[key].getTime() / 1000).toString();\n }\n return value;\n}\n/**\n * JSON stringifies an Object, replacing Date objects with Unix timestamps\n */\nexport function jsonStringifyRequestData(data) {\n return JSON.stringify(data, dateTimeReplacer);\n}\n/**\n * Inspects the given path to determine if the endpoint is for v1 or v2 API\n */\nexport function getAPIMode(path) {\n if (!path) {\n return 'v1';\n }\n return path.startsWith('/v2') ? 'v2' : 'v1';\n}\nexport function parseHttpHeaderAsString(header) {\n if (Array.isArray(header)) {\n return header.join(', ');\n }\n return String(header);\n}\nexport function parseHttpHeaderAsNumber(header) {\n const number = Array.isArray(header) ? header[0] : header;\n return Number(number);\n}\nexport function parseHeadersForFetch(headers) {\n return Object.entries(headers).map(([key, value]) => {\n return [key, parseHttpHeaderAsString(value)];\n });\n}\n","import { parseHeadersForFetch } from '../utils.js';\nimport { HttpClient, HttpClientResponse, } from './HttpClient.js';\n/**\n * HTTP client which uses a `fetch` function to issue requests.\n *\n * By default relies on the global `fetch` function, but an optional function\n * can be passed in. If passing in a function, it is expected to match the Web\n * Fetch API. As an example, this could be the function provided by the\n * node-fetch package (https://github.com/node-fetch/node-fetch).\n */\nexport class FetchHttpClient extends HttpClient {\n constructor(fetchFn) {\n super();\n // Default to global fetch if available\n if (!fetchFn) {\n if (!globalThis.fetch) {\n throw new Error('fetch() function not provided and is not defined in the global scope. ' +\n 'You must provide a fetch implementation.');\n }\n fetchFn = globalThis.fetch;\n }\n // Both timeout behaviors differs from Node:\n // - Fetch uses a single timeout for the entire length of the request.\n // - Node is more fine-grained and resets the timeout after each stage of the request.\n if (globalThis.AbortController) {\n // Utilise native AbortController if available\n // AbortController was added in Node v15.0.0, v14.17.0\n this._fetchFn = FetchHttpClient.makeFetchWithAbortTimeout(fetchFn);\n }\n else {\n // Fall back to racing against a timeout promise if not available in the runtime\n // This does not actually cancel the underlying fetch operation or resources\n this._fetchFn = FetchHttpClient.makeFetchWithRaceTimeout(fetchFn);\n }\n }\n static makeFetchWithRaceTimeout(fetchFn) {\n return (url, init, timeout) => {\n let pendingTimeoutId;\n const timeoutPromise = new Promise((_, reject) => {\n pendingTimeoutId = setTimeout(() => {\n pendingTimeoutId = null;\n reject(HttpClient.makeTimeoutError());\n }, timeout);\n });\n const fetchPromise = fetchFn(url, init);\n return Promise.race([fetchPromise, timeoutPromise]).finally(() => {\n if (pendingTimeoutId) {\n clearTimeout(pendingTimeoutId);\n }\n });\n };\n }\n static makeFetchWithAbortTimeout(fetchFn) {\n return async (url, init, timeout) => {\n // Use AbortController because AbortSignal.timeout() was added later in Node v17.3.0, v16.14.0\n const abort = new AbortController();\n let timeoutId = setTimeout(() => {\n timeoutId = null;\n abort.abort(HttpClient.makeTimeoutError());\n }, timeout);\n try {\n return await fetchFn(url, Object.assign(Object.assign({}, init), { signal: abort.signal }));\n }\n catch (err) {\n // Some implementations, like node-fetch, do not respect the reason passed to AbortController.abort()\n // and instead it always throws an AbortError\n // We catch this case to normalise all timeout errors\n if (err.name === 'AbortError') {\n throw HttpClient.makeTimeoutError();\n }\n else {\n throw err;\n }\n }\n finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n };\n }\n /** @override. */\n getClientName() {\n return 'fetch';\n }\n async makeRequest(host, port, path, method, headers, requestData, protocol, timeout) {\n const isInsecureConnection = protocol === 'http';\n const url = new URL(path, `${isInsecureConnection ? 'http' : 'https'}://${host}`);\n url.port = port;\n // For methods which expect payloads, we should always pass a body value\n // even when it is empty. Without this, some JS runtimes (eg. Deno) will\n // inject a second Content-Length header. See https://github.com/stripe/stripe-node/issues/1519\n // for more details.\n const methodHasPayload = method == 'POST' || method == 'PUT' || method == 'PATCH';\n const body = requestData || (methodHasPayload ? '' : undefined);\n const res = await this._fetchFn(url.toString(), {\n method,\n headers: parseHeadersForFetch(headers),\n body: body,\n }, timeout);\n return new FetchHttpClientResponse(res);\n }\n}\nexport class FetchHttpClientResponse extends HttpClientResponse {\n constructor(res) {\n super(res.status, FetchHttpClientResponse._transformHeadersToObject(res.headers));\n this._res = res;\n }\n getRawResponse() {\n return this._res;\n }\n toStream(streamCompleteCallback) {\n // Unfortunately `fetch` does not have event handlers for when the stream is\n // completely read. We therefore invoke the streamCompleteCallback right\n // away. This callback emits a response event with metadata and completes\n // metrics, so it's ok to do this without waiting for the stream to be\n // completely read.\n streamCompleteCallback();\n // Fetch's `body` property is expected to be a readable stream of the body.\n return this._res.body;\n }\n toJSON() {\n return this._res.json();\n }\n static _transformHeadersToObject(headers) {\n // Fetch uses a Headers instance so this must be converted to a barebones\n // JS object to meet the HttpClient interface.\n const headersObj = {};\n for (const entry of headers) {\n if (!Array.isArray(entry) || entry.length != 2) {\n throw new Error('Response objects produced by the fetch function given to FetchHttpClient do not have an iterable headers map. Response#headers should be an iterable object.');\n }\n headersObj[entry[0]] = entry[1];\n }\n return headersObj;\n }\n}\n","import { CryptoProvider, CryptoProviderOnlySupportsAsyncError, } from './CryptoProvider.js';\n/**\n * `CryptoProvider which uses the SubtleCrypto interface of the Web Crypto API.\n *\n * This only supports asynchronous operations.\n */\nexport class SubtleCryptoProvider extends CryptoProvider {\n constructor(subtleCrypto) {\n super();\n // If no subtle crypto is interface, default to the global namespace. This\n // is to allow custom interfaces (eg. using the Node webcrypto interface in\n // tests).\n this.subtleCrypto = subtleCrypto || crypto.subtle;\n }\n /** @override */\n computeHMACSignature(payload, secret) {\n throw new CryptoProviderOnlySupportsAsyncError('SubtleCryptoProvider cannot be used in a synchronous context.');\n }\n /** @override */\n async computeHMACSignatureAsync(payload, secret) {\n const encoder = new TextEncoder();\n const key = await this.subtleCrypto.importKey('raw', encoder.encode(secret), {\n name: 'HMAC',\n hash: { name: 'SHA-256' },\n }, false, ['sign']);\n const signatureBuffer = await this.subtleCrypto.sign('hmac', key, encoder.encode(payload));\n // crypto.subtle returns the signature in base64 format. This must be\n // encoded in hex to match the CryptoProvider contract. We map each byte in\n // the buffer to its corresponding hex octet and then combine into a string.\n const signatureBytes = new Uint8Array(signatureBuffer);\n const signatureHexCodes = new Array(signatureBytes.length);\n for (let i = 0; i < signatureBytes.length; i++) {\n signatureHexCodes[i] = byteHexMapping[signatureBytes[i]];\n }\n return signatureHexCodes.join('');\n }\n /** @override */\n async computeSHA256Async(data) {\n return new Uint8Array(await this.subtleCrypto.digest('SHA-256', data));\n }\n}\n// Cached mapping of byte to hex representation. We do this once to avoid re-\n// computing every time we need to convert the result of a signature to hex.\nconst byteHexMapping = new Array(256);\nfor (let i = 0; i < byteHexMapping.length; i++) {\n byteHexMapping[i] = i.toString(16).padStart(2, '0');\n}\n","import { FetchHttpClient } from '../net/FetchHttpClient.js';\nimport { SubtleCryptoProvider } from '../crypto/SubtleCryptoProvider.js';\n/**\n * Interface encapsulating various utility functions whose\n * implementations depend on the platform / JS runtime.\n */\nexport class PlatformFunctions {\n constructor() {\n this._fetchFn = null;\n this._agent = null;\n }\n /**\n * Gets uname with Node's built-in `exec` function, if available.\n */\n getUname() {\n throw new Error('getUname not implemented.');\n }\n /**\n * Generates a v4 UUID. See https://stackoverflow.com/a/2117523\n */\n uuid4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n /**\n * Compares strings in constant time.\n */\n secureCompare(a, b) {\n // return early here if buffer lengths are not equal\n if (a.length !== b.length) {\n return false;\n }\n const len = a.length;\n let result = 0;\n for (let i = 0; i < len; ++i) {\n result |= a.charCodeAt(i) ^ b.charCodeAt(i);\n }\n return result === 0;\n }\n /**\n * Creates an event emitter.\n */\n createEmitter() {\n throw new Error('createEmitter not implemented.');\n }\n /**\n * Checks if the request data is a stream. If so, read the entire stream\n * to a buffer and return the buffer.\n */\n tryBufferData(data) {\n throw new Error('tryBufferData not implemented.');\n }\n /**\n * Creates an HTTP client which uses the Node `http` and `https` packages\n * to issue requests.\n */\n createNodeHttpClient(agent) {\n throw new Error('createNodeHttpClient not implemented.');\n }\n /**\n * Creates an HTTP client for issuing Stripe API requests which uses the Web\n * Fetch API.\n *\n * A fetch function can optionally be passed in as a parameter. If none is\n * passed, will default to the default `fetch` function in the global scope.\n */\n createFetchHttpClient(fetchFn) {\n return new FetchHttpClient(fetchFn);\n }\n /**\n * Creates an HTTP client using runtime-specific APIs.\n */\n createDefaultHttpClient() {\n throw new Error('createDefaultHttpClient not implemented.');\n }\n /**\n * Creates a CryptoProvider which uses the Node `crypto` package for its computations.\n */\n createNodeCryptoProvider() {\n throw new Error('createNodeCryptoProvider not implemented.');\n }\n /**\n * Creates a CryptoProvider which uses the SubtleCrypto interface of the Web Crypto API.\n */\n createSubtleCryptoProvider(subtleCrypto) {\n return new SubtleCryptoProvider(subtleCrypto);\n }\n createDefaultCryptoProvider() {\n throw new Error('createDefaultCryptoProvider not implemented.');\n }\n}\n","/* eslint-disable camelcase */\n/* eslint-disable no-warning-comments */\nexport const generateV1Error = (rawStripeError) => {\n switch (rawStripeError.type) {\n case 'card_error':\n return new StripeCardError(rawStripeError);\n case 'invalid_request_error':\n return new StripeInvalidRequestError(rawStripeError);\n case 'api_error':\n return new StripeAPIError(rawStripeError);\n case 'authentication_error':\n return new StripeAuthenticationError(rawStripeError);\n case 'rate_limit_error':\n return new StripeRateLimitError(rawStripeError);\n case 'idempotency_error':\n return new StripeIdempotencyError(rawStripeError);\n case 'invalid_grant':\n return new StripeInvalidGrantError(rawStripeError);\n default:\n return new StripeUnknownError(rawStripeError);\n }\n};\n// eslint-disable-next-line complexity\nexport const generateV2Error = (rawStripeError) => {\n switch (rawStripeError.type) {\n // switchCases: The beginning of the section generated from our OpenAPI spec\n case 'temporary_session_expired':\n return new TemporarySessionExpiredError(rawStripeError);\n // switchCases: The end of the section generated from our OpenAPI spec\n }\n // Special handling for requests with missing required fields in V2 APIs.\n // invalid_field response in V2 APIs returns the field 'code' instead of 'type'.\n switch (rawStripeError.code) {\n case 'invalid_fields':\n return new StripeInvalidRequestError(rawStripeError);\n }\n return generateV1Error(rawStripeError);\n};\n/**\n * StripeError is the base error from which all other more specific Stripe errors derive.\n * Specifically for errors returned from Stripe's REST API.\n */\nexport class StripeError extends Error {\n constructor(raw = {}, type = null) {\n var _a;\n super(raw.message);\n this.type = type || this.constructor.name;\n this.raw = raw;\n this.rawType = raw.type;\n this.code = raw.code;\n this.doc_url = raw.doc_url;\n this.param = raw.param;\n this.detail = raw.detail;\n this.headers = raw.headers;\n this.requestId = raw.requestId;\n this.statusCode = raw.statusCode;\n this.message = (_a = raw.message) !== null && _a !== void 0 ? _a : '';\n this.userMessage = raw.user_message;\n this.charge = raw.charge;\n this.decline_code = raw.decline_code;\n this.payment_intent = raw.payment_intent;\n this.payment_method = raw.payment_method;\n this.payment_method_type = raw.payment_method_type;\n this.setup_intent = raw.setup_intent;\n this.source = raw.source;\n }\n}\n/**\n * Helper factory which takes raw stripe errors and outputs wrapping instances\n */\nStripeError.generate = generateV1Error;\n// Specific Stripe Error types:\n/**\n * CardError is raised when a user enters a card that can't be charged for\n * some reason.\n */\nexport class StripeCardError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeCardError');\n }\n}\n/**\n * InvalidRequestError is raised when a request is initiated with invalid\n * parameters.\n */\nexport class StripeInvalidRequestError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeInvalidRequestError');\n }\n}\n/**\n * APIError is a generic error that may be raised in cases where none of the\n * other named errors cover the problem. It could also be raised in the case\n * that a new error has been introduced in the API, but this version of the\n * Node.JS SDK doesn't know how to handle it.\n */\nexport class StripeAPIError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeAPIError');\n }\n}\n/**\n * AuthenticationError is raised when invalid credentials are used to connect\n * to Stripe's servers.\n */\nexport class StripeAuthenticationError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeAuthenticationError');\n }\n}\n/**\n * PermissionError is raised in cases where access was attempted on a resource\n * that wasn't allowed.\n */\nexport class StripePermissionError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripePermissionError');\n }\n}\n/**\n * RateLimitError is raised in cases where an account is putting too much load\n * on Stripe's API servers (usually by performing too many requests). Please\n * back off on request rate.\n */\nexport class StripeRateLimitError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeRateLimitError');\n }\n}\n/**\n * StripeConnectionError is raised in the event that the SDK can't connect to\n * Stripe's servers. That can be for a variety of different reasons from a\n * downed network to a bad TLS certificate.\n */\nexport class StripeConnectionError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeConnectionError');\n }\n}\n/**\n * SignatureVerificationError is raised when the signature verification for a\n * webhook fails\n */\nexport class StripeSignatureVerificationError extends StripeError {\n constructor(header, payload, raw = {}) {\n super(raw, 'StripeSignatureVerificationError');\n this.header = header;\n this.payload = payload;\n }\n}\n/**\n * IdempotencyError is raised in cases where an idempotency key was used\n * improperly.\n */\nexport class StripeIdempotencyError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeIdempotencyError');\n }\n}\n/**\n * InvalidGrantError is raised when a specified code doesn't exist, is\n * expired, has been used, or doesn't belong to you; a refresh token doesn't\n * exist, or doesn't belong to you; or if an API key's mode (live or test)\n * doesn't match the mode of a code or refresh token.\n */\nexport class StripeInvalidGrantError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeInvalidGrantError');\n }\n}\n/**\n * Any other error from Stripe not specifically captured above\n */\nexport class StripeUnknownError extends StripeError {\n constructor(raw = {}) {\n super(raw, 'StripeUnknownError');\n }\n}\n// classDefinitions: The beginning of the section generated from our OpenAPI spec\nexport class TemporarySessionExpiredError extends StripeError {\n constructor(rawStripeError = {}) {\n super(rawStripeError, 'TemporarySessionExpiredError');\n }\n}\n// classDefinitions: The end of the section generated from our OpenAPI spec\n","import * as crypto from 'crypto';\nimport { EventEmitter } from 'events';\nimport { NodeCryptoProvider } from '../crypto/NodeCryptoProvider.js';\nimport { NodeHttpClient } from '../net/NodeHttpClient.js';\nimport { PlatformFunctions } from './PlatformFunctions.js';\nimport { StripeError } from '../Error.js';\nimport { concat } from '../utils.js';\nimport { exec } from 'child_process';\nclass StreamProcessingError extends StripeError {\n}\n/**\n * Specializes WebPlatformFunctions using APIs available in Node.js.\n */\nexport class NodePlatformFunctions extends PlatformFunctions {\n constructor() {\n super();\n this._exec = exec;\n this._UNAME_CACHE = null;\n }\n /** @override */\n uuid4() {\n // available in: v14.17.x+\n if (crypto.randomUUID) {\n return crypto.randomUUID();\n }\n return super.uuid4();\n }\n /**\n * @override\n * Node's built in `exec` function sometimes throws outright,\n * and sometimes has a callback with an error,\n * depending on the type of error.\n *\n * This unifies that interface by resolving with a null uname\n * if an error is encountered.\n */\n getUname() {\n if (!this._UNAME_CACHE) {\n this._UNAME_CACHE = new Promise((resolve, reject) => {\n try {\n this._exec('uname -a', (err, uname) => {\n if (err) {\n return resolve(null);\n }\n resolve(uname);\n });\n }\n catch (e) {\n resolve(null);\n }\n });\n }\n return this._UNAME_CACHE;\n }\n /**\n * @override\n * Secure compare, from https://github.com/freewil/scmp\n */\n secureCompare(a, b) {\n if (!a || !b) {\n throw new Error('secureCompare must receive two arguments');\n }\n // return early here if buffer lengths are not equal since timingSafeEqual\n // will throw if buffer lengths are not equal\n if (a.length !== b.length) {\n return false;\n }\n // use crypto.timingSafeEqual if available (since Node.js v6.6.0),\n // otherwise use our own scmp-internal function.\n if (crypto.timingSafeEqual) {\n const textEncoder = new TextEncoder();\n const aEncoded = textEncoder.encode(a);\n const bEncoded = textEncoder.encode(b);\n return crypto.timingSafeEqual(aEncoded, bEncoded);\n }\n return super.secureCompare(a, b);\n }\n createEmitter() {\n return new EventEmitter();\n }\n /** @override */\n tryBufferData(data) {\n if (!(data.file.data instanceof EventEmitter)) {\n return Promise.resolve(data);\n }\n const bufferArray = [];\n return new Promise((resolve, reject) => {\n data.file.data\n .on('data', (line) => {\n bufferArray.push(line);\n })\n .once('end', () => {\n // @ts-ignore\n const bufferData = Object.assign({}, data);\n bufferData.file.data = concat(bufferArray);\n resolve(bufferData);\n })\n .on('error', (err) => {\n reject(new StreamProcessingError({\n message: 'An error occurred while attempting to process the file for upload.',\n detail: err,\n }));\n });\n });\n }\n /** @override */\n createNodeHttpClient(agent) {\n return new NodeHttpClient(agent);\n }\n /** @override */\n createDefaultHttpClient() {\n return new NodeHttpClient();\n }\n /** @override */\n createNodeCryptoProvider() {\n return new NodeCryptoProvider();\n }\n /** @override */\n createDefaultCryptoProvider() {\n return this.createNodeCryptoProvider();\n }\n}\n","import { StripeAPIError, StripeAuthenticationError, StripeConnectionError, StripeError, StripePermissionError, StripeRateLimitError, generateV1Error, generateV2Error, } from './Error.js';\nimport { HttpClient } from './net/HttpClient.js';\nimport { emitWarning, jsonStringifyRequestData, normalizeHeaders, queryStringifyRequestData, removeNullish, getAPIMode, getOptionsFromArgs, getDataFromArgs, parseHttpHeaderAsString, parseHttpHeaderAsNumber, } from './utils.js';\nconst MAX_RETRY_AFTER_WAIT = 60;\nexport class RequestSender {\n constructor(stripe, maxBufferedRequestMetric) {\n this._stripe = stripe;\n this._maxBufferedRequestMetric = maxBufferedRequestMetric;\n }\n _normalizeStripeContext(optsContext, clientContext) {\n if (optsContext) {\n return optsContext.toString() || null; // return null for empty strings\n }\n return (clientContext === null || clientContext === void 0 ? void 0 : clientContext.toString()) || null; // return null for empty strings\n }\n _addHeadersDirectlyToObject(obj, headers) {\n // For convenience, make some headers easily accessible on\n // lastResponse.\n // NOTE: Stripe responds with lowercase header names/keys.\n obj.requestId = headers['request-id'];\n obj.stripeAccount = obj.stripeAccount || headers['stripe-account'];\n obj.apiVersion = obj.apiVersion || headers['stripe-version'];\n obj.idempotencyKey = obj.idempotencyKey || headers['idempotency-key'];\n }\n _makeResponseEvent(requestEvent, statusCode, headers) {\n const requestEndTime = Date.now();\n const requestDurationMs = requestEndTime - requestEvent.request_start_time;\n return removeNullish({\n api_version: headers['stripe-version'],\n account: headers['stripe-account'],\n idempotency_key: headers['idempotency-key'],\n method: requestEvent.method,\n path: requestEvent.path,\n status: statusCode,\n request_id: this._getRequestId(headers),\n elapsed: requestDurationMs,\n request_start_time: requestEvent.request_start_time,\n request_end_time: requestEndTime,\n });\n }\n _getRequestId(headers) {\n return headers['request-id'];\n }\n /**\n * Used by methods with spec.streaming === true. For these methods, we do not\n * buffer successful responses into memory or do parse them into stripe\n * objects, we delegate that all of that to the user and pass back the raw\n * http.Response object to the callback.\n *\n * (Unsuccessful responses shouldn't make it here, they should\n * still be buffered/parsed and handled by _jsonResponseHandler -- see\n * makeRequest)\n */\n _streamingResponseHandler(requestEvent, usage, callback) {\n return (res) => {\n const headers = res.getHeaders();\n const streamCompleteCallback = () => {\n const responseEvent = this._makeResponseEvent(requestEvent, res.getStatusCode(), headers);\n this._stripe._emitter.emit('response', responseEvent);\n this._recordRequestMetrics(this._getRequestId(headers), responseEvent.elapsed, usage);\n };\n const stream = res.toStream(streamCompleteCallback);\n // This is here for backwards compatibility, as the stream is a raw\n // HTTP response in Node and the legacy behavior was to mutate this\n // response.\n this._addHeadersDirectlyToObject(stream, headers);\n return callback(null, stream);\n };\n }\n /**\n * Default handler for Stripe responses. Buffers the response into memory,\n * parses the JSON and returns it (i.e. passes it to the callback) if there\n * is no \"error\" field. Otherwise constructs/passes an appropriate Error.\n */\n _jsonResponseHandler(requestEvent, apiMode, usage, callback) {\n return (res) => {\n const headers = res.getHeaders();\n const requestId = this._getRequestId(headers);\n const statusCode = res.getStatusCode();\n const responseEvent = this._makeResponseEvent(requestEvent, statusCode, headers);\n this._stripe._emitter.emit('response', responseEvent);\n res\n .toJSON()\n .then((jsonResponse) => {\n if (jsonResponse.error) {\n let err;\n // Convert OAuth error responses into a standard format\n // so that the rest of the error logic can be shared\n if (typeof jsonResponse.error === 'string') {\n jsonResponse.error = {\n type: jsonResponse.error,\n message: jsonResponse.error_description,\n };\n }\n jsonResponse.error.headers = headers;\n jsonResponse.error.statusCode = statusCode;\n jsonResponse.error.requestId = requestId;\n if (statusCode === 401) {\n err = new StripeAuthenticationError(jsonResponse.error);\n }\n else if (statusCode === 403) {\n err = new StripePermissionError(jsonResponse.error);\n }\n else if (statusCode === 429) {\n err = new StripeRateLimitError(jsonResponse.error);\n }\n else if (apiMode === 'v2') {\n err = generateV2Error(jsonResponse.error);\n }\n else {\n err = generateV1Error(jsonResponse.error);\n }\n throw err;\n }\n return jsonResponse;\n }, (e) => {\n throw new StripeAPIError({\n message: 'Invalid JSON received from the Stripe API',\n exception: e,\n requestId: headers['request-id'],\n });\n })\n .then((jsonResponse) => {\n this._recordRequestMetrics(requestId, responseEvent.elapsed, usage);\n // Expose raw response object.\n const rawResponse = res.getRawResponse();\n this._addHeadersDirectlyToObject(rawResponse, headers);\n Object.defineProperty(jsonResponse, 'lastResponse', {\n enumerable: false,\n writable: false,\n value: rawResponse,\n });\n callback(null, jsonResponse);\n }, (e) => callback(e, null));\n };\n }\n static _generateConnectionErrorMessage(requestRetries) {\n return `An error occurred with our connection to Stripe.${requestRetries > 0 ? ` Request was retried ${requestRetries} times.` : ''}`;\n }\n // For more on when and how to retry API requests, see https://stripe.com/docs/error-handling#safely-retrying-requests-with-idempotency\n static _shouldRetry(res, numRetries, maxRetries, error) {\n if (error &&\n numRetries === 0 &&\n HttpClient.CONNECTION_CLOSED_ERROR_CODES.includes(error.code)) {\n return true;\n }\n // Do not retry if we are out of retries.\n if (numRetries >= maxRetries) {\n return false;\n }\n // Retry on connection error.\n if (!res) {\n return true;\n }\n // The API may ask us not to retry (e.g., if doing so would be a no-op)\n // or advise us to retry (e.g., in cases of lock timeouts); we defer to that.\n if (res.getHeaders()['stripe-should-retry'] === 'false') {\n return false;\n }\n if (res.getHeaders()['stripe-should-retry'] === 'true') {\n return true;\n }\n // Retry on conflict errors.\n if (res.getStatusCode() === 409) {\n return true;\n }\n // Retry on 500, 503, and other internal errors.\n //\n // Note that we expect the stripe-should-retry header to be false\n // in most cases when a 500 is returned, since our idempotency framework\n // would typically replay it anyway.\n if (res.getStatusCode() >= 500) {\n return true;\n }\n return false;\n }\n _getSleepTimeInMS(numRetries, retryAfter = null) {\n const initialNetworkRetryDelay = this._stripe.getInitialNetworkRetryDelay();\n const maxNetworkRetryDelay = this._stripe.getMaxNetworkRetryDelay();\n // Apply exponential backoff with initialNetworkRetryDelay on the\n // number of numRetries so far as inputs. Do not allow the number to exceed\n // maxNetworkRetryDelay.\n let sleepSeconds = Math.min(initialNetworkRetryDelay * Math.pow(2, numRetries - 1), maxNetworkRetryDelay);\n // Apply some jitter by randomizing the value in the range of\n // (sleepSeconds / 2) to (sleepSeconds).\n sleepSeconds *= 0.5 * (1 + Math.random());\n // But never sleep less than the base sleep seconds.\n sleepSeconds = Math.max(initialNetworkRetryDelay, sleepSeconds);\n // And never sleep less than the time the API asks us to wait, assuming it's a reasonable ask.\n if (Number.isInteger(retryAfter) && retryAfter <= MAX_RETRY_AFTER_WAIT) {\n sleepSeconds = Math.max(sleepSeconds, retryAfter);\n }\n return sleepSeconds * 1000;\n }\n // Max retries can be set on a per request basis. Favor those over the global setting\n _getMaxNetworkRetries(settings = {}) {\n return settings.maxNetworkRetries !== undefined &&\n Number.isInteger(settings.maxNetworkRetries)\n ? settings.maxNetworkRetries\n : this._stripe.getMaxNetworkRetries();\n }\n _defaultIdempotencyKey(method, settings, apiMode) {\n // If this is a POST and we allow multiple retries, ensure an idempotency key.\n const maxRetries = this._getMaxNetworkRetries(settings);\n const genKey = () => `stripe-node-retry-${this._stripe._platformFunctions.uuid4()}`;\n // more verbose than it needs to be, but gives clear separation between V1 and V2 behavior\n if (apiMode === 'v2') {\n if (method === 'POST' || method === 'DELETE') {\n return genKey();\n }\n }\n else if (apiMode === 'v1') {\n if (method === 'POST' && maxRetries > 0) {\n return genKey();\n }\n }\n return null;\n }\n _makeHeaders({ contentType, contentLength, apiVersion, clientUserAgent, method, userSuppliedHeaders, userSuppliedSettings, stripeAccount, stripeContext, apiMode, }) {\n const defaultHeaders = {\n Accept: 'application/json',\n 'Content-Type': contentType,\n 'User-Agent': this._getUserAgentString(apiMode),\n 'X-Stripe-Client-User-Agent': clientUserAgent,\n 'X-Stripe-Client-Telemetry': this._getTelemetryHeader(),\n 'Stripe-Version': apiVersion,\n 'Stripe-Account': stripeAccount,\n 'Stripe-Context': stripeContext,\n 'Idempotency-Key': this._defaultIdempotencyKey(method, userSuppliedSettings, apiMode),\n };\n // As per https://datatracker.ietf.org/doc/html/rfc7230#section-3.3.2:\n // A user agent SHOULD send a Content-Length in a request message when\n // no Transfer-Encoding is sent and the request method defines a meaning\n // for an enclosed payload body. For example, a Content-Length header\n // field is normally sent in a POST request even when the value is 0\n // (indicating an empty payload body). A user agent SHOULD NOT send a\n // Content-Length header field when the request message does not contain\n // a payload body and the method semantics do not anticipate such a\n // body.\n //\n // These method types are expected to have bodies and so we should always\n // include a Content-Length.\n const methodHasPayload = method == 'POST' || method == 'PUT' || method == 'PATCH';\n // If a content length was specified, we always include it regardless of\n // whether the method semantics anticipate such a body. This keeps us\n // consistent with historical behavior. We do however want to warn on this\n // and fix these cases as they are semantically incorrect.\n if (methodHasPayload || contentLength) {\n if (!methodHasPayload) {\n emitWarning(`${method} method had non-zero contentLength but no payload is expected for this verb`);\n }\n defaultHeaders['Content-Length'] = contentLength;\n }\n return Object.assign(removeNullish(defaultHeaders), \n // If the user supplied, say 'idempotency-key', override instead of appending by ensuring caps are the same.\n normalizeHeaders(userSuppliedHeaders));\n }\n _getUserAgentString(apiMode) {\n const packageVersion = this._stripe.getConstant('PACKAGE_VERSION');\n const appInfo = this._stripe._appInfo\n ? this._stripe.getAppInfoAsString()\n : '';\n const aiAgent = this._stripe.getConstant('AI_AGENT');\n let uaString = `Stripe/${apiMode} NodeBindings/${packageVersion}`;\n if (appInfo) {\n uaString += ` ${appInfo}`;\n }\n if (aiAgent) {\n uaString += ` AIAgent/${aiAgent}`;\n }\n return uaString;\n }\n _getTelemetryHeader() {\n if (this._stripe.getTelemetryEnabled() &&\n this._stripe._prevRequestMetrics.length > 0) {\n const metrics = this._stripe._prevRequestMetrics.shift();\n return JSON.stringify({\n last_request_metrics: metrics,\n });\n }\n }\n _recordRequestMetrics(requestId, requestDurationMs, usage) {\n if (this._stripe.getTelemetryEnabled() && requestId) {\n if (this._stripe._prevRequestMetrics.length > this._maxBufferedRequestMetric) {\n emitWarning('Request metrics buffer is full, dropping telemetry message.');\n }\n else {\n const m = {\n request_id: requestId,\n request_duration_ms: requestDurationMs,\n };\n if (usage && usage.length > 0) {\n m.usage = usage;\n }\n this._stripe._prevRequestMetrics.push(m);\n }\n }\n }\n _rawRequest(method, path, params, options, usage) {\n const requestPromise = new Promise((resolve, reject) => {\n let opts;\n try {\n const requestMethod = method.toUpperCase();\n if (requestMethod !== 'POST' &&\n params &&\n Object.keys(params).length !== 0) {\n throw new Error('rawRequest only supports params on POST requests. Please pass null and add your parameters to path.');\n }\n const args = [].slice.call([params, options]);\n // Pull request data and options (headers, auth) from args.\n const dataFromArgs = getDataFromArgs(args);\n const data = requestMethod === 'POST' ? Object.assign({}, dataFromArgs) : null;\n const calculatedOptions = getOptionsFromArgs(args);\n const headers = calculatedOptions.headers;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const authenticator = calculatedOptions.authenticator;\n opts = {\n requestMethod,\n requestPath: path,\n bodyData: data,\n queryData: {},\n authenticator,\n headers,\n host: calculatedOptions.host,\n streaming: !!calculatedOptions.streaming,\n settings: {},\n // We use this for thin event internals, so we should record the more specific `usage`, when available\n usage: usage || ['raw_request'],\n };\n }\n catch (err) {\n reject(err);\n return;\n }\n function requestCallback(err, response) {\n if (err) {\n reject(err);\n }\n else {\n resolve(response);\n }\n }\n const { headers, settings } = opts;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const authenticator = opts.authenticator;\n this._request(opts.requestMethod, opts.host, path, opts.bodyData, authenticator, { headers, settings, streaming: opts.streaming }, opts.usage, requestCallback);\n });\n return requestPromise;\n }\n _getContentLength(data) {\n // if we calculate this wrong, the server treats it as invalid json\n // or if content length is too big, the request never finishes and it\n // times out.\n return typeof data === 'string'\n ? new TextEncoder().encode(data).length\n : data.length;\n }\n _request(method, host, path, data, authenticator, options, usage = [], callback, requestDataProcessor = null) {\n var _a;\n let requestData;\n authenticator = (_a = authenticator !== null && authenticator !== void 0 ? authenticator : this._stripe._authenticator) !== null && _a !== void 0 ? _a : null;\n const apiMode = getAPIMode(path);\n const retryRequest = (requestFn, apiVersion, headers, requestRetries, retryAfter) => {\n return setTimeout(requestFn, this._getSleepTimeInMS(requestRetries, retryAfter), apiVersion, headers, requestRetries + 1);\n };\n const makeRequest = (apiVersion, headers, numRetries) => {\n // timeout can be set on a per-request basis. Favor that over the global setting\n const timeout = options.settings &&\n options.settings.timeout &&\n Number.isInteger(options.settings.timeout) &&\n options.settings.timeout >= 0\n ? options.settings.timeout\n : this._stripe.getApiField('timeout');\n const request = {\n host: host || this._stripe.getApiField('host'),\n port: this._stripe.getApiField('port'),\n path: path,\n method: method,\n headers: Object.assign({}, headers),\n body: requestData,\n protocol: this._stripe.getApiField('protocol'),\n };\n authenticator(request)\n .then(() => {\n const req = this._stripe\n .getApiField('httpClient')\n .makeRequest(request.host, request.port, request.path, request.method, request.headers, request.body, request.protocol, timeout);\n const requestStartTime = Date.now();\n const requestEvent = removeNullish({\n api_version: apiVersion,\n account: parseHttpHeaderAsString(headers['Stripe-Account']),\n idempotency_key: parseHttpHeaderAsString(headers['Idempotency-Key']),\n method,\n path,\n request_start_time: requestStartTime,\n });\n const requestRetries = numRetries || 0;\n const maxRetries = this._getMaxNetworkRetries(options.settings || {});\n this._stripe._emitter.emit('request', requestEvent);\n req\n .then((res) => {\n if (RequestSender._shouldRetry(res, requestRetries, maxRetries)) {\n return retryRequest(makeRequest, apiVersion, headers, requestRetries, parseHttpHeaderAsNumber(res.getHeaders()['retry-after']));\n }\n else if (options.streaming && res.getStatusCode() < 400) {\n return this._streamingResponseHandler(requestEvent, usage, callback)(res);\n }\n else {\n return this._jsonResponseHandler(requestEvent, apiMode, usage, callback)(res);\n }\n })\n .catch((error) => {\n if (RequestSender._shouldRetry(null, requestRetries, maxRetries, error)) {\n return retryRequest(makeRequest, apiVersion, headers, requestRetries, null);\n }\n else {\n const isTimeoutError = error.code && error.code === HttpClient.TIMEOUT_ERROR_CODE;\n return callback(new StripeConnectionError({\n message: isTimeoutError\n ? `Request aborted due to timeout being reached (${timeout}ms)`\n : RequestSender._generateConnectionErrorMessage(requestRetries),\n detail: error,\n }));\n }\n });\n })\n .catch((e) => {\n throw new StripeError({\n message: 'Unable to authenticate the request',\n exception: e,\n });\n });\n };\n const prepareAndMakeRequest = (error, data) => {\n if (error) {\n return callback(error);\n }\n requestData = data;\n this._stripe.getClientUserAgent((clientUserAgent) => {\n var _a, _b, _c;\n const apiVersion = this._stripe.getApiField('version');\n const headers = this._makeHeaders({\n contentType: apiMode == 'v2'\n ? 'application/json'\n : 'application/x-www-form-urlencoded',\n contentLength: this._getContentLength(data),\n apiVersion: apiVersion,\n clientUserAgent,\n method,\n // other callers expect null, but .headers being optional means it's undefined if not supplied. So we normalize to null.\n userSuppliedHeaders: (_a = options.headers) !== null && _a !== void 0 ? _a : null,\n userSuppliedSettings: (_b = options.settings) !== null && _b !== void 0 ? _b : {},\n stripeAccount: (_c = options.stripeAccount) !== null && _c !== void 0 ? _c : this._stripe.getApiField('stripeAccount'),\n stripeContext: this._normalizeStripeContext(options.stripeContext, this._stripe.getApiField('stripeContext')),\n apiMode: apiMode,\n });\n makeRequest(apiVersion, headers, 0);\n });\n };\n if (requestDataProcessor) {\n requestDataProcessor(method, data, options.headers, prepareAndMakeRequest);\n }\n else {\n let stringifiedData;\n if (apiMode == 'v2') {\n stringifiedData = data ? jsonStringifyRequestData(data) : '';\n }\n else {\n stringifiedData = queryStringifyRequestData(data || {});\n }\n prepareAndMakeRequest(null, stringifiedData);\n }\n }\n}\n","import { callbackifyPromiseWithTimeout, getDataFromArgs, getAPIMode, } from './utils.js';\nclass V1Iterator {\n constructor(firstPagePromise, requestArgs, spec, stripeResource) {\n this.index = 0;\n this.pagePromise = firstPagePromise;\n this.promiseCache = { currentPromise: null };\n this.requestArgs = requestArgs;\n this.spec = spec;\n this.stripeResource = stripeResource;\n }\n async iterate(pageResult) {\n if (!(pageResult &&\n pageResult.data &&\n typeof pageResult.data.length === 'number')) {\n throw Error('Unexpected: Stripe API response does not have a well-formed `data` array.');\n }\n const reverseIteration = isReverseIteration(this.requestArgs);\n if (this.index < pageResult.data.length) {\n const idx = reverseIteration\n ? pageResult.data.length - 1 - this.index\n : this.index;\n const value = pageResult.data[idx];\n this.index += 1;\n return { value, done: false };\n }\n else if (pageResult.has_more) {\n // Reset counter, request next page, and recurse.\n this.index = 0;\n this.pagePromise = this.getNextPage(pageResult);\n const nextPageResult = await this.pagePromise;\n return this.iterate(nextPageResult);\n }\n return { done: true, value: undefined };\n }\n /** @abstract */\n getNextPage(_pageResult) {\n throw new Error('Unimplemented');\n }\n async _next() {\n return this.iterate(await this.pagePromise);\n }\n next() {\n /**\n * If a user calls `.next()` multiple times in parallel,\n * return the same result until something has resolved\n * to prevent page-turning race conditions.\n */\n if (this.promiseCache.currentPromise) {\n return this.promiseCache.currentPromise;\n }\n const nextPromise = (async () => {\n const ret = await this._next();\n this.promiseCache.currentPromise = null;\n return ret;\n })();\n this.promiseCache.currentPromise = nextPromise;\n return nextPromise;\n }\n}\nclass V1ListIterator extends V1Iterator {\n getNextPage(pageResult) {\n const reverseIteration = isReverseIteration(this.requestArgs);\n const lastId = getLastId(pageResult, reverseIteration);\n return this.stripeResource._makeRequest(this.requestArgs, this.spec, {\n [reverseIteration ? 'ending_before' : 'starting_after']: lastId,\n });\n }\n}\nclass V1SearchIterator extends V1Iterator {\n getNextPage(pageResult) {\n if (!pageResult.next_page) {\n throw Error('Unexpected: Stripe API response does not have a well-formed `next_page` field, but `has_more` was true.');\n }\n return this.stripeResource._makeRequest(this.requestArgs, this.spec, {\n page: pageResult.next_page,\n });\n }\n}\nclass V2ListIterator {\n constructor(firstPagePromise, requestArgs, spec, stripeResource) {\n this.firstPagePromise = firstPagePromise;\n this.currentPageIterator = null;\n this.nextPageUrl = null;\n this.requestArgs = requestArgs;\n this.spec = spec;\n this.stripeResource = stripeResource;\n }\n async initFirstPage() {\n if (this.firstPagePromise) {\n const page = await this.firstPagePromise;\n this.firstPagePromise = null;\n this.currentPageIterator = page.data[Symbol.iterator]();\n this.nextPageUrl = page.next_page_url || null;\n }\n }\n async turnPage() {\n if (!this.nextPageUrl)\n return null;\n this.spec.fullPath = this.nextPageUrl;\n const page = await this.stripeResource._makeRequest([], this.spec, {});\n this.nextPageUrl = page.next_page_url || null;\n this.currentPageIterator = page.data[Symbol.iterator]();\n return this.currentPageIterator;\n }\n async next() {\n await this.initFirstPage();\n if (this.currentPageIterator) {\n const result = this.currentPageIterator.next();\n if (!result.done)\n return { done: false, value: result.value };\n }\n const nextPageIterator = await this.turnPage();\n if (!nextPageIterator) {\n return { done: true, value: undefined };\n }\n const result = nextPageIterator.next();\n if (!result.done)\n return { done: false, value: result.value };\n return { done: true, value: undefined };\n }\n}\nexport const makeAutoPaginationMethods = (stripeResource, requestArgs, spec, firstPagePromise) => {\n const apiMode = getAPIMode(spec.fullPath || spec.path);\n if (apiMode !== 'v2' && spec.methodType === 'search') {\n return makeAutoPaginationMethodsFromIterator(new V1SearchIterator(firstPagePromise, requestArgs, spec, stripeResource));\n }\n if (apiMode !== 'v2' && spec.methodType === 'list') {\n return makeAutoPaginationMethodsFromIterator(new V1ListIterator(firstPagePromise, requestArgs, spec, stripeResource));\n }\n if (apiMode === 'v2' && spec.methodType === 'list') {\n return makeAutoPaginationMethodsFromIterator(new V2ListIterator(firstPagePromise, requestArgs, spec, stripeResource));\n }\n return null;\n};\nconst makeAutoPaginationMethodsFromIterator = (iterator) => {\n const autoPagingEach = makeAutoPagingEach((...args) => iterator.next(...args));\n const autoPagingToArray = makeAutoPagingToArray(autoPagingEach);\n const autoPaginationMethods = {\n autoPagingEach,\n autoPagingToArray,\n // Async iterator functions:\n next: () => iterator.next(),\n return: () => {\n // This is required for `break`.\n return {};\n },\n [getAsyncIteratorSymbol()]: () => {\n return autoPaginationMethods;\n },\n };\n return autoPaginationMethods;\n};\n/**\n * ----------------\n * Private Helpers:\n * ----------------\n */\nfunction getAsyncIteratorSymbol() {\n if (typeof Symbol !== 'undefined' && Symbol.asyncIterator) {\n return Symbol.asyncIterator;\n }\n // Follow the convention from libraries like iterall: https://github.com/leebyron/iterall#asynciterator-1\n return '@@asyncIterator';\n}\nfunction getDoneCallback(args) {\n if (args.length < 2) {\n return null;\n }\n const onDone = args[1];\n if (typeof onDone !== 'function') {\n throw Error(`The second argument to autoPagingEach, if present, must be a callback function; received ${typeof onDone}`);\n }\n return onDone;\n}\n/**\n * We allow four forms of the `onItem` callback (the middle two being equivalent),\n *\n * 1. `.autoPagingEach((item) => { doSomething(item); return false; });`\n * 2. `.autoPagingEach(async (item) => { await doSomething(item); return false; });`\n * 3. `.autoPagingEach((item) => doSomething(item).then(() => false));`\n * 4. `.autoPagingEach((item, next) => { doSomething(item); next(false); });`\n *\n * In addition to standard validation, this helper\n * coalesces the former forms into the latter form.\n */\nfunction getItemCallback(args) {\n if (args.length === 0) {\n return undefined;\n }\n const onItem = args[0];\n if (typeof onItem !== 'function') {\n throw Error(`The first argument to autoPagingEach, if present, must be a callback function; received ${typeof onItem}`);\n }\n // 4. `.autoPagingEach((item, next) => { doSomething(item); next(false); });`\n if (onItem.length === 2) {\n return onItem;\n }\n if (onItem.length > 2) {\n throw Error(`The \\`onItem\\` callback function passed to autoPagingEach must accept at most two arguments; got ${onItem}`);\n }\n // This magically handles all three of these usecases (the latter two being functionally identical):\n // 1. `.autoPagingEach((item) => { doSomething(item); return false; });`\n // 2. `.autoPagingEach(async (item) => { await doSomething(item); return false; });`\n // 3. `.autoPagingEach((item) => doSomething(item).then(() => false));`\n return function _onItem(item, next) {\n const shouldContinue = onItem(item);\n next(shouldContinue);\n };\n}\nfunction getLastId(listResult, reverseIteration) {\n const lastIdx = reverseIteration ? 0 : listResult.data.length - 1;\n const lastItem = listResult.data[lastIdx];\n const lastId = lastItem && lastItem.id;\n if (!lastId) {\n throw Error('Unexpected: No `id` found on the last item while auto-paging a list.');\n }\n return lastId;\n}\nfunction makeAutoPagingEach(asyncIteratorNext) {\n return function autoPagingEach( /* onItem?, onDone? */) {\n const args = [].slice.call(arguments);\n const onItem = getItemCallback(args);\n const onDone = getDoneCallback(args);\n if (args.length > 2) {\n throw Error(`autoPagingEach takes up to two arguments; received ${args}`);\n }\n const autoPagePromise = wrapAsyncIteratorWithCallback(asyncIteratorNext, \n // @ts-ignore we might need a null check\n onItem);\n return callbackifyPromiseWithTimeout(autoPagePromise, onDone);\n };\n}\nfunction makeAutoPagingToArray(autoPagingEach) {\n return function autoPagingToArray(opts, onDone) {\n const limit = opts && opts.limit;\n if (!limit) {\n throw Error('You must pass a `limit` option to autoPagingToArray, e.g., `autoPagingToArray({limit: 1000});`.');\n }\n if (limit > 10000) {\n throw Error('You cannot specify a limit of more than 10,000 items to fetch in `autoPagingToArray`; use `autoPagingEach` to iterate through longer lists.');\n }\n const promise = new Promise((resolve, reject) => {\n const items = [];\n autoPagingEach((item) => {\n items.push(item);\n if (items.length >= limit) {\n return false;\n }\n })\n .then(() => {\n resolve(items);\n })\n .catch(reject);\n });\n // @ts-ignore\n return callbackifyPromiseWithTimeout(promise, onDone);\n };\n}\nfunction wrapAsyncIteratorWithCallback(asyncIteratorNext, onItem) {\n return new Promise((resolve, reject) => {\n function handleIteration(iterResult) {\n if (iterResult.done) {\n resolve();\n return;\n }\n const item = iterResult.value;\n return new Promise((next) => {\n // Bit confusing, perhaps; we pass a `resolve` fn\n // to the user, so they can decide when and if to continue.\n // They can return false, or a promise which resolves to false, to break.\n onItem(item, next);\n }).then((shouldContinue) => {\n if (shouldContinue === false) {\n return handleIteration({ done: true, value: undefined });\n }\n else {\n return asyncIteratorNext().then(handleIteration);\n }\n });\n }\n asyncIteratorNext()\n .then(handleIteration)\n .catch(reject);\n });\n}\nfunction isReverseIteration(requestArgs) {\n const args = [].slice.call(requestArgs);\n const dataFromArgs = getDataFromArgs(args);\n return !!dataFromArgs.ending_before;\n}\n","import { callbackifyPromiseWithTimeout, extractUrlParams } from './utils.js';\nimport { makeAutoPaginationMethods } from './autoPagination.js';\n/**\n * Create an API method from the declared spec.\n *\n * @param [spec.method='GET'] Request Method (POST, GET, DELETE, PUT)\n * @param [spec.path=''] Path to be appended to the API BASE_PATH, joined with\n * the instance's path (e.g. 'charges' or 'customers')\n * @param [spec.fullPath=''] Fully qualified path to the method (eg. /v1/a/b/c).\n * If this is specified, path should not be specified.\n * @param [spec.urlParams=[]] Array of required arguments in the order that they\n * must be passed by the consumer of the API. Subsequent optional arguments are\n * optionally passed through a hash (Object) as the penultimate argument\n * (preceding the also-optional callback argument\n * @param [spec.encode] Function for mutating input parameters to a method.\n * Usefully for applying transforms to data on a per-method basis.\n * @param [spec.host] Hostname for the request.\n *\n * <!-- Public API accessible via Stripe.StripeResource.method -->\n */\nexport function stripeMethod(spec) {\n if (spec.path !== undefined && spec.fullPath !== undefined) {\n throw new Error(`Method spec specified both a 'path' (${spec.path}) and a 'fullPath' (${spec.fullPath}).`);\n }\n return function (...args) {\n const callback = typeof args[args.length - 1] == 'function' && args.pop();\n spec.urlParams = extractUrlParams(spec.fullPath || this.createResourcePathWithSymbols(spec.path || ''));\n const requestPromise = callbackifyPromiseWithTimeout(this._makeRequest(args, spec, {}), callback);\n Object.assign(requestPromise, makeAutoPaginationMethods(this, args, spec, requestPromise));\n return requestPromise;\n };\n}\n","import { getDataFromArgs, getOptionsFromArgs, makeURLInterpolator, protoExtend, queryStringifyRequestData, } from './utils.js';\nimport { stripeMethod } from './StripeMethod.js';\n// Provide extension mechanism for Stripe Resource Sub-Classes\nStripeResource.extend = protoExtend;\n// Expose method-creator\nStripeResource.method = stripeMethod;\nStripeResource.MAX_BUFFERED_REQUEST_METRICS = 100;\n/**\n * Encapsulates request logic for a Stripe Resource\n */\nfunction StripeResource(stripe, deprecatedUrlData) {\n this._stripe = stripe;\n if (deprecatedUrlData) {\n throw new Error('Support for curried url params was dropped in stripe-node v7.0.0. Instead, pass two ids.');\n }\n this.basePath = makeURLInterpolator(\n // @ts-ignore changing type of basePath\n this.basePath || stripe.getApiField('basePath'));\n // @ts-ignore changing type of path\n this.resourcePath = this.path;\n // @ts-ignore changing type of path\n this.path = makeURLInterpolator(this.path);\n this.initialize(...arguments);\n}\nStripeResource.prototype = {\n _stripe: null,\n // @ts-ignore the type of path changes in ctor\n path: '',\n resourcePath: '',\n // Methods that don't use the API's default '/v1' path can override it with this setting.\n basePath: null,\n initialize() { },\n // Function to override the default data processor. This allows full control\n // over how a StripeResource's request data will get converted into an HTTP\n // body. This is useful for non-standard HTTP requests. The function should\n // take method name, data, and headers as arguments.\n requestDataProcessor: null,\n // Function to add a validation checks before sending the request, errors should\n // be thrown, and they will be passed to the callback/promise.\n validateRequest: null,\n createFullPath(commandPath, urlData) {\n const urlParts = [this.basePath(urlData), this.path(urlData)];\n if (typeof commandPath === 'function') {\n const computedCommandPath = commandPath(urlData);\n // If we have no actual command path, we just omit it to avoid adding a\n // trailing slash. This is important for top-level listing requests, which\n // do not have a command path.\n if (computedCommandPath) {\n urlParts.push(computedCommandPath);\n }\n }\n else {\n urlParts.push(commandPath);\n }\n return this._joinUrlParts(urlParts);\n },\n // Creates a relative resource path with symbols left in (unlike\n // createFullPath which takes some data to replace them with). For example it\n // might produce: /invoices/{id}\n createResourcePathWithSymbols(pathWithSymbols) {\n // If there is no path beyond the resource path, we want to produce just\n // /<resource path> rather than /<resource path>/.\n if (pathWithSymbols) {\n return `/${this._joinUrlParts([this.resourcePath, pathWithSymbols])}`;\n }\n else {\n return `/${this.resourcePath}`;\n }\n },\n _joinUrlParts(parts) {\n // Replace any accidentally doubled up slashes. This previously used\n // path.join, which would do this as well. Unfortunately we need to do this\n // as the functions for creating paths are technically part of the public\n // interface and so we need to preserve backwards compatibility.\n return parts.join('/').replace(/\\/{2,}/g, '/');\n },\n _getRequestOpts(requestArgs, spec, overrideData) {\n var _a;\n // Extract spec values with defaults.\n const requestMethod = (spec.method || 'GET').toUpperCase();\n const usage = spec.usage || [];\n const urlParams = spec.urlParams || [];\n const encode = spec.encode || ((data) => data);\n const isUsingFullPath = !!spec.fullPath;\n const commandPath = makeURLInterpolator(isUsingFullPath ? spec.fullPath : spec.path || '');\n // When using fullPath, we ignore the resource path as it should already be\n // fully qualified.\n const path = isUsingFullPath\n ? spec.fullPath\n : this.createResourcePathWithSymbols(spec.path);\n // Don't mutate args externally.\n const args = [].slice.call(requestArgs);\n // Generate and validate url params.\n const urlData = urlParams.reduce((urlData, param) => {\n const arg = args.shift();\n if (typeof arg !== 'string') {\n throw new Error(`Stripe: Argument \"${param}\" must be a string, but got: ${arg} (on API request to \\`${requestMethod} ${path}\\`)`);\n }\n urlData[param] = arg;\n return urlData;\n }, {});\n // Pull request data and options (headers, auth) from args.\n const dataFromArgs = getDataFromArgs(args);\n const data = encode(Object.assign({}, dataFromArgs, overrideData));\n const options = getOptionsFromArgs(args);\n const host = options.host || spec.host;\n const streaming = !!spec.streaming || !!options.streaming;\n // Validate that there are no more args.\n if (args.filter((x) => x != null).length) {\n throw new Error(`Stripe: Unknown arguments (${args}). Did you mean to pass an options object? See https://github.com/stripe/stripe-node/wiki/Passing-Options. (on API request to ${requestMethod} \\`${path}\\`)`);\n }\n // When using full path, we can just invoke the URL interpolator directly\n // as we don't need to use the resource to create a full path.\n const requestPath = isUsingFullPath\n ? commandPath(urlData)\n : this.createFullPath(commandPath, urlData);\n const headers = Object.assign(options.headers, spec.headers);\n if (spec.validator) {\n spec.validator(data, { headers });\n }\n const dataInQuery = spec.method === 'GET' || spec.method === 'DELETE';\n const bodyData = dataInQuery ? null : data;\n const queryData = dataInQuery ? data : {};\n return {\n requestMethod,\n requestPath,\n bodyData,\n queryData,\n authenticator: (_a = options.authenticator) !== null && _a !== void 0 ? _a : null,\n headers,\n host: host !== null && host !== void 0 ? host : null,\n streaming,\n settings: options.settings,\n usage,\n };\n },\n _makeRequest(requestArgs, spec, overrideData) {\n return new Promise((resolve, reject) => {\n var _a;\n let opts;\n try {\n opts = this._getRequestOpts(requestArgs, spec, overrideData);\n }\n catch (err) {\n reject(err);\n return;\n }\n function requestCallback(err, response) {\n if (err) {\n reject(err);\n }\n else {\n resolve(spec.transformResponseData\n ? spec.transformResponseData(response)\n : response);\n }\n }\n const emptyQuery = Object.keys(opts.queryData).length === 0;\n const path = [\n opts.requestPath,\n emptyQuery ? '' : '?',\n queryStringifyRequestData(opts.queryData),\n ].join('');\n const { headers, settings } = opts;\n this._stripe._requestSender._request(opts.requestMethod, opts.host, path, opts.bodyData, opts.authenticator, {\n headers,\n settings,\n streaming: opts.streaming,\n }, opts.usage, requestCallback, (_a = this.requestDataProcessor) === null || _a === void 0 ? void 0 : _a.bind(this));\n });\n },\n};\nexport { StripeResource };\n","/**\n * The StripeContext class provides an immutable container and convenience methods for interacting with the `Stripe-Context` header. All methods return a new instance of StripeContext.\n * You can use it whenever you're initializing a `Stripe` instance or sending `stripeContext` with a request. It's also found in the `EventNotification.context` property.\n */\nexport class StripeContext {\n /**\n * Creates a new StripeContext with the given segments.\n */\n constructor(segments = []) {\n this._segments = [...segments];\n }\n /**\n * Gets a copy of the segments of this Context.\n */\n get segments() {\n return [...this._segments];\n }\n /**\n * Creates a new StripeContext with an additional segment appended.\n */\n push(segment) {\n if (!segment) {\n throw new Error('Segment cannot be null or undefined');\n }\n return new StripeContext([...this._segments, segment]);\n }\n /**\n * Creates a new StripeContext with the last segment removed.\n * If there are no segments, throws an error.\n */\n pop() {\n if (this._segments.length === 0) {\n throw new Error('Cannot pop from an empty context');\n }\n return new StripeContext(this._segments.slice(0, -1));\n }\n /**\n * Converts this context to its string representation.\n */\n toString() {\n return this._segments.join('/');\n }\n /**\n * Parses a context string into a StripeContext instance.\n */\n static parse(contextStr) {\n if (!contextStr) {\n return new StripeContext([]);\n }\n return new StripeContext(contextStr.split('/'));\n }\n}\n","import { StripeError, StripeSignatureVerificationError } from './Error.js';\nimport { CryptoProviderOnlySupportsAsyncError, } from './crypto/CryptoProvider.js';\nexport function createWebhooks(platformFunctions) {\n const Webhook = {\n DEFAULT_TOLERANCE: 300,\n signature: null,\n constructEvent(payload, header, secret, tolerance, cryptoProvider, receivedAt) {\n try {\n if (!this.signature) {\n throw new Error('ERR: missing signature helper, unable to verify');\n }\n this.signature.verifyHeader(payload, header, secret, tolerance || Webhook.DEFAULT_TOLERANCE, cryptoProvider, receivedAt);\n }\n catch (e) {\n if (e instanceof CryptoProviderOnlySupportsAsyncError) {\n e.message +=\n '\\nUse `await constructEventAsync(...)` instead of `constructEvent(...)`';\n }\n throw e;\n }\n const jsonPayload = payload instanceof Uint8Array\n ? JSON.parse(new TextDecoder('utf8').decode(payload))\n : JSON.parse(payload);\n return jsonPayload;\n },\n async constructEventAsync(payload, header, secret, tolerance, cryptoProvider, receivedAt) {\n if (!this.signature) {\n throw new Error('ERR: missing signature helper, unable to verify');\n }\n await this.signature.verifyHeaderAsync(payload, header, secret, tolerance || Webhook.DEFAULT_TOLERANCE, cryptoProvider, receivedAt);\n const jsonPayload = payload instanceof Uint8Array\n ? JSON.parse(new TextDecoder('utf8').decode(payload))\n : JSON.parse(payload);\n return jsonPayload;\n },\n /**\n * Generates a header to be used for webhook mocking\n *\n * @typedef {object} opts\n * @property {number} timestamp - Timestamp of the header. Defaults to Date.now()\n * @property {string} payload - JSON stringified payload object, containing the 'id' and 'object' parameters\n * @property {string} secret - Stripe webhook secret 'whsec_...'\n * @property {string} scheme - Version of API to hit. Defaults to 'v1'.\n * @property {string} signature - Computed webhook signature\n * @property {CryptoProvider} cryptoProvider - Crypto provider to use for computing the signature if none was provided. Defaults to NodeCryptoProvider.\n */\n generateTestHeaderString: function (opts) {\n const preparedOpts = prepareOptions(opts);\n const signature = preparedOpts.signature ||\n preparedOpts.cryptoProvider.computeHMACSignature(preparedOpts.payloadString, preparedOpts.secret);\n return preparedOpts.generateHeaderString(signature);\n },\n generateTestHeaderStringAsync: async function (opts) {\n const preparedOpts = prepareOptions(opts);\n const signature = preparedOpts.signature ||\n (await preparedOpts.cryptoProvider.computeHMACSignatureAsync(preparedOpts.payloadString, preparedOpts.secret));\n return preparedOpts.generateHeaderString(signature);\n },\n };\n const signature = {\n EXPECTED_SCHEME: 'v1',\n verifyHeader(encodedPayload, encodedHeader, secret, tolerance, cryptoProvider, receivedAt) {\n const { decodedHeader: header, decodedPayload: payload, details, suspectPayloadType, } = parseEventDetails(encodedPayload, encodedHeader, this.EXPECTED_SCHEME);\n const secretContainsWhitespace = /\\s/.test(secret);\n cryptoProvider = cryptoProvider || getCryptoProvider();\n const expectedSignature = cryptoProvider.computeHMACSignature(makeHMACContent(payload, details), secret);\n validateComputedSignature(payload, header, details, expectedSignature, tolerance, suspectPayloadType, secretContainsWhitespace, receivedAt);\n return true;\n },\n async verifyHeaderAsync(encodedPayload, encodedHeader, secret, tolerance, cryptoProvider, receivedAt) {\n const { decodedHeader: header, decodedPayload: payload, details, suspectPayloadType, } = parseEventDetails(encodedPayload, encodedHeader, this.EXPECTED_SCHEME);\n const secretContainsWhitespace = /\\s/.test(secret);\n cryptoProvider = cryptoProvider || getCryptoProvider();\n const expectedSignature = await cryptoProvider.computeHMACSignatureAsync(makeHMACContent(payload, details), secret);\n return validateComputedSignature(payload, header, details, expectedSignature, tolerance, suspectPayloadType, secretContainsWhitespace, receivedAt);\n },\n };\n function makeHMACContent(payload, details) {\n return `${details.timestamp}.${payload}`;\n }\n function parseEventDetails(encodedPayload, encodedHeader, expectedScheme) {\n if (!encodedPayload) {\n throw new StripeSignatureVerificationError(encodedHeader, encodedPayload, {\n message: 'No webhook payload was provided.',\n });\n }\n const suspectPayloadType = typeof encodedPayload != 'string' &&\n !(encodedPayload instanceof Uint8Array);\n const textDecoder = new TextDecoder('utf8');\n const decodedPayload = encodedPayload instanceof Uint8Array\n ? textDecoder.decode(encodedPayload)\n : encodedPayload;\n // Express's type for `Request#headers` is `string | []string`\n // which is because the `set-cookie` header is an array,\n // but no other headers are an array (docs: https://nodejs.org/api/http.html#http_message_headers)\n // (Express's Request class is an extension of http.IncomingMessage, and doesn't appear to be relevantly modified: https://github.com/expressjs/express/blob/master/lib/request.js#L31)\n if (Array.isArray(encodedHeader)) {\n throw new Error('Unexpected: An array was passed as a header, which should not be possible for the stripe-signature header.');\n }\n if (encodedHeader == null || encodedHeader == '') {\n throw new StripeSignatureVerificationError(encodedHeader, encodedPayload, {\n message: 'No stripe-signature header value was provided.',\n });\n }\n const decodedHeader = encodedHeader instanceof Uint8Array\n ? textDecoder.decode(encodedHeader)\n : encodedHeader;\n const details = parseHeader(decodedHeader, expectedScheme);\n if (!details || details.timestamp === -1) {\n throw new StripeSignatureVerificationError(decodedHeader, decodedPayload, {\n message: 'Unable to extract timestamp and signatures from header',\n });\n }\n if (!details.signatures.length) {\n throw new StripeSignatureVerificationError(decodedHeader, decodedPayload, {\n message: 'No signatures found with expected scheme',\n });\n }\n return {\n decodedPayload,\n decodedHeader,\n details,\n suspectPayloadType,\n };\n }\n function validateComputedSignature(payload, header, details, expectedSignature, tolerance, suspectPayloadType, secretContainsWhitespace, receivedAt) {\n const signatureFound = !!details.signatures.filter(platformFunctions.secureCompare.bind(platformFunctions, expectedSignature)).length;\n const docsLocation = '\\nLearn more about webhook signing and explore webhook integration examples for various frameworks at ' +\n 'https://docs.stripe.com/webhooks/signature';\n const whitespaceMessage = secretContainsWhitespace\n ? '\\n\\nNote: The provided signing secret contains whitespace. This often indicates an extra newline or space is in the value'\n : '';\n if (!signatureFound) {\n if (suspectPayloadType) {\n throw new StripeSignatureVerificationError(header, payload, {\n message: 'Webhook payload must be provided as a string or a Buffer (https://nodejs.org/api/buffer.html) instance representing the _raw_ request body.' +\n 'Payload was provided as a parsed JavaScript object instead. \\n' +\n 'Signature verification is impossible without access to the original signed material. \\n' +\n docsLocation +\n '\\n' +\n whitespaceMessage,\n });\n }\n throw new StripeSignatureVerificationError(header, payload, {\n message: 'No signatures found matching the expected signature for payload.' +\n ' Are you passing the raw request body you received from Stripe? \\n' +\n ' If a webhook request is being forwarded by a third-party tool,' +\n ' ensure that the exact request body, including JSON formatting and new line style, is preserved.\\n' +\n docsLocation +\n '\\n' +\n whitespaceMessage,\n });\n }\n const timestampAge = Math.floor((typeof receivedAt === 'number' ? receivedAt : Date.now()) / 1000) - details.timestamp;\n if (tolerance > 0 && timestampAge > tolerance) {\n throw new StripeSignatureVerificationError(header, payload, {\n message: 'Timestamp outside the tolerance zone',\n });\n }\n return true;\n }\n function parseHeader(header, scheme) {\n if (typeof header !== 'string') {\n return null;\n }\n return header.split(',').reduce((accum, item) => {\n const kv = item.split('=');\n if (kv[0] === 't') {\n accum.timestamp = parseInt(kv[1], 10);\n }\n if (kv[0] === scheme) {\n accum.signatures.push(kv[1]);\n }\n return accum;\n }, {\n timestamp: -1,\n signatures: [],\n });\n }\n let webhooksCryptoProviderInstance = null;\n /**\n * Lazily instantiate a CryptoProvider instance. This is a stateless object\n * so a singleton can be used here.\n */\n function getCryptoProvider() {\n if (!webhooksCryptoProviderInstance) {\n webhooksCryptoProviderInstance = platformFunctions.createDefaultCryptoProvider();\n }\n return webhooksCryptoProviderInstance;\n }\n function prepareOptions(opts) {\n if (!opts) {\n throw new StripeError({\n message: 'Options are required',\n });\n }\n const timestamp = Math.floor(opts.timestamp) || Math.floor(Date.now() / 1000);\n const scheme = opts.scheme || signature.EXPECTED_SCHEME;\n const cryptoProvider = opts.cryptoProvider || getCryptoProvider();\n const payloadString = `${timestamp}.${opts.payload}`;\n const generateHeaderString = (signature) => {\n return `t=${timestamp},${scheme}=${signature}`;\n };\n return Object.assign(Object.assign({}, opts), { timestamp,\n scheme,\n cryptoProvider,\n payloadString,\n generateHeaderString });\n }\n Webhook.signature = signature;\n return Webhook;\n}\n","// File generated from our OpenAPI spec\nexport const ApiVersion = '2026-02-25.clover';\nexport const ApiMajorVersion = 'clover';\n","// ResourceNamespace allows you to create nested resources, i.e. `stripe.issuing.cards`.\n// It also works recursively, so you could do i.e. `stripe.billing.invoicing.pay`.\nfunction ResourceNamespace(stripe, resources) {\n for (const name in resources) {\n if (!Object.prototype.hasOwnProperty.call(resources, name)) {\n continue;\n }\n const camelCaseName = name[0].toLowerCase() + name.substring(1);\n const resource = new resources[name](stripe);\n this[camelCaseName] = resource;\n }\n}\nexport function resourceNamespace(namespace, resources) {\n return function (stripe) {\n return new ResourceNamespace(stripe, resources);\n };\n}\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const AccountLinks = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v2/core/account_links' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const AccountTokens = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v2/core/account_tokens' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/account_tokens/{id}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Accounts = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/accounts/{account}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/accounts',\n methodType: 'list',\n }),\n disconnect: stripeMethod({\n method: 'POST',\n fullPath: '/v1/financial_connections/accounts/{account}/disconnect',\n }),\n listOwners: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/accounts/{account}/owners',\n methodType: 'list',\n }),\n refresh: stripeMethod({\n method: 'POST',\n fullPath: '/v1/financial_connections/accounts/{account}/refresh',\n }),\n subscribe: stripeMethod({\n method: 'POST',\n fullPath: '/v1/financial_connections/accounts/{account}/subscribe',\n }),\n unsubscribe: stripeMethod({\n method: 'POST',\n fullPath: '/v1/financial_connections/accounts/{account}/unsubscribe',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Persons = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/accounts/{account_id}/persons',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/accounts/{account_id}/persons/{id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/accounts/{account_id}/persons/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/accounts/{account_id}/persons',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v2/core/accounts/{account_id}/persons/{id}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PersonTokens = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/accounts/{account_id}/person_tokens',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/accounts/{account_id}/person_tokens/{id}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nimport { Persons } from './Accounts/Persons.js';\nimport { PersonTokens } from './Accounts/PersonTokens.js';\nconst stripeMethod = StripeResource.method;\nexport const Accounts = StripeResource.extend({\n constructor: function (...args) {\n StripeResource.apply(this, args);\n this.persons = new Persons(...args);\n this.personTokens = new PersonTokens(...args);\n },\n create: stripeMethod({ method: 'POST', fullPath: '/v2/core/accounts' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v2/core/accounts/{id}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v2/core/accounts/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/accounts',\n methodType: 'list',\n }),\n close: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/accounts/{id}/close',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ActiveEntitlements = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/entitlements/active_entitlements/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/entitlements/active_entitlements',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Alerts = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/billing/alerts' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/billing/alerts/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/alerts',\n methodType: 'list',\n }),\n activate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/alerts/{id}/activate',\n }),\n archive: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/alerts/{id}/archive',\n }),\n deactivate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/alerts/{id}/deactivate',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Associations = StripeResource.extend({\n find: stripeMethod({ method: 'GET', fullPath: '/v1/tax/associations/find' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Authorizations = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/authorizations/{authorization}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/authorizations/{authorization}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/authorizations',\n methodType: 'list',\n }),\n approve: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/authorizations/{authorization}/approve',\n }),\n decline: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/authorizations/{authorization}/decline',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Authorizations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations',\n }),\n capture: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/capture',\n }),\n expire: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/expire',\n }),\n finalizeAmount: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/finalize_amount',\n }),\n increment: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/increment',\n }),\n respond: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/fraud_challenges/respond',\n }),\n reverse: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/authorizations/{authorization}/reverse',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Calculations = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/tax/calculations' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/calculations/{calculation}',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/calculations/{calculation}/line_items',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Cardholders = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/issuing/cardholders' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/cardholders/{cardholder}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/cardholders/{cardholder}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/cardholders',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Cards = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/issuing/cards' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/issuing/cards/{card}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/issuing/cards/{card}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/cards',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Cards = StripeResource.extend({\n deliverCard: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/cards/{card}/shipping/deliver',\n }),\n failCard: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/cards/{card}/shipping/fail',\n }),\n returnCard: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/cards/{card}/shipping/return',\n }),\n shipCard: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/cards/{card}/shipping/ship',\n }),\n submitCard: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/cards/{card}/shipping/submit',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Configurations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing_portal/configurations',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing_portal/configurations/{configuration}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing_portal/configurations/{configuration}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing_portal/configurations',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Configurations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/configurations',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/configurations/{configuration}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/configurations/{configuration}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/configurations',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/terminal/configurations/{configuration}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ConfirmationTokens = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/confirmation_tokens',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ConnectionTokens = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/connection_tokens',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CreditBalanceSummary = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/credit_balance_summary',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CreditBalanceTransactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/credit_balance_transactions/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/credit_balance_transactions',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CreditGrants = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/billing/credit_grants' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/credit_grants/{id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/credit_grants/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/credit_grants',\n methodType: 'list',\n }),\n expire: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/credit_grants/{id}/expire',\n }),\n voidGrant: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/credit_grants/{id}/void',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CreditReversals = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/credit_reversals',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/credit_reversals/{credit_reversal}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/credit_reversals',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Customers = StripeResource.extend({\n fundCashBalance: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/customers/{customer}/fund_cash_balance',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const DebitReversals = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/debit_reversals',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/debit_reversals/{debit_reversal}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/debit_reversals',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Disputes = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/issuing/disputes' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/disputes/{dispute}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/disputes/{dispute}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/disputes',\n methodType: 'list',\n }),\n submit: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/disputes/{dispute}/submit',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const EarlyFraudWarnings = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/early_fraud_warnings/{early_fraud_warning}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/early_fraud_warnings',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const EventDestinations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/event_destinations',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/event_destinations/{id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/event_destinations/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/event_destinations',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v2/core/event_destinations/{id}',\n }),\n disable: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/event_destinations/{id}/disable',\n }),\n enable: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/event_destinations/{id}/enable',\n }),\n ping: stripeMethod({\n method: 'POST',\n fullPath: '/v2/core/event_destinations/{id}/ping',\n }),\n});\n","// This file is manually maintained\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Events = StripeResource.extend({\n retrieve(...args) {\n const transformResponseData = (response) => {\n return this.addFetchRelatedObjectIfNeeded(response);\n };\n return stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/events/{id}',\n transformResponseData,\n }).apply(this, args);\n },\n list(...args) {\n const transformResponseData = (response) => {\n return Object.assign(Object.assign({}, response), { data: response.data.map(this.addFetchRelatedObjectIfNeeded.bind(this)) });\n };\n return stripeMethod({\n method: 'GET',\n fullPath: '/v2/core/events',\n methodType: 'list',\n transformResponseData,\n }).apply(this, args);\n },\n /**\n * @private\n *\n * For internal use in stripe-node.\n *\n * @param pulledEvent The retrieved event object\n * @returns The retrieved event object with a fetchRelatedObject method,\n * if pulledEvent.related_object is valid (non-null and has a url)\n */\n addFetchRelatedObjectIfNeeded(pulledEvent) {\n if (!pulledEvent.related_object || !pulledEvent.related_object.url) {\n return pulledEvent;\n }\n return Object.assign(Object.assign({}, pulledEvent), { fetchRelatedObject: () => \n // call stripeMethod with 'this' resource to fetch\n // the related object. 'this' is needed to construct\n // and send the request, but the method spec controls\n // the url endpoint and method, so it doesn't matter\n // that 'this' is an Events resource object here\n stripeMethod({\n method: 'GET',\n fullPath: pulledEvent.related_object.url,\n }).apply(this, [\n {\n stripeContext: pulledEvent.context,\n headers: {\n 'Stripe-Request-Trigger': `event=${pulledEvent.id}`,\n },\n },\n ]) });\n },\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Features = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/entitlements/features' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/entitlements/features/{id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/entitlements/features/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/entitlements/features',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const FinancialAccounts = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/financial_accounts',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/financial_accounts/{financial_account}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/financial_accounts/{financial_account}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/financial_accounts',\n methodType: 'list',\n }),\n close: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/financial_accounts/{financial_account}/close',\n }),\n retrieveFeatures: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/financial_accounts/{financial_account}/features',\n }),\n updateFeatures: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/financial_accounts/{financial_account}/features',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const InboundTransfers = StripeResource.extend({\n fail: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/inbound_transfers/{id}/fail',\n }),\n returnInboundTransfer: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/inbound_transfers/{id}/return',\n }),\n succeed: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/inbound_transfers/{id}/succeed',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const InboundTransfers = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/inbound_transfers',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/inbound_transfers/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/inbound_transfers',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/inbound_transfers/{inbound_transfer}/cancel',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Locations = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/terminal/locations' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/locations/{location}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/locations/{location}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/locations',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/terminal/locations/{location}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEventAdjustments = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/meter_event_adjustments',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEventAdjustments = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/billing/meter_event_adjustments',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEventSession = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/billing/meter_event_session',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEventStream = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v2/billing/meter_event_stream',\n host: 'meter-events.stripe.com',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEvents = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/billing/meter_events' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const MeterEvents = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v2/billing/meter_events' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Meters = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/billing/meters' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/billing/meters/{id}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/billing/meters/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/meters',\n methodType: 'list',\n }),\n deactivate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/meters/{id}/deactivate',\n }),\n listEventSummaries: stripeMethod({\n method: 'GET',\n fullPath: '/v1/billing/meters/{id}/event_summaries',\n methodType: 'list',\n }),\n reactivate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing/meters/{id}/reactivate',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const OnboardingLinks = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/onboarding_links',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Orders = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/climate/orders' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/orders/{order}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/climate/orders/{order}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/orders',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/climate/orders/{order}/cancel',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const OutboundPayments = StripeResource.extend({\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_payments/{id}',\n }),\n fail: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_payments/{id}/fail',\n }),\n post: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_payments/{id}/post',\n }),\n returnOutboundPayment: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_payments/{id}/return',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const OutboundPayments = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/outbound_payments',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/outbound_payments/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/outbound_payments',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/outbound_payments/{id}/cancel',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const OutboundTransfers = StripeResource.extend({\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}',\n }),\n fail: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/fail',\n }),\n post: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/post',\n }),\n returnOutboundTransfer: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/outbound_transfers/{outbound_transfer}/return',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const OutboundTransfers = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/outbound_transfers',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/outbound_transfers/{outbound_transfer}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/outbound_transfers',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/treasury/outbound_transfers/{outbound_transfer}/cancel',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentEvaluations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/radar/payment_evaluations',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PersonalizationDesigns = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/personalization_designs',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/personalization_designs/{personalization_design}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/personalization_designs/{personalization_design}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/personalization_designs',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PersonalizationDesigns = StripeResource.extend({\n activate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/personalization_designs/{personalization_design}/activate',\n }),\n deactivate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/personalization_designs/{personalization_design}/deactivate',\n }),\n reject: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/personalization_designs/{personalization_design}/reject',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PhysicalBundles = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/physical_bundles/{physical_bundle}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/physical_bundles',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Products = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/products/{product}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/products',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Readers = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/terminal/readers' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/readers/{reader}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/terminal/readers',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/terminal/readers/{reader}',\n }),\n cancelAction: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/cancel_action',\n }),\n collectInputs: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/collect_inputs',\n }),\n collectPaymentMethod: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/collect_payment_method',\n }),\n confirmPaymentIntent: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/confirm_payment_intent',\n }),\n processPaymentIntent: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/process_payment_intent',\n }),\n processSetupIntent: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/process_setup_intent',\n }),\n refundPayment: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/refund_payment',\n }),\n setReaderDisplay: stripeMethod({\n method: 'POST',\n fullPath: '/v1/terminal/readers/{reader}/set_reader_display',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Readers = StripeResource.extend({\n presentPaymentMethod: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/terminal/readers/{reader}/present_payment_method',\n }),\n succeedInputCollection: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/terminal/readers/{reader}/succeed_input_collection',\n }),\n timeoutInputCollection: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/terminal/readers/{reader}/timeout_input_collection',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReceivedCredits = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/received_credits',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReceivedCredits = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/received_credits/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/received_credits',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReceivedDebits = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/treasury/received_debits',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReceivedDebits = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/received_debits/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/received_debits',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Refunds = StripeResource.extend({\n expire: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/refunds/{refund}/expire',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Registrations = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/tax/registrations' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/registrations/{id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/tax/registrations/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/registrations',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReportRuns = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/reporting/report_runs' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/reporting/report_runs/{report_run}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/reporting/report_runs',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ReportTypes = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/reporting/report_types/{report_type}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/reporting/report_types',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Requests = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/forwarding/requests' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/forwarding/requests/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/forwarding/requests',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ScheduledQueryRuns = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/sigma/scheduled_query_runs/{scheduled_query_run}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/sigma/scheduled_query_runs',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Secrets = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/apps/secrets' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/apps/secrets',\n methodType: 'list',\n }),\n deleteWhere: stripeMethod({\n method: 'POST',\n fullPath: '/v1/apps/secrets/delete',\n }),\n find: stripeMethod({ method: 'GET', fullPath: '/v1/apps/secrets/find' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Sessions = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/billing_portal/sessions',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Sessions = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/checkout/sessions' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/checkout/sessions/{session}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/checkout/sessions/{session}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/checkout/sessions',\n methodType: 'list',\n }),\n expire: stripeMethod({\n method: 'POST',\n fullPath: '/v1/checkout/sessions/{session}/expire',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/checkout/sessions/{session}/line_items',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Sessions = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/financial_connections/sessions',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/sessions/{session}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Settings = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/tax/settings' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/tax/settings' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Suppliers = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/suppliers/{supplier}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/climate/suppliers',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const TestClocks = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/test_clocks',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/test_helpers/test_clocks/{test_clock}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/test_helpers/test_clocks',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/test_helpers/test_clocks/{test_clock}',\n }),\n advance: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/test_clocks/{test_clock}/advance',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Tokens = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/tokens/{token}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/tokens/{token}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/tokens',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const TransactionEntries = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/transaction_entries/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/transaction_entries',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/transactions/{transaction}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/financial_connections/transactions',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/transactions/{transaction}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/issuing/transactions/{transaction}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/issuing/transactions',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/transactions/{transaction}',\n }),\n createFromCalculation: stripeMethod({\n method: 'POST',\n fullPath: '/v1/tax/transactions/create_from_calculation',\n }),\n createReversal: stripeMethod({\n method: 'POST',\n fullPath: '/v1/tax/transactions/create_reversal',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax/transactions/{transaction}/line_items',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transactions = StripeResource.extend({\n createForceCapture: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/transactions/create_force_capture',\n }),\n createUnlinkedRefund: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/transactions/create_unlinked_refund',\n }),\n refund: stripeMethod({\n method: 'POST',\n fullPath: '/v1/test_helpers/issuing/transactions/{transaction}/refund',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/transactions/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/treasury/transactions',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ValueListItems = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/radar/value_list_items',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/value_list_items/{item}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/value_list_items',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/radar/value_list_items/{item}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ValueLists = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/radar/value_lists' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/value_lists/{value_list}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/radar/value_lists/{value_list}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/radar/value_lists',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/radar/value_lists/{value_list}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const VerificationReports = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/identity/verification_reports/{report}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/identity/verification_reports',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const VerificationSessions = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/identity/verification_sessions',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/identity/verification_sessions/{session}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/identity/verification_sessions/{session}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/identity/verification_sessions',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/identity/verification_sessions/{session}/cancel',\n }),\n redact: stripeMethod({\n method: 'POST',\n fullPath: '/v1/identity/verification_sessions/{session}/redact',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\n// Since path can either be `account` or `accounts`, support both through stripeMethod path\nexport const Accounts = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/accounts' }),\n retrieve(id, ...args) {\n // No longer allow an api key to be passed as the first string to this function due to ambiguity between\n // old account ids and api keys. To request the account for an api key, send null as the id\n if (typeof id === 'string') {\n return stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{id}',\n }).apply(this, [id, ...args]);\n }\n else {\n if (id === null || id === undefined) {\n // Remove id as stripeMethod would complain of unexpected argument\n [].shift.apply([id, ...args]);\n }\n return stripeMethod({\n method: 'GET',\n fullPath: '/v1/account',\n }).apply(this, [id, ...args]);\n }\n },\n update: stripeMethod({ method: 'POST', fullPath: '/v1/accounts/{account}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/accounts/{account}' }),\n createExternalAccount: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/external_accounts',\n }),\n createLoginLink: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/login_links',\n }),\n createPerson: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/persons',\n }),\n deleteExternalAccount: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/accounts/{account}/external_accounts/{id}',\n }),\n deletePerson: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/accounts/{account}/persons/{person}',\n }),\n listCapabilities: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/capabilities',\n methodType: 'list',\n }),\n listExternalAccounts: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/external_accounts',\n methodType: 'list',\n }),\n listPersons: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/persons',\n methodType: 'list',\n }),\n reject: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/reject',\n }),\n retrieveCurrent: stripeMethod({ method: 'GET', fullPath: '/v1/account' }),\n retrieveCapability: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/capabilities/{capability}',\n }),\n retrieveExternalAccount: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/external_accounts/{id}',\n }),\n retrievePerson: stripeMethod({\n method: 'GET',\n fullPath: '/v1/accounts/{account}/persons/{person}',\n }),\n updateCapability: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/capabilities/{capability}',\n }),\n updateExternalAccount: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/external_accounts/{id}',\n }),\n updatePerson: stripeMethod({\n method: 'POST',\n fullPath: '/v1/accounts/{account}/persons/{person}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const AccountLinks = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/account_links' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const AccountSessions = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/account_sessions' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ApplePayDomains = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/apple_pay/domains' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/apple_pay/domains/{domain}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/apple_pay/domains',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/apple_pay/domains/{domain}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ApplicationFees = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/application_fees/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/application_fees',\n methodType: 'list',\n }),\n createRefund: stripeMethod({\n method: 'POST',\n fullPath: '/v1/application_fees/{id}/refunds',\n }),\n listRefunds: stripeMethod({\n method: 'GET',\n fullPath: '/v1/application_fees/{id}/refunds',\n methodType: 'list',\n }),\n retrieveRefund: stripeMethod({\n method: 'GET',\n fullPath: '/v1/application_fees/{fee}/refunds/{id}',\n }),\n updateRefund: stripeMethod({\n method: 'POST',\n fullPath: '/v1/application_fees/{fee}/refunds/{id}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Balance = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/balance' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const BalanceSettings = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/balance_settings' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/balance_settings' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const BalanceTransactions = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/balance_transactions/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/balance_transactions',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Charges = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/charges' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/charges/{charge}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/charges/{charge}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/charges',\n methodType: 'list',\n }),\n capture: stripeMethod({\n method: 'POST',\n fullPath: '/v1/charges/{charge}/capture',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/charges/search',\n methodType: 'search',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ConfirmationTokens = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/confirmation_tokens/{confirmation_token}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CountrySpecs = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/country_specs/{country}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/country_specs',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Coupons = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/coupons' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/coupons/{coupon}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/coupons/{coupon}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/coupons',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/coupons/{coupon}' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CreditNotes = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/credit_notes' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/credit_notes/{id}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/credit_notes/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/credit_notes',\n methodType: 'list',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/credit_notes/{credit_note}/lines',\n methodType: 'list',\n }),\n listPreviewLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/credit_notes/preview/lines',\n methodType: 'list',\n }),\n preview: stripeMethod({ method: 'GET', fullPath: '/v1/credit_notes/preview' }),\n voidCreditNote: stripeMethod({\n method: 'POST',\n fullPath: '/v1/credit_notes/{id}/void',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const CustomerSessions = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/customer_sessions' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Customers = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/customers' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/customers/{customer}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/customers/{customer}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/customers/{customer}' }),\n createBalanceTransaction: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/balance_transactions',\n }),\n createFundingInstructions: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/funding_instructions',\n }),\n createSource: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/sources',\n }),\n createTaxId: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/tax_ids',\n }),\n deleteDiscount: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/customers/{customer}/discount',\n }),\n deleteSource: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/customers/{customer}/sources/{id}',\n }),\n deleteTaxId: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/customers/{customer}/tax_ids/{id}',\n }),\n listBalanceTransactions: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/balance_transactions',\n methodType: 'list',\n }),\n listCashBalanceTransactions: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/cash_balance_transactions',\n methodType: 'list',\n }),\n listPaymentMethods: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/payment_methods',\n methodType: 'list',\n }),\n listSources: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/sources',\n methodType: 'list',\n }),\n listTaxIds: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/tax_ids',\n methodType: 'list',\n }),\n retrieveBalanceTransaction: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/balance_transactions/{transaction}',\n }),\n retrieveCashBalance: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/cash_balance',\n }),\n retrieveCashBalanceTransaction: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/cash_balance_transactions/{transaction}',\n }),\n retrievePaymentMethod: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/payment_methods/{payment_method}',\n }),\n retrieveSource: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/sources/{id}',\n }),\n retrieveTaxId: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/{customer}/tax_ids/{id}',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/customers/search',\n methodType: 'search',\n }),\n updateBalanceTransaction: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/balance_transactions/{transaction}',\n }),\n updateCashBalance: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/cash_balance',\n }),\n updateSource: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/sources/{id}',\n }),\n verifySource: stripeMethod({\n method: 'POST',\n fullPath: '/v1/customers/{customer}/sources/{id}/verify',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Disputes = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/disputes/{dispute}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/disputes/{dispute}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/disputes',\n methodType: 'list',\n }),\n close: stripeMethod({\n method: 'POST',\n fullPath: '/v1/disputes/{dispute}/close',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const EphemeralKeys = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/ephemeral_keys',\n validator: (data, options) => {\n if (!options.headers || !options.headers['Stripe-Version']) {\n throw new Error('Passing apiVersion in a separate options hash is required to create an ephemeral key. See https://stripe.com/docs/api/versioning?lang=node');\n }\n },\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/ephemeral_keys/{key}' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Events = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/events/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/events',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ExchangeRates = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/exchange_rates/{rate_id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/exchange_rates',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const FileLinks = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/file_links' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/file_links/{link}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/file_links/{link}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/file_links',\n methodType: 'list',\n }),\n});\n","import { flattenAndStringify, queryStringifyRequestData } from './utils.js';\n// Method for formatting HTTP body for the multipart/form-data specification\n// Mostly taken from Fermata.js\n// https://github.com/natevw/fermata/blob/5d9732a33d776ce925013a265935facd1626cc88/fermata.js#L315-L343\nconst multipartDataGenerator = (method, data, headers) => {\n const segno = (Math.round(Math.random() * 1e16) + Math.round(Math.random() * 1e16)).toString();\n headers['Content-Type'] = `multipart/form-data; boundary=${segno}`;\n const textEncoder = new TextEncoder();\n let buffer = new Uint8Array(0);\n const endBuffer = textEncoder.encode('\\r\\n');\n function push(l) {\n const prevBuffer = buffer;\n const newBuffer = l instanceof Uint8Array ? l : new Uint8Array(textEncoder.encode(l));\n buffer = new Uint8Array(prevBuffer.length + newBuffer.length + 2);\n buffer.set(prevBuffer);\n buffer.set(newBuffer, prevBuffer.length);\n buffer.set(endBuffer, buffer.length - 2);\n }\n function q(s) {\n return `\"${s.replace(/\"|\"/g, '%22').replace(/\\r\\n|\\r|\\n/g, ' ')}\"`;\n }\n const flattenedData = flattenAndStringify(data);\n for (const k in flattenedData) {\n if (!Object.prototype.hasOwnProperty.call(flattenedData, k)) {\n continue;\n }\n const v = flattenedData[k];\n push(`--${segno}`);\n if (Object.prototype.hasOwnProperty.call(v, 'data')) {\n const typedEntry = v;\n push(`Content-Disposition: form-data; name=${q(k)}; filename=${q(typedEntry.name || 'blob')}`);\n push(`Content-Type: ${typedEntry.type || 'application/octet-stream'}`);\n push('');\n push(typedEntry.data);\n }\n else {\n push(`Content-Disposition: form-data; name=${q(k)}`);\n push('');\n push(v);\n }\n }\n push(`--${segno}--`);\n return buffer;\n};\nexport function multipartRequestDataProcessor(method, data, headers, callback) {\n data = data || {};\n if (method !== 'POST') {\n return callback(null, queryStringifyRequestData(data));\n }\n this._stripe._platformFunctions\n .tryBufferData(data)\n .then((bufferedData) => {\n const buffer = multipartDataGenerator(method, bufferedData, headers);\n return callback(null, buffer);\n })\n .catch((err) => callback(err, null));\n}\n","// File generated from our OpenAPI spec\nimport { multipartRequestDataProcessor } from '../multipart.js';\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Files = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/files',\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n host: 'files.stripe.com',\n }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/files/{file}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/files',\n methodType: 'list',\n }),\n requestDataProcessor: multipartRequestDataProcessor,\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const InvoiceItems = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/invoiceitems' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoiceitems/{invoiceitem}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoiceitems/{invoiceitem}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoiceitems',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/invoiceitems/{invoiceitem}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const InvoicePayments = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoice_payments/{invoice_payment}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoice_payments',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const InvoiceRenderingTemplates = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoice_rendering_templates/{template}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoice_rendering_templates',\n methodType: 'list',\n }),\n archive: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoice_rendering_templates/{template}/archive',\n }),\n unarchive: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoice_rendering_templates/{template}/unarchive',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Invoices = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/invoices' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/invoices/{invoice}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/invoices/{invoice}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoices',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/invoices/{invoice}' }),\n addLines: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/add_lines',\n }),\n attachPayment: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/attach_payment',\n }),\n createPreview: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/create_preview',\n }),\n finalizeInvoice: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/finalize',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoices/{invoice}/lines',\n methodType: 'list',\n }),\n markUncollectible: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/mark_uncollectible',\n }),\n pay: stripeMethod({ method: 'POST', fullPath: '/v1/invoices/{invoice}/pay' }),\n removeLines: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/remove_lines',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/invoices/search',\n methodType: 'search',\n }),\n sendInvoice: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/send',\n }),\n updateLines: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/update_lines',\n }),\n updateLineItem: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/lines/{line_item_id}',\n }),\n voidInvoice: stripeMethod({\n method: 'POST',\n fullPath: '/v1/invoices/{invoice}/void',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Mandates = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/mandates/{mandate}' }),\n});\n","'use strict';\nimport { StripeResource } from '../StripeResource.js';\nimport { queryStringifyRequestData } from '../utils.js';\nconst stripeMethod = StripeResource.method;\nconst oAuthHost = 'connect.stripe.com';\nexport const OAuth = StripeResource.extend({\n basePath: '/',\n authorizeUrl(params, options) {\n params = params || {};\n options = options || {};\n let path = 'oauth/authorize';\n // For Express accounts, the path changes\n if (options.express) {\n path = `express/${path}`;\n }\n if (!params.response_type) {\n params.response_type = 'code';\n }\n if (!params.client_id) {\n params.client_id = this._stripe.getClientId();\n }\n if (!params.scope) {\n params.scope = 'read_write';\n }\n return `https://${oAuthHost}/${path}?${queryStringifyRequestData(params)}`;\n },\n token: stripeMethod({\n method: 'POST',\n path: 'oauth/token',\n host: oAuthHost,\n }),\n deauthorize(spec, ...args) {\n if (!spec.client_id) {\n spec.client_id = this._stripe.getClientId();\n }\n return stripeMethod({\n method: 'POST',\n path: 'oauth/deauthorize',\n host: oAuthHost,\n }).apply(this, [spec, ...args]);\n },\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentAttemptRecords = StripeResource.extend({\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_attempt_records/{id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_attempt_records',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentIntents = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/payment_intents' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_intents/{intent}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_intents',\n methodType: 'list',\n }),\n applyCustomerBalance: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/apply_customer_balance',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/cancel',\n }),\n capture: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/capture',\n }),\n confirm: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/confirm',\n }),\n incrementAuthorization: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/increment_authorization',\n }),\n listAmountDetailsLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_intents/{intent}/amount_details_line_items',\n methodType: 'list',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_intents/search',\n methodType: 'search',\n }),\n verifyMicrodeposits: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_intents/{intent}/verify_microdeposits',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentLinks = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/payment_links' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_links/{payment_link}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_links/{payment_link}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_links',\n methodType: 'list',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_links/{payment_link}/line_items',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentMethodConfigurations = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_method_configurations',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_method_configurations/{configuration}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_method_configurations/{configuration}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_method_configurations',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentMethodDomains = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_method_domains',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_method_domains/{payment_method_domain}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_method_domains/{payment_method_domain}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_method_domains',\n methodType: 'list',\n }),\n validate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_method_domains/{payment_method_domain}/validate',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentMethods = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/payment_methods' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_methods/{payment_method}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_methods/{payment_method}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payment_methods',\n methodType: 'list',\n }),\n attach: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_methods/{payment_method}/attach',\n }),\n detach: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_methods/{payment_method}/detach',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PaymentRecords = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/payment_records/{id}' }),\n reportPayment: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/report_payment',\n }),\n reportPaymentAttempt: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_payment_attempt',\n }),\n reportPaymentAttemptCanceled: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_payment_attempt_canceled',\n }),\n reportPaymentAttemptFailed: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_payment_attempt_failed',\n }),\n reportPaymentAttemptGuaranteed: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_payment_attempt_guaranteed',\n }),\n reportPaymentAttemptInformational: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_payment_attempt_informational',\n }),\n reportRefund: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payment_records/{id}/report_refund',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Payouts = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/payouts' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/payouts/{payout}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/payouts/{payout}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/payouts',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payouts/{payout}/cancel',\n }),\n reverse: stripeMethod({\n method: 'POST',\n fullPath: '/v1/payouts/{payout}/reverse',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Plans = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/plans' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/plans/{plan}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/plans/{plan}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/plans',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/plans/{plan}' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Prices = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/prices' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/prices/{price}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/prices/{price}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/prices',\n methodType: 'list',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/prices/search',\n methodType: 'search',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Products = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/products' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/products/{id}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/products/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/products',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/products/{id}' }),\n createFeature: stripeMethod({\n method: 'POST',\n fullPath: '/v1/products/{product}/features',\n }),\n deleteFeature: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/products/{product}/features/{id}',\n }),\n listFeatures: stripeMethod({\n method: 'GET',\n fullPath: '/v1/products/{product}/features',\n methodType: 'list',\n }),\n retrieveFeature: stripeMethod({\n method: 'GET',\n fullPath: '/v1/products/{product}/features/{id}',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/products/search',\n methodType: 'search',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const PromotionCodes = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/promotion_codes' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/promotion_codes/{promotion_code}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/promotion_codes/{promotion_code}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/promotion_codes',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Quotes = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/quotes' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/quotes/{quote}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/quotes/{quote}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/quotes',\n methodType: 'list',\n }),\n accept: stripeMethod({ method: 'POST', fullPath: '/v1/quotes/{quote}/accept' }),\n cancel: stripeMethod({ method: 'POST', fullPath: '/v1/quotes/{quote}/cancel' }),\n finalizeQuote: stripeMethod({\n method: 'POST',\n fullPath: '/v1/quotes/{quote}/finalize',\n }),\n listComputedUpfrontLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/quotes/{quote}/computed_upfront_line_items',\n methodType: 'list',\n }),\n listLineItems: stripeMethod({\n method: 'GET',\n fullPath: '/v1/quotes/{quote}/line_items',\n methodType: 'list',\n }),\n pdf: stripeMethod({\n method: 'GET',\n fullPath: '/v1/quotes/{quote}/pdf',\n host: 'files.stripe.com',\n streaming: true,\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Refunds = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/refunds' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/refunds/{refund}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/refunds/{refund}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/refunds',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/refunds/{refund}/cancel',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Reviews = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/reviews/{review}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/reviews',\n methodType: 'list',\n }),\n approve: stripeMethod({\n method: 'POST',\n fullPath: '/v1/reviews/{review}/approve',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const SetupAttempts = StripeResource.extend({\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/setup_attempts',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const SetupIntents = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/setup_intents' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/setup_intents/{intent}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/setup_intents/{intent}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/setup_intents',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/setup_intents/{intent}/cancel',\n }),\n confirm: stripeMethod({\n method: 'POST',\n fullPath: '/v1/setup_intents/{intent}/confirm',\n }),\n verifyMicrodeposits: stripeMethod({\n method: 'POST',\n fullPath: '/v1/setup_intents/{intent}/verify_microdeposits',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const ShippingRates = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/shipping_rates' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/shipping_rates/{shipping_rate_token}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/shipping_rates/{shipping_rate_token}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/shipping_rates',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Sources = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/sources' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/sources/{source}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/sources/{source}' }),\n listSourceTransactions: stripeMethod({\n method: 'GET',\n fullPath: '/v1/sources/{source}/source_transactions',\n methodType: 'list',\n }),\n verify: stripeMethod({\n method: 'POST',\n fullPath: '/v1/sources/{source}/verify',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const SubscriptionItems = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/subscription_items' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscription_items/{item}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscription_items/{item}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscription_items',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/subscription_items/{item}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const SubscriptionSchedules = StripeResource.extend({\n create: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscription_schedules',\n }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscription_schedules/{schedule}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscription_schedules/{schedule}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscription_schedules',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscription_schedules/{schedule}/cancel',\n }),\n release: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscription_schedules/{schedule}/release',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Subscriptions = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/subscriptions' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscriptions/{subscription_exposed_id}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscriptions/{subscription_exposed_id}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscriptions',\n methodType: 'list',\n }),\n cancel: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/subscriptions/{subscription_exposed_id}',\n }),\n deleteDiscount: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/subscriptions/{subscription_exposed_id}/discount',\n }),\n migrate: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscriptions/{subscription}/migrate',\n }),\n resume: stripeMethod({\n method: 'POST',\n fullPath: '/v1/subscriptions/{subscription}/resume',\n }),\n search: stripeMethod({\n method: 'GET',\n fullPath: '/v1/subscriptions/search',\n methodType: 'search',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const TaxCodes = StripeResource.extend({\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/tax_codes/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax_codes',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const TaxIds = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/tax_ids' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/tax_ids/{id}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax_ids',\n methodType: 'list',\n }),\n del: stripeMethod({ method: 'DELETE', fullPath: '/v1/tax_ids/{id}' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const TaxRates = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/tax_rates' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/tax_rates/{tax_rate}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/tax_rates/{tax_rate}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/tax_rates',\n methodType: 'list',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Tokens = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/tokens' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/tokens/{token}' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Topups = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/topups' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/topups/{topup}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/topups/{topup}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/topups',\n methodType: 'list',\n }),\n cancel: stripeMethod({ method: 'POST', fullPath: '/v1/topups/{topup}/cancel' }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const Transfers = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/transfers' }),\n retrieve: stripeMethod({ method: 'GET', fullPath: '/v1/transfers/{transfer}' }),\n update: stripeMethod({ method: 'POST', fullPath: '/v1/transfers/{transfer}' }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/transfers',\n methodType: 'list',\n }),\n createReversal: stripeMethod({\n method: 'POST',\n fullPath: '/v1/transfers/{id}/reversals',\n }),\n listReversals: stripeMethod({\n method: 'GET',\n fullPath: '/v1/transfers/{id}/reversals',\n methodType: 'list',\n }),\n retrieveReversal: stripeMethod({\n method: 'GET',\n fullPath: '/v1/transfers/{transfer}/reversals/{id}',\n }),\n updateReversal: stripeMethod({\n method: 'POST',\n fullPath: '/v1/transfers/{transfer}/reversals/{id}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { StripeResource } from '../StripeResource.js';\nconst stripeMethod = StripeResource.method;\nexport const WebhookEndpoints = StripeResource.extend({\n create: stripeMethod({ method: 'POST', fullPath: '/v1/webhook_endpoints' }),\n retrieve: stripeMethod({\n method: 'GET',\n fullPath: '/v1/webhook_endpoints/{webhook_endpoint}',\n }),\n update: stripeMethod({\n method: 'POST',\n fullPath: '/v1/webhook_endpoints/{webhook_endpoint}',\n }),\n list: stripeMethod({\n method: 'GET',\n fullPath: '/v1/webhook_endpoints',\n methodType: 'list',\n }),\n del: stripeMethod({\n method: 'DELETE',\n fullPath: '/v1/webhook_endpoints/{webhook_endpoint}',\n }),\n});\n","// File generated from our OpenAPI spec\nimport { resourceNamespace } from './ResourceNamespace.js';\nimport { AccountLinks as V2CoreAccountLinks } from './resources/V2/Core/AccountLinks.js';\nimport { AccountTokens as V2CoreAccountTokens } from './resources/V2/Core/AccountTokens.js';\nimport { Accounts as FinancialConnectionsAccounts } from './resources/FinancialConnections/Accounts.js';\nimport { Accounts as V2CoreAccounts } from './resources/V2/Core/Accounts.js';\nimport { ActiveEntitlements as EntitlementsActiveEntitlements } from './resources/Entitlements/ActiveEntitlements.js';\nimport { Alerts as BillingAlerts } from './resources/Billing/Alerts.js';\nimport { Associations as TaxAssociations } from './resources/Tax/Associations.js';\nimport { Authorizations as IssuingAuthorizations } from './resources/Issuing/Authorizations.js';\nimport { Authorizations as TestHelpersIssuingAuthorizations } from './resources/TestHelpers/Issuing/Authorizations.js';\nimport { Calculations as TaxCalculations } from './resources/Tax/Calculations.js';\nimport { Cardholders as IssuingCardholders } from './resources/Issuing/Cardholders.js';\nimport { Cards as IssuingCards } from './resources/Issuing/Cards.js';\nimport { Cards as TestHelpersIssuingCards } from './resources/TestHelpers/Issuing/Cards.js';\nimport { Configurations as BillingPortalConfigurations } from './resources/BillingPortal/Configurations.js';\nimport { Configurations as TerminalConfigurations } from './resources/Terminal/Configurations.js';\nimport { ConfirmationTokens as TestHelpersConfirmationTokens } from './resources/TestHelpers/ConfirmationTokens.js';\nimport { ConnectionTokens as TerminalConnectionTokens } from './resources/Terminal/ConnectionTokens.js';\nimport { CreditBalanceSummary as BillingCreditBalanceSummary } from './resources/Billing/CreditBalanceSummary.js';\nimport { CreditBalanceTransactions as BillingCreditBalanceTransactions } from './resources/Billing/CreditBalanceTransactions.js';\nimport { CreditGrants as BillingCreditGrants } from './resources/Billing/CreditGrants.js';\nimport { CreditReversals as TreasuryCreditReversals } from './resources/Treasury/CreditReversals.js';\nimport { Customers as TestHelpersCustomers } from './resources/TestHelpers/Customers.js';\nimport { DebitReversals as TreasuryDebitReversals } from './resources/Treasury/DebitReversals.js';\nimport { Disputes as IssuingDisputes } from './resources/Issuing/Disputes.js';\nimport { EarlyFraudWarnings as RadarEarlyFraudWarnings } from './resources/Radar/EarlyFraudWarnings.js';\nimport { EventDestinations as V2CoreEventDestinations } from './resources/V2/Core/EventDestinations.js';\nimport { Events as V2CoreEvents } from './resources/V2/Core/Events.js';\nimport { Features as EntitlementsFeatures } from './resources/Entitlements/Features.js';\nimport { FinancialAccounts as TreasuryFinancialAccounts } from './resources/Treasury/FinancialAccounts.js';\nimport { InboundTransfers as TestHelpersTreasuryInboundTransfers } from './resources/TestHelpers/Treasury/InboundTransfers.js';\nimport { InboundTransfers as TreasuryInboundTransfers } from './resources/Treasury/InboundTransfers.js';\nimport { Locations as TerminalLocations } from './resources/Terminal/Locations.js';\nimport { MeterEventAdjustments as BillingMeterEventAdjustments } from './resources/Billing/MeterEventAdjustments.js';\nimport { MeterEventAdjustments as V2BillingMeterEventAdjustments } from './resources/V2/Billing/MeterEventAdjustments.js';\nimport { MeterEventSession as V2BillingMeterEventSession } from './resources/V2/Billing/MeterEventSession.js';\nimport { MeterEventStream as V2BillingMeterEventStream } from './resources/V2/Billing/MeterEventStream.js';\nimport { MeterEvents as BillingMeterEvents } from './resources/Billing/MeterEvents.js';\nimport { MeterEvents as V2BillingMeterEvents } from './resources/V2/Billing/MeterEvents.js';\nimport { Meters as BillingMeters } from './resources/Billing/Meters.js';\nimport { OnboardingLinks as TerminalOnboardingLinks } from './resources/Terminal/OnboardingLinks.js';\nimport { Orders as ClimateOrders } from './resources/Climate/Orders.js';\nimport { OutboundPayments as TestHelpersTreasuryOutboundPayments } from './resources/TestHelpers/Treasury/OutboundPayments.js';\nimport { OutboundPayments as TreasuryOutboundPayments } from './resources/Treasury/OutboundPayments.js';\nimport { OutboundTransfers as TestHelpersTreasuryOutboundTransfers } from './resources/TestHelpers/Treasury/OutboundTransfers.js';\nimport { OutboundTransfers as TreasuryOutboundTransfers } from './resources/Treasury/OutboundTransfers.js';\nimport { PaymentEvaluations as RadarPaymentEvaluations } from './resources/Radar/PaymentEvaluations.js';\nimport { PersonalizationDesigns as IssuingPersonalizationDesigns } from './resources/Issuing/PersonalizationDesigns.js';\nimport { PersonalizationDesigns as TestHelpersIssuingPersonalizationDesigns } from './resources/TestHelpers/Issuing/PersonalizationDesigns.js';\nimport { PhysicalBundles as IssuingPhysicalBundles } from './resources/Issuing/PhysicalBundles.js';\nimport { Products as ClimateProducts } from './resources/Climate/Products.js';\nimport { Readers as TerminalReaders } from './resources/Terminal/Readers.js';\nimport { Readers as TestHelpersTerminalReaders } from './resources/TestHelpers/Terminal/Readers.js';\nimport { ReceivedCredits as TestHelpersTreasuryReceivedCredits } from './resources/TestHelpers/Treasury/ReceivedCredits.js';\nimport { ReceivedCredits as TreasuryReceivedCredits } from './resources/Treasury/ReceivedCredits.js';\nimport { ReceivedDebits as TestHelpersTreasuryReceivedDebits } from './resources/TestHelpers/Treasury/ReceivedDebits.js';\nimport { ReceivedDebits as TreasuryReceivedDebits } from './resources/Treasury/ReceivedDebits.js';\nimport { Refunds as TestHelpersRefunds } from './resources/TestHelpers/Refunds.js';\nimport { Registrations as TaxRegistrations } from './resources/Tax/Registrations.js';\nimport { ReportRuns as ReportingReportRuns } from './resources/Reporting/ReportRuns.js';\nimport { ReportTypes as ReportingReportTypes } from './resources/Reporting/ReportTypes.js';\nimport { Requests as ForwardingRequests } from './resources/Forwarding/Requests.js';\nimport { ScheduledQueryRuns as SigmaScheduledQueryRuns } from './resources/Sigma/ScheduledQueryRuns.js';\nimport { Secrets as AppsSecrets } from './resources/Apps/Secrets.js';\nimport { Sessions as BillingPortalSessions } from './resources/BillingPortal/Sessions.js';\nimport { Sessions as CheckoutSessions } from './resources/Checkout/Sessions.js';\nimport { Sessions as FinancialConnectionsSessions } from './resources/FinancialConnections/Sessions.js';\nimport { Settings as TaxSettings } from './resources/Tax/Settings.js';\nimport { Suppliers as ClimateSuppliers } from './resources/Climate/Suppliers.js';\nimport { TestClocks as TestHelpersTestClocks } from './resources/TestHelpers/TestClocks.js';\nimport { Tokens as IssuingTokens } from './resources/Issuing/Tokens.js';\nimport { TransactionEntries as TreasuryTransactionEntries } from './resources/Treasury/TransactionEntries.js';\nimport { Transactions as FinancialConnectionsTransactions } from './resources/FinancialConnections/Transactions.js';\nimport { Transactions as IssuingTransactions } from './resources/Issuing/Transactions.js';\nimport { Transactions as TaxTransactions } from './resources/Tax/Transactions.js';\nimport { Transactions as TestHelpersIssuingTransactions } from './resources/TestHelpers/Issuing/Transactions.js';\nimport { Transactions as TreasuryTransactions } from './resources/Treasury/Transactions.js';\nimport { ValueListItems as RadarValueListItems } from './resources/Radar/ValueListItems.js';\nimport { ValueLists as RadarValueLists } from './resources/Radar/ValueLists.js';\nimport { VerificationReports as IdentityVerificationReports } from './resources/Identity/VerificationReports.js';\nimport { VerificationSessions as IdentityVerificationSessions } from './resources/Identity/VerificationSessions.js';\nexport { Accounts as Account } from './resources/Accounts.js';\nexport { AccountLinks } from './resources/AccountLinks.js';\nexport { AccountSessions } from './resources/AccountSessions.js';\nexport { Accounts } from './resources/Accounts.js';\nexport { ApplePayDomains } from './resources/ApplePayDomains.js';\nexport { ApplicationFees } from './resources/ApplicationFees.js';\nexport { Balance } from './resources/Balance.js';\nexport { BalanceSettings } from './resources/BalanceSettings.js';\nexport { BalanceTransactions } from './resources/BalanceTransactions.js';\nexport { Charges } from './resources/Charges.js';\nexport { ConfirmationTokens } from './resources/ConfirmationTokens.js';\nexport { CountrySpecs } from './resources/CountrySpecs.js';\nexport { Coupons } from './resources/Coupons.js';\nexport { CreditNotes } from './resources/CreditNotes.js';\nexport { CustomerSessions } from './resources/CustomerSessions.js';\nexport { Customers } from './resources/Customers.js';\nexport { Disputes } from './resources/Disputes.js';\nexport { EphemeralKeys } from './resources/EphemeralKeys.js';\nexport { Events } from './resources/Events.js';\nexport { ExchangeRates } from './resources/ExchangeRates.js';\nexport { FileLinks } from './resources/FileLinks.js';\nexport { Files } from './resources/Files.js';\nexport { InvoiceItems } from './resources/InvoiceItems.js';\nexport { InvoicePayments } from './resources/InvoicePayments.js';\nexport { InvoiceRenderingTemplates } from './resources/InvoiceRenderingTemplates.js';\nexport { Invoices } from './resources/Invoices.js';\nexport { Mandates } from './resources/Mandates.js';\nexport { OAuth } from './resources/OAuth.js';\nexport { PaymentAttemptRecords } from './resources/PaymentAttemptRecords.js';\nexport { PaymentIntents } from './resources/PaymentIntents.js';\nexport { PaymentLinks } from './resources/PaymentLinks.js';\nexport { PaymentMethodConfigurations } from './resources/PaymentMethodConfigurations.js';\nexport { PaymentMethodDomains } from './resources/PaymentMethodDomains.js';\nexport { PaymentMethods } from './resources/PaymentMethods.js';\nexport { PaymentRecords } from './resources/PaymentRecords.js';\nexport { Payouts } from './resources/Payouts.js';\nexport { Plans } from './resources/Plans.js';\nexport { Prices } from './resources/Prices.js';\nexport { Products } from './resources/Products.js';\nexport { PromotionCodes } from './resources/PromotionCodes.js';\nexport { Quotes } from './resources/Quotes.js';\nexport { Refunds } from './resources/Refunds.js';\nexport { Reviews } from './resources/Reviews.js';\nexport { SetupAttempts } from './resources/SetupAttempts.js';\nexport { SetupIntents } from './resources/SetupIntents.js';\nexport { ShippingRates } from './resources/ShippingRates.js';\nexport { Sources } from './resources/Sources.js';\nexport { SubscriptionItems } from './resources/SubscriptionItems.js';\nexport { SubscriptionSchedules } from './resources/SubscriptionSchedules.js';\nexport { Subscriptions } from './resources/Subscriptions.js';\nexport { TaxCodes } from './resources/TaxCodes.js';\nexport { TaxIds } from './resources/TaxIds.js';\nexport { TaxRates } from './resources/TaxRates.js';\nexport { Tokens } from './resources/Tokens.js';\nexport { Topups } from './resources/Topups.js';\nexport { Transfers } from './resources/Transfers.js';\nexport { WebhookEndpoints } from './resources/WebhookEndpoints.js';\nexport const Apps = resourceNamespace('apps', { Secrets: AppsSecrets });\nexport const Billing = resourceNamespace('billing', {\n Alerts: BillingAlerts,\n CreditBalanceSummary: BillingCreditBalanceSummary,\n CreditBalanceTransactions: BillingCreditBalanceTransactions,\n CreditGrants: BillingCreditGrants,\n MeterEventAdjustments: BillingMeterEventAdjustments,\n MeterEvents: BillingMeterEvents,\n Meters: BillingMeters,\n});\nexport const BillingPortal = resourceNamespace('billingPortal', {\n Configurations: BillingPortalConfigurations,\n Sessions: BillingPortalSessions,\n});\nexport const Checkout = resourceNamespace('checkout', {\n Sessions: CheckoutSessions,\n});\nexport const Climate = resourceNamespace('climate', {\n Orders: ClimateOrders,\n Products: ClimateProducts,\n Suppliers: ClimateSuppliers,\n});\nexport const Entitlements = resourceNamespace('entitlements', {\n ActiveEntitlements: EntitlementsActiveEntitlements,\n Features: EntitlementsFeatures,\n});\nexport const FinancialConnections = resourceNamespace('financialConnections', {\n Accounts: FinancialConnectionsAccounts,\n Sessions: FinancialConnectionsSessions,\n Transactions: FinancialConnectionsTransactions,\n});\nexport const Forwarding = resourceNamespace('forwarding', {\n Requests: ForwardingRequests,\n});\nexport const Identity = resourceNamespace('identity', {\n VerificationReports: IdentityVerificationReports,\n VerificationSessions: IdentityVerificationSessions,\n});\nexport const Issuing = resourceNamespace('issuing', {\n Authorizations: IssuingAuthorizations,\n Cardholders: IssuingCardholders,\n Cards: IssuingCards,\n Disputes: IssuingDisputes,\n PersonalizationDesigns: IssuingPersonalizationDesigns,\n PhysicalBundles: IssuingPhysicalBundles,\n Tokens: IssuingTokens,\n Transactions: IssuingTransactions,\n});\nexport const Radar = resourceNamespace('radar', {\n EarlyFraudWarnings: RadarEarlyFraudWarnings,\n PaymentEvaluations: RadarPaymentEvaluations,\n ValueListItems: RadarValueListItems,\n ValueLists: RadarValueLists,\n});\nexport const Reporting = resourceNamespace('reporting', {\n ReportRuns: ReportingReportRuns,\n ReportTypes: ReportingReportTypes,\n});\nexport const Sigma = resourceNamespace('sigma', {\n ScheduledQueryRuns: SigmaScheduledQueryRuns,\n});\nexport const Tax = resourceNamespace('tax', {\n Associations: TaxAssociations,\n Calculations: TaxCalculations,\n Registrations: TaxRegistrations,\n Settings: TaxSettings,\n Transactions: TaxTransactions,\n});\nexport const Terminal = resourceNamespace('terminal', {\n Configurations: TerminalConfigurations,\n ConnectionTokens: TerminalConnectionTokens,\n Locations: TerminalLocations,\n OnboardingLinks: TerminalOnboardingLinks,\n Readers: TerminalReaders,\n});\nexport const TestHelpers = resourceNamespace('testHelpers', {\n ConfirmationTokens: TestHelpersConfirmationTokens,\n Customers: TestHelpersCustomers,\n Refunds: TestHelpersRefunds,\n TestClocks: TestHelpersTestClocks,\n Issuing: resourceNamespace('issuing', {\n Authorizations: TestHelpersIssuingAuthorizations,\n Cards: TestHelpersIssuingCards,\n PersonalizationDesigns: TestHelpersIssuingPersonalizationDesigns,\n Transactions: TestHelpersIssuingTransactions,\n }),\n Terminal: resourceNamespace('terminal', {\n Readers: TestHelpersTerminalReaders,\n }),\n Treasury: resourceNamespace('treasury', {\n InboundTransfers: TestHelpersTreasuryInboundTransfers,\n OutboundPayments: TestHelpersTreasuryOutboundPayments,\n OutboundTransfers: TestHelpersTreasuryOutboundTransfers,\n ReceivedCredits: TestHelpersTreasuryReceivedCredits,\n ReceivedDebits: TestHelpersTreasuryReceivedDebits,\n }),\n});\nexport const Treasury = resourceNamespace('treasury', {\n CreditReversals: TreasuryCreditReversals,\n DebitReversals: TreasuryDebitReversals,\n FinancialAccounts: TreasuryFinancialAccounts,\n InboundTransfers: TreasuryInboundTransfers,\n OutboundPayments: TreasuryOutboundPayments,\n OutboundTransfers: TreasuryOutboundTransfers,\n ReceivedCredits: TreasuryReceivedCredits,\n ReceivedDebits: TreasuryReceivedDebits,\n TransactionEntries: TreasuryTransactionEntries,\n Transactions: TreasuryTransactions,\n});\nexport const V2 = resourceNamespace('v2', {\n Billing: resourceNamespace('billing', {\n MeterEventAdjustments: V2BillingMeterEventAdjustments,\n MeterEventSession: V2BillingMeterEventSession,\n MeterEventStream: V2BillingMeterEventStream,\n MeterEvents: V2BillingMeterEvents,\n }),\n Core: resourceNamespace('core', {\n AccountLinks: V2CoreAccountLinks,\n AccountTokens: V2CoreAccountTokens,\n Accounts: V2CoreAccounts,\n EventDestinations: V2CoreEventDestinations,\n Events: V2CoreEvents,\n }),\n});\n","import * as _Error from './Error.js';\nimport { RequestSender } from './RequestSender.js';\nimport { StripeResource } from './StripeResource.js';\nimport { StripeContext } from './StripeContext.js';\nimport { createWebhooks } from './Webhooks.js';\nimport { ApiVersion } from './apiVersion.js';\nimport { CryptoProvider } from './crypto/CryptoProvider.js';\nimport { HttpClient, HttpClientResponse } from './net/HttpClient.js';\nimport * as resources from './resources.js';\nimport { createApiKeyAuthenticator, detectAIAgent, determineProcessUserAgentProperties, pascalToCamelCase, validateInteger, } from './utils.js';\nconst DEFAULT_HOST = 'api.stripe.com';\nconst DEFAULT_PORT = '443';\nconst DEFAULT_BASE_PATH = '/v1/';\nconst DEFAULT_API_VERSION = ApiVersion;\nconst DEFAULT_TIMEOUT = 80000;\nconst MAX_NETWORK_RETRY_DELAY_SEC = 5;\nconst INITIAL_NETWORK_RETRY_DELAY_SEC = 0.5;\nconst APP_INFO_PROPERTIES = ['name', 'version', 'url', 'partner_id'];\nconst ALLOWED_CONFIG_PROPERTIES = [\n 'authenticator',\n 'apiVersion',\n 'typescript',\n 'maxNetworkRetries',\n 'httpAgent',\n 'httpClient',\n 'timeout',\n 'host',\n 'port',\n 'protocol',\n 'telemetry',\n 'appInfo',\n 'stripeAccount',\n 'stripeContext',\n];\nconst defaultRequestSenderFactory = (stripe) => new RequestSender(stripe, StripeResource.MAX_BUFFERED_REQUEST_METRICS);\nexport function createStripe(platformFunctions, requestSender = defaultRequestSenderFactory) {\n Stripe.PACKAGE_VERSION = '20.4.1';\n Stripe.API_VERSION = ApiVersion;\n const aiAgent = typeof process !== 'undefined' && process.env\n ? detectAIAgent(process.env)\n : '';\n Stripe.AI_AGENT = aiAgent;\n Stripe.USER_AGENT = Object.assign(Object.assign({ bindings_version: Stripe.PACKAGE_VERSION, lang: 'node', publisher: 'stripe', uname: null, typescript: false }, determineProcessUserAgentProperties()), (aiAgent ? { ai_agent: aiAgent } : {}));\n Stripe.StripeResource = StripeResource;\n Stripe.StripeContext = StripeContext;\n Stripe.resources = resources;\n Stripe.HttpClient = HttpClient;\n Stripe.HttpClientResponse = HttpClientResponse;\n Stripe.CryptoProvider = CryptoProvider;\n Stripe.webhooks = createWebhooks(platformFunctions);\n function Stripe(key, config = {}) {\n if (!(this instanceof Stripe)) {\n return new Stripe(key, config);\n }\n const props = this._getPropsFromConfig(config);\n this._platformFunctions = platformFunctions;\n Object.defineProperty(this, '_emitter', {\n value: this._platformFunctions.createEmitter(),\n enumerable: false,\n configurable: false,\n writable: false,\n });\n this.VERSION = Stripe.PACKAGE_VERSION;\n this.on = this._emitter.on.bind(this._emitter);\n this.once = this._emitter.once.bind(this._emitter);\n this.off = this._emitter.removeListener.bind(this._emitter);\n const agent = props.httpAgent || null;\n this._api = {\n host: props.host || DEFAULT_HOST,\n port: props.port || DEFAULT_PORT,\n protocol: props.protocol || 'https',\n basePath: DEFAULT_BASE_PATH,\n version: props.apiVersion || DEFAULT_API_VERSION,\n timeout: validateInteger('timeout', props.timeout, DEFAULT_TIMEOUT),\n maxNetworkRetries: validateInteger('maxNetworkRetries', props.maxNetworkRetries, 2),\n agent: agent,\n httpClient: props.httpClient ||\n (agent\n ? this._platformFunctions.createNodeHttpClient(agent)\n : this._platformFunctions.createDefaultHttpClient()),\n dev: false,\n stripeAccount: props.stripeAccount || null,\n stripeContext: props.stripeContext || null,\n };\n const typescript = props.typescript || false;\n if (typescript !== Stripe.USER_AGENT.typescript) {\n // The mutation here is uncomfortable, but likely fastest;\n // serializing the user agent involves shelling out to the system,\n // and given some users may instantiate the library many times without switching between TS and non-TS,\n // we only want to incur the performance hit when that actually happens.\n Stripe.USER_AGENT.typescript = typescript;\n }\n if (props.appInfo) {\n this._setAppInfo(props.appInfo);\n }\n this._prepResources();\n this._setAuthenticator(key, props.authenticator);\n this.errors = _Error;\n this.webhooks = Stripe.webhooks;\n this._prevRequestMetrics = [];\n this._enableTelemetry = props.telemetry !== false;\n this._requestSender = requestSender(this);\n // Expose StripeResource on the instance too\n // @ts-ignore\n this.StripeResource = Stripe.StripeResource;\n }\n Stripe.errors = _Error;\n Stripe.createNodeHttpClient = platformFunctions.createNodeHttpClient;\n /**\n * Creates an HTTP client for issuing Stripe API requests which uses the Web\n * Fetch API.\n *\n * A fetch function can optionally be passed in as a parameter. If none is\n * passed, will default to the default `fetch` function in the global scope.\n */\n Stripe.createFetchHttpClient = platformFunctions.createFetchHttpClient;\n /**\n * Create a CryptoProvider which uses the built-in Node crypto libraries for\n * its crypto operations.\n */\n Stripe.createNodeCryptoProvider = platformFunctions.createNodeCryptoProvider;\n /**\n * Creates a CryptoProvider which uses the Subtle Crypto API from the Web\n * Crypto API spec for its crypto operations.\n *\n * A SubtleCrypto interface can optionally be passed in as a parameter. If none\n * is passed, will default to the default `crypto.subtle` object in the global\n * scope.\n */\n Stripe.createSubtleCryptoProvider =\n platformFunctions.createSubtleCryptoProvider;\n Stripe.prototype = {\n // Properties are set in the constructor above\n _appInfo: undefined,\n on: null,\n off: null,\n once: null,\n VERSION: null,\n StripeResource: null,\n webhooks: null,\n errors: null,\n _api: null,\n _prevRequestMetrics: null,\n _emitter: null,\n _enableTelemetry: null,\n _requestSender: null,\n _platformFunctions: null,\n rawRequest(method, path, params, options) {\n return this._requestSender._rawRequest(method, path, params, options);\n },\n /**\n * @private\n */\n _setAuthenticator(key, authenticator) {\n if (key && authenticator) {\n throw new Error(\"Can't specify both apiKey and authenticator\");\n }\n if (!key && !authenticator) {\n throw new Error('Neither apiKey nor config.authenticator provided');\n }\n this._authenticator = key\n ? createApiKeyAuthenticator(key)\n : authenticator;\n },\n /**\n * @private\n * This may be removed in the future.\n */\n _setAppInfo(info) {\n if (info && typeof info !== 'object') {\n throw new Error('AppInfo must be an object.');\n }\n if (info && !info.name) {\n throw new Error('AppInfo.name is required');\n }\n info = info || {};\n this._appInfo = APP_INFO_PROPERTIES.reduce((accum, prop) => {\n if (typeof info[prop] == 'string') {\n accum = accum || {};\n accum[prop] = info[prop];\n }\n return accum;\n }, {});\n },\n /**\n * @private\n * This may be removed in the future.\n */\n _setApiField(key, value) {\n this._api[key] = value;\n },\n /**\n * @private\n * Please open or upvote an issue at github.com/stripe/stripe-node\n * if you use this, detailing your use-case.\n *\n * It may be deprecated and removed in the future.\n */\n getApiField(key) {\n return this._api[key];\n },\n setClientId(clientId) {\n this._clientId = clientId;\n },\n getClientId() {\n return this._clientId;\n },\n /**\n * @private\n * Please open or upvote an issue at github.com/stripe/stripe-node\n * if you use this, detailing your use-case.\n *\n * It may be deprecated and removed in the future.\n */\n getConstant: (c) => {\n switch (c) {\n case 'DEFAULT_HOST':\n return DEFAULT_HOST;\n case 'DEFAULT_PORT':\n return DEFAULT_PORT;\n case 'DEFAULT_BASE_PATH':\n return DEFAULT_BASE_PATH;\n case 'DEFAULT_API_VERSION':\n return DEFAULT_API_VERSION;\n case 'DEFAULT_TIMEOUT':\n return DEFAULT_TIMEOUT;\n case 'MAX_NETWORK_RETRY_DELAY_SEC':\n return MAX_NETWORK_RETRY_DELAY_SEC;\n case 'INITIAL_NETWORK_RETRY_DELAY_SEC':\n return INITIAL_NETWORK_RETRY_DELAY_SEC;\n }\n return Stripe[c];\n },\n getMaxNetworkRetries() {\n return this.getApiField('maxNetworkRetries');\n },\n /**\n * @private\n * This may be removed in the future.\n */\n _setApiNumberField(prop, n, defaultVal) {\n const val = validateInteger(prop, n, defaultVal);\n this._setApiField(prop, val);\n },\n getMaxNetworkRetryDelay() {\n return MAX_NETWORK_RETRY_DELAY_SEC;\n },\n getInitialNetworkRetryDelay() {\n return INITIAL_NETWORK_RETRY_DELAY_SEC;\n },\n /**\n * @private\n * Please open or upvote an issue at github.com/stripe/stripe-node\n * if you use this, detailing your use-case.\n *\n * It may be deprecated and removed in the future.\n *\n * Gets a JSON version of a User-Agent and uses a cached version for a slight\n * speed advantage.\n */\n getClientUserAgent(cb) {\n return this.getClientUserAgentSeeded(Stripe.USER_AGENT, cb);\n },\n /**\n * @private\n * Please open or upvote an issue at github.com/stripe/stripe-node\n * if you use this, detailing your use-case.\n *\n * It may be deprecated and removed in the future.\n *\n * Gets a JSON version of a User-Agent by encoding a seeded object and\n * fetching a uname from the system.\n */\n getClientUserAgentSeeded(seed, cb) {\n this._platformFunctions.getUname().then((uname) => {\n var _a;\n const userAgent = {};\n for (const field in seed) {\n if (!Object.prototype.hasOwnProperty.call(seed, field)) {\n continue;\n }\n userAgent[field] = encodeURIComponent((_a = seed[field]) !== null && _a !== void 0 ? _a : 'null');\n }\n // URI-encode in case there are unusual characters in the system's uname.\n userAgent.uname = encodeURIComponent(uname || 'UNKNOWN');\n const client = this.getApiField('httpClient');\n if (client) {\n userAgent.httplib = encodeURIComponent(client.getClientName());\n }\n if (this._appInfo) {\n userAgent.application = this._appInfo;\n }\n cb(JSON.stringify(userAgent));\n });\n },\n /**\n * @private\n * Please open or upvote an issue at github.com/stripe/stripe-node\n * if you use this, detailing your use-case.\n *\n * It may be deprecated and removed in the future.\n */\n getAppInfoAsString() {\n if (!this._appInfo) {\n return '';\n }\n let formatted = this._appInfo.name;\n if (this._appInfo.version) {\n formatted += `/${this._appInfo.version}`;\n }\n if (this._appInfo.url) {\n formatted += ` (${this._appInfo.url})`;\n }\n return formatted;\n },\n getTelemetryEnabled() {\n return this._enableTelemetry;\n },\n /**\n * @private\n * This may be removed in the future.\n */\n _prepResources() {\n for (const name in resources) {\n if (!Object.prototype.hasOwnProperty.call(resources, name)) {\n continue;\n }\n // @ts-ignore\n this[pascalToCamelCase(name)] = new resources[name](this);\n }\n },\n /**\n * @private\n * This may be removed in the future.\n */\n _getPropsFromConfig(config) {\n // If config is null or undefined, just bail early with no props\n if (!config) {\n return {};\n }\n // config can be an object or a string\n const isString = typeof config === 'string';\n const isObject = config === Object(config) && !Array.isArray(config);\n if (!isObject && !isString) {\n throw new Error('Config must either be an object or a string');\n }\n // If config is a string, we assume the old behavior of passing in a string representation of the api version\n if (isString) {\n return {\n apiVersion: config,\n };\n }\n // If config is an object, we assume the new behavior and make sure it doesn't contain any unexpected values\n const values = Object.keys(config).filter((value) => !ALLOWED_CONFIG_PROPERTIES.includes(value));\n if (values.length > 0) {\n throw new Error(`Config object may only contain the following: ${ALLOWED_CONFIG_PROPERTIES.join(', ')}`);\n }\n return config;\n },\n parseEventNotification(payload, header, secret, tolerance, cryptoProvider, receivedAt\n // this return type is ignored?? picks up types from `types/index.d.ts` instead\n ) {\n // parses and validates the event payload all in one go\n const eventNotification = this.webhooks.constructEvent(payload, header, secret, tolerance, cryptoProvider, receivedAt);\n // Parse string context into StripeContext object if present\n if (eventNotification.context) {\n eventNotification.context = StripeContext.parse(eventNotification.context);\n }\n eventNotification.fetchEvent = () => {\n return this._requestSender._rawRequest('GET', `/v2/core/events/${eventNotification.id}`, undefined, {\n stripeContext: eventNotification.context,\n headers: {\n 'Stripe-Request-Trigger': `event=${eventNotification.id}`,\n },\n }, ['fetch_event']);\n };\n eventNotification.fetchRelatedObject = () => {\n if (!eventNotification.related_object) {\n return Promise.resolve(null);\n }\n return this._requestSender._rawRequest('GET', eventNotification.related_object.url, undefined, {\n stripeContext: eventNotification.context,\n headers: {\n 'Stripe-Request-Trigger': `event=${eventNotification.id}`,\n },\n }, ['fetch_related_object']);\n };\n return eventNotification;\n },\n };\n return Stripe;\n}\n","import { NodePlatformFunctions } from './platform/NodePlatformFunctions.js';\nimport { createStripe } from './stripe.core.js';\nexport const Stripe = createStripe(new NodePlatformFunctions());\nexport default Stripe;\n","/** Stripe integration client.\n * Shared primitives: webhook verification, checkout, customers, subscriptions, portal.\n * Apps own: product/price IDs, business logic, event routing.\n * Constraint: No framework imports. Wraps official stripe SDK. */\n\nimport Stripe from 'stripe';\nimport type { StripeClientConfig, CreateCheckoutParams } from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class StripeClient {\n private readonly stripe: Stripe;\n private readonly webhookSecret: string;\n\n constructor(config: StripeClientConfig) {\n this.stripe = new Stripe(config.secretKey);\n this.webhookSecret = config.webhookSecret;\n }\n\n // ─── Webhook Verification ────────────────────────────────────────────────\n // NOTE: This uses Stripe SDK's constructEvent (recommended for Stripe webhooks).\n // webhooks/providers/stripe.ts provides a hand-rolled alternative for use\n // with the generic verifyWebhook() dispatcher. Apps should prefer this SDK\n // method when they need the parsed Stripe.Event object.\n\n verifyWebhookSignature(payload: string | Buffer, signature: string): Stripe.Event {\n return this.stripe.webhooks.constructEvent(payload, signature, this.webhookSecret);\n }\n\n // ─── Checkout ────────────────────────────────────────────────────────────\n\n async createCheckoutSession(params: CreateCheckoutParams): Promise<Stripe.Checkout.Session> {\n return this.stripe.checkout.sessions.create({\n mode: params.mode,\n line_items: [{ price: params.priceId, quantity: 1 }],\n success_url: params.successUrl,\n cancel_url: params.cancelUrl,\n ...(params.customerId ? { customer: params.customerId } : {}),\n ...(params.metadata ? { metadata: params.metadata } : {}),\n });\n }\n\n // ─── Customers ───────────────────────────────────────────────────────────\n\n async findOrCreateCustomer(email: string, name?: string): Promise<Stripe.Customer> {\n const existing = await this.stripe.customers.list({ email, limit: 1 });\n if (existing.data.length > 0) return existing.data[0];\n\n return this.stripe.customers.create({\n email,\n ...(name ? { name } : {}),\n });\n }\n\n async getCustomer(id: string): Promise<Stripe.Customer> {\n return this.stripe.customers.retrieve(id) as Promise<Stripe.Customer>;\n }\n\n // ─── Subscriptions ───────────────────────────────────────────────────────\n\n async getSubscription(id: string): Promise<Stripe.Subscription> {\n return this.stripe.subscriptions.retrieve(id);\n }\n\n async cancelSubscription(id: string): Promise<Stripe.Subscription> {\n return this.stripe.subscriptions.cancel(id);\n }\n\n // ─── Portal ──────────────────────────────────────────────────────────────\n\n async createPortalSession(\n customerId: string,\n returnUrl: string\n ): Promise<Stripe.BillingPortal.Session> {\n return this.stripe.billingPortal.sessions.create({\n customer: customerId,\n return_url: returnUrl,\n });\n }\n}\n","/** BetterContactClient. Async enrichment + lead finder via BetterContact API.\n * Constraint: No framework imports. Extends BaseApiClient.\n * Source: https://doc.bettercontact.rocks/quickstart */\n\nimport { BaseApiClient } from '../base-client';\n\nimport type {\n BetterContactEnrichRequest,\n BetterContactEnrichCreateResponse,\n BetterContactEnrichStatusResponse,\n BetterContactLeadFinderRequest,\n BetterContactLeadFinderCreateResponse,\n BetterContactLeadFinderStatusResponse,\n BetterContactAccountResponse,\n} from './types';\n\n// ─── Config ──────────────────────────────────────────────\n\nexport interface BetterContactClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n}\n\n// ─── Client ──────────────────────────────────────────────\n\nexport class BetterContactClient extends BaseApiClient {\n constructor(config: BetterContactClientConfig) {\n super({\n name: 'BetterContact',\n baseUrl: config.baseUrl ?? 'https://app.bettercontact.rocks/api/v2',\n headers: { 'X-API-Key': config.apiKey },\n timeoutMs: config.timeoutMs,\n });\n }\n\n // ─── Enrichment ────────────────────────────────────────\n\n async enrich(params: BetterContactEnrichRequest): Promise<BetterContactEnrichCreateResponse> {\n return this.request<BetterContactEnrichCreateResponse>('/async', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async getEnrichmentStatus(id: string): Promise<BetterContactEnrichStatusResponse> {\n return this.request<BetterContactEnrichStatusResponse>(`/async/${id}`, {\n method: 'GET',\n });\n }\n\n // ─── Lead Finder ───────────────────────────────────────\n\n async findPeople(\n params: BetterContactLeadFinderRequest\n ): Promise<BetterContactLeadFinderCreateResponse> {\n return this.request<BetterContactLeadFinderCreateResponse>('/lead_finder/async', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async getLeadFinderStatus(id: string): Promise<BetterContactLeadFinderStatusResponse> {\n return this.request<BetterContactLeadFinderStatusResponse>(`/lead_finder/async/${id}`, {\n method: 'GET',\n });\n }\n\n // ─── Account ───────────────────────────────────────────\n\n async getAccount(): Promise<BetterContactAccountResponse> {\n return this.request<BetterContactAccountResponse>('/account', {\n method: 'GET',\n });\n }\n}\n","/** DiscoClient. Company + contact discovery via DiscoLike API (60M+ businesses).\n * Constraint: No framework imports. Extends BaseApiClient. Sync request model.\n * Source: https://api.discolike.com/v1/docs/ */\n\nimport { BaseApiClient } from '../base-client.js';\n\nimport type {\n DiscoDiscoverQuery,\n DiscoDiscoverResponse,\n DiscoCountResponse,\n DiscoBizdataResponse,\n DiscoScoreResponse,\n DiscoMatchResponse,\n DiscoContactsQuery,\n DiscoContactsResponse,\n DiscoContactsCountResponse,\n DiscoContactLookupQuery,\n DiscoContactLookupResponse,\n} from './types.js';\n\n// ─── Config ──────────────────────────────────────────────\n\nexport interface DiscoClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n}\n\n// ─── Client ──────────────────────────────────────────────\n\nexport class DiscoClient extends BaseApiClient {\n constructor(config: DiscoClientConfig) {\n super({\n name: 'Disco',\n baseUrl: config.baseUrl ?? 'https://api.discolike.com/v1',\n headers: { 'x-discolike-key': config.apiKey },\n timeoutMs: config.timeoutMs,\n });\n }\n\n // ─── Discovery ─────────────────────────────────────────\n\n async discover(query: DiscoDiscoverQuery): Promise<DiscoDiscoverResponse> {\n const params = this.buildParams(query);\n return this.request<DiscoDiscoverResponse>(`/discover?${params}`, { method: 'GET' });\n }\n\n async count(query: DiscoDiscoverQuery): Promise<DiscoCountResponse> {\n const params = this.buildParams(query);\n return this.request<DiscoCountResponse>(`/count?${params}`, { method: 'GET' });\n }\n\n // ─── Firmographics ─────────────────────────────────────\n\n async getBizData(domain: string): Promise<DiscoBizdataResponse> {\n return this.request<DiscoBizdataResponse>(`/bizdata?domain=${encodeURIComponent(domain)}`, {\n method: 'GET',\n });\n }\n\n async getScore(domain: string): Promise<DiscoScoreResponse> {\n return this.request<DiscoScoreResponse>(`/score?domain=${encodeURIComponent(domain)}`, {\n method: 'GET',\n });\n }\n\n // ─── Match ─────────────────────────────────────────────\n\n async match(name: string): Promise<DiscoMatchResponse> {\n return this.request<DiscoMatchResponse>(`/match?name=${encodeURIComponent(name)}`, {\n method: 'GET',\n });\n }\n\n // ─── Contacts ─────────────────────────────────────────\n\n async searchContacts(query: DiscoContactsQuery): Promise<DiscoContactsResponse> {\n const params = this.buildContactParams(query);\n return this.request<DiscoContactsResponse>(`/contacts?${params}`, { method: 'GET' });\n }\n\n async countContacts(query: DiscoContactsQuery): Promise<DiscoContactsCountResponse> {\n const params = this.buildContactParams(query);\n return this.request<DiscoContactsCountResponse>(`/contacts/count?${params}`, { method: 'GET' });\n }\n\n async lookupContact(query: DiscoContactLookupQuery): Promise<DiscoContactLookupResponse> {\n const params = new URLSearchParams();\n if (query.persona_id) params.set('persona_id', query.persona_id);\n if (query.linkedin_url) params.set('linkedin_url', query.linkedin_url);\n return this.request<DiscoContactLookupResponse>(`/contacts/lookup?${params}`, {\n method: 'GET',\n });\n }\n\n // ─── Helpers ───────────────────────────────────────────\n\n private addParam(params: URLSearchParams, key: string, value: string | string[] | undefined) {\n if (value == null) return;\n if (Array.isArray(value)) {\n value.forEach((v) => params.append(key, v));\n } else {\n params.set(key, value);\n }\n }\n\n private buildParams(query: DiscoDiscoverQuery): string {\n const params = new URLSearchParams();\n\n this.addParam(params, 'domain', query.domain);\n this.addParam(params, 'negate_domain', query.negate_domain);\n if (query.icp_text) params.set('icp_text', query.icp_text);\n if (query.icp_prompt) params.set('icp_prompt', query.icp_prompt);\n this.addParam(params, 'phrase_match', query.phrase_match);\n this.addParam(params, 'category', query.category);\n this.addParam(params, 'country', query.country);\n if (query.employee_range) params.set('employee_range', query.employee_range);\n if (query.max_records != null) params.set('max_records', String(query.max_records));\n if (query.offset != null) params.set('offset', String(query.offset));\n if (query.min_similarity != null) params.set('min_similarity', String(query.min_similarity));\n if (query.variance) params.set('variance', query.variance);\n if (query.enhanced != null) params.set('enhanced', String(query.enhanced));\n this.addParam(params, 'tech_stack', query.tech_stack);\n this.addParam(params, 'language', query.language);\n this.addParam(params, 'social', query.social);\n\n return params.toString();\n }\n\n private buildContactParams(query: DiscoContactsQuery): string {\n const params = new URLSearchParams();\n\n this.addParam(params, 'domain', query.domain);\n if (query.icp_text) params.set('icp_text', query.icp_text);\n this.addParam(params, 'persona_id', query.persona_id);\n this.addParam(params, 'seniority', query.seniority);\n this.addParam(params, 'department', query.department);\n this.addParam(params, 'skills', query.skills);\n if (query.name) params.set('name', query.name);\n if (query.title) params.set('title', query.title);\n if (query.summary) params.set('summary', query.summary);\n this.addParam(params, 'person_country', query.person_country);\n this.addParam(params, 'person_state', query.person_state);\n if (query.has_email != null) params.set('has_email', String(query.has_email));\n if (query.email_validated != null) params.set('email_validated', String(query.email_validated));\n if (query.has_phone != null) params.set('has_phone', String(query.has_phone));\n if (query.has_linkedin != null) params.set('has_linkedin', String(query.has_linkedin));\n if (query.min_connections != null) params.set('min_connections', String(query.min_connections));\n this.addParam(params, 'filter_industry', query.filter_industry);\n this.addParam(params, 'filter_country', query.filter_country);\n this.addParam(params, 'filter_state', query.filter_state);\n if (query.employees) params.set('employees', query.employees);\n if (query.revenue_range) params.set('revenue_range', query.revenue_range);\n if (query.max_records != null) params.set('max_records', String(query.max_records));\n if (query.offset != null) params.set('offset', String(query.offset));\n\n return params.toString();\n }\n}\n","/** ApolloClient. People/company search and enrichment via Apollo.io API.\n * Constraint: No framework imports. Extends BaseApiClient.\n * Source: https://docs.apollo.io/ */\n\nimport { BaseApiClient } from '../base-client';\n\nimport type {\n ApolloPersonSearchParams,\n ApolloPersonSearchResponse,\n ApolloPersonEnrichParams,\n ApolloPersonEnrichResponse,\n ApolloBulkPersonEnrichParams,\n ApolloBulkPersonEnrichResponse,\n ApolloOrgSearchParams,\n ApolloOrgSearchResponse,\n ApolloOrgEnrichParams,\n ApolloOrgEnrichResponse,\n ApolloBulkOrgEnrichParams,\n ApolloBulkOrgEnrichResponse,\n} from './types';\n\n// ─── Config ──────────────────────────────────────────────\n\nexport interface ApolloClientConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n}\n\n// ─── Client ──────────────────────────────────────────────\n\nexport class ApolloClient extends BaseApiClient {\n constructor(config: ApolloClientConfig) {\n super({\n name: 'Apollo',\n baseUrl: config.baseUrl ?? 'https://api.apollo.io/api/v1',\n headers: { 'x-api-key': config.apiKey },\n timeoutMs: config.timeoutMs,\n });\n }\n\n // ─── People Search ────────────────────────────────────\n\n /** Search Apollo's 210M+ contact database. Does NOT consume credits. Does NOT return emails. */\n async searchPeople(params: ApolloPersonSearchParams): Promise<ApolloPersonSearchResponse> {\n return this.request<ApolloPersonSearchResponse>('/mixed_people/api_search', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── People Enrichment ────────────────────────────────\n\n /** Enrich a single person. Consumes 1 export credit per successful match. */\n async enrichPerson(params: ApolloPersonEnrichParams): Promise<ApolloPersonEnrichResponse> {\n return this.request<ApolloPersonEnrichResponse>('/people/match', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n /** Enrich up to 10 people in one call. */\n async bulkEnrichPeople(\n params: ApolloBulkPersonEnrichParams\n ): Promise<ApolloBulkPersonEnrichResponse> {\n return this.request<ApolloBulkPersonEnrichResponse>('/people/bulk_match', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Organization Search ──────────────────────────────\n\n /** Search companies. Consumes credits. */\n async searchOrganizations(params: ApolloOrgSearchParams): Promise<ApolloOrgSearchResponse> {\n return this.request<ApolloOrgSearchResponse>('/mixed_companies/search', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Organization Enrichment ──────────────────────────\n\n /** Enrich a single organization by domain, name, or ID. Consumes credits. */\n async enrichOrganization(params: ApolloOrgEnrichParams): Promise<ApolloOrgEnrichResponse> {\n const qs = new URLSearchParams();\n if (params.domain) qs.set('domain', params.domain);\n if (params.name) qs.set('name', params.name);\n if (params.organization_id) qs.set('organization_id', params.organization_id);\n\n return this.request<ApolloOrgEnrichResponse>(`/organizations/enrich?${qs}`, {\n method: 'GET',\n });\n }\n\n /** Enrich up to 10 organizations in one call. */\n async bulkEnrichOrganizations(\n params: ApolloBulkOrgEnrichParams\n ): Promise<ApolloBulkOrgEnrichResponse> {\n return this.request<ApolloBulkOrgEnrichResponse>('/organizations/bulk_enrich', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n}\n","/** SmartLead cold email integration client.\n * Wraps the SmartLead API (https://server.smartlead.ai/api/v1).\n * Auth: query parameter ?api_key= on every request (NOT a header).\n * Constraint: No framework imports. Uses BaseApiClient. No process.env reads. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n SmartLeadCampaign,\n SmartLeadAnalytics,\n SmartLeadLead,\n SmartLeadAddLeadsResponse,\n SmartLeadAddLeadsSettings,\n SmartLeadStatusAction,\n} from './types';\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst MAX_LEADS_PER_REQUEST = 400;\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class SmartLeadClient extends BaseApiClient {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n super({\n name: 'SmartLead',\n baseUrl: 'https://server.smartlead.ai/api/v1',\n headers: {},\n timeoutMs: 30_000,\n });\n this.apiKey = apiKey;\n }\n\n // ─── Auth Helper ───────────────────────────────────────────────────────────\n\n /** Append api_key query parameter to a path. Handles existing query strings. */\n private authPath(path: string): string {\n const separator = path.includes('?') ? '&' : '?';\n return `${path}${separator}api_key=${this.apiKey}`;\n }\n\n // ─── Campaigns ─────────────────────────────────────────────────────────────\n\n /** List all campaigns. Returns a bare array from the API. */\n async listCampaigns(): Promise<SmartLeadCampaign[]> {\n return this.request<SmartLeadCampaign[]>(this.authPath('/campaigns/'));\n }\n\n /** Get analytics for a single campaign. */\n async getCampaignAnalytics(campaignId: number): Promise<SmartLeadAnalytics> {\n return this.request<SmartLeadAnalytics>(this.authPath(`/campaigns/${campaignId}/analytics`));\n }\n\n /**\n * Update campaign status (pause, stop, or start).\n * Note: SmartLead uses 'START' (not 'ACTIVE') to activate a campaign.\n */\n async updateCampaignStatus(campaignId: number, status: SmartLeadStatusAction): Promise<void> {\n await this.request<unknown>(this.authPath(`/campaigns/${campaignId}/status`), {\n method: 'POST',\n body: JSON.stringify({ status }),\n });\n }\n\n // ─── Leads ─────────────────────────────────────────────────────────────────\n\n /**\n * Add leads to a campaign. Max 400 leads per request.\n * Throws if more than 400 leads are provided — callers must batch.\n */\n async addLeadsToCampaign(\n campaignId: number,\n leads: SmartLeadLead[],\n settings?: SmartLeadAddLeadsSettings\n ): Promise<SmartLeadAddLeadsResponse> {\n if (leads.length > MAX_LEADS_PER_REQUEST) {\n throw new Error(\n `SmartLead allows max ${MAX_LEADS_PER_REQUEST} leads per request, got ${leads.length}`\n );\n }\n\n return this.request<SmartLeadAddLeadsResponse>(\n this.authPath(`/campaigns/${campaignId}/leads`),\n {\n method: 'POST',\n body: JSON.stringify({\n lead_list: leads,\n settings: settings ?? {\n ignore_global_block_list: false,\n ignore_unsubscribe_list: false,\n ignore_duplicate_leads_in_other_campaign: false,\n },\n }),\n }\n );\n }\n}\n","/** Slack integration client. Posts messages, updates, and uploads files via Slack Web API.\n * Base URL: https://slack.com/api — Auth: Bearer token.\n * Constraint: No framework imports. Uses BaseApiClient.\n * Quirk: Slack returns HTTP 200 with { ok: false } on errors — must check response body. */\n\nimport { BaseApiClient, ApiClientError } from '../base-client';\nimport type {\n SlackClientConfig,\n SlackPostMessageParams,\n SlackUpdateMessageParams,\n SlackUploadFileParams,\n SlackMessageResponse,\n SlackFileResponse,\n} from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class SlackClient extends BaseApiClient {\n constructor(config: SlackClientConfig) {\n super({\n name: 'Slack',\n baseUrl: 'https://slack.com/api',\n headers: { Authorization: `Bearer ${config.botToken}` },\n timeoutMs: 10_000,\n });\n }\n\n /**\n * Slack returns HTTP 200 even on failures. Override to check { ok: false }.\n */\n private async slackRequest<T extends { ok: boolean; error?: string }>(\n path: string,\n init?: RequestInit\n ): Promise<T> {\n const result = await this.request<T>(path, init);\n if (!result.ok) {\n throw new ApiClientError(\n this.config.name,\n 200,\n result.error ?? 'Unknown Slack error',\n result\n );\n }\n return result;\n }\n\n // ─── Messages ───────────────────────────────────────────────────────────────\n\n async postMessage(params: SlackPostMessageParams): Promise<SlackMessageResponse> {\n return this.slackRequest<SlackMessageResponse>('/chat.postMessage', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async updateMessage(params: SlackUpdateMessageParams): Promise<SlackMessageResponse> {\n return this.slackRequest<SlackMessageResponse>('/chat.update', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Files ──────────────────────────────────────────────────────────────────\n\n async uploadFile(params: SlackUploadFileParams): Promise<SlackFileResponse> {\n return this.slackRequest<SlackFileResponse>('/files.upload', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n}\n","/** Cal.com integration client. Reads bookings and event types via Cal.com v2 API.\n * Base URL: https://api.cal.com/v2 — Auth: Bearer token + cal-api-version header.\n * Constraint: No framework imports. Uses BaseApiClient. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n CalComClientConfig,\n CalComBooking,\n CalComEventType,\n CalComListBookingsParams,\n} from './types';\n\n// ─── Internal Types ───────────────────────────────────────────────────────────\n\ninterface CalComDataResponse<T> {\n data: T;\n}\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class CalComClient extends BaseApiClient {\n constructor(config: CalComClientConfig) {\n super({\n name: 'CalCom',\n baseUrl: 'https://api.cal.com/v2',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n 'cal-api-version': '2024-08-13',\n },\n timeoutMs: 15_000,\n });\n }\n\n // ─── Bookings ─────────────────────────────────────────────────────────────\n\n async getBooking(uid: string): Promise<CalComBooking> {\n const res = await this.request<CalComDataResponse<CalComBooking>>(`/bookings/${uid}`);\n return res.data;\n }\n\n async listBookings(params?: CalComListBookingsParams): Promise<CalComBooking[]> {\n const query = new URLSearchParams();\n if (params?.status) query.set('status', params.status);\n if (params?.eventTypeId) query.set('eventTypeId', String(params.eventTypeId));\n const qs = query.toString();\n const path = qs ? `/bookings?${qs}` : '/bookings';\n const res = await this.request<CalComDataResponse<CalComBooking[]>>(path);\n return res.data;\n }\n\n async cancelBooking(uid: string, reason?: string): Promise<void> {\n await this.request<CalComDataResponse<unknown>>(`/bookings/${uid}/cancel`, {\n method: 'DELETE',\n ...(reason ? { body: JSON.stringify({ reason }) } : {}),\n });\n }\n\n // ─── Event Types ──────────────────────────────────────────────────────────\n\n async getEventType(id: number): Promise<CalComEventType> {\n const res = await this.request<CalComDataResponse<CalComEventType>>(`/event-types/${id}`);\n return res.data;\n }\n\n async listEventTypes(): Promise<CalComEventType[]> {\n const res = await this.request<CalComDataResponse<CalComEventType[]>>('/event-types');\n return res.data;\n }\n}\n","/** Google Gemini integration client. Calls generateContent via REST API.\n * Base URL: https://generativelanguage.googleapis.com/v1beta — Auth: x-goog-api-key header.\n * Constraint: No framework imports. No @google/generative-ai SDK. Uses BaseApiClient.\n * Quirk: Error responses have nested { error: { code, message, status } } — must extract. */\n\nimport { BaseApiClient, ApiClientError } from '../base-client';\nimport type {\n GeminiClientConfig,\n GeminiGenerateParams,\n GeminiGenerateResponse,\n GeminiPart,\n} from './types';\n\n// ─── Internal Types ───────────────────────────────────────────────────────────\n\ninterface GeminiRawResponse {\n candidates?: Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n usageMetadata?: {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n };\n}\n\n// ─── Constants ──────────────────────────────────────────────────────────────\n\nconst DEFAULT_MODEL = 'gemini-2.0-flash';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class GeminiClient extends BaseApiClient {\n private readonly defaultModel: string;\n\n constructor(config: GeminiClientConfig) {\n super({\n name: 'Gemini',\n baseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n headers: { 'x-goog-api-key': config.apiKey },\n timeoutMs: 60_000,\n });\n this.defaultModel = config.defaultModel ?? DEFAULT_MODEL;\n }\n\n /**\n * Gemini wraps base request() to fix error messages.\n * Gemini returns { error: { code, message, status } } where error is an object.\n * BaseApiClient extracts body.error which would produce [object Object].\n */\n private async geminiRequest<T>(path: string, init?: RequestInit): Promise<T> {\n try {\n return await this.request<T>(path, init);\n } catch (err) {\n if (err instanceof ApiClientError && err.responseBody) {\n const body = err.responseBody as Record<string, unknown>;\n const nested = body.error as Record<string, unknown> | undefined;\n if (nested?.message && typeof nested.message === 'string') {\n throw new ApiClientError(this.config.name, err.statusCode, nested.message, body);\n }\n }\n throw err;\n }\n }\n\n // ─── Generate ─────────────────────────────────────────────────────────────\n\n async generateContent(params: GeminiGenerateParams): Promise<GeminiGenerateResponse> {\n const model = params.model ?? this.defaultModel;\n const parts: GeminiPart[] = [...(params.parts ?? []), { text: params.prompt }];\n\n const body: Record<string, unknown> = {\n contents: [{ parts }],\n };\n\n if (params.maxOutputTokens) {\n body.generationConfig = { maxOutputTokens: params.maxOutputTokens };\n }\n\n const raw = await this.geminiRequest<GeminiRawResponse>(`/models/${model}:generateContent`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n const text = raw.candidates?.[0]?.content?.parts?.[0]?.text ?? '';\n\n return {\n text,\n usageMetadata: raw.usageMetadata,\n };\n }\n}\n","/** Unipile integration client. LinkedIn API replacement for posts, comments, messages, profiles.\n * Base URL: https://{dsn}/api/v1 — Auth: X-API-KEY header.\n * Constraint: No framework imports. Uses BaseApiClient. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n UnipileClientConfig,\n UnipileCreatePostParams,\n UnipilePostResponse,\n UnipileCommentParams,\n UnipileCommentResponse,\n UnipileSendMessageParams,\n UnipileMessageResponse,\n UnipileProfile,\n UnipileConnection,\n UnipileListParams,\n UnipileHostedAuthParams,\n} from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class UnipileClient extends BaseApiClient {\n constructor(config: UnipileClientConfig) {\n super({\n name: 'Unipile',\n baseUrl: `https://${config.dsn}/api/v1`,\n headers: { 'X-API-KEY': config.apiKey },\n timeoutMs: 30_000,\n });\n }\n\n // ─── Posts ──────────────────────────────────────────────────────────────────\n\n async createPost(params: UnipileCreatePostParams): Promise<UnipilePostResponse> {\n return this.request<UnipilePostResponse>('/posts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async addComment(postId: string, params: UnipileCommentParams): Promise<UnipileCommentResponse> {\n return this.request<UnipileCommentResponse>(`/posts/${postId}/comments`, {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Messaging ─────────────────────────────────────────────────────────────\n\n async sendMessage(params: UnipileSendMessageParams): Promise<UnipileMessageResponse> {\n return this.request<UnipileMessageResponse>('/messages', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Profiles ──────────────────────────────────────────────────────────────\n\n async getProfile(accountId: string, identifier: string): Promise<UnipileProfile> {\n return this.request<UnipileProfile>(`/users/${identifier}?account_id=${accountId}`);\n }\n\n async listConnections(\n accountId: string,\n params?: UnipileListParams\n ): Promise<UnipileConnection[]> {\n const query = new URLSearchParams({ account_id: accountId });\n if (params?.cursor) query.set('cursor', params.cursor);\n if (params?.limit) query.set('limit', String(params.limit));\n const res = await this.request<{ items: UnipileConnection[] }>(\n `/users/connections?${query.toString()}`\n );\n return res.items;\n }\n\n // ─── Auth ──────────────────────────────────────────────────────────────────\n\n async createHostedAuthLink(params: UnipileHostedAuthParams): Promise<{ url: string }> {\n return this.request<{ url: string }>('/hosted/request-link', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n}\n","/** Twilio integration client. Sends SMS via Twilio REST API.\n * Base URL: https://api.twilio.com/2010-04-01/Accounts/{sid} — Auth: HTTP Basic.\n * Constraint: No framework imports. Uses BaseApiClient.\n * Quirk: Twilio requires application/x-www-form-urlencoded for message creation. */\n\nimport { BaseApiClient } from '../base-client';\nimport type { TwilioClientConfig, TwilioSendSmsParams, TwilioMessageResponse } from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class TwilioClient extends BaseApiClient {\n constructor(config: TwilioClientConfig) {\n const credentials = Buffer.from(`${config.accountSid}:${config.authToken}`).toString('base64');\n super({\n name: 'Twilio',\n baseUrl: `https://api.twilio.com/2010-04-01/Accounts/${config.accountSid}`,\n headers: { Authorization: `Basic ${credentials}` },\n timeoutMs: 10_000,\n });\n }\n\n // ─── SMS ──────────────────────────────────────────────────────────────────\n\n async sendSms(params: TwilioSendSmsParams): Promise<TwilioMessageResponse> {\n const formData = new URLSearchParams();\n formData.set('To', params.to);\n formData.set('From', params.from);\n formData.set('Body', params.body);\n if (params.statusCallback) {\n formData.set('StatusCallback', params.statusCallback);\n }\n\n return this.request<TwilioMessageResponse>('/Messages.json', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: formData.toString(),\n });\n }\n}\n","/** Linear integration client. Creates issues and projects via Linear GraphQL API.\n * Base URL: https://api.linear.app — Auth: Bearer token.\n * Constraint: No framework imports. GraphQL via POST to /graphql. Uses BaseApiClient. */\n\nimport { BaseApiClient, ApiClientError } from '../base-client';\nimport type {\n LinearClientConfig,\n LinearCreateIssueInput,\n LinearIssue,\n LinearProject,\n LinearIssueFilter,\n} from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class LinearClient extends BaseApiClient {\n private readonly teamId: string;\n\n constructor(config: LinearClientConfig) {\n super({\n name: 'Linear',\n baseUrl: 'https://api.linear.app',\n headers: { Authorization: `Bearer ${config.apiKey}` },\n timeoutMs: 15_000,\n });\n this.teamId = config.teamId;\n }\n\n // ─── GraphQL Helper ────────────────────────────────────────────────────────\n\n protected async graphql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const result = await this.request<{ data?: T; errors?: Array<{ message: string }> }>(\n '/graphql',\n {\n method: 'POST',\n body: JSON.stringify({ query, variables }),\n }\n );\n\n if (result.errors?.length) {\n throw new ApiClientError(this.config.name, 200, result.errors[0].message, result.errors);\n }\n\n return result.data as T;\n }\n\n // ─── Issues ────────────────────────────────────────────────────────────────\n\n async createIssue(input: LinearCreateIssueInput): Promise<LinearIssue> {\n const data = await this.graphql<{ issueCreate: { issue: LinearIssue } }>(\n `mutation CreateIssue($input: IssueCreateInput!) {\n issueCreate(input: $input) {\n issue { id title identifier state { name } }\n }\n }`,\n {\n input: {\n teamId: this.teamId,\n title: input.title,\n description: input.description,\n projectId: input.projectId,\n labelIds: input.labelIds,\n assigneeId: input.assigneeId,\n dueDate: input.dueDate,\n priority: input.priority,\n },\n }\n );\n return data.issueCreate.issue;\n }\n\n async listIssues(filter?: LinearIssueFilter): Promise<LinearIssue[]> {\n const filterObj: Record<string, unknown> = { team: { id: { eq: this.teamId } } };\n if (filter?.projectId) filterObj.project = { id: { eq: filter.projectId } };\n if (filter?.states?.length) filterObj.state = { name: { in: filter.states } };\n\n const data = await this.graphql<{ issues: { nodes: LinearIssue[] } }>(\n `query ListIssues($filter: IssueFilter) {\n issues(filter: $filter) {\n nodes { id title identifier state { name } }\n }\n }`,\n { filter: filterObj }\n );\n return data.issues.nodes;\n }\n\n // ─── Projects ──────────────────────────────────────────────────────────────\n\n async createProject(name: string): Promise<LinearProject> {\n const data = await this.graphql<{ projectCreate: { project: LinearProject } }>(\n `mutation CreateProject($input: ProjectCreateInput!) {\n projectCreate(input: $input) {\n project { id name }\n }\n }`,\n { input: { name, teamIds: [this.teamId] } }\n );\n return data.projectCreate.project;\n }\n}\n","/** Zapmail integration client. Domain provisioning, mailbox setup, and wallet management.\n * Base URL: https://api.zapmail.ai/api/v2 — Auth: x-auth-zapmail header.\n * Constraint: No framework imports. Uses BaseApiClient.\n * Note: Bulk domain check endpoint is known broken — excluded. */\n\nimport { BaseApiClient } from '../base-client';\nimport type {\n ZapmailClientConfig,\n ZapmailDomainAvailability,\n ZapmailBuyDomainParams,\n ZapmailBuyDomainResponse,\n ZapmailDmarcParams,\n ZapmailScheduleMailboxParams,\n ZapmailExportParams,\n ZapmailBalance,\n ZapmailWorkspace,\n} from './types';\n\n// ─── Client ──────────────────────────────────────────────────────────────────\n\nexport class ZapmailClient extends BaseApiClient {\n private readonly serviceProvider?: string;\n\n constructor(config: ZapmailClientConfig) {\n super({\n name: 'Zapmail',\n baseUrl: 'https://api.zapmail.ai/api/v2',\n headers: { 'x-auth-zapmail': config.apiKey },\n timeoutMs: 30_000,\n });\n this.serviceProvider = config.serviceProvider;\n }\n\n // ─── Domains ──────────────────────────────────────────────────────────────\n\n async checkDomain(domainName: string): Promise<ZapmailDomainAvailability> {\n return this.request<ZapmailDomainAvailability>('/domains/available', {\n method: 'POST',\n body: JSON.stringify({ domainName, years: 1 }),\n });\n }\n\n async buyDomain(params: ZapmailBuyDomainParams): Promise<ZapmailBuyDomainResponse> {\n return this.request<ZapmailBuyDomainResponse>('/domains/buy', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n async connectDomain(domainNames: string[]): Promise<void> {\n await this.request<unknown>('/domains/connect-domain', {\n method: 'POST',\n body: JSON.stringify({ domainNames }),\n });\n }\n\n async setupDmarc(params: ZapmailDmarcParams): Promise<void> {\n await this.request<unknown>('/domains/setup-dmarc', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Mailboxes ────────────────────────────────────────────────────────────\n\n async scheduleMailbox(params: ZapmailScheduleMailboxParams): Promise<void> {\n await this.request<unknown>('/mailboxes/schedule', {\n method: 'POST',\n headers: this.serviceProvider ? { 'x-service-provider': this.serviceProvider } : {},\n body: JSON.stringify(params),\n });\n }\n\n async exportAccounts(params: ZapmailExportParams): Promise<void> {\n await this.request<unknown>('/mailboxes/export-accounts', {\n method: 'POST',\n body: JSON.stringify(params),\n });\n }\n\n // ─── Wallet ───────────────────────────────────────────────────────────────\n\n async getBalance(): Promise<ZapmailBalance> {\n return this.request<ZapmailBalance>('/wallet/balance');\n }\n\n // ─── Workspaces ───────────────────────────────────────────────────────────\n\n async createWorkspace(name: string): Promise<ZapmailWorkspace> {\n return this.request<ZapmailWorkspace>('/workspaces', {\n method: 'POST',\n body: JSON.stringify({ name }),\n });\n }\n}\n","/** Kondo DM intelligence — webhook parser and engagement scorer.\n * Inbound-only: no outbound API calls.\n * Constraint: No framework imports. Stateless utility functions. */\n\nimport type {\n KondoWebhookPayload,\n KondoParsedPayload,\n KondoContact,\n KondoEngagementSignals,\n} from './types';\n\n// ─── Scoring Constants ──────────────────────────────────────────────────────\n\nconst MAX_MESSAGE_SCORE = 30;\nconst MESSAGE_CAP = 10;\nconst RECENCY_1_DAY_SCORE = 30;\nconst RECENCY_3_DAY_SCORE = 20;\nconst RECENCY_7_DAY_SCORE = 10;\nconst POSITIVE_LABELS_SCORE = 20;\nconst HAS_NOTES_SCORE = 10;\nconst THEY_REPLIED_SCORE = 10;\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n// ─── LinkedIn Username Extraction ───────────────────────────────────────────\n\nexport function extractLinkedInUsername(url: string): string | null {\n if (!url) return null;\n const match = url.match(/linkedin\\.com\\/in\\/([^/?#]+)/);\n return match ? match[1].replace(/\\/$/, '') : null;\n}\n\n// ─── Webhook Parser ─────────────────────────────────────────────────────────\n\nexport function parseKondoWebhook(payload: unknown): KondoParsedPayload {\n const raw = (payload ?? {}) as KondoWebhookPayload;\n\n const linkedinUrl = raw.linkedin_url ?? '';\n const history = raw.conversation_history ?? [];\n\n const contact: KondoContact = {\n linkedinUrl,\n linkedinUsername: extractLinkedInUsername(linkedinUrl),\n headline: raw.headline ?? '',\n location: raw.location ?? '',\n kondoUrl: raw.kondo_url ?? '',\n };\n\n const labels = raw.labels ?? [];\n const notes = raw.notes ?? [];\n const positiveLabels = ['Positive', 'Hot', 'Interested', 'Priority'];\n\n const engagement: KondoEngagementSignals = {\n messageCount: history.length,\n lastMessageAt: raw.last_message_at ?? null,\n hasPositiveLabels: labels.some((l) => positiveLabels.includes(l)),\n hasNotes: notes.length > 0,\n theyReplied: history.some((m) => m.sender === 'them'),\n };\n\n return { contact, engagement, labels, notes };\n}\n\n// ─── Engagement Scorer ──────────────────────────────────────────────────────\n\nexport function scoreEngagement(payload: KondoParsedPayload): number {\n const { engagement } = payload;\n let score = 0;\n\n // Message count: up to MAX_MESSAGE_SCORE, capped at MESSAGE_CAP\n const cappedMessages = Math.min(engagement.messageCount, MESSAGE_CAP);\n score += Math.round((cappedMessages / MESSAGE_CAP) * MAX_MESSAGE_SCORE);\n\n // Recency\n if (engagement.lastMessageAt) {\n const ageMs = Date.now() - new Date(engagement.lastMessageAt).getTime();\n const ageDays = ageMs / MS_PER_DAY;\n if (ageDays <= 1) score += RECENCY_1_DAY_SCORE;\n else if (ageDays <= 3) score += RECENCY_3_DAY_SCORE;\n else if (ageDays <= 7) score += RECENCY_7_DAY_SCORE;\n }\n\n // Boolean signals\n if (engagement.hasPositiveLabels) score += POSITIVE_LABELS_SCORE;\n if (engagement.hasNotes) score += HAS_NOTES_SCORE;\n if (engagement.theyReplied) score += THEY_REPLIED_SCORE;\n\n return score;\n}\n","/** Helicone config factory — creates Anthropic client config for Helicone proxy.\n * Not a client itself. Returns baseURL + headers to spread into Anthropic constructor.\n * Constraint: Pure function. No framework imports. */\n\nimport type { HeliconeParams, HeliconeConfig } from './types';\n\nexport function createHeliconeConfig(params: HeliconeParams): HeliconeConfig {\n const headers: Record<string, string> = {\n 'Helicone-Auth': `Bearer ${params.apiKey}`,\n };\n\n if (params.source) {\n headers['Helicone-Property-Source'] = params.source;\n }\n\n if (params.caller) {\n headers['Helicone-Property-Caller'] = params.caller;\n }\n\n return {\n baseURL: 'https://anthropic.helicone.ai',\n defaultHeaders: headers,\n };\n}\n","/** @mas/integrations — Third-party API clients for the MAS platform.\n * All integration clients extend BaseApiClient for consistent error handling.\n * Constraint: No framework imports. Uses global fetch(). */\n\nexport { BaseApiClient, ApiClientError, type ApiClientConfig } from './base-client';\nexport { PlusVibeClient } from './plusvibe/client';\nexport type {\n PlusVibeLead,\n PlusVibeCampaign,\n CreateCampaignRequest as PlusVibeCreateCampaignRequest,\n AddLeadsResponse as PlusVibeAddLeadsResponse,\n GetEmailsParams as PlusVibeGetEmailsParams,\n ReplyToEmailParams as PlusVibeReplyToEmailParams,\n} from './plusvibe/types';\nexport { PLUSVIBE_VARIABLES } from './plusvibe/types';\nexport { HeyReachClient } from './heyreach/client';\nexport type {\n HeyReachCampaign,\n HeyReachContact,\n HeyReachAddLeadsResponse,\n HeyReachLeadStatus,\n HeyReachAnalytics,\n} from './heyreach/types';\n\nexport { InstantlyClient } from './instantly/client';\nexport type {\n InstantlyCampaign,\n InstantlyCampaignStatus,\n InstantlyAnalytics,\n InstantlyLead,\n InstantlyAddLeadsRequest,\n InstantlyAddLeadsResponse,\n InstantlyListResponse,\n} from './instantly/types';\nexport { INSTANTLY_STATUS_LABELS } from './instantly/types';\n\nexport { EnrichmentClient } from './enrichment/client';\nexport { LeadMagicAdapter } from './enrichment/adapters/leadmagic';\nexport { ProspeoAdapter } from './enrichment/adapters/prospeo';\nexport { BlitzAdapter } from './enrichment/adapters/blitz';\nexport { ZeroBounceAdapter } from './enrichment/adapters/zerobounce';\nexport { BouncebanAdapter } from './enrichment/adapters/bounceban';\nexport type {\n EnrichmentClientOptions,\n EnrichmentResult,\n EnrichmentAttempt,\n EmailFinderParams,\n EmailFinderAdapter,\n EmailValidatorAdapter,\n} from './enrichment/types';\n\nexport { AttioClient } from './attio/client';\nexport type {\n AttioPerson,\n AttioCompany,\n AttioDeal,\n AttioMeeting,\n AttioPersonInput,\n AttioCompanyInput,\n AttioDealInput,\n AttioSyncInput,\n AttioCallData,\n AttioMeetingInput,\n} from './attio/types';\n\nexport { ResendClient } from './resend/client';\nexport type {\n ResendConfig,\n SendEmailParams,\n EmailResponse,\n BatchEmailResponse,\n Audience,\n AudienceListResponse,\n Contact,\n AddContactParams,\n UpdateContactParams,\n ContactListResponse,\n BroadcastParams,\n BroadcastResponse,\n EmailDetail,\n EmailListResponse,\n ResendDomain,\n DomainListResponse,\n ResendWebhookResponse,\n WebhookListResponse,\n LeadMagnetEmailParams,\n BlueprintEmailParams,\n DailyContentEmailParams,\n ContentItem,\n} from './resend/types';\n\nexport {\n BlueprintGeneratorClient,\n generateBlueprintSlug,\n recommendOfferFromIncome,\n} from './blueprint/client';\nexport type {\n BlueprintConfig,\n BlueprintIntakeRequest,\n BlueprintIntakeResponse,\n BlueprintProspectStatus,\n BlueprintProspectStatusValue,\n BlueprintProspectRow,\n BlueprintData,\n} from './blueprint/types';\n\nexport { ApifyClient } from './apify/client';\nexport type {\n ApifyConfig,\n ApifyLinkedInPost,\n ApifyLinkedInProfile,\n ApifyRunResponse,\n ApifyPostScrapeOptions,\n ApifyProfileScrapeOptions,\n ApifySyncScrapeOptions,\n} from './apify/types';\n\nexport { BrightDataClient } from './brightdata/client';\nexport type {\n BrightDataConfig,\n BrightDataLinkedInAuthor,\n BrightDataLinkedInPost,\n ScrapeLinkedInRequest,\n ScrapeSearchUrlRequest,\n BrightDataSnapshotResponse,\n BrightDataJobStatus,\n} from './brightdata/types';\n\nexport {\n verifyWebhook,\n verifyHmacSha256,\n verifyStripeWebhook,\n verifySlackWebhook,\n} from './webhooks/verify';\nexport type { WebhookProvider, WebhookVerifyOptions } from './webhooks/types';\n\nexport { StripeClient } from './stripe/client';\nexport type { StripeClientConfig, CreateCheckoutParams } from './stripe/types';\n\nexport { BetterContactClient } from './bettercontact/client';\nexport type {\n BetterContactEnrichRequest,\n BetterContactEnrichCreateResponse,\n BetterContactEnrichStatusResponse,\n BetterContactEnrichResult,\n BetterContactEnrichSummary,\n BetterContactLeadFinderRequest,\n BetterContactLeadFinderCreateResponse,\n BetterContactLeadFinderStatusResponse,\n BetterContactLead,\n BetterContactAccountResponse,\n} from './bettercontact/types';\n\nexport { DiscoClient } from './disco/client';\nexport type {\n DiscoDiscoverQuery,\n DiscoDiscoverResponse,\n DiscoCompanyResult,\n DiscoCountResponse,\n DiscoBizdataResponse,\n DiscoScoreResponse,\n DiscoMatchResponse,\n DiscoMatchResult,\n DiscoAddress,\n DiscoContactsQuery,\n DiscoContactsResponse,\n DiscoContactResult,\n DiscoContactsCountResponse,\n DiscoContactLookupQuery,\n DiscoContactLookupResponse,\n DiscoSeniority,\n} from './disco/types';\n\n// ─── Apollo ─────────────────────────────────────────────────────────────────\n\nexport { ApolloClient } from './apollo/client';\nexport type { ApolloClientConfig } from './apollo/client';\nexport type {\n ApolloPersonSearchParams,\n ApolloPersonSearchResponse,\n ApolloPersonEnrichParams,\n ApolloPersonEnrichResponse,\n ApolloBulkPersonEnrichParams,\n ApolloBulkPersonEnrichResponse,\n ApolloOrgSearchParams,\n ApolloOrgSearchResponse,\n ApolloOrgEnrichParams,\n ApolloOrgEnrichResponse,\n ApolloBulkOrgEnrichParams,\n ApolloBulkOrgEnrichResponse,\n ApolloPerson,\n ApolloOrganization,\n ApolloEmployment,\n} from './apollo/types';\n\n// ─── SmartLead ──────────────────────────────────────────────────────────────\n\nexport { SmartLeadClient } from './smartlead/client';\nexport type {\n SmartLeadCampaign,\n SmartLeadCampaignStatus,\n SmartLeadAnalytics,\n SmartLeadLead,\n SmartLeadAddLeadsResponse,\n SmartLeadAddLeadsSettings,\n SmartLeadStatusAction,\n} from './smartlead/types';\n\n// ─── Slack ──────────────────────────────────────────────────────────────────\n\nexport { SlackClient } from './slack/client';\nexport type {\n SlackClientConfig,\n SlackPostMessageParams,\n SlackUpdateMessageParams,\n SlackUploadFileParams,\n SlackMessageResponse,\n SlackFileResponse,\n SlackBlock,\n} from './slack/types';\n\n// ─── Cal.com ────────────────────────────────────────────────────────────────\n\nexport { CalComClient } from './calcom/client';\nexport type {\n CalComClientConfig,\n CalComBooking,\n CalComEventType,\n CalComListBookingsParams,\n CalComAttendee,\n} from './calcom/types';\n\n// ─── Gemini ─────────────────────────────────────────────────────────────────\n\nexport { GeminiClient } from './gemini/client';\nexport type {\n GeminiClientConfig,\n GeminiGenerateParams,\n GeminiGenerateResponse,\n GeminiPart,\n} from './gemini/types';\n\n// ─── Unipile ────────────────────────────────────────────────────────────────\n\nexport { UnipileClient } from './unipile/client';\nexport type {\n UnipileClientConfig,\n UnipileCreatePostParams,\n UnipilePostResponse,\n UnipileCommentParams,\n UnipileCommentResponse,\n UnipileSendMessageParams,\n UnipileMessageResponse,\n UnipileProfile,\n UnipileConnection,\n UnipileListParams,\n UnipileHostedAuthParams,\n} from './unipile/types';\n\n// ─── Twilio ─────────────────────────────────────────────────────────────────\n\nexport { TwilioClient } from './twilio/client';\nexport type {\n TwilioClientConfig,\n TwilioSendSmsParams,\n TwilioMessageResponse,\n} from './twilio/types';\n\n// ─── Linear ─────────────────────────────────────────────────────────────────\n\nexport { LinearClient } from './linear/client';\nexport type {\n LinearClientConfig,\n LinearCreateIssueInput,\n LinearIssue,\n LinearProject,\n LinearIssueFilter,\n} from './linear/types';\n\n// ─── Zapmail ────────────────────────────────────────────────────────────────\n\nexport { ZapmailClient } from './zapmail/client';\nexport type {\n ZapmailClientConfig,\n ZapmailDomainAvailability,\n ZapmailBuyDomainParams,\n ZapmailBuyDomainResponse,\n ZapmailDmarcParams,\n ZapmailScheduleMailboxParams,\n ZapmailExportParams,\n ZapmailBalance,\n ZapmailWorkspace,\n} from './zapmail/types';\n\n// ─── Kondo ──────────────────────────────────────────────────────────────────\n\nexport { parseKondoWebhook, scoreEngagement, extractLinkedInUsername } from './kondo/parser';\nexport type {\n KondoWebhookPayload,\n KondoParsedPayload,\n KondoContact,\n KondoEngagementSignals,\n} from './kondo/types';\n\n// ─── Helicone ───────────────────────────────────────────────────────────────\n\nexport { createHeliconeConfig } from './helicone/factory';\nexport type { HeliconeParams, HeliconeConfig } from './helicone/types';\n","/** BetterContact adapter. Bridges BetterContactClient to MCP Provider interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { BetterContactClient } from '@mas/integrations';\n\nimport type { BetterContactEnrichStatusResponse } from '@mas/integrations';\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CreditBalance,\n EmailEnricher,\n PhoneEnricher,\n EmailVerifier,\n PeopleFinder,\n ContactInput,\n EnrichEmailResult,\n EnrichPhoneResult,\n VerificationResult,\n PeopleQuery,\n PersonResult,\n} from '../types.js';\n\n// ─── Constants ───────────────────────────────────────────\n\nconst POLL_INTERVAL_MS = 2000;\nconst MAX_POLL_ATTEMPTS = 30; // 30 * 2s = 60s max wait\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class BetterContactAdapter\n implements Provider, EmailEnricher, PhoneEnricher, EmailVerifier, PeopleFinder\n{\n readonly name = 'bettercontact';\n readonly capabilities: Capability[] = [\n 'enrich_email',\n 'enrich_phone',\n 'verify_email',\n 'find_people',\n ];\n private readonly client: BetterContactClient;\n\n constructor(apiKey: string) {\n this.client = new BetterContactClient({ apiKey });\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n await this.client.getAccount();\n return true;\n } catch (error) {\n logError(\n 'bettercontact:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n async checkCredits(): Promise<CreditBalance | null> {\n try {\n const account = await this.client.getAccount();\n return {\n remaining: account.credits_left,\n unit: 'credits',\n provider: this.name,\n };\n } catch (error) {\n logError(\n 'bettercontact:checkCredits',\n error instanceof Error ? error : new Error(String(error))\n );\n return null;\n }\n }\n\n // ─── EmailEnricher ──────────────────────────────────────\n\n async enrichEmail(contact: ContactInput): Promise<EnrichEmailResult | null> {\n const createResponse = await this.client.enrich({\n data: [\n {\n first_name: contact.first_name,\n last_name: contact.last_name,\n company: contact.company,\n company_domain: contact.company_domain,\n linkedin_url: contact.linkedin_url,\n },\n ],\n enrich_email_address: true,\n enrich_phone_number: false,\n });\n\n const result = await this.pollEnrichment(createResponse.id);\n const enriched = result.data?.[0];\n if (!enriched?.contact_email_address) return null;\n\n return {\n email: enriched.contact_email_address,\n quality: enriched.contact_email_address_status,\n provider: this.name,\n };\n }\n\n // ─── PhoneEnricher ──────────────────────────────────────\n\n async enrichPhone(contact: ContactInput): Promise<EnrichPhoneResult | null> {\n const createResponse = await this.client.enrich({\n data: [\n {\n first_name: contact.first_name,\n last_name: contact.last_name,\n company: contact.company,\n company_domain: contact.company_domain,\n linkedin_url: contact.linkedin_url,\n },\n ],\n enrich_email_address: false,\n enrich_phone_number: true,\n });\n\n const result = await this.pollEnrichment(createResponse.id);\n const enriched = result.data?.[0];\n if (!enriched?.contact_phone_number) return null;\n\n return {\n phone: enriched.contact_phone_number,\n provider: this.name,\n };\n }\n\n // ─── EmailVerifier ──────────────────────────────────────\n\n async verifyEmail(email: string): Promise<VerificationResult> {\n const createResponse = await this.client.enrich({\n data: [{ first_name: '', last_name: '', company_domain: email.split('@')[1] }],\n enrich_email_address: true,\n enrich_phone_number: false,\n });\n\n const result = await this.pollEnrichment(createResponse.id);\n const enriched = result.data?.[0];\n const status = enriched?.contact_email_address_status ?? 'unknown';\n const statusMap: Record<string, VerificationResult['status']> = {\n deliverable: 'deliverable',\n catch_all_safe: 'catch_all_safe',\n catch_all_not_safe: 'catch_all_not_safe',\n undeliverable: 'undeliverable',\n };\n\n return {\n email,\n valid: status === 'deliverable',\n status: statusMap[status] ?? 'unknown',\n provider: this.name,\n };\n }\n\n // ─── PeopleFinder ───────────────────────────────────────\n\n async findPeople(query: PeopleQuery): Promise<PersonResult[]> {\n // Merge domain and name into one company filter to avoid overwrite\n const companyTerms = [query.company_domain, query.company_name].filter(Boolean) as string[];\n\n const createResponse = await this.client.findPeople({\n filters: {\n ...(companyTerms.length > 0 && { company: { include: companyTerms } }),\n ...(query.job_title && { lead_job_title: { include: [query.job_title] } }),\n ...(query.location && { lead_location: { include: [query.location] } }),\n },\n max_leads: query.limit,\n });\n\n let result = await this.client.getLeadFinderStatus(createResponse.request_id);\n let attempts = 0;\n while (\n (result.status === 'pending' || result.status === 'processing') &&\n attempts < MAX_POLL_ATTEMPTS\n ) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n result = await this.client.getLeadFinderStatus(createResponse.request_id);\n attempts++;\n }\n\n if (result.status === 'pending' || result.status === 'processing') {\n throw new Error(\n `BetterContact lead finder timed out after ${(MAX_POLL_ATTEMPTS * POLL_INTERVAL_MS) / 1000}s`\n );\n }\n\n return (result.leads ?? []).map((lead) => ({\n first_name: lead.contact_first_name ?? '',\n last_name: lead.contact_last_name ?? '',\n job_title: lead.contact_job_title,\n company: lead.company_name,\n linkedin_url: lead.contact_linkedin_profile_url,\n email: lead.contact_email_address,\n phone: lead.contact_phone_number,\n }));\n }\n\n // ─── Helpers ────────────────────────────────────────────\n\n private async pollEnrichment(requestId: string): Promise<BetterContactEnrichStatusResponse> {\n let result = await this.client.getEnrichmentStatus(requestId);\n let attempts = 0;\n\n while (\n (result.status === 'pending' || result.status === 'processing') &&\n attempts < MAX_POLL_ATTEMPTS\n ) {\n await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));\n result = await this.client.getEnrichmentStatus(requestId);\n attempts++;\n }\n\n if (result.status === 'pending' || result.status === 'processing') {\n throw new Error(\n `BetterContact enrichment timed out after ${(MAX_POLL_ATTEMPTS * POLL_INTERVAL_MS) / 1000}s`\n );\n }\n\n return result;\n }\n}\n","/** Disco adapter. Bridges DiscoClient to MCP Provider CompanyFinder + PeopleFinder interfaces.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError, logWarn } from '@mas/logging';\nimport { DiscoClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CompanyFinder,\n PeopleFinder,\n CompanyQuery,\n CompanyResult,\n PeopleQuery,\n PersonResult,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class DiscoAdapter implements Provider, CompanyFinder, PeopleFinder {\n readonly name = 'disco';\n readonly capabilities: Capability[] = ['find_companies', 'find_people'];\n private readonly client: DiscoClient;\n\n constructor(apiKey: string) {\n this.client = new DiscoClient({ apiKey });\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n // Disco has no account/health endpoint — use a cheap count query\n await this.client.count({ max_records: 1 });\n return true;\n } catch (error) {\n logError('disco:checkCredentials', error instanceof Error ? error : new Error(String(error)));\n return false;\n }\n }\n\n // ─── CompanyFinder ──────────────────────────────────────\n\n async findCompanies(query: CompanyQuery): Promise<CompanyResult[]> {\n const response = await this.client.discover({\n domain: query.domain,\n icp_text: query.icp_text,\n max_records: query.limit,\n country: query.country,\n ...(query.min_employees != null &&\n query.max_employees != null && {\n employee_range: `${query.min_employees},${query.max_employees}`,\n }),\n });\n\n // API returns flat array of company results\n return response.map((c) => ({\n domain: c.domain,\n name: c.name,\n description: c.description,\n industry: c.industry_groups ? Object.keys(c.industry_groups)[0] : undefined,\n employees: c.employees ? parseInt(c.employees, 10) || undefined : undefined,\n country: c.address?.country,\n linkedin_url: c.social_urls?.find((u) => u.includes('linkedin')),\n score: c.score,\n }));\n }\n\n async countCompanies(query: CompanyQuery): Promise<number> {\n const response = await this.client.count({\n domain: query.domain,\n icp_text: query.icp_text,\n country: query.country,\n ...(query.min_employees != null &&\n query.max_employees != null && {\n employee_range: `${query.min_employees},${query.max_employees}`,\n }),\n });\n return response.count;\n }\n\n async getCompany(domain: string): Promise<CompanyResult | null> {\n try {\n const data = await this.client.getBizData(domain);\n return {\n domain: data.domain,\n name: data.name,\n description: data.description,\n industry: data.industry_groups ? Object.keys(data.industry_groups)[0] : undefined,\n employees: data.employees ? parseInt(data.employees, 10) || undefined : undefined,\n country: data.address?.country,\n linkedin_url: data.social_urls?.find((u) => u.includes('linkedin')),\n };\n } catch (_error) {\n logWarn('disco:getCompany', `Failed to get company data for ${domain}`);\n return null;\n }\n }\n\n // ─── PeopleFinder ───────────────────────────────────────\n\n async findPeople(query: PeopleQuery): Promise<PersonResult[]> {\n const response = await this.client.searchContacts({\n domain: query.company_domain,\n // Fall back to icp_text when company_name given without company_domain\n icp_text: !query.company_domain && query.company_name ? query.company_name : undefined,\n title: query.job_title,\n person_country: query.location,\n // Only return contacts with email — essential for GTM outreach\n has_email: true,\n max_records: query.limit ?? 25,\n });\n\n return response.map((c) => {\n const nameParts = parseName(c.name);\n return {\n first_name: nameParts.first,\n last_name: nameParts.last,\n job_title: c.title,\n company: c.domain,\n linkedin_url: c.social_urls?.find((u) => u.includes('linkedin')),\n email: c.email,\n phone: c.phone,\n };\n });\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────\n\nfunction parseName(fullName: string): { first: string; last: string } {\n const parts = fullName.trim().split(/\\s+/);\n if (parts.length === 0) return { first: '', last: '' };\n if (parts.length === 1) return { first: parts[0], last: '' };\n return { first: parts[0], last: parts.slice(1).join(' ') };\n}\n","/** Prospeo adapter. Bridges ProspeoAdapter to MCP Provider EmailEnricher interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { ProspeoAdapter as ProspeoClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type { Provider, EmailEnricher, ContactInput, EnrichEmailResult } from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class ProspeoMcpAdapter implements Provider, EmailEnricher {\n readonly name = 'prospeo';\n readonly capabilities: Capability[] = ['enrich_email'];\n private readonly client: ProspeoClient;\n\n constructor(apiKey: string) {\n this.client = new ProspeoClient(apiKey);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n // Prospeo has no free health-check endpoint. Use a minimal email find\n // with a known-invalid input to verify the API key is accepted (returns 200 vs 401).\n await this.client.findEmail({\n firstName: 'test',\n lastName: 'test',\n company: 'test.invalid',\n });\n return true;\n } catch (error) {\n logError(\n 'prospeo:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── EmailEnricher ──────────────────────────────────────\n\n async enrichEmail(contact: ContactInput): Promise<EnrichEmailResult | null> {\n try {\n const result = await this.client.findEmail({\n firstName: contact.first_name,\n lastName: contact.last_name,\n company: contact.company ?? '',\n domain: contact.company_domain,\n linkedinUrl: contact.linkedin_url,\n });\n\n if (!result?.email) return null;\n\n return {\n email: result.email,\n quality: result.confidence ? `${result.confidence}%` : undefined,\n provider: this.name,\n };\n } catch (error) {\n logError('prospeo:enrichEmail', error instanceof Error ? error : new Error(String(error)));\n return null;\n }\n }\n}\n","/** PlusVibe adapter. Bridges PlusVibeClient to MCP Provider CampaignManager interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { PlusVibeClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CampaignManager,\n Campaign,\n CampaignStats,\n CampaignLead,\n PushResult,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class PlusVibeAdapter implements Provider, CampaignManager {\n readonly name = 'plusvibe';\n readonly capabilities: Capability[] = ['campaign_email'];\n private readonly client: PlusVibeClient;\n\n constructor(apiKey: string, workspaceId: string) {\n this.client = new PlusVibeClient(apiKey, workspaceId);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n await this.client.listCampaigns();\n return true;\n } catch (error) {\n logError(\n 'plusvibe:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── CampaignManager ───────────────────────────────────\n\n async listCampaigns(): Promise<Campaign[]> {\n const campaigns = await this.client.listCampaigns();\n return campaigns.map((c) => ({\n id: c.id,\n name: c.name,\n status: c.status,\n provider: this.name,\n }));\n }\n\n async getCampaignStats(campaignId: string): Promise<CampaignStats> {\n const stats = await this.client.getCampaignStats(campaignId);\n return {\n campaign_id: campaignId,\n sent: stats.emails_sent,\n opened: stats.emails_opened,\n replied: stats.emails_replied,\n bounced: stats.emails_bounced,\n provider: this.name,\n };\n }\n\n async addLeadsToCampaign(campaignId: string, leads: CampaignLead[]): Promise<PushResult> {\n const plusVibeLeads = leads.map((l) => ({\n email: l.email,\n first_name: l.first_name ?? '',\n last_name: l.last_name ?? '',\n company_name: l.company ?? '',\n }));\n\n const response = await this.client.addLeadsToCampaign(campaignId, plusVibeLeads);\n return {\n added: response.added ?? response.leads_uploaded ?? 0,\n duplicates: response.duplicates ?? response.duplicate_email_count ?? 0,\n errors: response.invalid_email_count ?? 0,\n provider: this.name,\n };\n }\n}\n","/** HeyReach adapter. Bridges HeyReachClient to MCP Provider OutreachManager interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { HeyReachClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n OutreachManager,\n Campaign,\n CampaignStats,\n OutreachLead,\n PushResult,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class HeyReachAdapter implements Provider, OutreachManager {\n readonly name = 'heyreach';\n readonly capabilities: Capability[] = ['outreach_linkedin'];\n private readonly client: HeyReachClient;\n\n constructor(apiKey: string) {\n this.client = new HeyReachClient(apiKey);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n await this.client.listCampaigns();\n return true;\n } catch (error) {\n logError(\n 'heyreach:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── OutreachManager ────────────────────────────────────\n\n async listCampaigns(): Promise<Campaign[]> {\n const campaigns = await this.client.listCampaigns();\n return campaigns.map((c) => ({\n id: String(c.id),\n name: c.name ?? '',\n status: String(c.status ?? 'unknown'),\n provider: this.name,\n }));\n }\n\n async getCampaignStats(campaignId: string): Promise<CampaignStats> {\n const analytics = await this.client.getCampaignAnalytics(Number(campaignId));\n return {\n campaign_id: campaignId,\n sent: (analytics.sent as number) ?? 0,\n opened: (analytics.accepted as number) ?? 0,\n replied: (analytics.replied as number) ?? 0,\n bounced: 0,\n provider: this.name,\n };\n }\n\n async addLeadsToCampaign(campaignId: string, leads: OutreachLead[]): Promise<PushResult> {\n // HeyReach AddLeadsToCampaign returns void — no per-lead counts available.\n await this.client.addLeadsToList(\n Number(campaignId),\n leads.map((l) => ({\n profileUrl: l.linkedin_url,\n firstName: l.first_name,\n lastName: l.last_name,\n }))\n );\n\n return {\n added: leads.length,\n duplicates: 0,\n errors: 0,\n provider: this.name,\n };\n }\n}\n","/** Attio adapter. Bridges AttioClient to MCP Provider CrmManager interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { AttioClient } from '@mas/integrations';\n\nimport type { AttioPerson } from '@mas/integrations';\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CrmManager,\n CrmPersonQuery,\n CrmPerson,\n CrmPersonInput,\n CrmCompany,\n CrmDealInput,\n CrmDeal,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class AttioAdapter implements Provider, CrmManager {\n readonly name = 'attio';\n readonly capabilities: Capability[] = ['crm_read', 'crm_write'];\n private readonly client: AttioClient;\n\n constructor(apiKey: string) {\n this.client = new AttioClient(apiKey);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n // Try to list people with a non-matching query to verify auth\n await this.client.findPersonByEmail('health-check@test.invalid');\n return true;\n } catch (error) {\n logError('attio:checkCredentials', error instanceof Error ? error : new Error(String(error)));\n return false;\n }\n }\n\n // ─── CrmManager ────────────────────────────────────────\n\n async findPerson(query: CrmPersonQuery): Promise<CrmPerson | null> {\n let person = null;\n\n if (query.email) {\n person = await this.client.findPersonByEmail(query.email);\n } else if (query.linkedin_url) {\n person = await this.client.findPersonByLinkedIn(query.linkedin_url);\n }\n\n if (!person) return null;\n\n return this.mapPerson(person);\n }\n\n async createPerson(data: CrmPersonInput): Promise<CrmPerson> {\n const person = await this.client.createPerson({\n first_name: data.first_name,\n last_name: data.last_name,\n email_addresses: data.email ? [data.email] : [],\n job_title: data.job_title,\n });\n\n return this.mapPerson(person);\n }\n\n async updatePerson(id: string, data: Partial<CrmPersonInput>): Promise<CrmPerson> {\n const person = await this.client.updatePerson(id, {\n first_name: data.first_name,\n last_name: data.last_name,\n email_addresses: data.email ? [data.email] : undefined,\n job_title: data.job_title,\n });\n\n return this.mapPerson(person);\n }\n\n async findCompany(name: string): Promise<CrmCompany | null> {\n const company = await this.client.findCompany(name);\n if (!company) return null;\n\n return {\n id: company.id.record_id,\n name: String(this.extractValue(company.values, 'name') ?? name),\n domain: String(this.extractValue(company.values, 'domains') ?? ''),\n provider: this.name,\n };\n }\n\n async createDeal(data: CrmDealInput): Promise<CrmDeal> {\n const deal = await this.client.createDeal({\n name: data.name,\n stage: data.stage ?? 'New',\n owner_id: data.owner_id ?? '',\n });\n\n return {\n id: deal.id.record_id,\n name: data.name,\n stage: data.stage ?? 'New',\n provider: this.name,\n };\n }\n\n // ─── Helpers ────────────────────────────────────────────\n\n private mapPerson(person: AttioPerson): CrmPerson {\n const recordId = person.id.record_id;\n const values = person.values;\n\n return {\n id: recordId,\n name: String(this.extractValue(values, 'name') ?? ''),\n email: String(this.extractValue(values, 'email_addresses') ?? ''),\n company: String(this.extractValue(values, 'company') ?? ''),\n job_title: String(this.extractValue(values, 'job_title') ?? ''),\n provider: this.name,\n };\n }\n\n private extractValue(obj: Record<string, Record<string, unknown>[]>, field: string): unknown {\n const value = obj[field];\n if (Array.isArray(value) && value.length > 0) {\n const first = value[0];\n return first.value ?? first.full_name ?? first.email_address ?? first;\n }\n return undefined;\n }\n}\n","/** Apollo adapter. Bridges ApolloClient to MCP Provider interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError, logWarn } from '@mas/logging';\nimport { ApolloClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CompanyFinder,\n PeopleFinder,\n EmailEnricher,\n CompanyQuery,\n CompanyResult,\n PeopleQuery,\n PersonResult,\n ContactInput,\n EnrichEmailResult,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class ApolloAdapter implements Provider, CompanyFinder, PeopleFinder, EmailEnricher {\n readonly name = 'apollo';\n readonly capabilities: Capability[] = ['find_companies', 'find_people', 'enrich_email'];\n private readonly client: ApolloClient;\n\n constructor(apiKey: string) {\n this.client = new ApolloClient({ apiKey });\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n // Use a minimal people search (free, no credits consumed)\n await this.client.searchPeople({ per_page: 1, page: 1 });\n return true;\n } catch (error) {\n logError(\n 'apollo:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── CompanyFinder ──────────────────────────────────────\n\n async findCompanies(query: CompanyQuery): Promise<CompanyResult[]> {\n const response = await this.client.searchOrganizations({\n ...(query.domain && { q_organization_domains: query.domain }),\n ...(query.icp_text && { q_organization_keyword_tags: [query.icp_text] }),\n ...(query.country && { organization_locations: [query.country] }),\n ...(query.min_employees != null &&\n query.max_employees != null && {\n organization_num_employees_ranges: [`${query.min_employees},${query.max_employees}`],\n }),\n per_page: Math.min(query.limit ?? 25, 100),\n page: 1,\n });\n\n return response.organizations.map((org) => ({\n domain: org.primary_domain ?? org.website_url ?? '',\n name: org.name,\n description: org.short_description ?? undefined,\n industry: org.industry ?? undefined,\n employees: org.estimated_num_employees ?? undefined,\n country: org.country ?? undefined,\n linkedin_url: org.linkedin_url ?? undefined,\n }));\n }\n\n async getCompany(domain: string): Promise<CompanyResult | null> {\n try {\n const response = await this.client.enrichOrganization({ domain });\n const org = response.organization;\n if (!org) return null;\n\n return {\n domain: org.primary_domain ?? domain,\n name: org.name,\n description: org.short_description ?? undefined,\n industry: org.industry ?? undefined,\n employees: org.estimated_num_employees ?? undefined,\n country: org.country ?? undefined,\n linkedin_url: org.linkedin_url ?? undefined,\n };\n } catch (_error) {\n logWarn('apollo:getCompany', `Failed to enrich company data for ${domain}`);\n return null;\n }\n }\n\n // ─── PeopleFinder ───────────────────────────────────────\n\n async findPeople(query: PeopleQuery): Promise<PersonResult[]> {\n const response = await this.client.searchPeople({\n ...(query.job_title && { person_titles: [query.job_title] }),\n ...(query.company_domain && { q_organization_domains: query.company_domain }),\n ...(query.company_name && { q_keywords: query.company_name }),\n ...(query.location && { person_locations: [query.location] }),\n per_page: Math.min(query.limit ?? 25, 100),\n page: 1,\n });\n\n return response.people.map((p) => ({\n first_name: p.first_name,\n last_name: p.last_name,\n job_title: p.title ?? undefined,\n company: p.organization_name ?? undefined,\n linkedin_url: p.linkedin_url ?? undefined,\n // People search does NOT return email — null by design\n email: p.email ?? undefined,\n }));\n }\n\n // ─── EmailEnricher ──────────────────────────────────────\n\n async enrichEmail(contact: ContactInput): Promise<EnrichEmailResult | null> {\n const response = await this.client.enrichPerson({\n first_name: contact.first_name,\n last_name: contact.last_name,\n ...(contact.company && { organization_name: contact.company }),\n ...(contact.company_domain && { domain: contact.company_domain }),\n ...(contact.linkedin_url && { linkedin_url: contact.linkedin_url }),\n });\n\n const person = response.person;\n if (!person?.email) return null;\n\n return {\n email: person.email,\n quality: person.email_status ?? undefined,\n provider: this.name,\n };\n }\n}\n","/** Instantly adapter. Bridges InstantlyClient to MCP Provider CampaignManager interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { InstantlyClient, INSTANTLY_STATUS_LABELS } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CampaignManager,\n Campaign,\n CampaignStats,\n CampaignLead,\n PushResult,\n} from '../types.js';\n\nimport type { InstantlyCampaignStatus } from '@mas/integrations';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class InstantlyAdapter implements Provider, CampaignManager {\n readonly name = 'instantly';\n readonly capabilities: Capability[] = ['campaign_email'];\n private readonly client: InstantlyClient;\n\n constructor(apiKey: string) {\n this.client = new InstantlyClient(apiKey);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n await this.client.listCampaigns();\n return true;\n } catch (error) {\n logError(\n 'instantly:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── CampaignManager ───────────────────────────────────\n\n async listCampaigns(): Promise<Campaign[]> {\n const campaigns = await this.client.listCampaigns();\n return campaigns.map((c) => ({\n id: c.id,\n name: c.name ?? '',\n status: INSTANTLY_STATUS_LABELS[c.status as InstantlyCampaignStatus] ?? 'unknown',\n provider: this.name,\n }));\n }\n\n async getCampaignStats(campaignId: string): Promise<CampaignStats> {\n const analytics = await this.client.getCampaignAnalytics(campaignId);\n return {\n campaign_id: campaignId,\n sent: analytics.emails_sent_count ?? 0,\n opened: analytics.open_count ?? 0,\n replied: analytics.reply_count ?? 0,\n bounced: analytics.bounced_count ?? 0,\n provider: this.name,\n };\n }\n\n async addLeadsToCampaign(campaignId: string, leads: CampaignLead[]): Promise<PushResult> {\n const instantlyLeads = leads.map((l) => ({\n email: l.email,\n first_name: l.first_name ?? '',\n last_name: l.last_name ?? '',\n company_name: l.company ?? '',\n ...(l.custom_fields && Object.keys(l.custom_fields).length > 0\n ? { custom_variables: l.custom_fields }\n : {}),\n }));\n\n await this.client.addLeadsToCampaign(campaignId, instantlyLeads);\n\n // Instantly's add endpoint doesn't return per-lead counts\n return {\n added: leads.length,\n duplicates: 0,\n errors: 0,\n provider: this.name,\n };\n }\n}\n","/** SmartLead adapter. Bridges SmartLeadClient to MCP Provider CampaignManager interface.\n * Constraint: No direct API calls. Delegates to @mas/integrations client. */\n\nimport { logError } from '@mas/logging';\nimport { SmartLeadClient } from '@mas/integrations';\n\nimport type { Capability } from '../../constants.js';\nimport type {\n Provider,\n CampaignManager,\n Campaign,\n CampaignStats,\n CampaignLead,\n PushResult,\n} from '../types.js';\n\n// ─── Adapter ─────────────────────────────────────────────\n\nexport class SmartLeadAdapter implements Provider, CampaignManager {\n readonly name = 'smartlead';\n readonly capabilities: Capability[] = ['campaign_email'];\n private readonly client: SmartLeadClient;\n\n constructor(apiKey: string) {\n this.client = new SmartLeadClient(apiKey);\n }\n\n async checkCredentials(): Promise<boolean> {\n try {\n await this.client.listCampaigns();\n return true;\n } catch (error) {\n logError(\n 'smartlead:checkCredentials',\n error instanceof Error ? error : new Error(String(error))\n );\n return false;\n }\n }\n\n // ─── CampaignManager ───────────────────────────────────\n\n async listCampaigns(): Promise<Campaign[]> {\n const campaigns = await this.client.listCampaigns();\n return campaigns.map((c) => ({\n id: String(c.id),\n name: c.name,\n status: c.status,\n provider: this.name,\n }));\n }\n\n async getCampaignStats(campaignId: string): Promise<CampaignStats> {\n const analytics = await this.client.getCampaignAnalytics(Number(campaignId));\n return {\n campaign_id: campaignId,\n sent: analytics.total_sent,\n opened: analytics.total_opened,\n replied: analytics.total_replied,\n bounced: 0,\n provider: this.name,\n };\n }\n\n async addLeadsToCampaign(campaignId: string, leads: CampaignLead[]): Promise<PushResult> {\n const smartLeadLeads = leads.map((l) => ({\n email: l.email,\n first_name: l.first_name ?? '',\n last_name: l.last_name ?? '',\n company_name: l.company ?? '',\n custom_fields: l.custom_fields,\n }));\n\n const response = await this.client.addLeadsToCampaign(Number(campaignId), smartLeadLeads);\n return {\n added: response.added_count,\n duplicates: response.skipped_count,\n errors: 0,\n provider: this.name,\n };\n }\n}\n","/** Provider adapter index. Re-exports all adapters for clean imports.\n * Constraint: No logic. Re-exports only. */\n\nexport { BetterContactAdapter } from './bettercontact.js';\nexport { DiscoAdapter } from './disco.js';\nexport { ProspeoMcpAdapter } from './prospeo.js';\nexport { PlusVibeAdapter } from './plusvibe.js';\nexport { HeyReachAdapter } from './heyreach.js';\nexport { AttioAdapter } from './attio.js';\nexport { ApolloAdapter } from './apollo.js';\nexport { InstantlyAdapter } from './instantly.js';\nexport { SmartLeadAdapter } from './smartlead.js';\n","/** Provider factory. Creates and registers adapters based on config.\n * Constraint: Only reads config. No side effects beyond registration. */\n\nimport { logInfo, logWarn } from '@mas/logging';\n\nimport type { ClientConfig } from '../config.js';\nimport type { ProviderRegistry } from './registry.js';\n\nimport {\n BetterContactAdapter,\n DiscoAdapter,\n ProspeoMcpAdapter,\n PlusVibeAdapter,\n HeyReachAdapter,\n AttioAdapter,\n ApolloAdapter,\n InstantlyAdapter,\n SmartLeadAdapter,\n} from './adapters/index.js';\n\n// ─── Factory Map ─────────────────────────────────────────\n\nfunction createAdapter(name: string, config: { api_key: string; workspace_id?: string }) {\n switch (name) {\n case 'bettercontact':\n return new BetterContactAdapter(config.api_key);\n case 'disco':\n return new DiscoAdapter(config.api_key);\n case 'prospeo':\n return new ProspeoMcpAdapter(config.api_key);\n case 'plusvibe':\n return new PlusVibeAdapter(config.api_key, config.workspace_id ?? '');\n case 'heyreach':\n return new HeyReachAdapter(config.api_key);\n case 'attio':\n return new AttioAdapter(config.api_key);\n case 'apollo':\n return new ApolloAdapter(config.api_key);\n case 'instantly':\n return new InstantlyAdapter(config.api_key);\n case 'smartlead':\n return new SmartLeadAdapter(config.api_key);\n default:\n return null;\n }\n}\n\n// ─── Registration ────────────────────────────────────────\n\nexport function registerProviders(registry: ProviderRegistry, clientConfig: ClientConfig): void {\n registry.deregisterAll();\n\n for (const [name, config] of Object.entries(clientConfig.providers)) {\n if (!config.api_key) continue;\n\n const adapter = createAdapter(name, config);\n if (adapter) {\n registry.register(adapter);\n logInfo('provider:register', `Registered ${name}`, {\n capabilities: adapter.capabilities,\n });\n } else {\n logWarn('provider:register', `Unknown provider \"${name}\" in config — skipped`);\n }\n }\n}\n","/** Prospect handler. Routes company/people discovery to providers.\n * Constraint: No direct API calls. Uses provider registry. */\n\nimport type { HandlerContext } from './index.js';\nimport type { CompanyFinder, PeopleFinder, CompanyQuery, PeopleQuery } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleProspect(\n name: string,\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n if (name === 'gtm_find_companies') {\n return findCompanies(args, ctx);\n }\n return findPeople(args, ctx);\n}\n\n// ─── Find Companies ──────────────────────────────────────\n\nasync function findCompanies(args: Record<string, unknown>, ctx: HandlerContext): Promise<unknown> {\n const providerName = (args.provider as string) || undefined;\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability('find_companies');\n\n if (providers.length === 0) {\n throw new Error(\n 'No providers configured for company discovery. Add a provider with find_companies capability.'\n );\n }\n\n const provider = providers[0]!;\n const finder = provider as unknown as CompanyFinder;\n\n const query: CompanyQuery = {\n domain: args.domain as string | undefined,\n icp_text: args.icp_text as string | undefined,\n limit: args.limit as number | undefined,\n country: args.country as string | undefined,\n min_employees: args.min_employees as number | undefined,\n max_employees: args.max_employees as number | undefined,\n };\n\n const results = await finder.findCompanies(query);\n return { provider: provider.name, count: results.length, companies: results };\n}\n\n// ─── Find People ─────────────────────────────────────────\n\nasync function findPeople(args: Record<string, unknown>, ctx: HandlerContext): Promise<unknown> {\n const providerName = (args.provider as string) || undefined;\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability('find_people');\n\n if (providers.length === 0) {\n throw new Error(\n 'No providers configured for people search. Add a provider with find_people capability.'\n );\n }\n\n const provider = providers[0]!;\n const finder = provider as unknown as PeopleFinder;\n\n const query: PeopleQuery = {\n job_title: args.job_title as string | undefined,\n company_name: args.company_name as string | undefined,\n company_domain: args.company_domain as string | undefined,\n location: args.location as string | undefined,\n limit: args.limit as number | undefined,\n };\n\n const results = await finder.findPeople(query);\n return { provider: provider.name, count: results.length, people: results };\n}\n","/** WaterfallEngine. Orchestrates multi-provider enrichment with ordered fallback.\n * Constraint: Stateless. No database. No side effects beyond API calls. */\n\nimport { logError } from '@mas/logging';\n\nimport type { ProviderRegistry } from './registry.js';\nimport type {\n ContactInput,\n EmailEnricher,\n PhoneEnricher,\n WaterfallConfig,\n WaterfallResult,\n WaterfallAttempt,\n ProviderPricing,\n} from './types.js';\n\n// ─── Pricing Defaults ────────────────────────────────────\n\nconst DEFAULT_PRICING: Record<string, ProviderPricing> = {\n bettercontact: { charged_only_on_find: true, estimated_cost_per_hit: '$0.10' },\n prospeo: { charged_only_on_find: true, estimated_cost_per_hit: '$0.05' },\n apollo: { charged_only_on_find: false, estimated_cost_per_lookup: '$0.03' },\n hunter: { charged_only_on_find: true, estimated_cost_per_hit: '$0.05' },\n};\n\n// ─── Waterfall Execution ─────────────────────────────────\n\nexport async function runWaterfall(\n contacts: ContactInput[],\n config: WaterfallConfig,\n registry: ProviderRegistry\n): Promise<WaterfallResult[]> {\n const results: WaterfallResult[] = [];\n\n for (const contact of contacts) {\n const result = await enrichContact(contact, config, registry);\n results.push(result);\n }\n\n return results;\n}\n\n// ─── Per-Contact Enrichment ──────────────────────────────\n\nasync function enrichContact(\n contact: ContactInput,\n config: WaterfallConfig,\n registry: ProviderRegistry\n): Promise<WaterfallResult> {\n const attempts: WaterfallAttempt[] = [];\n let email: string | undefined;\n let emailProvider: string | undefined;\n let phone: string | undefined;\n let phoneProvider: string | undefined;\n let charged = false;\n\n for (const field of config.find) {\n const fieldResult = await enrichField(contact, field, config, registry);\n attempts.push(...fieldResult.attempts);\n\n if (field === 'email' && fieldResult.value) {\n email = fieldResult.value;\n emailProvider = fieldResult.provider;\n charged = true;\n } else if (field === 'phone' && fieldResult.value) {\n phone = fieldResult.value;\n phoneProvider = fieldResult.provider;\n charged = true;\n }\n }\n\n return {\n contact,\n email,\n phone,\n email_provider: emailProvider,\n phone_provider: phoneProvider,\n attempts,\n charged,\n };\n}\n\n// ─── Single Field Enrichment ─────────────────────────────\n\ninterface FieldResult {\n value?: string;\n provider?: string;\n attempts: WaterfallAttempt[];\n}\n\nasync function enrichField(\n contact: ContactInput,\n field: 'email' | 'phone',\n config: WaterfallConfig,\n registry: ProviderRegistry\n): Promise<FieldResult> {\n const capability = field === 'email' ? 'enrich_email' : 'enrich_phone';\n const attempts: WaterfallAttempt[] = [];\n\n for (const providerName of config.providers) {\n const provider = registry.get(providerName);\n if (!provider || !provider.capabilities.includes(capability)) continue;\n\n const start = Date.now();\n try {\n let value: string | undefined;\n\n if (field === 'email' && 'enrichEmail' in provider) {\n const result = await (provider as EmailEnricher).enrichEmail(contact);\n value = result?.email;\n } else if (field === 'phone' && 'enrichPhone' in provider) {\n const result = await (provider as PhoneEnricher).enrichPhone(contact);\n value = result?.phone;\n }\n\n const found = !!value;\n attempts.push({\n provider: providerName,\n capability,\n found,\n charged: found,\n duration_ms: Date.now() - start,\n });\n\n if (found && config.stopOnFirst) {\n return { value, provider: providerName, attempts };\n }\n } catch (error) {\n attempts.push({\n provider: providerName,\n capability,\n found: false,\n charged: false,\n duration_ms: Date.now() - start,\n error: error instanceof Error ? error.message : String(error),\n });\n logError(\n `waterfall:${providerName}`,\n error instanceof Error ? error : new Error(String(error)),\n { contact: `${contact.first_name} ${contact.last_name}` }\n );\n }\n }\n\n return { attempts };\n}\n\n// ─── Dry Run ─────────────────────────────────────────────\n\nexport interface DryRunEstimate {\n dry_run: true;\n contacts_count: number;\n waterfall: string[];\n pricing_model: string;\n estimated_cost_per_hit: Record<string, string>;\n note: string;\n confirm: string;\n}\n\nexport function dryRunWaterfall(\n contactsCount: number,\n config: WaterfallConfig,\n registry: ProviderRegistry\n): DryRunEstimate {\n const activeProviders = config.providers.filter((name) => registry.get(name));\n const costs: Record<string, string> = {};\n\n for (const name of activeProviders) {\n const pricing = DEFAULT_PRICING[name];\n if (pricing?.estimated_cost_per_hit) {\n costs[name] = pricing.estimated_cost_per_hit;\n } else if (pricing?.estimated_cost_per_lookup) {\n costs[name] = `${pricing.estimated_cost_per_lookup}/lookup`;\n } else {\n costs[name] = 'unknown';\n }\n }\n\n return {\n dry_run: true,\n contacts_count: contactsCount,\n waterfall: activeProviders,\n pricing_model: 'pay-on-find',\n estimated_cost_per_hit: costs,\n note: 'Charged only when contact info is found. No result = no charge.',\n confirm: 'Call gtm_enrich again without dry_run to execute.',\n };\n}\n","/** Enrich handler. Orchestrates waterfall enrichment and email verification.\n * Constraint: Delegates to waterfall engine. No direct provider calls. */\n\nimport { runWaterfall, dryRunWaterfall } from '../providers/waterfall.js';\n\nimport type { HandlerContext } from './index.js';\nimport type { ContactInput, EmailVerifier, WaterfallConfig } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleEnrich(\n name: string,\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n if (name === 'gtm_verify') {\n return verifyEmail(args, ctx);\n }\n return enrichContacts(args, ctx);\n}\n\n// ─── Enrich ──────────────────────────────────────────────\n\nasync function enrichContacts(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const contacts = args.contacts as ContactInput[];\n const find = (args.find as string[]) ?? ['email'];\n const verify = (args.verify as boolean) ?? true;\n const dryRun = (args.dry_run as boolean) ?? false;\n\n const clientConfig = ctx.session.getActiveContext().config;\n const waterfallProviders = (args.waterfall as string[]) ?? clientConfig.waterfall.email;\n\n const config: WaterfallConfig = {\n providers: waterfallProviders,\n find: find as ('email' | 'phone')[],\n verify,\n stopOnFirst: true,\n };\n\n if (dryRun) {\n return dryRunWaterfall(contacts.length, config, ctx.registry);\n }\n\n const results = await runWaterfall(contacts, config, ctx.registry);\n const found = results.filter((r) => r.email || r.phone).length;\n\n return {\n total: results.length,\n found,\n missed: results.length - found,\n results,\n };\n}\n\n// ─── Verify ──────────────────────────────────────────────\n\nasync function verifyEmail(args: Record<string, unknown>, ctx: HandlerContext): Promise<unknown> {\n const email = args.email as string;\n\n const providers = ctx.registry.getForCapability('verify_email');\n if (providers.length === 0) {\n throw new Error('No providers configured for email verification.');\n }\n\n const provider = providers[0]!;\n const verifier = provider as unknown as EmailVerifier;\n return verifier.verifyEmail(email);\n}\n","/** Extract handler. Routes scraping/extraction to providers.\n * Constraint: No direct API calls. Uses provider registry. */\n\nimport type { HandlerContext } from './index.js';\nimport type { Extractor, ExtractTarget } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleExtract(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const target: ExtractTarget = {\n url: args.url as string,\n type: args.type as ExtractTarget['type'],\n fields: args.fields as string[] | undefined,\n };\n\n const capability = target.type === 'web_page' ? 'extract_web' : 'extract_linkedin';\n\n const providerName = (args.provider as string) || undefined;\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability(capability);\n\n if (providers.length === 0) {\n throw new Error(\n `No providers configured for ${capability}. Add a provider with that capability.`\n );\n }\n\n const provider = providers[0]!;\n const extractor = provider as unknown as Extractor;\n return extractor.extract(target);\n}\n","/** Fetch handler. Raw HTTP calls with SSRF protection.\n * Constraint: Blocks private IPs, localhost, and link-local addresses. */\n\nimport { logError } from '@mas/logging';\n\n// ─── SSRF Protection ─────────────────────────────────────\n\nconst BLOCKED_PATTERNS = [\n /^127\\./,\n /^10\\./,\n /^172\\.(1[6-9]|2\\d|3[01])\\./,\n /^192\\.168\\./,\n /^169\\.254\\./,\n /^0\\./,\n /^::1$/,\n /^fc00:/,\n /^fe80:/,\n];\n\nconst BLOCKED_HOSTS = ['localhost', '0.0.0.0', '[::1]'];\n\nfunction isBlockedUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString);\n const hostname = url.hostname.replace(/^\\[|\\]$/g, '');\n\n if (BLOCKED_HOSTS.includes(hostname)) return true;\n return BLOCKED_PATTERNS.some((pattern) => pattern.test(hostname));\n } catch {\n return true;\n }\n}\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleFetch(args: Record<string, unknown>): Promise<unknown> {\n const url = args.url as string;\n const method = (args.method as string) ?? 'GET';\n const headers = (args.headers as Record<string, string>) ?? {};\n const body = args.body as Record<string, unknown> | undefined;\n const params = args.params as Record<string, string> | undefined;\n\n if (isBlockedUrl(url)) {\n throw new Error('URL targets a private or local network address. Blocked for security.');\n }\n\n const fullUrl = params ? `${url}?${new URLSearchParams(params).toString()}` : url;\n\n const init: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n };\n\n if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {\n init.body = JSON.stringify(body);\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n\n try {\n const response = await fetch(fullUrl, { ...init, signal: controller.signal });\n const contentType = response.headers.get('content-type') ?? '';\n\n let responseBody: unknown;\n if (contentType.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n return {\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n body: responseBody,\n };\n } catch (error) {\n logError('handler:gtm_fetch', error instanceof Error ? error : new Error(String(error)), {\n url: fullUrl,\n method,\n });\n throw error;\n } finally {\n clearTimeout(timeout);\n }\n}\n","/** AI handler. Runs AI data operations using configured AI provider.\n * Constraint: Uses BYOK AI keys. No hardcoded API keys. */\n\nimport type { HandlerContext } from './index.js';\n\n// ─── Types ───────────────────────────────────────────────\n\ntype AiAction = 'personalize' | 'classify' | 'clean' | 'score' | 'write_copy';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleAi(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as AiAction;\n const data = args.data as unknown;\n const prompt = args.prompt as string | undefined;\n const model = args.model as string | undefined;\n\n const aiConfig = ctx.session.getActiveContext().config.ai;\n\n if (!aiConfig.api_key) {\n throw new Error(\n 'No AI API key configured. Set GTM_ANTHROPIC_API_KEY or GTM_OPENAI_API_KEY, or add ai.api_key to config.'\n );\n }\n\n const systemPrompt = buildSystemPrompt(action, prompt);\n const userContent = typeof data === 'string' ? data : JSON.stringify(data, null, 2);\n const modelId = model ?? aiConfig.model ?? getDefaultModel(aiConfig.provider);\n\n if (aiConfig.provider === 'anthropic') {\n return callAnthropic(aiConfig.api_key, modelId, systemPrompt, userContent);\n }\n return callOpenAI(aiConfig.api_key, modelId, systemPrompt, userContent);\n}\n\n// ─── Prompts ─────────────────────────────────────────────\n\nfunction buildSystemPrompt(action: AiAction, customPrompt?: string): string {\n if (customPrompt) return customPrompt;\n\n const prompts: Record<AiAction, string> = {\n personalize:\n 'You are a sales copywriter. Personalize the outreach message for each contact using their data. Return JSON array with personalized fields.',\n classify:\n 'You are a data classifier. Classify each record according to the criteria. Return JSON array with classification results.',\n clean:\n 'You are a data cleaning specialist. Clean and normalize the data. Fix typos, standardize formats, remove duplicates. Return cleaned JSON.',\n score:\n 'You are a lead scoring expert. Score each lead 1-100 based on fit and intent signals. Return JSON array with scores and reasoning.',\n write_copy:\n 'You are a B2B copywriter. Write the requested copy based on the data provided. Return the copy as a string.',\n };\n\n return prompts[action];\n}\n\nfunction getDefaultModel(provider: 'anthropic' | 'openai'): string {\n return provider === 'anthropic' ? 'claude-sonnet-4-5-20250514' : 'gpt-4o';\n}\n\n// ─── API Calls ───────────────────────────────────────────\n\nasync function callAnthropic(\n apiKey: string,\n model: string,\n system: string,\n content: string\n): Promise<unknown> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 120_000);\n\n try {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: 4096,\n system,\n messages: [{ role: 'user', content }],\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(`Anthropic API error ${response.status}: ${JSON.stringify(body)}`);\n }\n\n const result = (await response.json()) as { content: Array<{ text: string }> };\n const text = result.content[0]?.text ?? '';\n\n try {\n return { result: JSON.parse(text), raw: false };\n } catch {\n return { result: text, raw: true };\n }\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function callOpenAI(\n apiKey: string,\n model: string,\n system: string,\n content: string\n): Promise<unknown> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 120_000);\n\n try {\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: 'system', content: system },\n { role: 'user', content },\n ],\n max_tokens: 4096,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const body = await response.json().catch(() => ({}));\n throw new Error(`OpenAI API error ${response.status}: ${JSON.stringify(body)}`);\n }\n\n const result = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n const text = result.choices[0]?.message?.content ?? '';\n\n try {\n return { result: JSON.parse(text), raw: false };\n } catch {\n return { result: text, raw: true };\n }\n } finally {\n clearTimeout(timeout);\n }\n}\n","/** Campaign handler. Routes cold email campaign operations to providers.\n * Constraint: No direct API calls. Uses provider registry. */\n\nimport type { HandlerContext } from './index.js';\nimport type { CampaignManager, CampaignLead } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleCampaign(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as string;\n const providerName = (args.provider as string) || undefined;\n\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability('campaign_email');\n\n if (providers.length === 0) {\n throw new Error(\n 'No providers configured for email campaigns. Add a provider with campaign_email capability.'\n );\n }\n\n const provider = providers[0]!;\n const manager = provider as unknown as CampaignManager;\n\n switch (action) {\n case 'list':\n return { provider: provider.name, campaigns: await manager.listCampaigns() };\n\n case 'stats': {\n const campaignId = args.campaign_id as string;\n if (!campaignId) throw new Error('campaign_id is required for stats action');\n return manager.getCampaignStats(campaignId);\n }\n\n case 'add_leads': {\n const campaignId = args.campaign_id as string;\n const leads = args.leads as CampaignLead[];\n if (!campaignId) throw new Error('campaign_id is required for add_leads action');\n if (!leads?.length) throw new Error('leads array is required for add_leads action');\n return manager.addLeadsToCampaign(campaignId, leads);\n }\n\n default:\n throw new Error(`Unknown campaign action: ${action}`);\n }\n}\n","/** Outreach handler. Routes LinkedIn outreach operations to providers.\n * Constraint: No direct API calls. Uses provider registry. */\n\nimport type { HandlerContext } from './index.js';\nimport type { OutreachManager, OutreachLead } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleOutreach(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as string;\n const providerName = (args.provider as string) || undefined;\n\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability('outreach_linkedin');\n\n if (providers.length === 0) {\n throw new Error(\n 'No providers configured for LinkedIn outreach. Add a provider with outreach_linkedin capability.'\n );\n }\n\n const provider = providers[0]!;\n const manager = provider as unknown as OutreachManager;\n\n switch (action) {\n case 'list':\n return { provider: provider.name, campaigns: await manager.listCampaigns() };\n\n case 'stats': {\n const campaignId = args.campaign_id as string;\n if (!campaignId) throw new Error('campaign_id is required for stats action');\n return manager.getCampaignStats(campaignId);\n }\n\n case 'add_leads': {\n const campaignId = args.campaign_id as string;\n const leads = args.leads as OutreachLead[];\n if (!campaignId) throw new Error('campaign_id is required for add_leads action');\n if (!leads?.length) throw new Error('leads array is required for add_leads action');\n return manager.addLeadsToCampaign(campaignId, leads);\n }\n\n default:\n throw new Error(`Unknown outreach action: ${action}`);\n }\n}\n","/** CRM handler. Routes CRM read/write operations to providers.\n * Constraint: No direct API calls. Uses provider registry. */\n\nimport type { HandlerContext } from './index.js';\nimport type {\n CrmManager,\n CrmPersonQuery,\n CrmPersonInput,\n CrmDealInput,\n} from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleCrm(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as string;\n const providerName = (args.provider as string) || undefined;\n\n const readActions = ['find', 'find_company'];\n const capability = readActions.includes(action) ? 'crm_read' : 'crm_write';\n\n const providers = providerName\n ? [ctx.registry.get(providerName)].filter(Boolean)\n : ctx.registry.getForCapability(capability);\n\n if (providers.length === 0) {\n throw new Error(\n `No providers configured for CRM ${capability}. Add a provider with that capability.`\n );\n }\n\n const provider = providers[0]!;\n const manager = provider as unknown as CrmManager;\n\n switch (action) {\n case 'find': {\n const query = (args.query as CrmPersonQuery) ?? {};\n return manager.findPerson(query);\n }\n\n case 'create': {\n const data = args.data as CrmPersonInput;\n if (!data) throw new Error('data is required for create action');\n return manager.createPerson(data);\n }\n\n case 'update': {\n const id = args.id as string;\n const data = args.data as Partial<CrmPersonInput>;\n if (!id) throw new Error('id is required for update action');\n if (!data) throw new Error('data is required for update action');\n return manager.updatePerson(id, data);\n }\n\n case 'find_company': {\n const name = args.name as string;\n if (!name) throw new Error('name is required for find_company action');\n if (!manager.findCompany) throw new Error('Provider does not support company lookup');\n return manager.findCompany(name);\n }\n\n case 'create_deal': {\n const data = args.data as CrmDealInput;\n if (!data) throw new Error('data is required for create_deal action');\n if (!manager.createDeal) throw new Error('Provider does not support deal creation');\n return manager.createDeal(data);\n }\n\n default:\n throw new Error(`Unknown CRM action: ${action}`);\n }\n}\n","/** Status handler. Aggregates health and credit info from all providers.\n * Constraint: No side effects. Reads only. */\n\nimport { logError } from '@mas/logging';\n\nimport type { HandlerContext } from './index.js';\nimport type { CreditBalance } from '../providers/types.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleStatus(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const filterProvider = args.provider as string | undefined;\n const allProviders = ctx.registry.list();\n\n const targets = filterProvider\n ? allProviders.filter((p) => p.name === filterProvider)\n : allProviders;\n\n const results = await Promise.all(\n targets.map(async (summary) => {\n const provider = ctx.registry.get(summary.name)!;\n let healthy = false;\n let credits: CreditBalance | null = null;\n\n try {\n healthy = await provider.checkCredentials();\n } catch (error) {\n logError(\n `status:${summary.name}`,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n if (healthy && provider.checkCredits) {\n try {\n credits = await provider.checkCredits();\n } catch (error) {\n logError(\n `status:credits:${summary.name}`,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n return {\n provider: summary.name,\n capabilities: summary.capabilities,\n healthy,\n credits,\n };\n })\n );\n\n const client = ctx.session.getActiveContext();\n\n return {\n client: client.clientName,\n providers: results,\n waterfall: client.config.waterfall,\n };\n}\n","/** Configure handler. Client switching, waterfall config, provider listing.\n * Constraint: In-memory state changes only. No persistence. */\n\nimport type { HandlerContext } from './index.js';\n\n// ─── Handler ─────────────────────────────────────────────\n\nexport async function handleConfigure(\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n const action = args.action as string;\n\n switch (action) {\n case 'switch_client': {\n const client = args.client as string;\n if (!client) throw new Error('client name is required for switch_client');\n const result = ctx.session.switchClient(client);\n if (!result.success) throw new Error(result.error);\n return { switched: true, client: result.clientName };\n }\n\n case 'list_clients':\n return { clients: ctx.session.listClients() };\n\n case 'show_config': {\n const active = ctx.session.getActiveContext();\n return {\n client: active.clientName,\n providers: Object.keys(active.config.providers),\n waterfall: active.config.waterfall,\n ai: {\n provider: active.config.ai.provider,\n model: active.config.ai.model,\n has_key: !!active.config.ai.api_key,\n },\n campaigns: active.config.campaigns,\n };\n }\n\n case 'set_waterfall': {\n const email = args.email as string[] | undefined;\n const phone = args.phone as string[] | undefined;\n if (!email && !phone) {\n throw new Error('At least one of email or phone waterfall order must be provided');\n }\n // Waterfall changes are session-only (in-memory)\n const active = ctx.session.getActiveContext();\n if (email) active.config.waterfall.email = email;\n if (phone) active.config.waterfall.phone = phone;\n return { updated: true, waterfall: active.config.waterfall };\n }\n\n case 'add_client': {\n const name = args.client as string;\n if (!name) throw new Error('client name is required for add_client');\n ctx.session.addClient(name, {});\n return { added: true, client: name };\n }\n\n default:\n throw new Error(`Unknown configure action: ${action}`);\n }\n}\n","/** Handler dispatcher. Validates args and routes to category handlers.\n * Constraint: No direct provider calls. Delegates to domain handlers. */\n\nimport { logError } from '@mas/logging';\n\nimport type { SessionContext } from '../context.js';\nimport type { ProviderRegistry } from '../providers/registry.js';\n\n// ─── Types ───────────────────────────────────────────────\n\nexport interface ToolResult {\n content: Array<{ type: 'text'; text: string }>;\n isError?: boolean;\n [key: string]: unknown;\n}\n\nexport interface HandlerContext {\n session: SessionContext;\n registry: ProviderRegistry;\n}\n\n// ─── Dispatcher ──────────────────────────────────────────\n\nexport async function handleToolCall(\n name: string,\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<ToolResult> {\n try {\n const result = await dispatch(name, args, ctx);\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) ?? '{}' }],\n };\n } catch (error) {\n logError(`handler:${name}`, error instanceof Error ? error : new Error(String(error)));\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ error: error instanceof Error ? error.message : String(error) }),\n },\n ],\n isError: true,\n };\n }\n}\n\n// ─── Routing ─────────────────────────────────────────────\n\nasync function dispatch(\n name: string,\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<unknown> {\n switch (name) {\n case 'gtm_find_companies':\n case 'gtm_find_people': {\n const { handleProspect } = await import('./prospect.js');\n return handleProspect(name, args, ctx);\n }\n\n case 'gtm_enrich':\n case 'gtm_verify': {\n const { handleEnrich } = await import('./enrich.js');\n return handleEnrich(name, args, ctx);\n }\n\n case 'gtm_extract': {\n const { handleExtract } = await import('./extract.js');\n return handleExtract(args, ctx);\n }\n\n case 'gtm_fetch': {\n const { handleFetch } = await import('./fetch.js');\n return handleFetch(args);\n }\n\n case 'gtm_ai': {\n const { handleAi } = await import('./ai.js');\n return handleAi(args, ctx);\n }\n\n case 'gtm_campaign': {\n const { handleCampaign } = await import('./campaign.js');\n return handleCampaign(args, ctx);\n }\n\n case 'gtm_outreach': {\n const { handleOutreach } = await import('./outreach.js');\n return handleOutreach(args, ctx);\n }\n\n case 'gtm_crm': {\n const { handleCrm } = await import('./crm.js');\n return handleCrm(args, ctx);\n }\n\n case 'gtm_status': {\n const { handleStatus } = await import('./status.js');\n return handleStatus(args, ctx);\n }\n\n case 'gtm_configure': {\n const { handleConfigure } = await import('./configure.js');\n return handleConfigure(args, ctx);\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n}\n","/** Prospect tools. Company and people discovery tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const prospectTools: Tool[] = [\n {\n name: 'gtm_find_companies',\n description:\n 'Discover companies matching ICP criteria. Search by natural language description, ' +\n 'lookalike domains, industry, size, or geography. Returns scored company results ' +\n 'with domain, description, and firmographic data.',\n inputSchema: {\n type: 'object',\n properties: {\n icp_text: {\n type: 'string',\n description:\n 'Natural language ICP description (e.g., \"B2B SaaS startups in US, 50-200 employees\")',\n },\n domains: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Lookalike domains to find similar companies (e.g., [\"stripe.com\", \"plaid.com\"])',\n },\n industry: {\n type: 'string',\n description: 'Industry filter (e.g., \"SaaS\", \"FinTech\", \"Healthcare\")',\n },\n country: {\n type: 'string',\n description: 'Country filter (e.g., \"US\", \"UK\", \"DE\")',\n },\n min_employees: {\n type: 'number',\n description: 'Minimum employee count',\n },\n max_employees: {\n type: 'number',\n description: 'Maximum employee count',\n },\n limit: {\n type: 'number',\n description: 'Max results to return (default: 50, max: 500)',\n },\n provider: {\n type: 'string',\n description:\n 'Provider override (uses first available find_companies provider if omitted)',\n },\n },\n required: [],\n },\n },\n {\n name: 'gtm_find_people',\n description:\n 'Find contacts/people at companies. Search by job title, company, location, or domain. ' +\n 'Returns person results with name, title, company, and optionally email/LinkedIn URL.',\n inputSchema: {\n type: 'object',\n properties: {\n job_title: {\n type: 'string',\n description: 'Job title to search for (e.g., \"VP of Sales\", \"CEO\", \"Head of Marketing\")',\n },\n company_name: {\n type: 'string',\n description: 'Company name to search within',\n },\n company_domain: {\n type: 'string',\n description: 'Company domain to search within (e.g., \"stripe.com\")',\n },\n location: {\n type: 'string',\n description: 'Location filter (e.g., \"San Francisco\", \"United States\")',\n },\n limit: {\n type: 'number',\n description: 'Max results to return (default: 25, max: 100)',\n },\n provider: {\n type: 'string',\n description: 'Provider override (uses first available find_people provider if omitted)',\n },\n },\n required: [],\n },\n },\n];\n","/** Enrich tools. Email/phone enrichment and verification tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const enrichTools: Tool[] = [\n {\n name: 'gtm_enrich',\n description:\n 'Enrich contacts with email and/or phone using a waterfall of providers. ' +\n 'For batches > 5, always dry_run first to show cost estimate before executing. ' +\n 'Providers only charge when contact info is found — no result, no charge.',\n inputSchema: {\n type: 'object',\n properties: {\n contacts: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n company: { type: 'string' },\n company_domain: { type: 'string' },\n linkedin_url: { type: 'string' },\n },\n required: ['first_name', 'last_name'],\n },\n description: 'Contacts to enrich (1-100)',\n maxItems: 100,\n },\n find: {\n type: 'array',\n items: { type: 'string', enum: ['email', 'phone'] },\n default: ['email'],\n description: 'What to find',\n },\n waterfall: {\n type: 'array',\n items: { type: 'string' },\n description: 'Provider order override (uses client default if omitted)',\n },\n verify: { type: 'boolean', default: true },\n dry_run: { type: 'boolean', default: false },\n },\n required: ['contacts'],\n },\n },\n {\n name: 'gtm_verify',\n description:\n 'Verify a single email address for deliverability. Returns verification status: ' +\n 'deliverable, catch_all_safe, catch_all_not_safe, undeliverable, or unknown. ' +\n 'Use this after enrichment or to validate an existing email.',\n inputSchema: {\n type: 'object',\n properties: {\n email: {\n type: 'string',\n description: 'Email address to verify',\n },\n },\n required: ['email'],\n },\n },\n];\n","/** Extract tools. Scraping and data extraction tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const extractTools: Tool[] = [\n {\n name: 'gtm_extract',\n description:\n 'Extract structured data from a URL. Supports LinkedIn profiles, LinkedIn posts, ' +\n 'and web pages. Optionally specify which fields to extract. ' +\n 'Provider is auto-selected based on URL type (LinkedIn vs web).',\n inputSchema: {\n type: 'object',\n properties: {\n url: {\n type: 'string',\n description: 'URL to extract data from (LinkedIn profile/post URL or any web page)',\n },\n type: {\n type: 'string',\n enum: ['linkedin_profile', 'linkedin_post', 'web_page'],\n description: 'Content type (auto-detected from URL if omitted)',\n },\n fields: {\n type: 'array',\n items: { type: 'string' },\n description:\n 'Specific fields to extract (e.g., [\"name\", \"title\", \"company\", \"about\"]). Extracts all available fields if omitted.',\n },\n provider: {\n type: 'string',\n description: 'Provider override (auto-selected based on URL type if omitted)',\n },\n },\n required: ['url'],\n },\n },\n];\n","/** Fetch tools. Raw HTTP call tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const fetchTools: Tool[] = [\n {\n name: 'gtm_fetch',\n description:\n 'Make an HTTP call to any API endpoint. ' +\n \"Use this to pull data from services that don't have a dedicated provider.\",\n inputSchema: {\n type: 'object',\n properties: {\n url: { type: 'string', description: 'Full URL to call' },\n method: {\n type: 'string',\n enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],\n default: 'GET',\n },\n headers: {\n type: 'object',\n description: 'Request headers (e.g., Authorization)',\n },\n body: {\n type: 'object',\n description: 'Request body (for POST/PUT/PATCH)',\n },\n params: {\n type: 'object',\n description: 'URL query parameters',\n },\n },\n required: ['url'],\n },\n },\n];\n","/** AI tools. AI-powered data operations tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const aiTools: Tool[] = [\n {\n name: 'gtm_ai',\n description:\n 'AI-powered data operations: personalize outreach, classify leads, clean data, ' +\n 'score prospects, or write copy. Provide an action, input data, and optional ' +\n 'prompt. Uses your configured AI provider (Anthropic or OpenAI).',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['personalize', 'classify', 'clean', 'score', 'write_copy'],\n description:\n 'Action type: personalize (outreach messages), classify (categorize data), ' +\n 'clean (normalize/deduplicate), score (rank/prioritize), write_copy (generate copy)',\n },\n data: {\n description: 'Input data to process (object, array, or string)',\n },\n prompt: {\n type: 'string',\n description:\n 'Custom instructions for the AI operation (e.g., \"Write a 2-sentence cold email opener\")',\n },\n model: {\n type: 'string',\n description: 'Model override (uses config default if omitted)',\n },\n },\n required: ['action', 'data'],\n },\n },\n];\n","/** Campaign tools. Cold email campaign management tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const campaignTools: Tool[] = [\n {\n name: 'gtm_campaign',\n description:\n 'Manage cold email campaigns. List campaigns, get stats, or add leads to a campaign. ' +\n 'Supports PlusVibe, Instantly, and Smartlead providers.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['list', 'stats', 'add_leads'],\n description:\n 'Action to perform: list (all campaigns), stats (campaign metrics), add_leads (push contacts)',\n },\n campaign_id: {\n type: 'string',\n description: 'Campaign ID (required for stats and add_leads)',\n },\n leads: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n email: { type: 'string' },\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n company: { type: 'string' },\n custom_fields: {\n type: 'object',\n description: 'Custom merge fields for email personalization',\n },\n },\n required: ['email'],\n },\n description: 'Leads to add (required for add_leads action)',\n },\n provider: {\n type: 'string',\n description:\n 'Provider override (uses first available campaign_email provider if omitted)',\n },\n },\n required: ['action'],\n },\n },\n];\n","/** Outreach tools. LinkedIn outreach management tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const outreachTools: Tool[] = [\n {\n name: 'gtm_outreach',\n description:\n 'Manage LinkedIn outreach campaigns. List campaigns, get stats, or add leads ' +\n 'to a LinkedIn outreach campaign. Leads require a LinkedIn profile URL.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['list', 'stats', 'add_leads'],\n description:\n 'Action to perform: list (all campaigns), stats (campaign metrics), add_leads (push contacts)',\n },\n campaign_id: {\n type: 'string',\n description: 'Campaign ID (required for stats and add_leads)',\n },\n leads: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n linkedin_url: { type: 'string' },\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n company: { type: 'string' },\n },\n required: ['linkedin_url'],\n },\n description:\n 'Leads to add (required for add_leads action). Each lead must have a LinkedIn profile URL.',\n },\n provider: {\n type: 'string',\n description:\n 'Provider override (uses first available outreach_linkedin provider if omitted)',\n },\n },\n required: ['action'],\n },\n },\n];\n","/** CRM tools. CRM read/write tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const crmTools: Tool[] = [\n {\n name: 'gtm_crm',\n description:\n 'Read and write CRM data. Find, create, or update people and companies. ' +\n 'Create deals. Supports Attio and other CRM providers.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['find', 'create', 'update', 'find_company', 'create_deal'],\n description:\n 'Action to perform: find (search people by email/LinkedIn/name), create (person), ' +\n 'update (person by id), find_company (search by name), create_deal',\n },\n id: {\n type: 'string',\n description: 'Person ID (required for update)',\n },\n query: {\n type: 'object',\n properties: {\n email: { type: 'string' },\n linkedin_url: { type: 'string' },\n name: { type: 'string' },\n },\n description: 'Search query (for find, find_company)',\n },\n data: {\n type: 'object',\n properties: {\n first_name: { type: 'string' },\n last_name: { type: 'string' },\n email: { type: 'string' },\n company: { type: 'string' },\n job_title: { type: 'string' },\n name: { type: 'string', description: 'Deal name (for create_deal)' },\n company_id: { type: 'string', description: 'Associated company ID (for create_deal)' },\n person_id: { type: 'string', description: 'Associated person ID (for create_deal)' },\n stage: { type: 'string', description: 'Deal stage (for create_deal)' },\n value: { type: 'number', description: 'Deal value (for create_deal)' },\n },\n description: 'Data payload (for create, update, create_deal)',\n },\n provider: {\n type: 'string',\n description: 'CRM provider override (uses first available if omitted)',\n },\n },\n required: ['action'],\n },\n },\n];\n","/** Status tools. Provider health and credit balance tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const statusTools: Tool[] = [\n {\n name: 'gtm_status',\n description:\n 'Check provider health, credit balances, and active configuration. ' +\n 'Shows which providers are configured, their capabilities, remaining credits, ' +\n 'and the current client context.',\n inputSchema: {\n type: 'object',\n properties: {\n check: {\n type: 'string',\n enum: ['all', 'credits', 'health', 'config'],\n default: 'all',\n description:\n 'What to check: all (full status report), credits (remaining balances), ' +\n 'health (provider connectivity), config (active client and waterfall)',\n },\n provider: {\n type: 'string',\n description:\n 'Check a specific provider only (checks all configured providers if omitted)',\n },\n },\n required: [],\n },\n },\n];\n","/** Configure tools. Configuration management tool definitions.\n * Constraint: Pure definitions. No runtime logic. No imports beyond SDK types. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n// ─── Tool Definitions ────────────────────────────────────\n\nexport const configureTools: Tool[] = [\n {\n name: 'gtm_configure',\n description:\n 'Manage GTM configuration. Switch between clients, view active config, ' +\n 'set waterfall order, list available providers.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['switch_client', 'list_clients', 'show_config', 'set_waterfall', 'add_client'],\n },\n client: {\n type: 'string',\n description: 'Client name (for switch_client, add_client)',\n },\n email: {\n type: 'array',\n items: { type: 'string' },\n description: 'Email waterfall order (for set_waterfall)',\n },\n phone: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phone waterfall order (for set_waterfall)',\n },\n },\n required: ['action'],\n },\n },\n];\n","/** Tool index. Aggregates all tool definitions, meta-tools, and workflow recipes.\n * Constraint: Pure definitions and maps. No runtime logic. No handler imports. */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\nimport { prospectTools } from './prospect.js';\nimport { enrichTools } from './enrich.js';\nimport { extractTools } from './extract.js';\nimport { fetchTools } from './fetch.js';\nimport { aiTools } from './ai.js';\nimport { campaignTools } from './campaign.js';\nimport { outreachTools } from './outreach.js';\nimport { crmTools } from './crm.js';\nimport { statusTools } from './status.js';\nimport { configureTools } from './configure.js';\n\n// ─── Capability Tools (12) ──────────────────────────────\n\nconst capabilityTools: Tool[] = [\n ...prospectTools,\n ...enrichTools,\n ...extractTools,\n ...fetchTools,\n ...aiTools,\n ...campaignTools,\n ...outreachTools,\n ...crmTools,\n ...statusTools,\n ...configureTools,\n];\n\n// ─── Meta-Tools (3) ─────────────────────────────────────\n\nconst guideTool: Tool = {\n name: 'gtm_guide',\n description:\n 'CALL THIS FIRST before any multi-step GTM task. Returns step-by-step workflow ' +\n 'recipes for common tasks like building a TAM list, running enrichment, or launching ' +\n 'cold outreach. Always check the guide before starting work to ensure you follow ' +\n 'the correct sequence and avoid wasting credits.',\n inputSchema: {\n type: 'object',\n properties: {\n task: {\n type: 'string',\n enum: [\n 'build_tam',\n 'enrich_list',\n 'cold_outreach',\n 'linkedin_outreach',\n 'crm_sync',\n 'list_tasks',\n ],\n description: 'The workflow to get guidance for',\n },\n },\n required: ['task'],\n },\n};\n\nconst toolHelpTool: Tool = {\n name: 'gtm_tool_help',\n description:\n 'Get the full parameter schema for a specific GTM tool. Use this to see exactly ' +\n 'what arguments a tool accepts before calling gtm_execute.',\n inputSchema: {\n type: 'object',\n properties: {\n tool: {\n type: 'string',\n description: 'The tool name to get help for (e.g., \"gtm_enrich\", \"gtm_find_companies\")',\n },\n },\n required: ['tool'],\n },\n};\n\nconst executeTool: Tool = {\n name: 'gtm_execute',\n description:\n 'Gateway to execute any GTM tool by name. Use gtm_guide for workflow recipes, ' +\n 'gtm_tool_help for parameter schemas, then this to execute.',\n inputSchema: {\n type: 'object',\n properties: {\n tool: {\n type: 'string',\n description: 'The tool name to execute (e.g., \"gtm_enrich\")',\n },\n arguments: {\n type: 'object',\n description: 'The arguments to pass to the tool, matching its schema',\n },\n },\n required: ['tool'],\n },\n};\n\nconst metaTools: Tool[] = [guideTool, toolHelpTool, executeTool];\n\n// ─── All Tools ──────────────────────────────────────────\n\nexport const tools: Tool[] = [...capabilityTools, ...metaTools];\n\n// ─── Re-exports ─────────────────────────────────────────\n\nexport { prospectTools } from './prospect.js';\nexport { enrichTools } from './enrich.js';\nexport { extractTools } from './extract.js';\nexport { fetchTools } from './fetch.js';\nexport { aiTools } from './ai.js';\nexport { campaignTools } from './campaign.js';\nexport { outreachTools } from './outreach.js';\nexport { crmTools } from './crm.js';\nexport { statusTools } from './status.js';\nexport { configureTools } from './configure.js';\n\n// ─── Tool Lookup ────────────────────────────────────────\n\nexport const toolsByName = new Map<string, Tool>(tools.map((tool) => [tool.name, tool]));\n\n// ─── Tool Categories ────────────────────────────────────\n\nexport const toolCategories = {\n prospect: prospectTools.map((t) => t.name),\n enrich: enrichTools.map((t) => t.name),\n extract: extractTools.map((t) => t.name),\n fetch: fetchTools.map((t) => t.name),\n ai: aiTools.map((t) => t.name),\n campaign: campaignTools.map((t) => t.name),\n outreach: outreachTools.map((t) => t.name),\n crm: crmTools.map((t) => t.name),\n status: statusTools.map((t) => t.name),\n configure: configureTools.map((t) => t.name),\n meta: metaTools.map((t) => t.name),\n};\n\nexport type ToolCategory = keyof typeof toolCategories;\n\n// ─── Workflow Recipes ───────────────────────────────────\n\nexport const workflowRecipes: Record<string, string> = {\n build_tam: `# Build a TAM List — Workflow\n\n## Steps\n\n1. DISCOVER — Find companies matching your ICP\n → gtm_find_companies({ icp_text: \"...\", limit: 100 })\n\n2. FIND PEOPLE — Get decision-makers at those companies\n → gtm_find_people({ company_domain: \"...\", job_title: \"CEO\" })\n\n3. ENRICH — Get email addresses (DRY RUN FIRST for batches > 5)\n → gtm_enrich({ contacts: [...], find: [\"email\"], dry_run: true })\n Review the cost estimate, then run without dry_run to execute.\n\n4. VERIFY — Validate emails before outreach\n → gtm_verify({ emails: [...] })\n\n5. PUSH — Add to cold email or LinkedIn campaign\n → gtm_campaign({ action: \"add_leads\", campaign_id: \"...\", leads: [...] })\n\n## Key principle\nAlways dry_run enrichment first. Credits are spent per successful find — previewing cost avoids surprises.`,\n\n enrich_list: `# Enrich a Contact List — Workflow\n\n## Steps\n\n1. PREPARE — Ensure contacts have at minimum first_name + last_name. company or company_domain dramatically improves match rates.\n\n2. DRY RUN — Preview cost before spending credits\n → gtm_enrich({ contacts: [...], find: [\"email\"], dry_run: true })\n\n3. EXECUTE — Run the waterfall enrichment\n → gtm_enrich({ contacts: [...], find: [\"email\"], verify: true })\n\n4. REVIEW — Check results. The waterfall tries each provider in order and stops on first match.\n\n## Waterfall order\nDefault order comes from your config. Override per-call with the waterfall parameter.\nMost providers charge only on successful find — no result, no charge.`,\n\n cold_outreach: `# Cold Email Outreach — Workflow\n\n## Steps\n\n1. ENRICH — Get verified emails for your contacts\n → gtm_enrich({ contacts: [...], find: [\"email\"], verify: true, dry_run: true })\n → gtm_enrich({ contacts: [...], find: [\"email\"], verify: true })\n\n2. PERSONALIZE — Use AI to write custom openers\n → gtm_ai({ action: \"personalize\", data: [...], prompt: \"Write a 2-sentence cold email opener referencing their company\" })\n\n3. LIST CAMPAIGNS — Find or identify the target campaign\n → gtm_campaign({ action: \"list\" })\n\n4. PUSH — Add enriched + personalized leads to campaign\n → gtm_campaign({ action: \"add_leads\", campaign_id: \"...\", leads: [...] })\n\n5. SYNC CRM — Create contacts in CRM for tracking\n → gtm_crm({ action: \"create\", data: { first_name: \"...\", last_name: \"...\", email: \"...\" } })\n\n## Key principle\nAlways verify emails before pushing to campaigns. Bounced emails hurt sender reputation.`,\n\n linkedin_outreach: `# LinkedIn Outreach — Workflow\n\n## Steps\n\n1. EXTRACT — Get LinkedIn profile data\n → gtm_extract({ url: \"https://linkedin.com/in/...\", type: \"linkedin_profile\" })\n\n2. PERSONALIZE — Use AI to write connection request messages\n → gtm_ai({ action: \"personalize\", data: [...], prompt: \"Write a LinkedIn connection request referencing their recent post\" })\n\n3. LIST CAMPAIGNS — Find or identify the target outreach campaign\n → gtm_outreach({ action: \"list\" })\n\n4. PUSH — Add leads to LinkedIn outreach campaign\n → gtm_outreach({ action: \"add_leads\", campaign_id: \"...\", leads: [{ linkedin_url: \"...\" }] })\n\n## Key principle\nLinkedIn outreach requires LinkedIn profile URLs — not emails. Extract profile data first for personalization.`,\n\n crm_sync: `# CRM Sync — Workflow\n\n## Steps\n\n1. CHECK — See if the person already exists in CRM\n → gtm_crm({ action: \"find\", query: { email: \"...\" } })\n\n2. CREATE or UPDATE\n → gtm_crm({ action: \"create\", data: { first_name: \"...\", last_name: \"...\", email: \"...\" } })\n → gtm_crm({ action: \"update\", id: \"...\", data: { job_title: \"...\" } })\n\n3. DEAL — Create a deal if this is a qualified prospect\n → gtm_crm({ action: \"create_deal\", data: { name: \"...\", person_id: \"...\", stage: \"New\" } })\n\n## Key principle\nAlways search before creating to avoid duplicates. Most CRMs have built-in email dedup but better to check first.`,\n\n list_tasks: `# Available GTM Workflows\n\nCall gtm_guide with one of these tasks:\n\n- build_tam — Discover companies + find people + enrich + push to campaign\n- enrich_list — Take a contact list and enrich with email/phone via waterfall\n- cold_outreach — Enrich + personalize + push to cold email campaign\n- linkedin_outreach — Extract profiles + personalize + push to LinkedIn campaign\n- crm_sync — Find/create/update people and deals in CRM\n\nFor any task: always dry_run enrichment batches > 5 to preview cost before executing.`,\n};\n","/** Validation. Zod schemas for all tool inputs. Source of truth for runtime validation. */\n\nimport { z } from 'zod';\n\n// ─── Contact Schema (reused by gtm_enrich) ──────────────\n\nconst contactInputSchema = z.object({\n first_name: z.string().min(1, 'first_name is required'),\n last_name: z.string().min(1, 'last_name is required'),\n company: z.string().optional(),\n company_domain: z.string().optional(),\n linkedin_url: z.string().optional(),\n});\n\n// ─── Campaign Lead Schema (reused by gtm_campaign) ──────\n\nconst campaignLeadSchema = z.object({\n email: z.string().email('email must be a valid email address'),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n company: z.string().optional(),\n custom_fields: z.record(z.string()).optional(),\n});\n\n// ─── Outreach Lead Schema (reused by gtm_outreach) ─────\n\nconst outreachLeadSchema = z.object({\n linkedin_url: z.string().min(1, 'linkedin_url is required'),\n first_name: z.string().optional(),\n last_name: z.string().optional(),\n company: z.string().optional(),\n});\n\n// ─── Tool Schemas ────────────────────────────────────────\n\nexport const toolSchemas = {\n // 1. Company discovery\n gtm_find_companies: z.object({\n icp_text: z.string().optional(),\n domain: z.string().optional(),\n limit: z.number().int().min(1).max(1000).optional(),\n country: z.string().optional(),\n min_employees: z.number().int().min(0).optional(),\n max_employees: z.number().int().min(1).optional(),\n }),\n\n // 2. People/contact search\n gtm_find_people: z.object({\n job_title: z.string().optional(),\n company_name: z.string().optional(),\n company_domain: z.string().optional(),\n limit: z.number().int().min(1).max(1000).optional(),\n }),\n\n // 3. Enrichment waterfall\n gtm_enrich: z.object({\n contacts: z\n .array(contactInputSchema)\n .min(1, 'contacts must contain at least 1 contact')\n .max(100, 'contacts must contain at most 100 contacts'),\n find: z.array(z.enum(['email', 'phone'])).optional(),\n waterfall: z.array(z.string()).optional(),\n verify: z.boolean().optional(),\n dry_run: z.boolean().optional(),\n }),\n\n // 4. Email verification\n gtm_verify: z.object({\n email: z.string().email('email must be a valid email address'),\n }),\n\n // 5. Extract/scrape\n gtm_extract: z.object({\n url: z.string().url('url must be a valid URL'),\n type: z.enum(['linkedin_profile', 'linkedin_post', 'web_page'], {\n message: 'type must be one of: linkedin_profile, linkedin_post, web_page',\n }),\n fields: z.array(z.string()).optional(),\n }),\n\n // 6. Raw HTTP fetch\n gtm_fetch: z.object({\n url: z.string().url('url must be a valid URL'),\n method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']).optional(),\n headers: z.record(z.string()).optional(),\n body: z.record(z.unknown()).optional(),\n params: z.record(z.string()).optional(),\n }),\n\n // 7. AI data operations\n gtm_ai: z.object({\n action: z.enum(['personalize', 'classify', 'clean', 'score', 'write_copy'], {\n message: 'action must be one of: personalize, classify, clean, score, write_copy',\n }),\n data: z.unknown().refine((val) => val !== undefined && val !== null, {\n message: 'data is required',\n }),\n prompt: z.string().optional(),\n model: z.string().optional(),\n }),\n\n // 8. Cold email campaign management\n gtm_campaign: z.object({\n action: z.enum(['list', 'stats', 'add_leads'], {\n message: 'action must be one of: list, stats, add_leads',\n }),\n campaign_id: z.string().optional(),\n leads: z.array(campaignLeadSchema).optional(),\n name: z.string().optional(),\n }),\n\n // 9. LinkedIn outreach management\n gtm_outreach: z.object({\n action: z.enum(['list', 'stats', 'add_leads'], {\n message: 'action must be one of: list, stats, add_leads',\n }),\n campaign_id: z.string().optional(),\n leads: z.array(outreachLeadSchema).optional(),\n }),\n\n // 10. CRM read/write\n gtm_crm: z.object({\n action: z.enum(['find', 'create', 'update', 'find_company', 'create_deal'], {\n message: 'action must be one of: find, create, update, find_company, create_deal',\n }),\n query: z.record(z.unknown()).optional(),\n data: z.record(z.unknown()).optional(),\n id: z.string().optional(),\n }),\n\n // 11. Provider status/credits\n gtm_status: z.object({\n provider: z.string().optional(),\n }),\n\n // 12. Configuration management\n gtm_configure: z.object({\n action: z.enum(\n ['switch_client', 'list_clients', 'show_config', 'set_waterfall', 'add_client'],\n {\n message:\n 'action must be one of: switch_client, list_clients, show_config, set_waterfall, add_client',\n }\n ),\n client: z.string().optional(),\n email: z.array(z.string()).optional(),\n phone: z.array(z.string()).optional(),\n }),\n\n // 13. Workflow guide\n gtm_guide: z.object({\n task: z.enum([\n 'build_tam',\n 'enrich_list',\n 'cold_outreach',\n 'linkedin_outreach',\n 'crm_sync',\n 'list_tasks',\n ]),\n }),\n\n // 14. Tool help lookup\n gtm_tool_help: z.object({\n tool: z.string().min(1, 'tool is required'),\n }),\n\n // 15. Execute gateway\n gtm_execute: z.object({\n tool: z.string().min(1, 'tool is required'),\n arguments: z.record(z.unknown()).optional(),\n }),\n} as const;\n\n// ─── Derived Constants ──────────────────────────────────\n\n/** Single source of truth for tool names — derived from schema keys. */\nexport const TOOL_NAMES = Object.keys(toolSchemas) as ToolName[];\n\n// ─── Types ───────────────────────────────────────────────\n\nexport type ToolName = keyof typeof toolSchemas;\n\nexport type ValidationResult<T> = { success: true; data: T } | { success: false; error: string };\n\n// ─── Validation Function ────────────────────────────────\n\n/**\n * Validate tool arguments against the schema for the given tool.\n * Returns success with parsed data if valid, or failure with error message.\n * Unknown tool names return failure (prevents silent passthrough of typos).\n */\nexport function validateToolArgs<T>(toolName: string, args: unknown): ValidationResult<T> {\n const schema = toolSchemas[toolName as ToolName];\n\n if (!schema) {\n return { success: false, error: `Unknown tool: \"${toolName}\"` };\n }\n\n const result = schema.safeParse(args);\n if (!result.success) {\n const issues = result.error.issues || [];\n const errors = issues\n .map((e: { path: (string | number)[]; message: string }) =>\n e.path.length > 0 ? `${e.path.join('.')}: ${e.message}` : e.message\n )\n .join(', ');\n return { success: false, error: errors || 'Validation failed' };\n }\n\n return { success: true, data: result.data as T };\n}\n","/** MCP Server. Creates and configures the MCP server with stdio transport.\n * Constraint: Single entry point. Reads config from ~/.gtm/config.yaml or env vars. */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport { logInfo } from '@mas/logging';\n\nimport { loadConfig, loadYamlFromDisk } from './config.js';\nimport { SERVER_VERSION } from './constants.js';\nimport { SessionContext } from './context.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { registerProviders } from './providers/factory.js';\nimport { handleToolCall } from './handlers/index.js';\nimport { tools, toolsByName, workflowRecipes } from './tools/index.js';\nimport { validateToolArgs } from './validation.js';\n\nimport type { HandlerContext, ToolResult } from './handlers/index.js';\n\n// ─── Server Creation ────────────────────────────────────\n\nexport function createServer(): { server: Server; ctx: HandlerContext } {\n const yamlContent = loadYamlFromDisk();\n const config = loadConfig(yamlContent);\n const session = new SessionContext(config);\n const registry = new ProviderRegistry();\n\n // Register providers from default client config\n const activeCtx = session.getActiveContext();\n registerProviders(registry, activeCtx.config);\n\n const ctx: HandlerContext = { session, registry };\n\n const server = new Server(\n { name: 'gtm-mcp', version: SERVER_VERSION },\n { capabilities: { tools: {} } }\n );\n\n // ─── List Tools ─────────────────────────────────────────\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools,\n }));\n\n // ─── Call Tool ──────────────────────────────────────────\n\n server.setRequestHandler(CallToolRequestSchema, async (request, _extra) => {\n const { name, arguments: args = {} } = request.params;\n\n // Handle meta-tools inline (still validated through executeToolCall)\n if (name === 'gtm_guide') {\n const validation = validateToolArgs<{ task: string }>(name, args);\n if (!validation.success) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: validation.error }) }],\n isError: true,\n };\n }\n const recipe = workflowRecipes[validation.data.task] ?? workflowRecipes.list_tasks;\n return {\n content: [\n {\n type: 'text' as const,\n text:\n recipe ??\n `Unknown task: ${validation.data.task}. Use task: \"list_tasks\" to see available workflows.`,\n },\n ],\n };\n }\n\n if (name === 'gtm_tool_help') {\n const validation = validateToolArgs<{ tool: string }>(name, args);\n if (!validation.success) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: validation.error }) }],\n isError: true,\n };\n }\n const tool = toolsByName.get(validation.data.tool);\n if (!tool) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({ error: `Unknown tool: ${validation.data.tool}` }),\n },\n ],\n isError: true,\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(\n { name: tool.name, description: tool.description, inputSchema: tool.inputSchema },\n null,\n 2\n ),\n },\n ],\n };\n }\n\n if (name === 'gtm_execute') {\n const validation = validateToolArgs<{ tool: string; arguments?: Record<string, unknown> }>(\n name,\n args\n );\n if (!validation.success) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: validation.error }) }],\n isError: true,\n };\n }\n return executeToolCall(validation.data.tool, validation.data.arguments ?? {}, ctx);\n }\n\n return executeToolCall(name, args as Record<string, unknown>, ctx);\n });\n\n return { server, ctx };\n}\n\n// ─── Tool Execution ─────────────────────────────────────\n\nasync function executeToolCall(\n name: string,\n args: Record<string, unknown>,\n ctx: HandlerContext\n): Promise<ToolResult> {\n // Validate args\n const validation = validateToolArgs(name, args);\n if (!validation.success) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: validation.error }) }],\n isError: true,\n };\n }\n\n // Re-register providers on client switch\n if (name === 'gtm_configure' && args.action === 'switch_client') {\n const result = await handleToolCall(name, validation.data as Record<string, unknown>, ctx);\n const activeCtx = ctx.session.getActiveContext();\n registerProviders(ctx.registry, activeCtx.config);\n return result;\n }\n\n return handleToolCall(name, validation.data as Record<string, unknown>, ctx);\n}\n\n// ─── Main ───────────────────────────────────────────────\n\nexport async function startServer(): Promise<void> {\n const { server } = createServer();\n const transport = new StdioServerTransport();\n\n logInfo('server:start', 'GTM MCP server starting');\n\n await server.connect(transport);\n\n logInfo('server:connected', 'GTM MCP server connected via stdio');\n}\n","/** CLI command builders. Defines all subcommands for the GTM CLI.\n * Constraint: No direct tool calls. Delegates to executeTool via cli.ts. */\n\nimport { Command } from 'commander';\nimport { readFileSync, existsSync } from 'node:fs';\n\nimport type { HandlerContext } from './handlers/index.js';\n\n// ─── Types ───────────────────────────────────────────────\n\n/** Minimal interface for the CLI execution layer (from cli.ts). */\ninterface CliExecutor {\n createCliContext(): HandlerContext;\n executeTool(\n toolName: string,\n args: Record<string, unknown>,\n ctx: HandlerContext,\n opts: { pretty?: boolean }\n ): Promise<void>;\n writeError(message: string, details?: unknown): never;\n parseArgFlags(argPairs: string[]): Record<string, unknown>;\n parseStdinJson(): Promise<Record<string, unknown> | null>;\n readStdin(): Promise<string | null>;\n}\n\n// ─── Registration ───────────────────────────────────────\n\n/** Register all CLI subcommands on the given program. */\nexport function registerCommands(program: Command, exec: CliExecutor): void {\n buildServeCommand(program);\n buildStatusCommand(program, exec);\n buildConfigCommand(program, exec);\n buildExecCommand(program, exec);\n buildFindCommand(program, exec);\n buildEnrichCommand(program, exec);\n buildVerifyCommand(program, exec);\n buildCampaignsCommand(program, exec);\n buildCampaignStatsCommand(program, exec);\n}\n\n// ─── serve ──────────────────────────────────────────────\n\nfunction buildServeCommand(program: Command): void {\n program\n .command('serve')\n .description('Start the MCP server (stdio transport)')\n .action(async () => {\n const { startServer } = await import('./server.js');\n await startServer();\n });\n}\n\n// ─── status ─────────────────────────────────────────────\n\nfunction buildStatusCommand(program: Command, exec: CliExecutor): void {\n program\n .command('status')\n .description('Check all provider health and credits')\n .option('--provider <name>', 'Check a specific provider only')\n .option('--pretty', 'Human-readable output')\n .action(async (opts: { provider?: string; pretty?: boolean }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = {};\n if (opts.provider) args.provider = opts.provider;\n await exec.executeTool('gtm_status', args, ctx, { pretty: opts.pretty });\n });\n}\n\n// ─── config ─────────────────────────────────────────────\n\nfunction buildConfigCommand(program: Command, exec: CliExecutor): void {\n program\n .command('config')\n .description('Show current configuration')\n .option('--client <name>', 'Show config for a specific client')\n .option('--pretty', 'Human-readable output')\n .action(async (opts: { client?: string; pretty?: boolean }) => {\n const ctx = exec.createCliContext();\n if (opts.client) {\n await exec.executeTool(\n 'gtm_configure',\n { action: 'switch_client', client: opts.client },\n ctx,\n { pretty: opts.pretty }\n );\n }\n await exec.executeTool('gtm_configure', { action: 'show_config' }, ctx, {\n pretty: opts.pretty,\n });\n });\n}\n\n// ─── exec ───────────────────────────────────────────────\n\nfunction buildExecCommand(program: Command, exec: CliExecutor): void {\n program\n .command('exec <tool_name>')\n .description('Execute any MCP tool by name')\n .option('--arg <key=value...>', 'Tool arguments (repeatable)', collectArgs, [])\n .option('--pretty', 'Human-readable output')\n .action(async (toolName: string, opts: { arg: string[]; pretty?: boolean }) => {\n const ctx = exec.createCliContext();\n let args = exec.parseArgFlags(opts.arg);\n const stdinData = await exec.parseStdinJson();\n if (stdinData) args = { ...stdinData, ...args };\n await exec.executeTool(toolName, args, ctx, { pretty: opts.pretty });\n });\n}\n\n/** Collector for repeatable --arg flags. */\nexport function collectArgs(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n// ─── find ───────────────────────────────────────────────\n\nfunction buildFindCommand(program: Command, exec: CliExecutor): void {\n const findCmd = program.command('find').description('Find companies or people');\n\n findCmd\n .command('companies')\n .description('Find companies matching your ICP')\n .option('--icp <text>', 'ICP description text')\n .option('--domain <domain>', 'Company domain to look up')\n .option('--limit <n>', 'Max results', parseInt)\n .option('--country <code>', 'Country code (e.g. US, GB)')\n .option('--min-employees <n>', 'Minimum employee count', parseInt)\n .option('--max-employees <n>', 'Maximum employee count', parseInt)\n .option('--pretty', 'Human-readable output')\n .action(\n async (opts: {\n icp?: string;\n domain?: string;\n limit?: number;\n country?: string;\n minEmployees?: number;\n maxEmployees?: number;\n pretty?: boolean;\n }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = {};\n if (opts.icp) args.icp_text = opts.icp;\n if (opts.domain) args.domain = opts.domain;\n if (opts.limit !== undefined) args.limit = opts.limit;\n if (opts.country) args.country = opts.country;\n if (opts.minEmployees !== undefined) args.min_employees = opts.minEmployees;\n if (opts.maxEmployees !== undefined) args.max_employees = opts.maxEmployees;\n await exec.executeTool('gtm_find_companies', args, ctx, { pretty: opts.pretty });\n }\n );\n\n findCmd\n .command('people')\n .description('Find people at companies')\n .option('--title <title>', 'Job title to search for')\n .option('--company <name>', 'Company name')\n .option('--domain <domain>', 'Company domain')\n .option('--limit <n>', 'Max results', parseInt)\n .option('--pretty', 'Human-readable output')\n .action(\n async (opts: {\n title?: string;\n company?: string;\n domain?: string;\n limit?: number;\n pretty?: boolean;\n }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = {};\n if (opts.title) args.job_title = opts.title;\n if (opts.company) args.company_name = opts.company;\n if (opts.domain) args.company_domain = opts.domain;\n if (opts.limit !== undefined) args.limit = opts.limit;\n await exec.executeTool('gtm_find_people', args, ctx, { pretty: opts.pretty });\n }\n );\n}\n\n// ─── enrich ─────────────────────────────────────────────\n\nfunction buildEnrichCommand(program: Command, exec: CliExecutor): void {\n program\n .command('enrich')\n .description('Enrich contacts with email/phone via waterfall')\n .option('--contacts <json_or_file>', 'Contacts as JSON string or path to JSON file')\n .option('--find <targets>', 'Comma-separated: email,phone', commaSplit)\n .option('--dry-run', 'Preview cost without spending credits')\n .option('--verify', 'Verify found emails')\n .option('--waterfall <providers>', 'Comma-separated provider order', commaSplit)\n .option('--pretty', 'Human-readable output')\n .action(\n async (opts: {\n contacts?: string;\n find?: string[];\n dryRun?: boolean;\n verify?: boolean;\n waterfall?: string[];\n pretty?: boolean;\n }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = {};\n\n if (opts.contacts) {\n args.contacts = parseContactsArg(opts.contacts, exec.writeError);\n } else {\n const stdinData = await exec.readStdin();\n if (stdinData) {\n try {\n const parsed = JSON.parse(stdinData);\n if (Array.isArray(parsed)) {\n args.contacts = parsed;\n } else if (parsed.contacts && Array.isArray(parsed.contacts)) {\n args.contacts = parsed.contacts;\n } else {\n exec.writeError(\n 'Stdin must be a JSON array of contacts or an object with a \"contacts\" key'\n );\n }\n } catch {\n exec.writeError('Failed to parse stdin as JSON');\n }\n } else {\n exec.writeError(\n 'No contacts provided. Use --contacts <file_or_json> or pipe JSON to stdin'\n );\n }\n }\n\n if (opts.find) args.find = opts.find;\n if (opts.dryRun) args.dry_run = true;\n if (opts.verify) args.verify = true;\n if (opts.waterfall) args.waterfall = opts.waterfall;\n\n await exec.executeTool('gtm_enrich', args, ctx, { pretty: opts.pretty });\n }\n );\n}\n\n/** Parse --contacts: if it looks like a file path, read it. Otherwise parse as JSON. */\nexport function parseContactsArg(\n value: string,\n writeError: (msg: string, details?: unknown) => never\n): unknown {\n const trimmed = value.trim();\n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n try {\n const parsed = JSON.parse(trimmed);\n return Array.isArray(parsed) ? parsed : [parsed];\n } catch {\n writeError('Failed to parse --contacts as JSON', { received: trimmed.slice(0, 200) });\n }\n }\n\n if (!existsSync(value)) {\n writeError(`Contacts file not found: ${value}`);\n }\n\n try {\n const content = readFileSync(value, 'utf-8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [parsed];\n } catch (err) {\n writeError(`Failed to read/parse contacts file: ${value}`, {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/** Split comma-separated values. */\nexport function commaSplit(value: string): string[] {\n return value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n// ─── verify ─────────────────────────────────────────────\n\nfunction buildVerifyCommand(program: Command, exec: CliExecutor): void {\n program\n .command('verify')\n .description('Verify an email address')\n .option('--email <address>', 'Email address to verify')\n .option('--pretty', 'Human-readable output')\n .action(async (opts: { email?: string; pretty?: boolean }) => {\n if (!opts.email) exec.writeError('--email is required');\n const ctx = exec.createCliContext();\n await exec.executeTool('gtm_verify', { email: opts.email }, ctx, { pretty: opts.pretty });\n });\n}\n\n// ─── campaigns ──────────────────────────────────────────\n\nfunction buildCampaignsCommand(program: Command, exec: CliExecutor): void {\n program\n .command('campaigns')\n .description('List campaigns')\n .option('--provider <name>', 'Filter by provider (e.g. plusvibe, heyreach)')\n .option('--pretty', 'Human-readable output')\n .action(async (opts: { provider?: string; pretty?: boolean }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = { action: 'list' };\n if (opts.provider) args.provider = opts.provider;\n await exec.executeTool('gtm_campaign', args, ctx, { pretty: opts.pretty });\n });\n}\n\n// ─── campaign-stats ─────────────────────────────────────\n\nfunction buildCampaignStatsCommand(program: Command, exec: CliExecutor): void {\n program\n .command('campaign-stats <campaign_id>')\n .description('Get stats for a specific campaign')\n .option('--provider <name>', 'Provider name (e.g. plusvibe, heyreach)')\n .option('--pretty', 'Human-readable output')\n .action(async (campaignId: string, opts: { provider?: string; pretty?: boolean }) => {\n const ctx = exec.createCliContext();\n const args: Record<string, unknown> = { action: 'stats', campaign_id: campaignId };\n if (opts.provider) args.provider = opts.provider;\n await exec.executeTool('gtm_campaign', args, ctx, { pretty: opts.pretty });\n });\n}\n","/** CLI entry point and utilities for the GTM MCP server.\n * Purpose: Pipe-friendly CLI with JSON output by default. Wraps MCP tools for terminal use.\n * Constraint: All output to stdout is valid JSON unless --pretty. Errors go to stderr. */\n\nimport { Command } from 'commander';\nimport { logError } from '@mas/logging';\n\nimport { loadConfig, loadYamlFromDisk } from './config.js';\nimport { SessionContext } from './context.js';\nimport { ProviderRegistry } from './providers/registry.js';\nimport { registerProviders } from './providers/factory.js';\nimport { handleToolCall } from './handlers/index.js';\nimport { validateToolArgs, TOOL_NAMES } from './validation.js';\nimport { SERVER_VERSION } from './constants.js';\nimport { registerCommands, collectArgs, commaSplit, parseContactsArg } from './cli-commands.js';\n\nimport type { HandlerContext, ToolResult } from './handlers/index.js';\n\n// ─── Types ───────────────────────────────────────────────\n\ninterface OutputOptions {\n pretty?: boolean;\n}\n\n// ─── Context Factory ─────────────────────────────────────\n\n/** Create a HandlerContext for CLI use by reading config from ~/.gtm/config.yaml. */\nfunction createCliContext(): HandlerContext {\n const yamlContent = loadYamlFromDisk();\n const config = loadConfig(yamlContent);\n const session = new SessionContext(config);\n const registry = new ProviderRegistry();\n\n const activeCtx = session.getActiveContext();\n registerProviders(registry, activeCtx.config);\n\n return { session, registry };\n}\n\n// ─── Output Helpers ──────────────────────────────────────\n\n/** Write JSON data to stdout. Pretty-prints if --pretty flag is set. */\nfunction writeOutput(data: unknown, opts: OutputOptions): void {\n const indent = opts.pretty ? 2 : undefined;\n process.stdout.write(JSON.stringify(data, null, indent) + '\\n');\n}\n\n/** Write an error to stderr and exit with code 1. */\nfunction writeError(message: string, details?: unknown): never {\n const payload: Record<string, unknown> = { error: message };\n if (details !== undefined) {\n payload.details = details;\n }\n process.stderr.write(JSON.stringify(payload) + '\\n');\n process.exit(1);\n}\n\n// ─── Tool Execution ──────────────────────────────────────\n\n/** Execute an MCP tool by name, with validation and error handling. */\nasync function executeTool(\n toolName: string,\n args: Record<string, unknown>,\n ctx: HandlerContext,\n opts: OutputOptions\n): Promise<void> {\n if (!TOOL_NAMES.includes(toolName as (typeof TOOL_NAMES)[number])) {\n writeError(`Unknown tool: ${toolName}`, { available: [...TOOL_NAMES] });\n }\n\n const validation = validateToolArgs(toolName, args);\n if (!validation.success) {\n writeError(`Validation failed for ${toolName}`, validation.error);\n }\n\n if (toolName === 'gtm_configure' && args.action === 'switch_client') {\n const result = await handleToolCall(toolName, validation.data as Record<string, unknown>, ctx);\n const activeCtx = ctx.session.getActiveContext();\n registerProviders(ctx.registry, activeCtx.config);\n outputToolResult(result, opts);\n return;\n }\n\n const result = await handleToolCall(toolName, validation.data as Record<string, unknown>, ctx);\n outputToolResult(result, opts);\n}\n\n/** Parse a ToolResult and write to stdout. Errors exit with code 1. */\nfunction outputToolResult(result: ToolResult, opts: OutputOptions): void {\n const text = result.content[0]?.text ?? '{}';\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n // Not valid JSON — wrap raw text for pipe consumers\n parsed = { raw: text };\n }\n\n if (result.isError) {\n process.stderr.write(JSON.stringify(parsed) + '\\n');\n process.exit(1);\n }\n\n writeOutput(parsed, opts);\n}\n\n// ─── Stdin Reader ────────────────────────────────────────\n\n/** Read all data from stdin (for piped input). Returns null if stdin is a TTY. */\nasync function readStdin(): Promise<string | null> {\n if (process.stdin.isTTY) return null;\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n\n const data = Buffer.concat(chunks).toString('utf-8').trim();\n return data.length > 0 ? data : null;\n}\n\n/** Parse stdin as JSON. Returns parsed object or exits with error. */\nasync function parseStdinJson(): Promise<Record<string, unknown> | null> {\n const raw = await readStdin();\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as Record<string, unknown>;\n } catch {\n writeError('Failed to parse stdin as JSON', { received: raw.slice(0, 200) });\n }\n}\n\n// ─── Arg Parsing ─────────────────────────────────────────\n\n/** Parse repeated --arg key=value flags into a Record. Handles JSON values. */\nfunction parseArgFlags(argPairs: string[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const pair of argPairs) {\n const eqIndex = pair.indexOf('=');\n if (eqIndex === -1) {\n writeError(`Invalid --arg format: \"${pair}\". Expected key=value`);\n }\n\n const key = pair.slice(0, eqIndex);\n const rawValue = pair.slice(eqIndex + 1);\n result[key] = coerceValue(rawValue);\n }\n\n return result;\n}\n\n/** Coerce a string value to its natural type: number, boolean, JSON, or string. */\nfunction coerceValue(raw: string): unknown {\n if ((raw.startsWith('[') || raw.startsWith('{')) && (raw.endsWith(']') || raw.endsWith('}'))) {\n try {\n return JSON.parse(raw);\n } catch {\n // Not valid JSON — return as string\n return raw;\n }\n }\n\n if (raw === 'true') return true;\n if (raw === 'false') return false;\n\n const num = Number(raw);\n if (!Number.isNaN(num) && raw.length > 0) return num;\n\n return raw;\n}\n\n// ─── CLI Builder ─────────────────────────────────────────\n\n/** Build the top-level CLI program with all subcommands. */\nexport function buildCli(): Command {\n const program = new Command();\n\n program\n .name('gtm')\n .description('GTM MCP Server — capability-oriented tools for go-to-market operations')\n .version(SERVER_VERSION);\n\n registerCommands(program, {\n createCliContext,\n executeTool,\n writeError,\n parseArgFlags,\n parseStdinJson,\n readStdin,\n });\n\n return program;\n}\n\n// ─── Exports for Testing ─────────────────────────────────\n\nexport {\n coerceValue,\n parseArgFlags,\n createCliContext,\n writeOutput,\n writeError,\n outputToolResult,\n collectArgs,\n commaSplit,\n parseContactsArg,\n};\n\n// ─── Entry Point ─────────────────────────────────────────\n\n/** Run the CLI. Called from index.ts when args are present. */\nexport async function runCli(): Promise<void> {\n const program = buildCli();\n program.exitOverride();\n\n try {\n await program.parseAsync();\n } catch (err) {\n if (err instanceof Error && 'code' in err) {\n const cmdErr = err as Error & { code: string };\n if (cmdErr.code === 'commander.helpDisplayed' || cmdErr.code === 'commander.version') {\n process.exit(0);\n }\n }\n\n logError('cli:fatal', err instanceof Error ? err : new Error(String(err)));\n process.stderr.write(\n JSON.stringify({ error: err instanceof Error ? err.message : String(err) }) + '\\n'\n );\n process.exit(1);\n }\n}\n","#!/usr/bin/env node\n/** @mas/mcp entry point. Routes to MCP server (no args) or CLI commands (with args).\n * Constraint: Thin wrapper. No business logic. Delegates to server.ts or cli.ts. */\n\nimport { logError } from '@mas/logging';\nimport { startServer } from './server.js';\n\n// ─── Routing ─────────────────────────────────────────────\n\nif (process.argv.length <= 2) {\n // No args: start MCP server (stdio transport for Claude Code integration)\n startServer().catch((err) => {\n logError('server:fatal', err instanceof Error ? err : new Error(String(err)));\n process.exit(1);\n });\n} else {\n // Args present: delegate to CLI\n import('./cli.js')\n .then(({ runCli }) => runCli())\n .catch((err) => {\n logError('cli:fatal', err instanceof Error ? err : new Error(String(err)));\n process.exit(1);\n });\n}\n"],"mappings":"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,WAIA,OAGA,KAOA,UAOA,aAsBA,UAYA;AAxPb;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA,IAAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA,IAAAA;AACA,IAAAA;AACA,IAAAA;AACA;AACA;AACA;AACA;AACA,IAAAd;AACA,IAAAe;AACA;AACA,IAAAf;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAgB;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA;AACA;AACO,IAAM,OAAO,kBAAkB,QAAQ,EAAE,QAAqB,CAAC;AAC/D,IAAM,UAAU,kBAAkB,WAAW;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AACM,IAAM,gBAAgB,kBAAkB,iBAAiB;AAAA,MAC5D;AAAA,MACA;AAAA,IACJ,CAAC;AACM,IAAM,WAAW,kBAAkB,YAAY;AAAA,MAClD,UAAUC;AAAA,IACd,CAAC;AACM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","names":["init_client","init_client","init_types","init_client","init_client","init_client","init_client","init_client","init_client","crypto","crypto","crypto","crypto","crypto","crypto","headers","authenticator","data","_a","result","data","urlData","signature","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Accounts","init_Accounts","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Authorizations","init_Authorizations","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Cards","init_Cards","stripeMethod","stripeMethod","Configurations","init_Configurations","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","InboundTransfers","init_InboundTransfers","stripeMethod","stripeMethod","stripeMethod","MeterEventAdjustments","init_MeterEventAdjustments","stripeMethod","stripeMethod","stripeMethod","stripeMethod","MeterEvents","init_MeterEvents","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","OutboundPayments","init_OutboundPayments","stripeMethod","stripeMethod","OutboundTransfers","init_OutboundTransfers","stripeMethod","stripeMethod","stripeMethod","PersonalizationDesigns","init_PersonalizationDesigns","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Readers","init_Readers","stripeMethod","stripeMethod","ReceivedCredits","init_ReceivedCredits","stripeMethod","stripeMethod","ReceivedDebits","init_ReceivedDebits","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Sessions","init_Sessions","stripeMethod","Sessions","init_Sessions","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Transactions","init_Transactions","stripeMethod","Transactions","init_Transactions","stripeMethod","Transactions","init_Transactions","stripeMethod","Transactions","init_Transactions","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Accounts","init_Accounts","stripeMethod","AccountLinks","init_AccountLinks","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","ConfirmationTokens","init_ConfirmationTokens","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Customers","init_Customers","stripeMethod","Disputes","init_Disputes","stripeMethod","stripeMethod","Events","init_Events","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Products","init_Products","stripeMethod","stripeMethod","stripeMethod","Refunds","init_Refunds","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","stripeMethod","Tokens","init_Tokens","stripeMethod","stripeMethod","stripeMethod","Accounts","AccountLinks","ConfirmationTokens","Customers","Disputes","Events","Products","Refunds","Tokens","init_Accounts","init_Authorizations","init_Cards","init_Configurations","init_InboundTransfers","init_MeterEventAdjustments","init_MeterEvents","init_OutboundPayments","init_OutboundTransfers","init_PersonalizationDesigns","init_Readers","init_ReceivedCredits","init_ReceivedDebits","init_Sessions","init_Transactions","init_AccountLinks","init_ConfirmationTokens","init_Customers","init_Disputes","init_Events","init_Products","init_Refunds","init_Tokens","Sessions","Transactions","Configurations","Authorizations","Cards","PersonalizationDesigns","Readers","InboundTransfers","OutboundPayments","OutboundTransfers","ReceivedCredits","ReceivedDebits","MeterEventAdjustments","MeterEvents","Stripe","isObject","init_client","init_client","init_client","init_client","MAX_LEADS_PER_REQUEST","init_client","init_client","init_client","init_client","init_client","init_client","init_client","init_client","init_dist","init_client","init_types","init_dist","init_dist","init_prospeo","init_dist","init_dist","init_dist","init_dist","init_dist","init_dist","init_dist","init_prospeo","init_factory","handleProspect","handleEnrich","handleExtract","handleFetch","handleAi","handleCampaign","handleOutreach","handleCrm","handleStatus","handleConfigure","init_prospect","init_enrich","init_extract","init_fetch","init_ai","init_campaign","init_outreach","init_crm","init_status","init_configure","init_prospect","init_enrich","init_extract","init_fetch","init_ai","init_campaign","init_outreach","init_crm","init_status","init_configure","z","init_factory","readFileSync","existsSync","exec","startServer","writeError","executeTool","result","init_factory","runCli"]}
|