@elevasis/core 0.7.1 → 0.8.2
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/test-utils/index.d.ts +3122 -0
- package/dist/test-utils/index.js +386 -0
- package/package.json +6 -1
- package/src/README.md +39 -36
- package/src/__tests__/publish.test.ts +18 -13
- package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
- package/src/_gen/__tests__/scaffold-contracts.test.ts +47 -36
- package/src/_gen/scaffold-contracts.ts +45 -45
- package/src/auth/multi-tenancy/credentials/README.md +38 -38
- package/src/auth/multi-tenancy/credentials/index.ts +6 -6
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
- package/src/auth/multi-tenancy/index.ts +17 -17
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
- package/src/auth/multi-tenancy/invitations/index.ts +37 -37
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
- package/src/auth/multi-tenancy/memberships/index.ts +21 -21
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
- package/src/auth/multi-tenancy/organizations/index.ts +23 -23
- package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
- package/src/auth/multi-tenancy/types.ts +83 -83
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
- package/src/auth/multi-tenancy/users/index.ts +27 -27
- package/src/auth/multi-tenancy/users/server/index.ts +19 -19
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
- package/src/auth/multi-tenancy/users/user.ts +65 -65
- package/src/business/README.md +52 -52
- package/src/business/__tests__/entities-published.test.ts +33 -33
- package/src/business/acquisition/api-schemas.ts +759 -759
- package/src/business/acquisition/index.ts +109 -109
- package/src/business/acquisition/types.ts +402 -402
- package/src/business/base-entities.test.ts +481 -481
- package/src/business/base-entities.ts +241 -241
- package/src/business/entities-published.ts +24 -24
- package/src/business/index.ts +15 -15
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
- package/src/business/pdf/index.ts +10 -10
- package/src/business/pdf/server/index.ts +21 -21
- package/src/business/pdf/server/themes/default.ts +8 -8
- package/src/business/pdf/server/themes/index.ts +9 -9
- package/src/business/pdf/server/themes/types.ts +8 -8
- package/src/business/pdf/types.ts +272 -272
- package/src/business/projects/index.ts +2 -2
- package/src/business/projects/sse-events.ts +21 -21
- package/src/business/projects/types.ts +89 -89
- package/src/business/sales/api-schemas.ts +75 -75
- package/src/business/seo/__tests__/linking.test.ts +549 -549
- package/src/business/seo/__tests__/types.test.ts +404 -404
- package/src/business/seo/index.ts +2 -2
- package/src/business/seo/linking.ts +281 -281
- package/src/business/seo/types.ts +199 -199
- package/src/commands/queue/index.ts +3 -3
- package/src/commands/queue/schemas.test.ts +593 -593
- package/src/commands/queue/schemas.ts +125 -125
- package/src/commands/queue/sse-events.ts +61 -61
- package/src/commands/queue/types/action.ts +52 -52
- package/src/commands/queue/types/checkpoint.ts +44 -44
- package/src/commands/queue/types/index.ts +7 -7
- package/src/commands/queue/types/task.ts +116 -116
- package/src/commands/queue/types.ts +14 -14
- package/src/content/distribution-metadata.ts +61 -61
- package/src/content/index.ts +10 -10
- package/src/deployments/index.ts +22 -22
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
- package/src/execution/core/index.ts +11 -11
- package/src/execution/core/runner-types.ts +80 -80
- package/src/execution/core/server/environment.ts +31 -31
- package/src/execution/core/sse-executions.ts +119 -119
- package/src/execution/core/types.ts +29 -29
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
- package/src/execution/engine/__tests__/timeout.test.ts +565 -565
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
- package/src/execution/engine/agent/actions/executor.ts +205 -205
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
- package/src/execution/engine/agent/actions/processor.ts +116 -116
- package/src/execution/engine/agent/actions/types.ts +70 -70
- package/src/execution/engine/agent/core/agent.ts +810 -810
- package/src/execution/engine/agent/core/types.ts +155 -155
- package/src/execution/engine/agent/errors.ts +251 -251
- package/src/execution/engine/agent/index.ts +78 -78
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
- package/src/execution/engine/agent/memory/domains.ts +99 -99
- package/src/execution/engine/agent/memory/manager.ts +365 -365
- package/src/execution/engine/agent/memory/processor.ts +66 -66
- package/src/execution/engine/agent/memory/types.ts +90 -90
- package/src/execution/engine/agent/memory/utils.ts +134 -134
- package/src/execution/engine/agent/observability/logging.ts +467 -467
- package/src/execution/engine/agent/observability/types.ts +64 -64
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
- package/src/execution/engine/agent/reasoning/processor.ts +92 -92
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
- package/src/execution/engine/agent/reasoning/types.ts +18 -18
- package/src/execution/engine/base/errors.ts +118 -118
- package/src/execution/engine/base/index.ts +2 -2
- package/src/execution/engine/base/logging.ts +31 -31
- package/src/execution/engine/base/serialization.ts +324 -324
- package/src/execution/engine/base/types.ts +126 -126
- package/src/execution/engine/base/utils.ts +41 -41
- package/src/execution/engine/index.ts +434 -434
- package/src/execution/engine/interface/index.ts +1 -1
- package/src/execution/engine/interface/types.ts +62 -62
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
- package/src/execution/engine/llm/adapters/index.ts +17 -17
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
- package/src/execution/engine/llm/adapters/server/google.ts +283 -283
- package/src/execution/engine/llm/adapters/server/index.ts +12 -12
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
- package/src/execution/engine/llm/errors.ts +186 -186
- package/src/execution/engine/llm/model-info.ts +332 -332
- package/src/execution/engine/llm/response-schema-validator.ts +113 -113
- package/src/execution/engine/llm/types.ts +86 -86
- package/src/execution/engine/test-utils/index.ts +6 -6
- package/src/execution/engine/test-utils/mocks.ts +56 -56
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
- package/src/execution/engine/tools/integration/index.ts +53 -53
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
- package/src/execution/engine/tools/integration/server/index.ts +61 -61
- package/src/execution/engine/tools/integration/service.ts +161 -161
- package/src/execution/engine/tools/integration/tool.ts +253 -253
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
- package/src/execution/engine/tools/integration/types/apify.ts +92 -92
- package/src/execution/engine/tools/integration/types/index.ts +19 -19
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
- package/src/execution/engine/tools/lead-service-types.ts +884 -884
- package/src/execution/engine/tools/llm/index.ts +11 -11
- package/src/execution/engine/tools/llm/server/index.ts +8 -8
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
- package/src/execution/engine/tools/platform/email/index.ts +122 -122
- package/src/execution/engine/tools/platform/email/types.ts +96 -96
- package/src/execution/engine/tools/platform/index.ts +157 -157
- package/src/execution/engine/tools/platform/notification.ts +81 -81
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
- package/src/execution/engine/tools/platform/scheduler.ts +87 -87
- package/src/execution/engine/tools/platform/storage/index.ts +370 -370
- package/src/execution/engine/tools/platform/types.ts +148 -148
- package/src/execution/engine/tools/registry.ts +700 -700
- package/src/execution/engine/tools/tool-maps.ts +786 -786
- package/src/execution/engine/tools/types.ts +233 -233
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
- package/src/execution/engine/workflow/errors.ts +63 -63
- package/src/execution/engine/workflow/helpers/index.ts +11 -11
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
- package/src/execution/engine/workflow/index.ts +19 -19
- package/src/execution/engine/workflow/log-truncate.ts +26 -26
- package/src/execution/engine/workflow/logging.ts +191 -191
- package/src/execution/engine/workflow/types.ts +182 -182
- package/src/execution/engine/workflow/utils.ts +280 -280
- package/src/execution/engine/workflow/workflow.ts +168 -168
- package/src/execution/index.ts +3 -3
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
- package/src/execution/scheduler/api-schemas.ts +296 -296
- package/src/execution/scheduler/index.ts +50 -50
- package/src/execution/scheduler/schemas.ts +264 -264
- package/src/execution/scheduler/types.ts +111 -111
- package/src/execution/scheduler/utils.ts +364 -364
- package/src/forms/index.ts +7 -7
- package/src/forms/schemas.ts +69 -69
- package/src/forms/types.ts +70 -70
- package/src/index.ts +71 -60
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
- package/src/integrations/credentials/api-schemas.ts +143 -143
- package/src/integrations/credentials/index.ts +32 -32
- package/src/integrations/credentials/schemas.ts +164 -164
- package/src/integrations/credentials/utils.ts +59 -59
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
- package/src/integrations/oauth/api-schemas.ts +92 -92
- package/src/integrations/oauth/index.ts +19 -19
- package/src/integrations/oauth/provider-registry.ts +61 -61
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
- package/src/integrations/oauth/server/credentials.ts +39 -39
- package/src/integrations/oauth/server/refresh.ts +214 -214
- package/src/integrations/oauth/types.ts +34 -34
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
- package/src/integrations/webhook-endpoints/index.ts +28 -28
- package/src/integrations/webhook-endpoints/types.ts +51 -51
- package/src/operations/activities/api-schemas.ts +79 -79
- package/src/operations/activities/index.ts +9 -9
- package/src/operations/activities/sse-events.ts +30 -30
- package/src/operations/activities/types.ts +63 -63
- package/src/operations/debug-logs/client.ts +60 -60
- package/src/operations/debug-logs/debug-logger.ts +83 -83
- package/src/operations/debug-logs/index.ts +8 -8
- package/src/operations/debug-logs/server.ts +19 -19
- package/src/operations/debug-logs/types.ts +33 -33
- package/src/operations/index.ts +50 -50
- package/src/operations/notifications/api-schemas.ts +91 -91
- package/src/operations/notifications/index.ts +3 -3
- package/src/operations/notifications/sse-events.ts +21 -21
- package/src/operations/notifications/types.ts +47 -47
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
- package/src/operations/observability/__tests__/utils.test.ts +54 -54
- package/src/operations/observability/ai-usage-collector.ts +64 -64
- package/src/operations/observability/index.ts +13 -13
- package/src/operations/observability/metrics-collector.ts +49 -49
- package/src/operations/observability/schemas.ts +39 -39
- package/src/operations/observability/types.ts +463 -463
- package/src/operations/observability/utils.ts +77 -77
- package/src/operations/sessions/__tests__/manager.test.ts +821 -821
- package/src/operations/sessions/index.ts +26 -26
- package/src/operations/sessions/server/manager.ts +90 -90
- package/src/operations/sessions/server/session.ts +180 -180
- package/src/operations/sessions/types.ts +98 -98
- package/src/operations/triggers/index.ts +12 -12
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
- package/src/operations/triggers/webhook/index.ts +35 -35
- package/src/operations/triggers/webhook/types.ts +74 -74
- package/src/organization-model/README.md +97 -97
- package/src/organization-model/__tests__/defaults.test.ts +175 -175
- package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
- package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
- package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
- package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
- package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
- package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
- package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
- package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
- package/src/organization-model/__tests__/foundation.test.ts +105 -105
- package/src/organization-model/__tests__/graph.test.ts +894 -894
- package/src/organization-model/__tests__/resolve.test.ts +690 -690
- package/src/organization-model/__tests__/schema.test.ts +407 -407
- package/src/organization-model/contracts.ts +14 -14
- package/src/organization-model/defaults.ts +148 -148
- package/src/organization-model/domains/branding.ts +22 -22
- package/src/organization-model/domains/customers.ts +75 -75
- package/src/organization-model/domains/features.ts +22 -22
- package/src/organization-model/domains/goals.ts +80 -80
- package/src/organization-model/domains/identity.ts +94 -94
- package/src/organization-model/domains/navigation.ts +391 -391
- package/src/organization-model/domains/offerings.ts +66 -66
- package/src/organization-model/domains/operations.ts +85 -85
- package/src/organization-model/domains/projects.ts +48 -48
- package/src/organization-model/domains/prospecting.ts +33 -33
- package/src/organization-model/domains/roles.ts +55 -55
- package/src/organization-model/domains/sales.ts +94 -94
- package/src/organization-model/domains/shared.ts +62 -62
- package/src/organization-model/domains/statuses.ts +130 -130
- package/src/organization-model/foundation.ts +97 -97
- package/src/organization-model/graph/build.ts +399 -399
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/schema.ts +48 -48
- package/src/organization-model/graph/types.ts +40 -40
- package/src/organization-model/index.ts +13 -13
- package/src/organization-model/organization-graph.mdx +272 -272
- package/src/organization-model/organization-model.mdx +320 -320
- package/src/organization-model/published.ts +85 -85
- package/src/organization-model/resolve.ts +66 -66
- package/src/organization-model/schema.ts +287 -287
- package/src/organization-model/types.ts +46 -46
- package/src/platform/api/index.ts +1 -1
- package/src/platform/api/types.ts +35 -35
- package/src/platform/constants/http.ts +37 -37
- package/src/platform/constants/index.ts +5 -5
- package/src/platform/constants/limits.ts +32 -32
- package/src/platform/constants/resilience.ts +51 -51
- package/src/platform/constants/timeouts.ts +20 -20
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
- package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
- package/src/platform/registry/command-view.ts +180 -180
- package/src/platform/registry/domains.ts +165 -165
- package/src/platform/registry/index.ts +93 -93
- package/src/platform/registry/reserved.ts +24 -24
- package/src/platform/registry/resource-metadata.ts +59 -59
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
- package/src/platform/registry/resource-registry.ts +876 -876
- package/src/platform/registry/serialization.ts +273 -273
- package/src/platform/registry/serialized-types.ts +231 -231
- package/src/platform/registry/stats-types.ts +66 -66
- package/src/platform/registry/types.ts +404 -404
- package/src/platform/registry/validation.ts +513 -513
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
- package/src/platform/resilience/circuit-breaker.ts +164 -164
- package/src/platform/resilience/errors.ts +68 -68
- package/src/platform/resilience/http-error-mapper.ts +129 -129
- package/src/platform/resilience/index.ts +93 -93
- package/src/platform/resilience/rate-limiter-types.ts +46 -46
- package/src/platform/resilience/rate-limiter.ts +140 -140
- package/src/platform/resilience/retry.ts +89 -89
- package/src/platform/resilience/timeout.ts +63 -63
- package/src/platform/sse/events.ts +37 -37
- package/src/platform/sse/index.ts +7 -7
- package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
- package/src/platform/utils/currency.ts +96 -96
- package/src/platform/utils/debounce.ts +52 -52
- package/src/platform/utils/error.ts +41 -41
- package/src/platform/utils/hmac.test.ts +97 -97
- package/src/platform/utils/index.ts +32 -32
- package/src/platform/utils/server/betterstack-logger.ts +210 -210
- package/src/platform/utils/server/hmac.ts +44 -44
- package/src/platform/utils/server/unsubscribe.ts +111 -111
- package/src/platform/utils/token-counter.ts +96 -96
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.ts +268 -268
- package/src/published.ts +1 -1
- package/src/reference/_generated/contracts.md +607 -607
- package/src/reference/glossary.md +105 -105
- package/src/requests/__tests__/api-schemas.test.ts +277 -277
- package/src/requests/api-schemas.ts +83 -83
- package/src/requests/index.ts +1 -1
- package/src/scaffold-registry/__tests__/index.test.ts +17 -0
- package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
- package/src/scaffold-registry/index.ts +205 -189
- package/src/scaffold-registry/schema.ts +196 -128
- package/src/server.ts +272 -272
- package/src/supabase/database.types.ts +2719 -2719
- package/src/supabase/helpers.ts +20 -20
- package/src/supabase/index.ts +52 -52
- package/src/supabase/server/client.ts +58 -58
- package/src/test-utils/README.md +30 -138
- package/src/test-utils/browser-mocks.ts +54 -54
- package/src/test-utils/fixtures/api-keys.ts +52 -52
- package/src/test-utils/fixtures/index.ts +4 -4
- package/src/test-utils/fixtures/memberships.ts +80 -80
- package/src/test-utils/fixtures/organizations.ts +69 -69
- package/src/test-utils/fixtures/users.ts +79 -79
- package/src/test-utils/index.ts +7 -8
- package/src/test-utils/mocks/index.ts +2 -2
- package/src/test-utils/mocks/supabase.ts +142 -142
- package/src/test-utils/mocks/workos.ts +108 -108
- package/src/test-utils/published.ts +4 -0
- package/src/test-utils/rls/RLSTestContext.ts +554 -554
- package/src/test-utils/rls/index.ts +1 -1
|
@@ -1,517 +1,517 @@
|
|
|
1
|
-
import type Stripe from 'stripe'
|
|
2
|
-
import type { BaseIntegrationAdapter } from '../../../base-integration-adapter'
|
|
3
|
-
import { ToolingError } from '../../../../types'
|
|
4
|
-
import type { ExecutionContext } from '../../../../../base/types'
|
|
5
|
-
import type {
|
|
6
|
-
StripeCredentials,
|
|
7
|
-
CreatePaymentLinkParams,
|
|
8
|
-
CreatePaymentLinkResult,
|
|
9
|
-
GetPaymentLinkParams,
|
|
10
|
-
GetPaymentLinkResult,
|
|
11
|
-
UpdatePaymentLinkParams,
|
|
12
|
-
UpdatePaymentLinkResult,
|
|
13
|
-
ListPaymentLinksParams,
|
|
14
|
-
ListPaymentLinksResult,
|
|
15
|
-
CreateCheckoutSessionParams,
|
|
16
|
-
CreateCheckoutSessionResult,
|
|
17
|
-
CreateAutoPaymentLinkParams,
|
|
18
|
-
CreateAutoPaymentLinkResult
|
|
19
|
-
} from './fetch/utils/types'
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Stripe API version
|
|
23
|
-
* Using latest stable version with Payment Links support
|
|
24
|
-
*/
|
|
25
|
-
const STRIPE_API_VERSION = '2026-01-28.clover' as const
|
|
26
|
-
|
|
27
|
-
// Lazy-loaded Stripe client to avoid eager loading issues in Docker
|
|
28
|
-
let stripeModule: typeof import('stripe') | null = null
|
|
29
|
-
async function getStripeModule(): Promise<typeof import('stripe')> {
|
|
30
|
-
if (!stripeModule) {
|
|
31
|
-
stripeModule = await import('stripe')
|
|
32
|
-
}
|
|
33
|
-
return stripeModule
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Stripe integration adapter
|
|
38
|
-
*
|
|
39
|
-
* Provides access to Stripe Payment Links API for creating and managing
|
|
40
|
-
* payment links programmatically.
|
|
41
|
-
*
|
|
42
|
-
* @example
|
|
43
|
-
* ```typescript
|
|
44
|
-
* const adapter = new StripeAdapter()
|
|
45
|
-
* const result = await adapter.call(
|
|
46
|
-
* 'createPaymentLink',
|
|
47
|
-
* {
|
|
48
|
-
* priceId: 'price_xxx',
|
|
49
|
-
* quantity: 1,
|
|
50
|
-
* metadata: { dealId: '123' }
|
|
51
|
-
* },
|
|
52
|
-
* { apiKey: 'sk_xxx' },
|
|
53
|
-
* context
|
|
54
|
-
* )
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export class StripeAdapter implements BaseIntegrationAdapter {
|
|
58
|
-
readonly name = 'stripe'
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Create Stripe client with secret key (lazy-loaded)
|
|
62
|
-
*/
|
|
63
|
-
private async createClient(secretKey: string): Promise<Stripe> {
|
|
64
|
-
const { default: StripeClient } = await getStripeModule()
|
|
65
|
-
return new StripeClient(secretKey, {
|
|
66
|
-
apiVersion: STRIPE_API_VERSION,
|
|
67
|
-
typescript: true
|
|
68
|
-
})
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* Call Stripe API method
|
|
73
|
-
*/
|
|
74
|
-
async call(
|
|
75
|
-
method: string,
|
|
76
|
-
params: unknown,
|
|
77
|
-
credentials: Record<string, unknown>,
|
|
78
|
-
context?: ExecutionContext
|
|
79
|
-
): Promise<unknown> {
|
|
80
|
-
// Validate credentials first
|
|
81
|
-
if (!this.validateCredentials(credentials)) {
|
|
82
|
-
throw new ToolingError('credentials_invalid', 'Invalid Stripe credentials', {
|
|
83
|
-
integration: this.name,
|
|
84
|
-
organizationId: context?.organizationId
|
|
85
|
-
})
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Safe to cast after validation confirms apiKey exists and is valid
|
|
89
|
-
const creds = credentials as unknown as StripeCredentials
|
|
90
|
-
const stripe = await this.createClient(creds.apiKey)
|
|
91
|
-
|
|
92
|
-
// Route to method handler
|
|
93
|
-
switch (method) {
|
|
94
|
-
case 'createPaymentLink':
|
|
95
|
-
return this.createPaymentLink(stripe, params as CreatePaymentLinkParams, context)
|
|
96
|
-
case 'getPaymentLink':
|
|
97
|
-
return this.getPaymentLink(stripe, params as GetPaymentLinkParams, context)
|
|
98
|
-
case 'updatePaymentLink':
|
|
99
|
-
return this.updatePaymentLink(stripe, params as UpdatePaymentLinkParams, context)
|
|
100
|
-
case 'listPaymentLinks':
|
|
101
|
-
return this.listPaymentLinks(stripe, params as ListPaymentLinksParams, context)
|
|
102
|
-
case 'createCheckoutSession':
|
|
103
|
-
return this.createCheckoutSession(stripe, params as CreateCheckoutSessionParams, context)
|
|
104
|
-
case 'createAutoPaymentLink':
|
|
105
|
-
return this.createAutoPaymentLink(stripe, params as CreateAutoPaymentLinkParams, context)
|
|
106
|
-
default:
|
|
107
|
-
throw new ToolingError('method_not_found', `Unknown Stripe method: ${method}`, {
|
|
108
|
-
integration: this.name,
|
|
109
|
-
method,
|
|
110
|
-
organizationId: context?.organizationId
|
|
111
|
-
})
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Validate Stripe credentials
|
|
117
|
-
*/
|
|
118
|
-
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
119
|
-
const creds = credentials as unknown as StripeCredentials
|
|
120
|
-
// Require API key (should start with 'sk_')
|
|
121
|
-
return !!creds.apiKey && typeof creds.apiKey === 'string' && creds.apiKey.startsWith('sk_')
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Create a payment link
|
|
126
|
-
*/
|
|
127
|
-
private async createPaymentLink(
|
|
128
|
-
stripe: Stripe,
|
|
129
|
-
params: CreatePaymentLinkParams,
|
|
130
|
-
context?: ExecutionContext
|
|
131
|
-
): Promise<CreatePaymentLinkResult> {
|
|
132
|
-
try {
|
|
133
|
-
// Build line items
|
|
134
|
-
const lineItems: Stripe.PaymentLinkCreateParams.LineItem[] = [
|
|
135
|
-
{
|
|
136
|
-
price: params.priceId,
|
|
137
|
-
quantity: params.quantity ?? 1
|
|
138
|
-
}
|
|
139
|
-
]
|
|
140
|
-
|
|
141
|
-
// Build after_completion config
|
|
142
|
-
let afterCompletion: Stripe.PaymentLinkCreateParams.AfterCompletion | undefined
|
|
143
|
-
if (params.afterCompletionType === 'redirect' && params.redirectUrl) {
|
|
144
|
-
afterCompletion = {
|
|
145
|
-
type: 'redirect',
|
|
146
|
-
redirect: { url: params.redirectUrl }
|
|
147
|
-
}
|
|
148
|
-
} else if (params.afterCompletionType === 'hosted_confirmation') {
|
|
149
|
-
afterCompletion = {
|
|
150
|
-
type: 'hosted_confirmation'
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Build create params
|
|
155
|
-
const createParams: Stripe.PaymentLinkCreateParams = {
|
|
156
|
-
line_items: lineItems,
|
|
157
|
-
...(params.metadata && { metadata: params.metadata }),
|
|
158
|
-
...(afterCompletion && { after_completion: afterCompletion }),
|
|
159
|
-
...(params.allowPromotionCodes !== undefined && {
|
|
160
|
-
allow_promotion_codes: params.allowPromotionCodes
|
|
161
|
-
}),
|
|
162
|
-
...(params.automaticTax !== undefined && {
|
|
163
|
-
automatic_tax: { enabled: params.automaticTax }
|
|
164
|
-
}),
|
|
165
|
-
...(params.billingAddressCollection && {
|
|
166
|
-
billing_address_collection: params.billingAddressCollection
|
|
167
|
-
}),
|
|
168
|
-
...(params.invoiceCreation !== undefined && {
|
|
169
|
-
invoice_creation: { enabled: params.invoiceCreation }
|
|
170
|
-
})
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const paymentLink = await stripe.paymentLinks.create(createParams)
|
|
174
|
-
|
|
175
|
-
// Log success
|
|
176
|
-
if (context?.logger) {
|
|
177
|
-
context.logger.info(
|
|
178
|
-
`[StripeAdapter] Payment link created: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
179
|
-
)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
id: paymentLink.id,
|
|
184
|
-
url: paymentLink.url,
|
|
185
|
-
active: paymentLink.active,
|
|
186
|
-
livemode: paymentLink.livemode
|
|
187
|
-
}
|
|
188
|
-
} catch (error) {
|
|
189
|
-
throw this.handleStripeError(error, 'createPaymentLink', context)
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Get a payment link by ID
|
|
195
|
-
*/
|
|
196
|
-
private async getPaymentLink(
|
|
197
|
-
stripe: Stripe,
|
|
198
|
-
params: GetPaymentLinkParams,
|
|
199
|
-
context?: ExecutionContext
|
|
200
|
-
): Promise<GetPaymentLinkResult> {
|
|
201
|
-
try {
|
|
202
|
-
const paymentLink = await stripe.paymentLinks.retrieve(params.paymentLinkId)
|
|
203
|
-
|
|
204
|
-
// Log success
|
|
205
|
-
if (context?.logger) {
|
|
206
|
-
context.logger.info(
|
|
207
|
-
`[StripeAdapter] Payment link retrieved: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
208
|
-
)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
return {
|
|
212
|
-
id: paymentLink.id,
|
|
213
|
-
url: paymentLink.url,
|
|
214
|
-
active: paymentLink.active,
|
|
215
|
-
livemode: paymentLink.livemode,
|
|
216
|
-
metadata: (paymentLink.metadata as Record<string, string>) ?? {}
|
|
217
|
-
}
|
|
218
|
-
} catch (error) {
|
|
219
|
-
throw this.handleStripeError(error, 'getPaymentLink', context)
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Update a payment link
|
|
225
|
-
*/
|
|
226
|
-
private async updatePaymentLink(
|
|
227
|
-
stripe: Stripe,
|
|
228
|
-
params: UpdatePaymentLinkParams,
|
|
229
|
-
context?: ExecutionContext
|
|
230
|
-
): Promise<UpdatePaymentLinkResult> {
|
|
231
|
-
try {
|
|
232
|
-
const updateParams: Stripe.PaymentLinkUpdateParams = {
|
|
233
|
-
...(params.active !== undefined && { active: params.active }),
|
|
234
|
-
...(params.metadata && { metadata: params.metadata })
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
const paymentLink = await stripe.paymentLinks.update(params.paymentLinkId, updateParams)
|
|
238
|
-
|
|
239
|
-
// Log success
|
|
240
|
-
if (context?.logger) {
|
|
241
|
-
context.logger.info(
|
|
242
|
-
`[StripeAdapter] Payment link updated: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
243
|
-
)
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
return {
|
|
247
|
-
id: paymentLink.id,
|
|
248
|
-
active: paymentLink.active,
|
|
249
|
-
url: paymentLink.url
|
|
250
|
-
}
|
|
251
|
-
} catch (error) {
|
|
252
|
-
throw this.handleStripeError(error, 'updatePaymentLink', context)
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* List payment links
|
|
258
|
-
*/
|
|
259
|
-
private async listPaymentLinks(
|
|
260
|
-
stripe: Stripe,
|
|
261
|
-
params: ListPaymentLinksParams,
|
|
262
|
-
context?: ExecutionContext
|
|
263
|
-
): Promise<ListPaymentLinksResult> {
|
|
264
|
-
try {
|
|
265
|
-
const listParams: Stripe.PaymentLinkListParams = {
|
|
266
|
-
limit: params.limit ?? 10,
|
|
267
|
-
...(params.active !== undefined && { active: params.active }),
|
|
268
|
-
...(params.startingAfter && { starting_after: params.startingAfter }),
|
|
269
|
-
...(params.endingBefore && { ending_before: params.endingBefore })
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
const response = await stripe.paymentLinks.list(listParams)
|
|
273
|
-
|
|
274
|
-
// Log success
|
|
275
|
-
if (context?.logger) {
|
|
276
|
-
context.logger.info(
|
|
277
|
-
`[StripeAdapter] Payment links listed: organizationId=${context.organizationId} executionId=${context.executionId} count=${response.data.length}`
|
|
278
|
-
)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
return {
|
|
282
|
-
data: response.data.map((link: Stripe.PaymentLink) => ({
|
|
283
|
-
id: link.id,
|
|
284
|
-
url: link.url,
|
|
285
|
-
active: link.active,
|
|
286
|
-
metadata: (link.metadata as Record<string, string>) ?? {}
|
|
287
|
-
})),
|
|
288
|
-
hasMore: response.has_more
|
|
289
|
-
}
|
|
290
|
-
} catch (error) {
|
|
291
|
-
throw this.handleStripeError(error, 'listPaymentLinks', context)
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Create a checkout session for custom/variable pricing
|
|
297
|
-
*
|
|
298
|
-
* Uses price_data instead of a pre-defined price ID, allowing any amount
|
|
299
|
-
* to be specified. The session URL expires in 24 hours.
|
|
300
|
-
*/
|
|
301
|
-
private async createCheckoutSession(
|
|
302
|
-
stripe: Stripe,
|
|
303
|
-
params: CreateCheckoutSessionParams,
|
|
304
|
-
context?: ExecutionContext
|
|
305
|
-
): Promise<CreateCheckoutSessionResult> {
|
|
306
|
-
try {
|
|
307
|
-
const session = await stripe.checkout.sessions.create({
|
|
308
|
-
mode: 'payment',
|
|
309
|
-
line_items: [
|
|
310
|
-
{
|
|
311
|
-
price_data: {
|
|
312
|
-
currency: params.currency ?? 'usd',
|
|
313
|
-
unit_amount: params.amount,
|
|
314
|
-
product_data: {
|
|
315
|
-
name: params.productName ?? 'AI Automation Services',
|
|
316
|
-
...(params.productDescription && { description: params.productDescription })
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
quantity: 1
|
|
320
|
-
}
|
|
321
|
-
],
|
|
322
|
-
...(params.metadata && { metadata: params.metadata }),
|
|
323
|
-
success_url: params.successUrl,
|
|
324
|
-
cancel_url: params.cancelUrl,
|
|
325
|
-
...(params.customerEmail && { customer_email: params.customerEmail })
|
|
326
|
-
})
|
|
327
|
-
|
|
328
|
-
// Log success
|
|
329
|
-
if (context?.logger) {
|
|
330
|
-
context.logger.info(
|
|
331
|
-
`[StripeAdapter] Checkout session created: organizationId=${context.organizationId} executionId=${context.executionId} sessionId=${session.id}`
|
|
332
|
-
)
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
return {
|
|
336
|
-
id: session.id,
|
|
337
|
-
url: session.url!,
|
|
338
|
-
expiresAt: session.expires_at
|
|
339
|
-
}
|
|
340
|
-
} catch (error) {
|
|
341
|
-
throw this.handleStripeError(error, 'createCheckoutSession', context)
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/**
|
|
346
|
-
* Create a payment link with inline price_data (dynamic pricing)
|
|
347
|
-
*
|
|
348
|
-
* Supports both one-time and recurring fees in a single payment link.
|
|
349
|
-
* URLs never expire - same link can be used in all reminder emails.
|
|
350
|
-
*/
|
|
351
|
-
private async createAutoPaymentLink(
|
|
352
|
-
stripe: Stripe,
|
|
353
|
-
params: CreateAutoPaymentLinkParams,
|
|
354
|
-
context?: ExecutionContext
|
|
355
|
-
): Promise<CreateAutoPaymentLinkResult> {
|
|
356
|
-
try {
|
|
357
|
-
const { dealId, companyName, contactEmail, initialFee, monthlyFee } = params
|
|
358
|
-
|
|
359
|
-
// Build line items with inline price_data
|
|
360
|
-
const lineItems: Array<{
|
|
361
|
-
price_data: {
|
|
362
|
-
currency: string
|
|
363
|
-
unit_amount: number
|
|
364
|
-
recurring?: { interval: 'month' }
|
|
365
|
-
product_data: { name: string; description?: string }
|
|
366
|
-
}
|
|
367
|
-
quantity: number
|
|
368
|
-
}> = []
|
|
369
|
-
|
|
370
|
-
// One-time setup fee (if > 0)
|
|
371
|
-
if (initialFee > 0) {
|
|
372
|
-
lineItems.push({
|
|
373
|
-
price_data: {
|
|
374
|
-
currency: 'usd',
|
|
375
|
-
unit_amount: initialFee * 100, // Convert dollars to cents
|
|
376
|
-
product_data: {
|
|
377
|
-
name: 'Implementation Fee',
|
|
378
|
-
description: `One-time setup for ${companyName}`
|
|
379
|
-
}
|
|
380
|
-
},
|
|
381
|
-
quantity: 1
|
|
382
|
-
})
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// Recurring monthly fee (if > 0)
|
|
386
|
-
if (monthlyFee > 0) {
|
|
387
|
-
lineItems.push({
|
|
388
|
-
price_data: {
|
|
389
|
-
currency: 'usd',
|
|
390
|
-
unit_amount: monthlyFee * 100, // Convert dollars to cents
|
|
391
|
-
recurring: { interval: 'month' },
|
|
392
|
-
product_data: {
|
|
393
|
-
name: 'AI Automation Services',
|
|
394
|
-
description: `Monthly subscription for ${companyName}`
|
|
395
|
-
}
|
|
396
|
-
},
|
|
397
|
-
quantity: 1
|
|
398
|
-
})
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// Validate at least one fee exists
|
|
402
|
-
if (lineItems.length === 0) {
|
|
403
|
-
throw new ToolingError(
|
|
404
|
-
'validation_error',
|
|
405
|
-
'Cannot create payment link: no fees set (both initialFee and monthlyFee are 0)',
|
|
406
|
-
{
|
|
407
|
-
integration: this.name,
|
|
408
|
-
method: 'createAutoPaymentLink',
|
|
409
|
-
organizationId: context?.organizationId
|
|
410
|
-
}
|
|
411
|
-
)
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
const paymentLink = await stripe.paymentLinks.create({
|
|
415
|
-
line_items: lineItems,
|
|
416
|
-
metadata: {
|
|
417
|
-
deal_id: dealId,
|
|
418
|
-
company_name: companyName,
|
|
419
|
-
contact_email: contactEmail
|
|
420
|
-
}
|
|
421
|
-
})
|
|
422
|
-
|
|
423
|
-
// Log success
|
|
424
|
-
if (context?.logger) {
|
|
425
|
-
context.logger.info(
|
|
426
|
-
`[StripeAdapter] Auto payment link created: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id} initialFee=${initialFee} monthlyFee=${monthlyFee}`
|
|
427
|
-
)
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
return {
|
|
431
|
-
paymentLinkId: paymentLink.id,
|
|
432
|
-
url: paymentLink.url,
|
|
433
|
-
hasInitialFee: initialFee > 0,
|
|
434
|
-
hasRecurring: monthlyFee > 0
|
|
435
|
-
}
|
|
436
|
-
} catch (error) {
|
|
437
|
-
throw this.handleStripeError(error, 'createAutoPaymentLink', context)
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Handle Stripe SDK errors and map to ToolingError
|
|
443
|
-
*/
|
|
444
|
-
private handleStripeError(error: unknown, method: string, context?: ExecutionContext): ToolingError {
|
|
445
|
-
// Type guard for Stripe errors
|
|
446
|
-
const isStripeError = (err: unknown): err is Stripe.errors.StripeError => {
|
|
447
|
-
return err instanceof Error && 'type' in err && typeof (err as Stripe.errors.StripeError).type === 'string'
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
// Handle Stripe-specific errors by checking error type
|
|
451
|
-
if (isStripeError(error)) {
|
|
452
|
-
const stripeError = error
|
|
453
|
-
|
|
454
|
-
// Map Stripe error types to ToolingError types
|
|
455
|
-
switch (stripeError.type) {
|
|
456
|
-
case 'StripeAuthenticationError':
|
|
457
|
-
return new ToolingError('auth_error', `Stripe authentication failed: ${stripeError.message}`, {
|
|
458
|
-
integration: this.name,
|
|
459
|
-
method,
|
|
460
|
-
organizationId: context?.organizationId,
|
|
461
|
-
stripeCode: stripeError.code
|
|
462
|
-
})
|
|
463
|
-
|
|
464
|
-
case 'StripeRateLimitError':
|
|
465
|
-
return new ToolingError('rate_limit_exceeded', `Stripe rate limit exceeded: ${stripeError.message}`, {
|
|
466
|
-
integration: this.name,
|
|
467
|
-
method,
|
|
468
|
-
organizationId: context?.organizationId,
|
|
469
|
-
stripeCode: stripeError.code
|
|
470
|
-
})
|
|
471
|
-
|
|
472
|
-
case 'StripeConnectionError':
|
|
473
|
-
return new ToolingError('network_error', `Stripe connection error: ${stripeError.message}`, {
|
|
474
|
-
integration: this.name,
|
|
475
|
-
method,
|
|
476
|
-
organizationId: context?.organizationId,
|
|
477
|
-
stripeCode: stripeError.code
|
|
478
|
-
})
|
|
479
|
-
|
|
480
|
-
case 'StripeInvalidRequestError':
|
|
481
|
-
return new ToolingError('validation_error', `Stripe invalid request: ${stripeError.message}`, {
|
|
482
|
-
integration: this.name,
|
|
483
|
-
method,
|
|
484
|
-
organizationId: context?.organizationId,
|
|
485
|
-
stripeCode: stripeError.code,
|
|
486
|
-
stripeParam: (stripeError as Stripe.errors.StripeInvalidRequestError).param
|
|
487
|
-
})
|
|
488
|
-
|
|
489
|
-
case 'StripeAPIError':
|
|
490
|
-
return new ToolingError('api_error', `Stripe API error: ${stripeError.message}`, {
|
|
491
|
-
integration: this.name,
|
|
492
|
-
method,
|
|
493
|
-
organizationId: context?.organizationId,
|
|
494
|
-
stripeCode: stripeError.code
|
|
495
|
-
})
|
|
496
|
-
|
|
497
|
-
default:
|
|
498
|
-
// Handle other Stripe error types
|
|
499
|
-
return new ToolingError('api_error', `Stripe error: ${stripeError.message}`, {
|
|
500
|
-
integration: this.name,
|
|
501
|
-
method,
|
|
502
|
-
organizationId: context?.organizationId,
|
|
503
|
-
stripeCode: stripeError.code,
|
|
504
|
-
stripeType: stripeError.type
|
|
505
|
-
})
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
// Handle unknown errors
|
|
510
|
-
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
511
|
-
return new ToolingError('unknown_error', `Stripe ${method} failed: ${message}`, {
|
|
512
|
-
integration: this.name,
|
|
513
|
-
method,
|
|
514
|
-
organizationId: context?.organizationId
|
|
515
|
-
})
|
|
516
|
-
}
|
|
517
|
-
}
|
|
1
|
+
import type Stripe from 'stripe'
|
|
2
|
+
import type { BaseIntegrationAdapter } from '../../../base-integration-adapter'
|
|
3
|
+
import { ToolingError } from '../../../../types'
|
|
4
|
+
import type { ExecutionContext } from '../../../../../base/types'
|
|
5
|
+
import type {
|
|
6
|
+
StripeCredentials,
|
|
7
|
+
CreatePaymentLinkParams,
|
|
8
|
+
CreatePaymentLinkResult,
|
|
9
|
+
GetPaymentLinkParams,
|
|
10
|
+
GetPaymentLinkResult,
|
|
11
|
+
UpdatePaymentLinkParams,
|
|
12
|
+
UpdatePaymentLinkResult,
|
|
13
|
+
ListPaymentLinksParams,
|
|
14
|
+
ListPaymentLinksResult,
|
|
15
|
+
CreateCheckoutSessionParams,
|
|
16
|
+
CreateCheckoutSessionResult,
|
|
17
|
+
CreateAutoPaymentLinkParams,
|
|
18
|
+
CreateAutoPaymentLinkResult
|
|
19
|
+
} from './fetch/utils/types'
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Stripe API version
|
|
23
|
+
* Using latest stable version with Payment Links support
|
|
24
|
+
*/
|
|
25
|
+
const STRIPE_API_VERSION = '2026-01-28.clover' as const
|
|
26
|
+
|
|
27
|
+
// Lazy-loaded Stripe client to avoid eager loading issues in Docker
|
|
28
|
+
let stripeModule: typeof import('stripe') | null = null
|
|
29
|
+
async function getStripeModule(): Promise<typeof import('stripe')> {
|
|
30
|
+
if (!stripeModule) {
|
|
31
|
+
stripeModule = await import('stripe')
|
|
32
|
+
}
|
|
33
|
+
return stripeModule
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Stripe integration adapter
|
|
38
|
+
*
|
|
39
|
+
* Provides access to Stripe Payment Links API for creating and managing
|
|
40
|
+
* payment links programmatically.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```typescript
|
|
44
|
+
* const adapter = new StripeAdapter()
|
|
45
|
+
* const result = await adapter.call(
|
|
46
|
+
* 'createPaymentLink',
|
|
47
|
+
* {
|
|
48
|
+
* priceId: 'price_xxx',
|
|
49
|
+
* quantity: 1,
|
|
50
|
+
* metadata: { dealId: '123' }
|
|
51
|
+
* },
|
|
52
|
+
* { apiKey: 'sk_xxx' },
|
|
53
|
+
* context
|
|
54
|
+
* )
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export class StripeAdapter implements BaseIntegrationAdapter {
|
|
58
|
+
readonly name = 'stripe'
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Create Stripe client with secret key (lazy-loaded)
|
|
62
|
+
*/
|
|
63
|
+
private async createClient(secretKey: string): Promise<Stripe> {
|
|
64
|
+
const { default: StripeClient } = await getStripeModule()
|
|
65
|
+
return new StripeClient(secretKey, {
|
|
66
|
+
apiVersion: STRIPE_API_VERSION,
|
|
67
|
+
typescript: true
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Call Stripe API method
|
|
73
|
+
*/
|
|
74
|
+
async call(
|
|
75
|
+
method: string,
|
|
76
|
+
params: unknown,
|
|
77
|
+
credentials: Record<string, unknown>,
|
|
78
|
+
context?: ExecutionContext
|
|
79
|
+
): Promise<unknown> {
|
|
80
|
+
// Validate credentials first
|
|
81
|
+
if (!this.validateCredentials(credentials)) {
|
|
82
|
+
throw new ToolingError('credentials_invalid', 'Invalid Stripe credentials', {
|
|
83
|
+
integration: this.name,
|
|
84
|
+
organizationId: context?.organizationId
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Safe to cast after validation confirms apiKey exists and is valid
|
|
89
|
+
const creds = credentials as unknown as StripeCredentials
|
|
90
|
+
const stripe = await this.createClient(creds.apiKey)
|
|
91
|
+
|
|
92
|
+
// Route to method handler
|
|
93
|
+
switch (method) {
|
|
94
|
+
case 'createPaymentLink':
|
|
95
|
+
return this.createPaymentLink(stripe, params as CreatePaymentLinkParams, context)
|
|
96
|
+
case 'getPaymentLink':
|
|
97
|
+
return this.getPaymentLink(stripe, params as GetPaymentLinkParams, context)
|
|
98
|
+
case 'updatePaymentLink':
|
|
99
|
+
return this.updatePaymentLink(stripe, params as UpdatePaymentLinkParams, context)
|
|
100
|
+
case 'listPaymentLinks':
|
|
101
|
+
return this.listPaymentLinks(stripe, params as ListPaymentLinksParams, context)
|
|
102
|
+
case 'createCheckoutSession':
|
|
103
|
+
return this.createCheckoutSession(stripe, params as CreateCheckoutSessionParams, context)
|
|
104
|
+
case 'createAutoPaymentLink':
|
|
105
|
+
return this.createAutoPaymentLink(stripe, params as CreateAutoPaymentLinkParams, context)
|
|
106
|
+
default:
|
|
107
|
+
throw new ToolingError('method_not_found', `Unknown Stripe method: ${method}`, {
|
|
108
|
+
integration: this.name,
|
|
109
|
+
method,
|
|
110
|
+
organizationId: context?.organizationId
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Validate Stripe credentials
|
|
117
|
+
*/
|
|
118
|
+
validateCredentials(credentials: Record<string, unknown>): boolean {
|
|
119
|
+
const creds = credentials as unknown as StripeCredentials
|
|
120
|
+
// Require API key (should start with 'sk_')
|
|
121
|
+
return !!creds.apiKey && typeof creds.apiKey === 'string' && creds.apiKey.startsWith('sk_')
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Create a payment link
|
|
126
|
+
*/
|
|
127
|
+
private async createPaymentLink(
|
|
128
|
+
stripe: Stripe,
|
|
129
|
+
params: CreatePaymentLinkParams,
|
|
130
|
+
context?: ExecutionContext
|
|
131
|
+
): Promise<CreatePaymentLinkResult> {
|
|
132
|
+
try {
|
|
133
|
+
// Build line items
|
|
134
|
+
const lineItems: Stripe.PaymentLinkCreateParams.LineItem[] = [
|
|
135
|
+
{
|
|
136
|
+
price: params.priceId,
|
|
137
|
+
quantity: params.quantity ?? 1
|
|
138
|
+
}
|
|
139
|
+
]
|
|
140
|
+
|
|
141
|
+
// Build after_completion config
|
|
142
|
+
let afterCompletion: Stripe.PaymentLinkCreateParams.AfterCompletion | undefined
|
|
143
|
+
if (params.afterCompletionType === 'redirect' && params.redirectUrl) {
|
|
144
|
+
afterCompletion = {
|
|
145
|
+
type: 'redirect',
|
|
146
|
+
redirect: { url: params.redirectUrl }
|
|
147
|
+
}
|
|
148
|
+
} else if (params.afterCompletionType === 'hosted_confirmation') {
|
|
149
|
+
afterCompletion = {
|
|
150
|
+
type: 'hosted_confirmation'
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Build create params
|
|
155
|
+
const createParams: Stripe.PaymentLinkCreateParams = {
|
|
156
|
+
line_items: lineItems,
|
|
157
|
+
...(params.metadata && { metadata: params.metadata }),
|
|
158
|
+
...(afterCompletion && { after_completion: afterCompletion }),
|
|
159
|
+
...(params.allowPromotionCodes !== undefined && {
|
|
160
|
+
allow_promotion_codes: params.allowPromotionCodes
|
|
161
|
+
}),
|
|
162
|
+
...(params.automaticTax !== undefined && {
|
|
163
|
+
automatic_tax: { enabled: params.automaticTax }
|
|
164
|
+
}),
|
|
165
|
+
...(params.billingAddressCollection && {
|
|
166
|
+
billing_address_collection: params.billingAddressCollection
|
|
167
|
+
}),
|
|
168
|
+
...(params.invoiceCreation !== undefined && {
|
|
169
|
+
invoice_creation: { enabled: params.invoiceCreation }
|
|
170
|
+
})
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const paymentLink = await stripe.paymentLinks.create(createParams)
|
|
174
|
+
|
|
175
|
+
// Log success
|
|
176
|
+
if (context?.logger) {
|
|
177
|
+
context.logger.info(
|
|
178
|
+
`[StripeAdapter] Payment link created: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
179
|
+
)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
id: paymentLink.id,
|
|
184
|
+
url: paymentLink.url,
|
|
185
|
+
active: paymentLink.active,
|
|
186
|
+
livemode: paymentLink.livemode
|
|
187
|
+
}
|
|
188
|
+
} catch (error) {
|
|
189
|
+
throw this.handleStripeError(error, 'createPaymentLink', context)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Get a payment link by ID
|
|
195
|
+
*/
|
|
196
|
+
private async getPaymentLink(
|
|
197
|
+
stripe: Stripe,
|
|
198
|
+
params: GetPaymentLinkParams,
|
|
199
|
+
context?: ExecutionContext
|
|
200
|
+
): Promise<GetPaymentLinkResult> {
|
|
201
|
+
try {
|
|
202
|
+
const paymentLink = await stripe.paymentLinks.retrieve(params.paymentLinkId)
|
|
203
|
+
|
|
204
|
+
// Log success
|
|
205
|
+
if (context?.logger) {
|
|
206
|
+
context.logger.info(
|
|
207
|
+
`[StripeAdapter] Payment link retrieved: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
id: paymentLink.id,
|
|
213
|
+
url: paymentLink.url,
|
|
214
|
+
active: paymentLink.active,
|
|
215
|
+
livemode: paymentLink.livemode,
|
|
216
|
+
metadata: (paymentLink.metadata as Record<string, string>) ?? {}
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
throw this.handleStripeError(error, 'getPaymentLink', context)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Update a payment link
|
|
225
|
+
*/
|
|
226
|
+
private async updatePaymentLink(
|
|
227
|
+
stripe: Stripe,
|
|
228
|
+
params: UpdatePaymentLinkParams,
|
|
229
|
+
context?: ExecutionContext
|
|
230
|
+
): Promise<UpdatePaymentLinkResult> {
|
|
231
|
+
try {
|
|
232
|
+
const updateParams: Stripe.PaymentLinkUpdateParams = {
|
|
233
|
+
...(params.active !== undefined && { active: params.active }),
|
|
234
|
+
...(params.metadata && { metadata: params.metadata })
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const paymentLink = await stripe.paymentLinks.update(params.paymentLinkId, updateParams)
|
|
238
|
+
|
|
239
|
+
// Log success
|
|
240
|
+
if (context?.logger) {
|
|
241
|
+
context.logger.info(
|
|
242
|
+
`[StripeAdapter] Payment link updated: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id}`
|
|
243
|
+
)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return {
|
|
247
|
+
id: paymentLink.id,
|
|
248
|
+
active: paymentLink.active,
|
|
249
|
+
url: paymentLink.url
|
|
250
|
+
}
|
|
251
|
+
} catch (error) {
|
|
252
|
+
throw this.handleStripeError(error, 'updatePaymentLink', context)
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* List payment links
|
|
258
|
+
*/
|
|
259
|
+
private async listPaymentLinks(
|
|
260
|
+
stripe: Stripe,
|
|
261
|
+
params: ListPaymentLinksParams,
|
|
262
|
+
context?: ExecutionContext
|
|
263
|
+
): Promise<ListPaymentLinksResult> {
|
|
264
|
+
try {
|
|
265
|
+
const listParams: Stripe.PaymentLinkListParams = {
|
|
266
|
+
limit: params.limit ?? 10,
|
|
267
|
+
...(params.active !== undefined && { active: params.active }),
|
|
268
|
+
...(params.startingAfter && { starting_after: params.startingAfter }),
|
|
269
|
+
...(params.endingBefore && { ending_before: params.endingBefore })
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const response = await stripe.paymentLinks.list(listParams)
|
|
273
|
+
|
|
274
|
+
// Log success
|
|
275
|
+
if (context?.logger) {
|
|
276
|
+
context.logger.info(
|
|
277
|
+
`[StripeAdapter] Payment links listed: organizationId=${context.organizationId} executionId=${context.executionId} count=${response.data.length}`
|
|
278
|
+
)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return {
|
|
282
|
+
data: response.data.map((link: Stripe.PaymentLink) => ({
|
|
283
|
+
id: link.id,
|
|
284
|
+
url: link.url,
|
|
285
|
+
active: link.active,
|
|
286
|
+
metadata: (link.metadata as Record<string, string>) ?? {}
|
|
287
|
+
})),
|
|
288
|
+
hasMore: response.has_more
|
|
289
|
+
}
|
|
290
|
+
} catch (error) {
|
|
291
|
+
throw this.handleStripeError(error, 'listPaymentLinks', context)
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Create a checkout session for custom/variable pricing
|
|
297
|
+
*
|
|
298
|
+
* Uses price_data instead of a pre-defined price ID, allowing any amount
|
|
299
|
+
* to be specified. The session URL expires in 24 hours.
|
|
300
|
+
*/
|
|
301
|
+
private async createCheckoutSession(
|
|
302
|
+
stripe: Stripe,
|
|
303
|
+
params: CreateCheckoutSessionParams,
|
|
304
|
+
context?: ExecutionContext
|
|
305
|
+
): Promise<CreateCheckoutSessionResult> {
|
|
306
|
+
try {
|
|
307
|
+
const session = await stripe.checkout.sessions.create({
|
|
308
|
+
mode: 'payment',
|
|
309
|
+
line_items: [
|
|
310
|
+
{
|
|
311
|
+
price_data: {
|
|
312
|
+
currency: params.currency ?? 'usd',
|
|
313
|
+
unit_amount: params.amount,
|
|
314
|
+
product_data: {
|
|
315
|
+
name: params.productName ?? 'AI Automation Services',
|
|
316
|
+
...(params.productDescription && { description: params.productDescription })
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
quantity: 1
|
|
320
|
+
}
|
|
321
|
+
],
|
|
322
|
+
...(params.metadata && { metadata: params.metadata }),
|
|
323
|
+
success_url: params.successUrl,
|
|
324
|
+
cancel_url: params.cancelUrl,
|
|
325
|
+
...(params.customerEmail && { customer_email: params.customerEmail })
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
// Log success
|
|
329
|
+
if (context?.logger) {
|
|
330
|
+
context.logger.info(
|
|
331
|
+
`[StripeAdapter] Checkout session created: organizationId=${context.organizationId} executionId=${context.executionId} sessionId=${session.id}`
|
|
332
|
+
)
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
id: session.id,
|
|
337
|
+
url: session.url!,
|
|
338
|
+
expiresAt: session.expires_at
|
|
339
|
+
}
|
|
340
|
+
} catch (error) {
|
|
341
|
+
throw this.handleStripeError(error, 'createCheckoutSession', context)
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Create a payment link with inline price_data (dynamic pricing)
|
|
347
|
+
*
|
|
348
|
+
* Supports both one-time and recurring fees in a single payment link.
|
|
349
|
+
* URLs never expire - same link can be used in all reminder emails.
|
|
350
|
+
*/
|
|
351
|
+
private async createAutoPaymentLink(
|
|
352
|
+
stripe: Stripe,
|
|
353
|
+
params: CreateAutoPaymentLinkParams,
|
|
354
|
+
context?: ExecutionContext
|
|
355
|
+
): Promise<CreateAutoPaymentLinkResult> {
|
|
356
|
+
try {
|
|
357
|
+
const { dealId, companyName, contactEmail, initialFee, monthlyFee } = params
|
|
358
|
+
|
|
359
|
+
// Build line items with inline price_data
|
|
360
|
+
const lineItems: Array<{
|
|
361
|
+
price_data: {
|
|
362
|
+
currency: string
|
|
363
|
+
unit_amount: number
|
|
364
|
+
recurring?: { interval: 'month' }
|
|
365
|
+
product_data: { name: string; description?: string }
|
|
366
|
+
}
|
|
367
|
+
quantity: number
|
|
368
|
+
}> = []
|
|
369
|
+
|
|
370
|
+
// One-time setup fee (if > 0)
|
|
371
|
+
if (initialFee > 0) {
|
|
372
|
+
lineItems.push({
|
|
373
|
+
price_data: {
|
|
374
|
+
currency: 'usd',
|
|
375
|
+
unit_amount: initialFee * 100, // Convert dollars to cents
|
|
376
|
+
product_data: {
|
|
377
|
+
name: 'Implementation Fee',
|
|
378
|
+
description: `One-time setup for ${companyName}`
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
quantity: 1
|
|
382
|
+
})
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Recurring monthly fee (if > 0)
|
|
386
|
+
if (monthlyFee > 0) {
|
|
387
|
+
lineItems.push({
|
|
388
|
+
price_data: {
|
|
389
|
+
currency: 'usd',
|
|
390
|
+
unit_amount: monthlyFee * 100, // Convert dollars to cents
|
|
391
|
+
recurring: { interval: 'month' },
|
|
392
|
+
product_data: {
|
|
393
|
+
name: 'AI Automation Services',
|
|
394
|
+
description: `Monthly subscription for ${companyName}`
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
quantity: 1
|
|
398
|
+
})
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Validate at least one fee exists
|
|
402
|
+
if (lineItems.length === 0) {
|
|
403
|
+
throw new ToolingError(
|
|
404
|
+
'validation_error',
|
|
405
|
+
'Cannot create payment link: no fees set (both initialFee and monthlyFee are 0)',
|
|
406
|
+
{
|
|
407
|
+
integration: this.name,
|
|
408
|
+
method: 'createAutoPaymentLink',
|
|
409
|
+
organizationId: context?.organizationId
|
|
410
|
+
}
|
|
411
|
+
)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const paymentLink = await stripe.paymentLinks.create({
|
|
415
|
+
line_items: lineItems,
|
|
416
|
+
metadata: {
|
|
417
|
+
deal_id: dealId,
|
|
418
|
+
company_name: companyName,
|
|
419
|
+
contact_email: contactEmail
|
|
420
|
+
}
|
|
421
|
+
})
|
|
422
|
+
|
|
423
|
+
// Log success
|
|
424
|
+
if (context?.logger) {
|
|
425
|
+
context.logger.info(
|
|
426
|
+
`[StripeAdapter] Auto payment link created: organizationId=${context.organizationId} executionId=${context.executionId} paymentLinkId=${paymentLink.id} initialFee=${initialFee} monthlyFee=${monthlyFee}`
|
|
427
|
+
)
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
return {
|
|
431
|
+
paymentLinkId: paymentLink.id,
|
|
432
|
+
url: paymentLink.url,
|
|
433
|
+
hasInitialFee: initialFee > 0,
|
|
434
|
+
hasRecurring: monthlyFee > 0
|
|
435
|
+
}
|
|
436
|
+
} catch (error) {
|
|
437
|
+
throw this.handleStripeError(error, 'createAutoPaymentLink', context)
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Handle Stripe SDK errors and map to ToolingError
|
|
443
|
+
*/
|
|
444
|
+
private handleStripeError(error: unknown, method: string, context?: ExecutionContext): ToolingError {
|
|
445
|
+
// Type guard for Stripe errors
|
|
446
|
+
const isStripeError = (err: unknown): err is Stripe.errors.StripeError => {
|
|
447
|
+
return err instanceof Error && 'type' in err && typeof (err as Stripe.errors.StripeError).type === 'string'
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// Handle Stripe-specific errors by checking error type
|
|
451
|
+
if (isStripeError(error)) {
|
|
452
|
+
const stripeError = error
|
|
453
|
+
|
|
454
|
+
// Map Stripe error types to ToolingError types
|
|
455
|
+
switch (stripeError.type) {
|
|
456
|
+
case 'StripeAuthenticationError':
|
|
457
|
+
return new ToolingError('auth_error', `Stripe authentication failed: ${stripeError.message}`, {
|
|
458
|
+
integration: this.name,
|
|
459
|
+
method,
|
|
460
|
+
organizationId: context?.organizationId,
|
|
461
|
+
stripeCode: stripeError.code
|
|
462
|
+
})
|
|
463
|
+
|
|
464
|
+
case 'StripeRateLimitError':
|
|
465
|
+
return new ToolingError('rate_limit_exceeded', `Stripe rate limit exceeded: ${stripeError.message}`, {
|
|
466
|
+
integration: this.name,
|
|
467
|
+
method,
|
|
468
|
+
organizationId: context?.organizationId,
|
|
469
|
+
stripeCode: stripeError.code
|
|
470
|
+
})
|
|
471
|
+
|
|
472
|
+
case 'StripeConnectionError':
|
|
473
|
+
return new ToolingError('network_error', `Stripe connection error: ${stripeError.message}`, {
|
|
474
|
+
integration: this.name,
|
|
475
|
+
method,
|
|
476
|
+
organizationId: context?.organizationId,
|
|
477
|
+
stripeCode: stripeError.code
|
|
478
|
+
})
|
|
479
|
+
|
|
480
|
+
case 'StripeInvalidRequestError':
|
|
481
|
+
return new ToolingError('validation_error', `Stripe invalid request: ${stripeError.message}`, {
|
|
482
|
+
integration: this.name,
|
|
483
|
+
method,
|
|
484
|
+
organizationId: context?.organizationId,
|
|
485
|
+
stripeCode: stripeError.code,
|
|
486
|
+
stripeParam: (stripeError as Stripe.errors.StripeInvalidRequestError).param
|
|
487
|
+
})
|
|
488
|
+
|
|
489
|
+
case 'StripeAPIError':
|
|
490
|
+
return new ToolingError('api_error', `Stripe API error: ${stripeError.message}`, {
|
|
491
|
+
integration: this.name,
|
|
492
|
+
method,
|
|
493
|
+
organizationId: context?.organizationId,
|
|
494
|
+
stripeCode: stripeError.code
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
default:
|
|
498
|
+
// Handle other Stripe error types
|
|
499
|
+
return new ToolingError('api_error', `Stripe error: ${stripeError.message}`, {
|
|
500
|
+
integration: this.name,
|
|
501
|
+
method,
|
|
502
|
+
organizationId: context?.organizationId,
|
|
503
|
+
stripeCode: stripeError.code,
|
|
504
|
+
stripeType: stripeError.type
|
|
505
|
+
})
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Handle unknown errors
|
|
510
|
+
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
511
|
+
return new ToolingError('unknown_error', `Stripe ${method} failed: ${message}`, {
|
|
512
|
+
integration: this.name,
|
|
513
|
+
method,
|
|
514
|
+
organizationId: context?.organizationId
|
|
515
|
+
})
|
|
516
|
+
}
|
|
517
|
+
}
|