@zackbart/connecta 0.34.1 → 0.35.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/CHANGELOG.md +363 -0
- package/README.md +62 -106
- package/SECURITY.md +3 -2
- package/bin/connecta.mjs +41 -16
- package/bin/version.mjs +1 -1
- package/dist/access-tokens.d.ts +2 -1
- package/dist/access-tokens.js +66 -30
- package/dist/activity.d.ts +1 -1
- package/dist/activity.js +2 -0
- package/dist/agent-config.d.ts +23 -0
- package/dist/agent-config.js +59 -0
- package/dist/agent-description.js +16 -0
- package/dist/agent-identity.js +4 -4
- package/dist/agent-observation.js +39 -0
- package/dist/auth/clerk-sdk/client.d.ts +2 -0
- package/dist/auth/clerk-sdk/generated.js +554 -563
- package/dist/auth/clerk-transport.js +70 -3
- package/dist/auth/clerk.d.ts +13 -0
- package/dist/auth/clerk.js +653 -246
- package/dist/auth/cloudflare-access.js +46 -42
- package/dist/auth/downstream-client-metadata.js +2 -2
- package/dist/auth/downstream-oauth.js +2051 -1160
- package/dist/auth/downstream-revocation.js +88 -88
- package/dist/auth/native-call.js +20 -0
- package/dist/auth/native.js +184 -0
- package/dist/auth/oauth-start-reset.js +11 -5
- package/dist/auth/oauth-token-response.js +121 -102
- package/dist/auth/oauth-v2-migration.js +97 -78
- package/dist/auth/renewable-grant.js +10 -0
- package/dist/auth/static-oauth.js +663 -271
- package/dist/auth/vercel-agent.js +266 -0
- package/dist/auth-admission.js +204 -0
- package/dist/auth-elicitation.js +350 -241
- package/dist/authorization-handoff.js +164 -90
- package/dist/call-admission-context.js +3 -10
- package/dist/call-admission.js +2 -0
- package/dist/call-classification.js +9 -0
- package/dist/call-recovery.js +32 -13
- package/dist/canonical-json.js +8 -0
- package/dist/catalog-cache.js +369 -213
- package/dist/catalog-service.js +659 -530
- package/dist/catalog.js +5 -1
- package/dist/concurrency.js +0 -25
- package/dist/config-defaults.d.ts +1 -0
- package/dist/config-defaults.js +1 -0
- package/dist/config-schema.d.ts +3 -1
- package/dist/config-schema.js +13 -3
- package/dist/config.d.ts +40 -6
- package/dist/config.js +40 -26
- package/dist/connector-caller.d.ts +4 -0
- package/dist/connector-caller.js +17 -4
- package/dist/connectors/api-connector.d.ts +12 -7
- package/dist/connectors/api-connector.js +142 -56
- package/dist/connectors/guarded-fetch.d.ts +51 -17
- package/dist/connectors/guarded-fetch.js +215 -121
- package/dist/connectors/negotiation-cache.js +20 -10
- package/dist/connectors/remote-mcp.d.ts +10 -30
- package/dist/connectors/remote-mcp.js +955 -563
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +3 -1
- package/dist/describe-config.js +2 -0
- package/dist/downstream-input.js +347 -260
- package/dist/errors.d.ts +87 -6
- package/dist/errors.js +114 -4
- package/dist/execute.js +87 -50
- package/dist/executor-admission.js +3 -0
- package/dist/executors/quickjs.js +163 -112
- package/dist/guarded-transport.js +50 -0
- package/dist/guest-runtime.js +1 -1
- package/dist/http/client.js +439 -0
- package/dist/http/errors.js +558 -0
- package/dist/http/fields.js +49 -0
- package/dist/http/hatch-paging.js +318 -0
- package/dist/http/hatch.js +1279 -0
- package/dist/http/json-schema.js +267 -0
- package/dist/http/node-transport.js +241 -0
- package/dist/http/oauth.js +162 -0
- package/dist/http/paging.js +228 -0
- package/dist/http/provider.js +221 -0
- package/dist/http/safety.js +82 -0
- package/dist/http/services.js +79 -0
- package/dist/http/tools.js +383 -0
- package/dist/http/vendor-index.js +138 -0
- package/dist/http/vendor.js +448 -0
- package/dist/http/write-request.js +66 -0
- package/dist/http-policy.d.ts +11 -0
- package/dist/http-policy.js +45 -0
- package/dist/inbound-credential.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -0
- package/dist/invocation-auth.js +30 -19
- package/dist/invocation.js +218 -85
- package/dist/mcp-result.js +0 -4
- package/dist/membership.d.ts +4 -0
- package/dist/meta-output.js +1 -1
- package/dist/meta-tools.js +531 -406
- package/dist/native-recovery.js +52 -0
- package/dist/native-tools.js +382 -0
- package/dist/node.d.ts +4 -3
- package/dist/node.js +45 -8
- package/dist/oauth-handoff.js +177 -104
- package/dist/oauth-partition.js +6 -20
- package/dist/oauth-sealing.js +6 -7
- package/dist/operation-vocabulary.js +101 -0
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +17 -4
- package/dist/operator-ui/agents.d.ts +5 -4
- package/dist/operator-ui/agents.js +17 -7
- package/dist/operator-ui/config-summary.js +5 -4
- package/dist/operator-ui/connection-map.js +7 -5
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +4 -13
- package/dist/operator-ui/fix-prompts.d.ts +1 -1
- package/dist/operator-ui/fix-prompts.js +0 -8
- package/dist/operator-ui/generated.js +3 -3
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +5 -2
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +2 -25
- package/dist/operator-ui/view.js +2 -76
- package/dist/program-writes.js +47 -26
- package/dist/provider-call-facts.d.ts +115 -0
- package/dist/provider-call-facts.js +182 -0
- package/dist/provider-call.d.ts +112 -0
- package/dist/provider-call.js +271 -0
- package/dist/provider.d.ts +65 -31
- package/dist/provider.js +116 -39
- package/dist/providers/_shared/google/hatch.js +91 -0
- package/dist/providers/_shared/google/kit.js +537 -0
- package/dist/providers/_shared/google/result-size.js +15 -2
- package/dist/providers/_shared/google/service-account.d.ts +2 -1
- package/dist/providers/_shared/google/service-account.js +8 -4
- package/dist/providers/_shared/google/workspace.d.ts +6 -210
- package/dist/providers/_shared/google/workspace.js +6 -425
- package/dist/providers/_shared/rest/compact-index.js +86 -0
- package/dist/providers/_shared/rest/dispatch.js +3 -23
- package/dist/providers/_shared/rest/kit.js +546 -0
- package/dist/providers/_shared/rest/operation-index.js +230 -14
- package/dist/providers/_shared/rest/response-media.js +11 -0
- package/dist/providers/_shared/rest/tools.js +101 -78
- package/dist/providers/_shared/rest/value-safety.js +353 -195
- package/dist/providers/_shared/sensitive-fields.js +27 -0
- package/dist/providers/breeze/api.js +584 -0
- package/dist/providers/breeze/index.d.ts +1 -3
- package/dist/providers/breeze/index.js +67 -1420
- package/dist/providers/breeze/openapi.generated.js +60 -0
- package/dist/providers/breeze/skill.generated.js +2 -6
- package/dist/providers/breeze/tools.js +696 -0
- package/dist/providers/ccb/api.js +496 -0
- package/dist/providers/ccb/index.d.ts +15 -37
- package/dist/providers/ccb/index.js +77 -1702
- package/dist/providers/ccb/lib/constants.d.ts +34 -0
- package/dist/providers/ccb/lib/constants.js +74 -0
- package/dist/providers/ccb/lib/guide.js +9 -0
- package/dist/providers/ccb/lib/verdicts.js +387 -0
- package/dist/providers/ccb/openapi.generated.js +397 -0
- package/dist/providers/ccb/safety.js +295 -0
- package/dist/providers/ccb/skill.generated.js +2 -6
- package/dist/providers/ccb/tools.js +853 -0
- package/dist/providers/cloudflare/api.js +1066 -0
- package/dist/providers/cloudflare/index.d.ts +5 -22
- package/dist/providers/cloudflare/index.js +79 -197
- package/dist/providers/cloudflare/lib/config.d.ts +16 -0
- package/dist/providers/cloudflare/lib/config.js +2 -0
- package/dist/providers/cloudflare/lib/discovery.js +29 -0
- package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
- package/dist/providers/cloudflare/lib/hatch.js +103 -0
- package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
- package/dist/providers/cloudflare/lib/response-media.js +75 -0
- package/dist/providers/cloudflare/openapi.generated.js +4 -3
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
- package/dist/providers/cloudflare/skill.generated.js +2 -10
- package/dist/providers/cloudflare/tools.js +360 -0
- package/dist/providers/docs/api.js +51 -0
- package/dist/providers/docs/index.d.ts +1 -12
- package/dist/providers/docs/index.js +53 -1165
- package/dist/providers/docs/lib/constants.d.ts +18 -0
- package/dist/providers/docs/lib/constants.js +18 -0
- package/dist/providers/docs/lib/discovery.js +26 -0
- package/dist/providers/docs/lib/requests.js +48 -0
- package/dist/providers/docs/lib/schemas.js +168 -0
- package/dist/providers/docs/openapi.generated.js +16 -0
- package/dist/providers/docs/safety.js +54 -0
- package/dist/providers/docs/skill.generated.js +2 -6
- package/dist/providers/docs/tools.js +802 -0
- package/dist/providers/drive/api.js +177 -0
- package/dist/providers/drive/index.d.ts +1 -12
- package/dist/providers/drive/index.js +38 -1448
- package/dist/providers/drive/lib/constants.d.ts +6 -0
- package/dist/providers/drive/lib/constants.js +6 -0
- package/dist/providers/drive/lib/contracts.js +532 -0
- package/dist/providers/drive/lib/hatch.js +197 -0
- package/dist/providers/drive/openapi.generated.js +77 -0
- package/dist/providers/drive/safety.js +90 -0
- package/dist/providers/drive/skill.generated.js +2 -6
- package/dist/providers/drive/tools.js +1290 -0
- package/dist/providers/forms/api.js +71 -0
- package/dist/providers/forms/index.d.ts +1 -12
- package/dist/providers/forms/index.js +49 -1145
- package/dist/providers/forms/lib/constants.d.ts +14 -0
- package/dist/providers/forms/lib/constants.js +19 -0
- package/dist/providers/forms/lib/hatch.js +72 -0
- package/dist/providers/forms/openapi.generated.js +23 -0
- package/dist/providers/forms/safety.js +34 -0
- package/dist/providers/forms/skill.generated.js +2 -8
- package/dist/providers/forms/tools.js +1024 -0
- package/dist/providers/github/api.js +150 -0
- package/dist/providers/github/index.d.ts +4 -5
- package/dist/providers/github/index.js +30 -87
- package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
- package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
- package/dist/providers/github/lib/discovery.js +132 -0
- package/dist/providers/github/lib/operations.js +58 -0
- package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
- package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
- package/dist/providers/github/openapi.generated.js +1216 -0
- package/dist/providers/github/safety.js +216 -0
- package/dist/providers/github/skill.generated.js +2 -5
- package/dist/providers/github/tools.js +506 -0
- package/dist/providers/gmail/api.js +114 -0
- package/dist/providers/gmail/index.d.ts +1 -12
- package/dist/providers/gmail/index.js +73 -1621
- package/dist/providers/gmail/lib/constants.d.ts +13 -0
- package/dist/providers/gmail/lib/constants.js +16 -0
- package/dist/providers/gmail/lib/index.js +173 -0
- package/dist/providers/gmail/lib/schemas.js +176 -0
- package/dist/providers/gmail/lib/threading.js +120 -0
- package/dist/providers/gmail/openapi.generated.js +92 -0
- package/dist/providers/gmail/safety.js +21 -0
- package/dist/providers/gmail/skill.generated.js +2 -6
- package/dist/providers/gmail/tools.js +1435 -0
- package/dist/providers/overflow/api.js +1008 -0
- package/dist/providers/overflow/index.d.ts +1 -17
- package/dist/providers/overflow/index.js +60 -1488
- package/dist/providers/overflow/skill.generated.js +2 -5
- package/dist/providers/overflow/tools.js +873 -0
- package/dist/providers/planning-center/api.js +467 -0
- package/dist/providers/planning-center/index.d.ts +4 -35
- package/dist/providers/planning-center/index.js +69 -2445
- package/dist/providers/planning-center/lib/constants.d.ts +58 -0
- package/dist/providers/planning-center/lib/constants.js +83 -0
- package/dist/providers/planning-center/lib/discovery.js +40 -0
- package/dist/providers/planning-center/lib/guide.js +39 -0
- package/dist/providers/planning-center/lib/json-api.js +83 -0
- package/dist/providers/planning-center/lib/verdicts.js +1758 -0
- package/dist/providers/planning-center/openapi.generated.js +1764 -0
- package/dist/providers/planning-center/safety.js +188 -0
- package/dist/providers/planning-center/skill.generated.js +2 -27
- package/dist/providers/planning-center/tools.js +1010 -0
- package/dist/providers/sheets/api.js +133 -0
- package/dist/providers/sheets/index.d.ts +4 -16
- package/dist/providers/sheets/index.js +61 -1172
- package/dist/providers/sheets/lib/constants.d.ts +14 -0
- package/dist/providers/sheets/lib/constants.js +14 -0
- package/dist/providers/sheets/lib/hatch.js +163 -0
- package/dist/providers/sheets/lib/requests.js +105 -0
- package/dist/providers/sheets/lib/schemas.js +138 -0
- package/dist/providers/sheets/openapi.generated.js +30 -0
- package/dist/providers/sheets/safety.js +27 -0
- package/dist/providers/sheets/skill.generated.js +2 -7
- package/dist/providers/sheets/tools.js +734 -0
- package/dist/providers/slides/api.js +147 -0
- package/dist/providers/slides/index.d.ts +2 -10
- package/dist/providers/slides/index.js +48 -2555
- package/dist/providers/slides/lib/constants.d.ts +11 -0
- package/dist/providers/slides/lib/constants.js +11 -0
- package/dist/providers/slides/lib/requests.js +60 -0
- package/dist/providers/slides/lib/schemas.js +565 -0
- package/dist/providers/slides/openapi.generated.js +18 -0
- package/dist/providers/slides/skill.generated.js +2 -6
- package/dist/providers/slides/tools.js +1968 -0
- package/dist/providers/stripe/api.js +401 -0
- package/dist/providers/stripe/index.d.ts +5 -27
- package/dist/providers/stripe/index.js +74 -210
- package/dist/providers/stripe/lib/config.d.ts +4 -0
- package/dist/providers/stripe/lib/config.js +2 -0
- package/dist/providers/stripe/openapi.generated.js +4 -3
- package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
- package/dist/providers/stripe/skill.generated.js +2 -11
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +17 -0
- package/dist/providers/tithely/index.js +86 -965
- package/dist/providers/tithely/skill.generated.js +2 -5
- package/dist/providers/tithely/tools.js +426 -0
- package/dist/providers/vercel/api.js +551 -0
- package/dist/providers/vercel/index.d.ts +9 -25
- package/dist/providers/vercel/index.js +66 -260
- package/dist/providers/vercel/lib/config.d.ts +2 -0
- package/dist/providers/vercel/lib/config.js +2 -0
- package/dist/providers/vercel/lib/index.js +117 -0
- package/dist/providers/vercel/lib/logs.js +100 -0
- package/dist/providers/vercel/lib/pin.js +270 -0
- package/dist/providers/vercel/openapi.generated.js +10 -5
- package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
- package/dist/providers/vercel/skill.generated.js +2 -7
- package/dist/providers/vercel/tools.js +642 -0
- package/dist/redaction-identity.js +47 -0
- package/dist/redaction-marker.js +125 -0
- package/dist/registry.d.ts +21 -15
- package/dist/registry.js +409 -376
- package/dist/routes/access-tokens.js +1 -1
- package/dist/routes/actor-labels.js +1 -1
- package/dist/routes/connect.js +1 -1
- package/dist/routes/dispatch.js +103 -0
- package/dist/routes/mcp.js +170 -79
- package/dist/routes/oauth.js +3 -1
- package/dist/routes/operator.js +2 -2
- package/dist/routes/shared.d.ts +5 -4
- package/dist/routes/shared.js +244 -177
- package/dist/routes/skills.js +10 -8
- package/dist/routes/ui-config.js +27 -3
- package/dist/routes/ui-data.js +21 -20
- package/dist/routes/ui.js +1 -1
- package/dist/runtime/call-admission.js +0 -26
- package/dist/runtime/call-entry.js +30 -0
- package/dist/runtime/call.js +556 -0
- package/dist/runtime/connector-scope.js +7 -0
- package/dist/runtime/credential-probe.js +34 -0
- package/dist/runtime/executor.js +40 -0
- package/dist/runtime/native-storage.js +63 -0
- package/dist/runtime/registry.js +27 -0
- package/dist/runtime/request-scope.js +72 -0
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/shared-read.js +34 -5
- package/dist/runtime/storage.js +34 -21
- package/dist/sent-secrets.d.ts +194 -37
- package/dist/sent-secrets.js +1743 -340
- package/dist/server.js +5 -56
- package/dist/skills.js +322 -222
- package/dist/sqlite.js +15 -14
- package/dist/storage/d1-copy.js +255 -0
- package/dist/storage/d1-driver.js +15 -0
- package/dist/storage/keys.js +28 -0
- package/dist/storage/sql-driver.js +88 -0
- package/dist/storage/sql-native.js +544 -0
- package/dist/storage/sql-schema.d.ts +6 -0
- package/dist/storage/sql-schema.js +15 -0
- package/dist/storage/sql.d.ts +14 -20
- package/dist/storage/sql.js +29 -535
- package/dist/timeout.js +0 -26
- package/dist/tool-safety.js +20 -10
- package/dist/types.d.ts +7 -109
- package/dist/upward.js +3 -0
- package/dist/usage-guide.js +3 -1
- package/dist/validate.d.ts +4 -2
- package/dist/validate.js +86 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.js +312 -292
- package/dist/workspace-subject.js +5 -1
- package/dist/write-outcome.js +454 -34
- package/documentation/README.md +27 -7
- package/documentation/architecture.md +2547 -226
- package/documentation/auth.md +821 -98
- package/documentation/code-mode.md +49 -16
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +129 -144
- package/documentation/meta-tools.md +409 -32
- package/documentation/operating.md +27 -3
- package/documentation/operator-tests.md +3 -0
- package/documentation/operator-ui.md +68 -45
- package/documentation/provider-auth-migration.md +16 -63
- package/documentation/provider-migration-0.29.md +10 -5
- package/documentation/provider-migration-0.35.md +975 -0
- package/documentation/providers.md +965 -0
- package/examples/worker/AGENTS.md +23 -9
- package/examples/worker/README.md +254 -135
- package/examples/worker/alchemy.run.ts +116 -0
- package/examples/worker/gitignore +10 -0
- package/examples/worker/src/connecta.config.ts +23 -21
- package/examples/worker/wrangler.jsonc +14 -5
- package/guides/connecting-agents.md +157 -0
- package/guides/how-it-works.md +156 -0
- package/guides/safety-and-trust.md +153 -0
- package/package.json +27 -46
- package/templates/node/.env.example +3 -0
- package/templates/node/README.md +22 -2
- package/templates/node/docker-compose.yml +1 -0
- package/templates/node/package.json +3 -2
- package/templates/node/src/connecta.config.ts +8 -0
- package/dist/catalog-drift.d.ts +0 -138
- package/dist/catalog-drift.js +0 -578
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
- package/dist/providers/_shared/rest/tools.d.ts +0 -141
- package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
- package/dist/providers/basecamp/index.d.ts +0 -45
- package/dist/providers/basecamp/index.js +0 -997
- package/dist/providers/basecamp/skill.generated.js +0 -9
- package/dist/providers/cloudflare/rest.d.ts +0 -37
- package/dist/providers/cloudflare/rest.js +0 -1097
- package/dist/providers/github/hosted.js +0 -218
- package/dist/providers/github/rest.js +0 -321
- package/dist/providers/infisical/index.d.ts +0 -7
- package/dist/providers/infisical/index.js +0 -713
- package/dist/providers/infisical/skill.generated.js +0 -8
- package/dist/providers/intercom/index.d.ts +0 -24
- package/dist/providers/intercom/index.js +0 -121
- package/dist/providers/intercom/skill.generated.js +0 -8
- package/dist/providers/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -537
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -59
- package/dist/providers/mixpanel/index.js +0 -472
- package/dist/providers/mixpanel/operations.js +0 -20
- package/dist/providers/mixpanel/rest.js +0 -603
- package/dist/providers/mixpanel/skill.generated.js +0 -10
- package/dist/providers/mixpanel/value-safety.js +0 -16
- package/dist/providers/notion/index.d.ts +0 -67
- package/dist/providers/notion/index.js +0 -368
- package/dist/providers/notion/openapi.generated.js +0 -75
- package/dist/providers/notion/rest.d.ts +0 -24
- package/dist/providers/notion/rest.js +0 -1226
- package/dist/providers/notion/skill.generated.js +0 -11
- package/dist/providers/notion/value-safety.js +0 -56
- package/dist/providers/revenuecat/index.d.ts +0 -51
- package/dist/providers/revenuecat/index.js +0 -697
- package/dist/providers/revenuecat/skill.generated.js +0 -11
- package/dist/providers/stripe/rest.d.ts +0 -14
- package/dist/providers/stripe/rest.js +0 -402
- package/dist/providers/vercel/rest.d.ts +0 -20
- package/dist/providers/vercel/rest.js +0 -1020
- package/dist/providers/wispr-flow/index.d.ts +0 -14
- package/dist/providers/wispr-flow/index.js +0 -117
- package/dist/providers/wispr-flow/skill.generated.js +0 -8
- /package/dist/providers/github/{key.js → lib/key.js} +0 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
// Stripe's pinned contract, auth, error mapping and framing on the provider kit.
|
|
2
|
+
import { Effect, Schema } from "effect";
|
|
3
|
+
import { ConnectorCallError } from "../../errors.js";
|
|
4
|
+
import { Refusal } from "../../http/errors.js";
|
|
5
|
+
import { restSafety, resultSafety } from "../../http/safety.js";
|
|
6
|
+
import { guardedClient } from "../../http/client.js";
|
|
7
|
+
import { Credentials } from "../../http/services.js";
|
|
8
|
+
import { connect, get } from "../../http/vendor.js";
|
|
9
|
+
import { stripePage, stripeBackwardPage, stripeSearchPage, stripeV2Page } from "../../http/hatch-paging.js";
|
|
10
|
+
import { responseMedia } from "../_shared/rest/response-media.js";
|
|
11
|
+
import { OperationIndex } from "../_shared/rest/operation-index.js";
|
|
12
|
+
import { checked, indexedVendor } from "../_shared/rest/kit.js";
|
|
13
|
+
import { valueSafety, refuseWithheldLinks } from "../_shared/rest/value-safety.js";
|
|
14
|
+
import { openapi } from "./openapi.generated.js";
|
|
15
|
+
import { STRIPE_VALUE_SAFETY } from "./safety.js";
|
|
16
|
+
import { STRIPE_API_BASE_URL } from "./lib/config.js";
|
|
17
|
+
import { withholdEmbeddedUrlsIn } from "../_shared/rest/value-safety.js";
|
|
18
|
+
export function record(value) {
|
|
19
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
|
|
20
|
+
}
|
|
21
|
+
export function text(value) {
|
|
22
|
+
return typeof value === "string" && value.trim() !== "" ? value : undefined;
|
|
23
|
+
}
|
|
24
|
+
const LOCK_TIMEOUT = "lock_timeout";
|
|
25
|
+
export const stripeErrors = {
|
|
26
|
+
meanings: {
|
|
27
|
+
unknownId: "not_found",
|
|
28
|
+
provesAbsence: true,
|
|
29
|
+
conflicts: [
|
|
30
|
+
"HTTP 409 when the request conflicts with another request, including a concurrent use of the same idempotency key",
|
|
31
|
+
"HTTP 429 with code lock_timeout when another request holds the object's lock",
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
numericFacts: {
|
|
35
|
+
retryAfterMs: {
|
|
36
|
+
header: "retry-after",
|
|
37
|
+
format: "retry-after",
|
|
38
|
+
review: "HTTP Retry-After delay for failure recovery.",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
authBeforeExecution: {
|
|
42
|
+
evidence: "https://docs.stripe.com/error-low-level#content-errors: invalid API keys are refused before execution on API v1; API replies carry Request-Id.",
|
|
43
|
+
matches: ({ operation, headers }) => operation.template.startsWith("/v1/") && !!headers["request-id"],
|
|
44
|
+
},
|
|
45
|
+
provider: "Stripe",
|
|
46
|
+
factVocabulary: { code: [LOCK_TIMEOUT] },
|
|
47
|
+
facts: (body) => {
|
|
48
|
+
const error = record(record(body)["error"]);
|
|
49
|
+
return {
|
|
50
|
+
type: text(error["type"]),
|
|
51
|
+
code: text(error["code"]),
|
|
52
|
+
declineCode: text(error["decline_code"]),
|
|
53
|
+
param: text(error["param"]),
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
headers: ["request-id", "stripe-rate-limited-reason"],
|
|
57
|
+
detail: ({ status, facts, headers, withheld, body }) => {
|
|
58
|
+
const kind = [facts.type, facts.code, facts.declineCode].filter(Boolean).join(" ");
|
|
59
|
+
const message = withheld
|
|
60
|
+
? "Stripe's message is withheld because this operation handles credentials."
|
|
61
|
+
: (text(record(record(withholdEmbeddedUrlsIn(body))["error"])["message"]) ?? `Stripe returned HTTP ${status}.`);
|
|
62
|
+
const requestId = headers["request-id"];
|
|
63
|
+
return (`Stripe ${kind || `HTTP ${status}`}${facts.param ? ` (param ${facts.param})` : ""}: ` +
|
|
64
|
+
`${message}${requestId ? ` Request ${requestId}.` : ""}`);
|
|
65
|
+
},
|
|
66
|
+
classify: [
|
|
67
|
+
// Stripe did not process the request (docs.stripe.com/rate-limits#object-lock-timeouts):
|
|
68
|
+
// a definite conflict, safe to retry once the other request finishes.
|
|
69
|
+
({ status, facts }) => status === 429 && facts.code === LOCK_TIMEOUT
|
|
70
|
+
? {
|
|
71
|
+
code: "conflict",
|
|
72
|
+
retryable: true,
|
|
73
|
+
retryAfterMs: 1_000,
|
|
74
|
+
words: (detail) => `${detail} Another request is changing this object and Stripe did not process this one. This is a lock conflict, not a rate limit.`,
|
|
75
|
+
advice: " Retry after it finishes.",
|
|
76
|
+
}
|
|
77
|
+
: undefined,
|
|
78
|
+
],
|
|
79
|
+
statuses: {
|
|
80
|
+
429: ({ headers, retryAfterMs }) => {
|
|
81
|
+
const reason = headers["stripe-rate-limited-reason"];
|
|
82
|
+
return {
|
|
83
|
+
code: "rate_limited",
|
|
84
|
+
retryAfterMs: retryAfterMs ?? 1_000,
|
|
85
|
+
words: (detail) => `${detail}${reason ? ` Limited by ${reason}.` : ""}`,
|
|
86
|
+
advice: " Back off before retrying.",
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
401: () => ({
|
|
90
|
+
code: "auth_required",
|
|
91
|
+
words: (detail) => `${detail} The configured Stripe key was rejected; an operator must replace it in this connection.`,
|
|
92
|
+
}),
|
|
93
|
+
403: () => ({
|
|
94
|
+
code: "provider_permission_denied",
|
|
95
|
+
words: (detail) => `${detail} A restricted key lacks this permission; an operator must grant it on the key or use another key.`,
|
|
96
|
+
}),
|
|
97
|
+
404: () => ({ code: "not_found", words: (detail) => `${detail} Resolve the id with a list or search read.` }),
|
|
98
|
+
409: () => ({ code: "conflict" }),
|
|
99
|
+
402: () => ({ code: "connector_call_failed", retryable: false }),
|
|
100
|
+
424: () => ({ code: "unavailable" }),
|
|
101
|
+
},
|
|
102
|
+
unreadable: "Stripe returned malformed JSON.",
|
|
103
|
+
bodyFailures: {
|
|
104
|
+
review: "Stripe HTTP 424 is an external dependency failure, including when its body exceeds the byte ceiling (https://docs.stripe.com/api/errors). A failed body read does not establish malformed JSON; preserve the bounded read phase only.",
|
|
105
|
+
statusOnly: [424],
|
|
106
|
+
readFailed: "Stripe's response body could not be read completely.",
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
const FILES_ORIGIN = "https://files.stripe.com";
|
|
110
|
+
const METER_EVENTS_ORIGIN = "https://meter-events.stripe.com";
|
|
111
|
+
export const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
112
|
+
export const READ_CAP_MS = 60_000;
|
|
113
|
+
/**
|
|
114
|
+
* POSTs that only read, admitted by `stripe_api_read`. `POST
|
|
115
|
+
* /v1/tax/calculations` is deliberately absent: it persists a Calculation
|
|
116
|
+
* object a later Tax Transaction can reference, and Stripe bills each call.
|
|
117
|
+
*/
|
|
118
|
+
export const READ_POSTS = [
|
|
119
|
+
["POST", "/v1/invoices/create_preview", "Computes an upcoming invoice; Stripe persists nothing."],
|
|
120
|
+
];
|
|
121
|
+
function invalid(message) {
|
|
122
|
+
throw new ConnectorCallError("invalid_args", message);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Why this key cannot serve a connector declared for `mode`, or undefined.
|
|
126
|
+
* The key's own prefix carries its mode, so a live key in a sandbox
|
|
127
|
+
* connector (or the reverse) is refused before any request leaves.
|
|
128
|
+
*/
|
|
129
|
+
export function stripeKeyProblem(key, mode) {
|
|
130
|
+
if (/^(?:sk|rk)_org_/.test(key)) {
|
|
131
|
+
return "This is a Stripe organization key, which needs a Stripe-Context header this connector does not send. Use one account's secret or restricted key.";
|
|
132
|
+
}
|
|
133
|
+
if (key.startsWith("pk_")) {
|
|
134
|
+
return "This is a publishable key; the Stripe API needs a secret (sk_) or restricted (rk_) key.";
|
|
135
|
+
}
|
|
136
|
+
const prefix = /^(?:sk|rk)_(live|test)_\S+$/.exec(key);
|
|
137
|
+
if (!prefix)
|
|
138
|
+
return "This is not a Stripe secret (sk_…) or restricted (rk_…) key.";
|
|
139
|
+
const keyMode = prefix[1] === "live" ? "production" : "sandbox";
|
|
140
|
+
if (keyMode !== mode) {
|
|
141
|
+
return `This connector is declared ${mode}, but the configured key is a ${prefix[1]}-mode key.`;
|
|
142
|
+
}
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
/** Flatten one value Stripe's way: `a[b]=`, indexed arrays, `""` to unset. */
|
|
146
|
+
function flatten(key, value, emit, emptyArrays) {
|
|
147
|
+
if (value === undefined)
|
|
148
|
+
return;
|
|
149
|
+
if (value === null || value === "")
|
|
150
|
+
return emit(key, "");
|
|
151
|
+
if (Array.isArray(value)) {
|
|
152
|
+
if (value.length === 0) {
|
|
153
|
+
if (emptyArrays)
|
|
154
|
+
emit(key, "");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
value.forEach((item, index) => flatten(`${key}[${index}]`, item, emit, emptyArrays));
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (typeof value === "object") {
|
|
161
|
+
for (const [name, item] of Object.entries(value))
|
|
162
|
+
flatten(`${key}[${name}]`, item, emit, emptyArrays);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (typeof value === "boolean")
|
|
166
|
+
return emit(key, value ? "true" : "false");
|
|
167
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
168
|
+
return emit(key, String(value));
|
|
169
|
+
if (typeof value === "string")
|
|
170
|
+
return emit(key, value);
|
|
171
|
+
invalid(`Stripe parameter ${key} must be a string, number, boolean, object, list, or null.`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* A v1 form body: nested objects as `a[b]`, arrays indexed `a[0]`, booleans
|
|
175
|
+
* as `true`/`false`, and `null`, `""`, or `[]` as an empty value, which is
|
|
176
|
+
* how Stripe unsets a field.
|
|
177
|
+
*/
|
|
178
|
+
function stripeForm(body) {
|
|
179
|
+
const form = new URLSearchParams();
|
|
180
|
+
for (const [key, value] of Object.entries(body))
|
|
181
|
+
flatten(key, value, (name, item) => form.append(name, item), true);
|
|
182
|
+
return form.toString();
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Query parameters. v1 indexes arrays (`expand[0]=…`) like its bodies; v2
|
|
186
|
+
* repeats the key for a list of scalars (`include=a&include=b`), as Stripe's
|
|
187
|
+
* own libraries do. Objects use brackets in both.
|
|
188
|
+
*/
|
|
189
|
+
function stripeQuery(query, v2) {
|
|
190
|
+
const out = {};
|
|
191
|
+
for (const [key, value] of Object.entries(query)) {
|
|
192
|
+
const scalars = Array.isArray(value) && value.every((item) => ["string", "number", "boolean"].includes(typeof item));
|
|
193
|
+
if (v2 && scalars && value.length > 0) {
|
|
194
|
+
out[key] = value.map((item) => (typeof item === "boolean" ? (item ? "true" : "false") : String(item)));
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
flatten(key, value, (name, item) => (out[name] = item), false);
|
|
198
|
+
}
|
|
199
|
+
return out;
|
|
200
|
+
}
|
|
201
|
+
function expansions(call) {
|
|
202
|
+
const read = (value) => typeof value === "string"
|
|
203
|
+
? [value]
|
|
204
|
+
: Array.isArray(value)
|
|
205
|
+
? value.filter((item) => typeof item === "string")
|
|
206
|
+
: [];
|
|
207
|
+
return [...read(call.query["expand"]), ...read(record(call.body)["expand"])];
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Reviewed refusals that depend on arguments; the value-safety table
|
|
211
|
+
* (`value-safety.ts`) refuses whole operations. Each expansion returns a
|
|
212
|
+
* secret the caller could not otherwise read through Connecta: a Stripe Apps
|
|
213
|
+
* secret's value, or a full Issuing card number or CVC, which an Issuing
|
|
214
|
+
* authorization, transaction, or token can embed as well as the card itself.
|
|
215
|
+
*/
|
|
216
|
+
export function refuse(call) {
|
|
217
|
+
const expanded = expansions(call);
|
|
218
|
+
if (/^\/v1\/apps\/secrets(?:\/|$)/.test(call.path) && expanded.some((path) => /(?:^|\.)payload$/.test(path))) {
|
|
219
|
+
return "Stripe Apps secret values are not returned through Connecta. Read the secret's metadata without expanding payload.";
|
|
220
|
+
}
|
|
221
|
+
if (/^\/v1\/(?:test_helpers\/)?issuing\//.test(call.path) &&
|
|
222
|
+
expanded.some((path) => /(?:^|\.)(?:number|cvc)$/.test(path))) {
|
|
223
|
+
return "Issuing card numbers and CVCs are not expanded through Connecta. Use the card id and last4, or the Stripe Dashboard.";
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
export const stripeIndex = new OperationIndex(openapi, { vendor: "stripe", title: "Stripe" });
|
|
228
|
+
export const stripeSafety = valueSafety(STRIPE_VALUE_SAFETY, () => stripeIndex);
|
|
229
|
+
function operationRefusal(op) {
|
|
230
|
+
return (checkServer(op.server) ??
|
|
231
|
+
stripeSafety.refusal(op.method, op.path) ??
|
|
232
|
+
(/^multipart\/|octet-stream/.test(stripeIndex.bodyType(op) ?? "")
|
|
233
|
+
? `${op.method} ${op.path} takes an upload. Upload files in the Stripe Dashboard; this connector sends no multipart bodies.`
|
|
234
|
+
: undefined));
|
|
235
|
+
}
|
|
236
|
+
export const STRIPE_VERDICTS = Object.fromEntries(stripeIndex.ops.map((op) => [
|
|
237
|
+
`${op.method} ${op.path}`,
|
|
238
|
+
operationRefusal(op)
|
|
239
|
+
? "refuse"
|
|
240
|
+
: op.method === "GET" || READ_POSTS.some(([method, path]) => method === op.method && path === op.path)
|
|
241
|
+
? "read"
|
|
242
|
+
: "destructive",
|
|
243
|
+
]));
|
|
244
|
+
export const STRIPE_PAGES = Object.fromEntries(stripeIndex.ops.flatMap((op) => {
|
|
245
|
+
if (op.method !== "GET" || STRIPE_VERDICTS[`GET ${op.path}`] !== "read")
|
|
246
|
+
return [];
|
|
247
|
+
const parameters = stripeIndex
|
|
248
|
+
.contract(op)
|
|
249
|
+
.parameters.filter((p) => p.in === "query")
|
|
250
|
+
.map((p) => p.name);
|
|
251
|
+
return parameters.includes("starting_after")
|
|
252
|
+
? [[`GET ${op.path}`, parameters.includes("ending_before") ? [stripePage, stripeBackwardPage] : stripePage]]
|
|
253
|
+
: parameters.includes("page")
|
|
254
|
+
? [[`GET ${op.path}`, op.path.startsWith("/v2/") ? stripeV2Page : stripeSearchPage]]
|
|
255
|
+
: [];
|
|
256
|
+
}));
|
|
257
|
+
export function stripeBinding({ connection, options, }) {
|
|
258
|
+
const files = stripeConnection(options, "files");
|
|
259
|
+
return {
|
|
260
|
+
review: "Stripe v1 nested form and v2 JSON framing, connected-account headers, confined quote PDF origin, and existing argument-dependent safety refusals; every dispatch uses Connection.sendPath.",
|
|
261
|
+
allowOtherServers: true,
|
|
262
|
+
refusal: operationRefusal,
|
|
263
|
+
refuse: (call) => operationRefusal(call.op) ?? refuse(call),
|
|
264
|
+
send: (call, sendOptions) => sendStripe(connection, options, call, files, sendOptions),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
export const safety = () => ({
|
|
268
|
+
reviewed: restSafety(stripeSafety, stripeIndex),
|
|
269
|
+
sensitiveFields: { names: [], choice: "drop" },
|
|
270
|
+
});
|
|
271
|
+
export const getAccount = get("getAccount", "/v1/account", {
|
|
272
|
+
headers: Schema.Struct({ "Stripe-Account": Schema.optionalKey(Schema.String) }),
|
|
273
|
+
success: Schema.Unknown,
|
|
274
|
+
});
|
|
275
|
+
export const getBalance = get("getBalance", "/v1/balance", { success: Schema.Unknown });
|
|
276
|
+
const RESPONSE_MEDIA = { "GET /v1/quotes/{quote}/pdf": ["application/pdf"] };
|
|
277
|
+
export const StripeApi = {
|
|
278
|
+
...indexedVendor("stripe", stripeIndex, [getAccount, getBalance]),
|
|
279
|
+
binaryBodies: {
|
|
280
|
+
review: "The exact Stripe pin declares one non-JSON success: GET /v1/quotes/{quote}/pdf, application/pdf. JSON operations never accept text/HTML or arbitrary binary acknowledgements (#1000).",
|
|
281
|
+
forResponse: (status, operation, type) => responseMedia(RESPONSE_MEDIA, status, operation, type) === "binary",
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
export function stripeConnection(options, origin = "api") {
|
|
285
|
+
return connect(StripeApi, guardedClient({
|
|
286
|
+
provider: "Stripe",
|
|
287
|
+
baseUrl: origin === "files" ? FILES_ORIGIN : STRIPE_API_BASE_URL,
|
|
288
|
+
maxResponseBytes: MAX_RESPONSE_BYTES,
|
|
289
|
+
timeoutMs: READ_CAP_MS,
|
|
290
|
+
headers: { "Stripe-Version": stripeIndex.version },
|
|
291
|
+
authenticate: authenticate(options),
|
|
292
|
+
}), { errors: stripeErrors, safety: resultSafety(safety()) });
|
|
293
|
+
}
|
|
294
|
+
export const authenticate = (options) => Effect.gen(function* () {
|
|
295
|
+
const values = yield* (yield* Credentials).values.pipe(Effect.mapError((error) => new Refusal({ error })));
|
|
296
|
+
const key = typeof values?.value === "string" ? values.value.trim() : undefined;
|
|
297
|
+
if (!key)
|
|
298
|
+
return yield* Effect.fail(new Refusal({
|
|
299
|
+
error: new ConnectorCallError("auth_required", "No Stripe key is configured for this connector. An operator must add one in this connection in the operator UI."),
|
|
300
|
+
}));
|
|
301
|
+
const problem = stripeKeyProblem(key, options.mode);
|
|
302
|
+
if (problem)
|
|
303
|
+
return yield* Effect.fail(new Refusal({
|
|
304
|
+
error: new ConnectorCallError("auth_required", `${problem} An operator must replace this connector's key.`),
|
|
305
|
+
}));
|
|
306
|
+
return { Authorization: `Bearer ${key}` };
|
|
307
|
+
});
|
|
308
|
+
export function connectedAccount(options) {
|
|
309
|
+
if (options.auth.type !== "apiKey")
|
|
310
|
+
throw new Error("remoteMcp() with ConnectaConfig.classification for hosted MCP connections; use a distinct id beside the API connector.");
|
|
311
|
+
if (options.mode !== "production" && options.mode !== "sandbox")
|
|
312
|
+
throw new Error('stripe() requires mode "production" or "sandbox" with apiKey auth.');
|
|
313
|
+
if (options.connectedAccount === undefined)
|
|
314
|
+
return undefined;
|
|
315
|
+
const account = typeof options.connectedAccount === "string" ? options.connectedAccount.trim() : "";
|
|
316
|
+
if (!/^acct_[A-Za-z0-9]+$/.test(account))
|
|
317
|
+
throw new Error('stripe() connectedAccount must be a Stripe account id ("acct_...").');
|
|
318
|
+
return account;
|
|
319
|
+
}
|
|
320
|
+
export function checkServer(server) {
|
|
321
|
+
if (server === undefined || server === FILES_ORIGIN)
|
|
322
|
+
return undefined;
|
|
323
|
+
return server === METER_EVENTS_ORIGIN
|
|
324
|
+
? "The meter event stream takes a short-lived meter event session token, not an API key. Send single events with POST /v2/billing/meter_events."
|
|
325
|
+
: `This operation is served from ${server}, which this connector does not reach.`;
|
|
326
|
+
}
|
|
327
|
+
export function sendStripe(connection, options, call, files, sendOptions) {
|
|
328
|
+
return checked(() => {
|
|
329
|
+
const server = checkServer(call.op.server);
|
|
330
|
+
if (server)
|
|
331
|
+
invalid(server);
|
|
332
|
+
const refusal = stripeSafety.refusal(call.method, call.op.path) ?? refuse(call);
|
|
333
|
+
if (refusal)
|
|
334
|
+
invalid(refusal);
|
|
335
|
+
const reading = call.method === "GET" ||
|
|
336
|
+
call.method === "HEAD" ||
|
|
337
|
+
READ_POSTS.some(([method, path]) => method === call.method && path === call.op.path);
|
|
338
|
+
if (!reading)
|
|
339
|
+
refuseWithheldLinks([call.body, call.query, call.path], "Stripe");
|
|
340
|
+
const v2 = call.path.startsWith("/v2/");
|
|
341
|
+
const headers = {};
|
|
342
|
+
const account = connectedAccount(options);
|
|
343
|
+
if (account)
|
|
344
|
+
headers[v2 ? "Stripe-Context" : "Stripe-Account"] = account;
|
|
345
|
+
const query = Object.entries(stripeQuery(call.query, v2)).flatMap(([key, value]) => (Array.isArray(value) ? value : [value]).map((value) => [key, value]));
|
|
346
|
+
if (call.body === undefined)
|
|
347
|
+
return { method: call.method, path: call.path, template: call.op.path, query, headers };
|
|
348
|
+
if (v2)
|
|
349
|
+
return {
|
|
350
|
+
method: call.method,
|
|
351
|
+
path: call.path,
|
|
352
|
+
template: call.op.path,
|
|
353
|
+
query,
|
|
354
|
+
headers,
|
|
355
|
+
json: JSON.stringify(call.body),
|
|
356
|
+
};
|
|
357
|
+
if (!call.body || typeof call.body !== "object" || Array.isArray(call.body))
|
|
358
|
+
invalid("A Stripe v1 body is an object of parameters.");
|
|
359
|
+
return {
|
|
360
|
+
method: call.method,
|
|
361
|
+
path: call.path,
|
|
362
|
+
template: call.op.path,
|
|
363
|
+
query,
|
|
364
|
+
headers,
|
|
365
|
+
form: [...new URLSearchParams(stripeForm(call.body))],
|
|
366
|
+
emptyForm: true,
|
|
367
|
+
};
|
|
368
|
+
}).pipe(Effect.flatMap((request) => (call.op.server === FILES_ORIGIN ? files : connection).sendPath(request, sendOptions)));
|
|
369
|
+
}
|
|
370
|
+
export const probe = {
|
|
371
|
+
operation: getAccount,
|
|
372
|
+
request: (options) => ({
|
|
373
|
+
headers: connectedAccount(options) ? { "Stripe-Account": connectedAccount(options) } : {},
|
|
374
|
+
}),
|
|
375
|
+
check: (values, options) => stripeKeyProblem((values.value ?? "").trim(), options.mode),
|
|
376
|
+
describe: (data, options) => {
|
|
377
|
+
const account = record(data);
|
|
378
|
+
const name = text(record(account["business_profile"])["name"]);
|
|
379
|
+
return `Authenticated to ${String(account["id"] ?? "the Stripe account")}${name ? ` (${name})` : ""} with a ${options.mode === "production" ? "live" : "test"}-mode key.`;
|
|
380
|
+
},
|
|
381
|
+
failure: (error, options) => error.code === "provider_permission_denied"
|
|
382
|
+
? {
|
|
383
|
+
ok: true,
|
|
384
|
+
message: `Stripe accepted the ${options.mode === "production" ? "live" : "test"}-mode key; it cannot read the account object, which only get_stripe_account_info needs.`,
|
|
385
|
+
}
|
|
386
|
+
: undefined,
|
|
387
|
+
};
|
|
388
|
+
export const MODE_COPY = {
|
|
389
|
+
production: {
|
|
390
|
+
title: "Stripe (production)",
|
|
391
|
+
blurb: "production — live money and real customers",
|
|
392
|
+
warning: "This is a PRODUCTION Stripe connection. Every write moves real money against real customers, and a refund cannot be undone. If a request could plausibly be a rehearsal, route it to a sandbox connector instead.",
|
|
393
|
+
rate: "100 requests per second",
|
|
394
|
+
},
|
|
395
|
+
sandbox: {
|
|
396
|
+
title: "Stripe (sandbox)",
|
|
397
|
+
blurb: "sandbox — test data, no real money",
|
|
398
|
+
warning: "This is a SANDBOX Stripe connection. Nothing here is real money and none of these objects exist in production, so never answer a question about live revenue, payouts, or a named customer from this connector.",
|
|
399
|
+
rate: "25 requests per second",
|
|
400
|
+
},
|
|
401
|
+
};
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { type StripeMode } from "./
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
4
|
-
/** Stripe publishes one hosted MCP endpoint for every account and mode. */
|
|
5
|
-
export declare const STRIPE_MCP_ENDPOINT = "https://mcp.stripe.com/";
|
|
1
|
+
import { type StripeMode } from "./lib/config.js";
|
|
2
|
+
export { STRIPE_API_BASE_URL } from "./lib/config.js";
|
|
3
|
+
export type { StripeMode } from "./lib/config.js";
|
|
6
4
|
interface StripeCommonOptions {
|
|
7
5
|
/** Human-readable display name; defaults to "Stripe" for OAuth and the mode for a key. */
|
|
8
6
|
title?: string;
|
|
@@ -17,19 +15,6 @@ interface StripeCommonOptions {
|
|
|
17
15
|
/** Serve only read-classified tools on every endpoint. Defaults to false. */
|
|
18
16
|
readOnly?: boolean;
|
|
19
17
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Stripe's hosted MCP server over OAuth. One session can reach live and
|
|
22
|
-
* sandbox accounts; Stripe returns the mode with each account.
|
|
23
|
-
*/
|
|
24
|
-
export interface StripeOAuthOptions extends StripeCommonOptions {
|
|
25
|
-
auth: {
|
|
26
|
-
type: "oauth";
|
|
27
|
-
};
|
|
28
|
-
/** Refused: OAuth reaches live and sandbox accounts, and Stripe returns mode with each. */
|
|
29
|
-
mode?: never;
|
|
30
|
-
/** Refused: a Connect account needs an API-key connector. */
|
|
31
|
-
connectedAccount?: never;
|
|
32
|
-
}
|
|
33
18
|
/**
|
|
34
19
|
* Connecta's REST connector to `api.stripe.com` with one operator-managed
|
|
35
20
|
* secret or restricted key, pasted into the connection in the operator UI.
|
|
@@ -44,12 +29,5 @@ export interface StripeApiKeyOptions extends StripeCommonOptions {
|
|
|
44
29
|
/** Act as one Connect account: `Stripe-Account` on v1, `Stripe-Context` on v2. */
|
|
45
30
|
connectedAccount?: string;
|
|
46
31
|
}
|
|
47
|
-
export type StripeOptions =
|
|
48
|
-
|
|
49
|
-
* A maintained Stripe connection. `auth` selects the implementation: OAuth
|
|
50
|
-
* reaches Stripe's hosted MCP server; an API key reaches Connecta's REST
|
|
51
|
-
* connector to `api.stripe.com`.
|
|
52
|
-
*/
|
|
53
|
-
export declare const stripe: import("../../provider.js").ProviderFactory<StripeOptions>;
|
|
54
|
-
/** @deprecated Read `stripe.definition.classify` instead. Kept for existing imports. */
|
|
55
|
-
export declare const STRIPE_VETTED_CATALOG: import("../../catalog-drift.js").VettedCatalog;
|
|
32
|
+
export type StripeOptions = StripeApiKeyOptions;
|
|
33
|
+
export declare const stripe: import("../../provider.js").ProviderFactory<StripeApiKeyOptions>;
|