@zackbart/connecta 0.34.0 → 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 +393 -0
- package/README.md +62 -105
- 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 +15 -7
- package/dist/connectors/api-connector.js +147 -57
- 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/option-shapes.js +1 -1
- package/dist/connectors/remote-mcp.d.ts +12 -30
- package/dist/connectors/remote-mcp.js +960 -564
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +5 -1
- package/dist/describe-config.js +3 -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 +221 -87
- 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 +534 -408
- 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 +8 -4
- package/dist/operator-ui/connection-map.js +9 -6
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +5 -14
- 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/health.js +52 -0
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +11 -19
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +5 -29
- package/dist/operator-ui/view.js +3 -59
- 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 +71 -32
- package/dist/provider.js +134 -40
- 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 +8 -209
- package/dist/providers/_shared/google/workspace.js +7 -426
- 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 +3 -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 +17 -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 +7 -22
- package/dist/providers/cloudflare/index.js +80 -194
- 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 +3299 -3208
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +538 -18
- 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 +3 -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 +6 -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 +7 -27
- package/dist/providers/stripe/index.js +75 -191
- 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 -10
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +19 -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 +11 -25
- package/dist/providers/vercel/index.js +67 -261
- 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 +398 -376
- package/dist/providers/vercel/{value-safety.js → safety.js} +261 -42
- 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 +30 -28
- package/dist/registry.js +446 -413
- 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 +29 -22
- 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 +330 -224
- 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 +11 -99
- 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 +2550 -186
- package/documentation/auth.md +821 -98
- package/documentation/code-mode.md +56 -21
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +144 -105
- package/documentation/meta-tools.md +411 -34
- package/documentation/operating.md +28 -4
- package/documentation/operator-tests.md +11 -2
- package/documentation/operator-ui.md +103 -33
- package/documentation/provider-auth-migration.md +38 -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 -42
- 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 -134
- package/dist/catalog-drift.js +0 -493
- 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 -43
- 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 -1078
- 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/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -352
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -57
- package/dist/providers/mixpanel/index.js +0 -468
- 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 -65
- 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 -49
- package/dist/providers/revenuecat/index.js +0 -557
- 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
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
import { retryAfterMs } from "../../connectors/guarded-fetch.js";
|
|
2
|
-
import { ConnectorCallError } from "../../errors.js";
|
|
3
|
-
import { OperationIndex } from "../_shared/rest/operation-index.js";
|
|
4
|
-
import { callRest, restCall, restTransport, } from "../_shared/rest/tools.js";
|
|
5
|
-
import { valueSafety, withholdEmbeddedUrlsIn, refuseWithheldLinks } from "../_shared/rest/value-safety.js";
|
|
6
|
-
import { openapi } from "./openapi.generated.js";
|
|
7
|
-
import { STRIPE_VALUE_SAFETY } from "./value-safety.js";
|
|
8
|
-
/** Stripe's REST origin. */
|
|
9
|
-
export const STRIPE_API_BASE_URL = "https://api.stripe.com";
|
|
10
|
-
const FILES_ORIGIN = "https://files.stripe.com";
|
|
11
|
-
const METER_EVENTS_ORIGIN = "https://meter-events.stripe.com";
|
|
12
|
-
const MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
13
|
-
const READ_CAP_MS = 60_000;
|
|
14
|
-
/**
|
|
15
|
-
* POSTs that only read, admitted by `stripe_api_read`. `POST
|
|
16
|
-
* /v1/tax/calculations` is deliberately absent: it persists a Calculation
|
|
17
|
-
* object a later Tax Transaction can reference, and Stripe bills each call.
|
|
18
|
-
*/
|
|
19
|
-
const READ_POSTS = [
|
|
20
|
-
["POST", "/v1/invoices/create_preview", "Computes an upcoming invoice; Stripe persists nothing."],
|
|
21
|
-
];
|
|
22
|
-
function record(value) {
|
|
23
|
-
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
|
|
24
|
-
}
|
|
25
|
-
function text(value) {
|
|
26
|
-
return typeof value === "string" && value.trim() !== "" ? value : undefined;
|
|
27
|
-
}
|
|
28
|
-
function invalid(message) {
|
|
29
|
-
throw new ConnectorCallError("invalid_args", message);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Why this key cannot serve a connector declared for `mode`, or undefined.
|
|
33
|
-
* The key's own prefix carries its mode, so a live key in a sandbox
|
|
34
|
-
* connector (or the reverse) is refused before any request leaves.
|
|
35
|
-
*/
|
|
36
|
-
function stripeKeyProblem(key, mode) {
|
|
37
|
-
if (/^(?:sk|rk)_org_/.test(key)) {
|
|
38
|
-
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.";
|
|
39
|
-
}
|
|
40
|
-
if (key.startsWith("pk_")) {
|
|
41
|
-
return "This is a publishable key; the Stripe API needs a secret (sk_) or restricted (rk_) key.";
|
|
42
|
-
}
|
|
43
|
-
const prefix = /^(?:sk|rk)_(live|test)_\S+$/.exec(key);
|
|
44
|
-
if (!prefix)
|
|
45
|
-
return "This is not a Stripe secret (sk_…) or restricted (rk_…) key.";
|
|
46
|
-
const keyMode = prefix[1] === "live" ? "production" : "sandbox";
|
|
47
|
-
if (keyMode !== mode) {
|
|
48
|
-
return `This connector is declared ${mode}, but the configured key is a ${prefix[1]}-mode key.`;
|
|
49
|
-
}
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
/** Flatten one value Stripe's way: `a[b]=`, indexed arrays, `""` to unset. */
|
|
53
|
-
function flatten(key, value, emit, emptyArrays) {
|
|
54
|
-
if (value === undefined)
|
|
55
|
-
return;
|
|
56
|
-
if (value === null || value === "")
|
|
57
|
-
return emit(key, "");
|
|
58
|
-
if (Array.isArray(value)) {
|
|
59
|
-
if (value.length === 0) {
|
|
60
|
-
if (emptyArrays)
|
|
61
|
-
emit(key, "");
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
value.forEach((item, index) => flatten(`${key}[${index}]`, item, emit, emptyArrays));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (typeof value === "object") {
|
|
68
|
-
for (const [name, item] of Object.entries(value))
|
|
69
|
-
flatten(`${key}[${name}]`, item, emit, emptyArrays);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
if (typeof value === "boolean")
|
|
73
|
-
return emit(key, value ? "true" : "false");
|
|
74
|
-
if (typeof value === "number" && Number.isFinite(value))
|
|
75
|
-
return emit(key, String(value));
|
|
76
|
-
if (typeof value === "string")
|
|
77
|
-
return emit(key, value);
|
|
78
|
-
invalid(`Stripe parameter ${key} must be a string, number, boolean, object, list, or null.`);
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* A v1 form body: nested objects as `a[b]`, arrays indexed `a[0]`, booleans
|
|
82
|
-
* as `true`/`false`, and `null`, `""`, or `[]` as an empty value, which is
|
|
83
|
-
* how Stripe unsets a field.
|
|
84
|
-
*/
|
|
85
|
-
function stripeForm(body) {
|
|
86
|
-
const form = new URLSearchParams();
|
|
87
|
-
for (const [key, value] of Object.entries(body))
|
|
88
|
-
flatten(key, value, (name, item) => form.append(name, item), true);
|
|
89
|
-
return form.toString();
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Query parameters. v1 indexes arrays (`expand[0]=…`) like its bodies; v2
|
|
93
|
-
* repeats the key for a list of scalars (`include=a&include=b`), as Stripe's
|
|
94
|
-
* own libraries do. Objects use brackets in both.
|
|
95
|
-
*/
|
|
96
|
-
function stripeQuery(query, v2) {
|
|
97
|
-
const out = {};
|
|
98
|
-
for (const [key, value] of Object.entries(query)) {
|
|
99
|
-
const scalars = Array.isArray(value) && value.every((item) => ["string", "number", "boolean"].includes(typeof item));
|
|
100
|
-
if (v2 && scalars && value.length > 0) {
|
|
101
|
-
out[key] = value.map((item) => (typeof item === "boolean" ? (item ? "true" : "false") : String(item)));
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
flatten(key, value, (name, item) => (out[name] = item), false);
|
|
105
|
-
}
|
|
106
|
-
return out;
|
|
107
|
-
}
|
|
108
|
-
function expansions(call) {
|
|
109
|
-
const read = (value) => typeof value === "string"
|
|
110
|
-
? [value]
|
|
111
|
-
: Array.isArray(value)
|
|
112
|
-
? value.filter((item) => typeof item === "string")
|
|
113
|
-
: [];
|
|
114
|
-
return [...read(call.query["expand"]), ...read(record(call.body)["expand"])];
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Reviewed refusals that depend on arguments; the value-safety table
|
|
118
|
-
* (`value-safety.ts`) refuses whole operations. Each expansion returns a
|
|
119
|
-
* secret the caller could not otherwise read through Connecta: a Stripe Apps
|
|
120
|
-
* secret's value, or a full Issuing card number or CVC, which an Issuing
|
|
121
|
-
* authorization, transaction, or token can embed as well as the card itself.
|
|
122
|
-
*/
|
|
123
|
-
function refuse(call) {
|
|
124
|
-
const expanded = expansions(call);
|
|
125
|
-
if (/^\/v1\/apps\/secrets(?:\/|$)/.test(call.path) && expanded.some((path) => /(?:^|\.)payload$/.test(path))) {
|
|
126
|
-
return "Stripe Apps secret values are not returned through Connecta. Read the secret's metadata without expanding payload.";
|
|
127
|
-
}
|
|
128
|
-
if (/^\/v1\/(?:test_helpers\/)?issuing\//.test(call.path) &&
|
|
129
|
-
expanded.some((path) => /(?:^|\.)(?:number|cvc)$/.test(path))) {
|
|
130
|
-
return "Issuing card numbers and CVCs are not expanded through Connecta. Use the card id and last4, or the Stripe Dashboard.";
|
|
131
|
-
}
|
|
132
|
-
return undefined;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Map a Stripe failure by the caller's next move (H11). For an operation the
|
|
136
|
-
* value-safety review withholds (`withheld`), Stripe's message is replaced:
|
|
137
|
-
* the type, code, decline code, and param still route.
|
|
138
|
-
*/
|
|
139
|
-
function stripeFailure(status, headers, body, withheld = false) {
|
|
140
|
-
const error = record(record(withholdEmbeddedUrlsIn(body))["error"]);
|
|
141
|
-
const code = text(error["code"]);
|
|
142
|
-
const kind = [text(error["type"]), code, text(error["decline_code"])].filter(Boolean).join(" ");
|
|
143
|
-
const param = text(error["param"]);
|
|
144
|
-
const requestId = headers.get("request-id");
|
|
145
|
-
const message = withheld
|
|
146
|
-
? "Stripe's message is withheld because this operation handles credentials."
|
|
147
|
-
: (text(error["message"]) ?? `Stripe returned HTTP ${status}.`);
|
|
148
|
-
const detail = `Stripe ${kind || `HTTP ${status}`}${param ? ` (param ${param})` : ""}: ` +
|
|
149
|
-
`${message}${requestId ? ` Request ${requestId}.` : ""}`;
|
|
150
|
-
if (status === 429) {
|
|
151
|
-
if (code === "lock_timeout") {
|
|
152
|
-
// Stripe did not process the request (docs.stripe.com/rate-limits#object-lock-timeouts):
|
|
153
|
-
// a definite conflict, safe to retry once the other request finishes.
|
|
154
|
-
return new ConnectorCallError("conflict", `${detail} Another request is changing this object and Stripe did not process this one; retry after it finishes. This is a lock conflict, not a rate limit.`, { retryable: true, retryAfterMs: 1_000 });
|
|
155
|
-
}
|
|
156
|
-
const reason = headers.get("stripe-rate-limited-reason");
|
|
157
|
-
return new ConnectorCallError("rate_limited", `${detail}${reason ? ` Limited by ${reason}.` : ""} Back off before retrying.`, { retryAfterMs: retryAfterMs(headers) ?? 1_000 });
|
|
158
|
-
}
|
|
159
|
-
if (status === 401) {
|
|
160
|
-
return new ConnectorCallError("auth_required", `${detail} The configured Stripe key was rejected; an operator must replace it in this connection.`);
|
|
161
|
-
}
|
|
162
|
-
if (status === 403) {
|
|
163
|
-
return new ConnectorCallError("provider_permission_denied", `${detail} A restricted key lacks this permission; an operator must grant it on the key or use another key.`);
|
|
164
|
-
}
|
|
165
|
-
if (status === 404)
|
|
166
|
-
return new ConnectorCallError("not_found", `${detail} Resolve the id with a list or search read.`);
|
|
167
|
-
if (status === 400 || status === 409 || status === 422)
|
|
168
|
-
return new ConnectorCallError("invalid_args", detail);
|
|
169
|
-
if (status === 402)
|
|
170
|
-
return new ConnectorCallError("connector_call_failed", detail, { retryable: false });
|
|
171
|
-
if (status === 424 || status >= 500)
|
|
172
|
-
return new ConnectorCallError("unavailable", detail);
|
|
173
|
-
return new ConnectorCallError("connector_call_failed", detail, { retryable: false });
|
|
174
|
-
}
|
|
175
|
-
/** Cursors: v1 lists, search results, and v2 lists each spell the next page differently. */
|
|
176
|
-
function page(data, call) {
|
|
177
|
-
const body = record(data);
|
|
178
|
-
if (body["object"] === "list" && Array.isArray(body["data"])) {
|
|
179
|
-
const backward = call.query["ending_before"] !== undefined;
|
|
180
|
-
const items = body["data"];
|
|
181
|
-
const edge = record(backward ? items[0] : items[items.length - 1])["id"];
|
|
182
|
-
const hasMore = body["has_more"] === true;
|
|
183
|
-
return {
|
|
184
|
-
hasMore,
|
|
185
|
-
...(hasMore && typeof edge === "string"
|
|
186
|
-
? { next: edge, param: backward ? "ending_before" : "starting_after" }
|
|
187
|
-
: {}),
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
if (body["object"] === "search_result") {
|
|
191
|
-
const next = text(body["next_page"]);
|
|
192
|
-
return { hasMore: body["has_more"] === true, ...(next ? { next, param: "page" } : {}) };
|
|
193
|
-
}
|
|
194
|
-
if (Array.isArray(body["data"]) && "next_page_url" in body) {
|
|
195
|
-
const url = text(body["next_page_url"]);
|
|
196
|
-
let next = null;
|
|
197
|
-
try {
|
|
198
|
-
next = url ? new URL(url, STRIPE_API_BASE_URL).searchParams.get("page") : null;
|
|
199
|
-
}
|
|
200
|
-
catch {
|
|
201
|
-
next = null;
|
|
202
|
-
}
|
|
203
|
-
return { hasMore: url !== undefined, ...(next ? { next, param: "page" } : {}) };
|
|
204
|
-
}
|
|
205
|
-
return undefined;
|
|
206
|
-
}
|
|
207
|
-
/** The pinned index, shared by every Stripe REST connector in the deployment. */
|
|
208
|
-
let index;
|
|
209
|
-
function stripeIndex() {
|
|
210
|
-
index ??= new OperationIndex(openapi, { vendor: "stripe", title: "Stripe" });
|
|
211
|
-
return index;
|
|
212
|
-
}
|
|
213
|
-
/** The reviewed value-safety table over the pinned index. */
|
|
214
|
-
const SAFETY = valueSafety(STRIPE_VALUE_SAFETY, () => stripeIndex());
|
|
215
|
-
/** Stripe's REST vendor, its named tools, and its credential test, for one mode. */
|
|
216
|
-
export function stripeRest(mode, connectedAccount) {
|
|
217
|
-
const operations = stripeIndex();
|
|
218
|
-
const transports = new Map();
|
|
219
|
-
const transport = (origin) => {
|
|
220
|
-
let send = transports.get(origin);
|
|
221
|
-
if (!send) {
|
|
222
|
-
send = restTransport({
|
|
223
|
-
provider: "Stripe",
|
|
224
|
-
baseUrl: origin,
|
|
225
|
-
maxResponseBytes: MAX_RESPONSE_BYTES,
|
|
226
|
-
timeoutMs: READ_CAP_MS,
|
|
227
|
-
authenticate: async (ctx) => {
|
|
228
|
-
const key = (await ctx.credential?.get())?.trim();
|
|
229
|
-
if (!key) {
|
|
230
|
-
throw new ConnectorCallError("auth_required", "No Stripe key is configured for this connector. An operator must add one in this connection in the operator UI.");
|
|
231
|
-
}
|
|
232
|
-
const problem = stripeKeyProblem(key, mode);
|
|
233
|
-
if (problem) {
|
|
234
|
-
throw new ConnectorCallError("auth_required", `${problem} An operator must replace this connector's key.`);
|
|
235
|
-
}
|
|
236
|
-
return { Authorization: `Bearer ${key}` };
|
|
237
|
-
},
|
|
238
|
-
});
|
|
239
|
-
transports.set(origin, send);
|
|
240
|
-
}
|
|
241
|
-
return send;
|
|
242
|
-
};
|
|
243
|
-
const encode = (call) => {
|
|
244
|
-
const v2 = call.path.startsWith("/v2/");
|
|
245
|
-
const headers = { "Stripe-Version": operations.version };
|
|
246
|
-
// v2 names the acting account with Stripe-Context; v1 with Stripe-Account.
|
|
247
|
-
if (connectedAccount)
|
|
248
|
-
headers[v2 ? "Stripe-Context" : "Stripe-Account"] = connectedAccount;
|
|
249
|
-
const query = stripeQuery(call.query, v2);
|
|
250
|
-
if (call.body === undefined)
|
|
251
|
-
return { query, headers };
|
|
252
|
-
if (v2)
|
|
253
|
-
return { query, headers, body: call.body };
|
|
254
|
-
if (typeof call.body !== "object" || call.body === null || Array.isArray(call.body)) {
|
|
255
|
-
invalid("A Stripe v1 body is an object of parameters.");
|
|
256
|
-
}
|
|
257
|
-
return {
|
|
258
|
-
query,
|
|
259
|
-
headers: { ...headers, "Content-Type": "application/x-www-form-urlencoded" },
|
|
260
|
-
rawBody: stripeForm(call.body),
|
|
261
|
-
};
|
|
262
|
-
};
|
|
263
|
-
const vendor = {
|
|
264
|
-
vendor: "stripe",
|
|
265
|
-
title: "Stripe",
|
|
266
|
-
index: operations,
|
|
267
|
-
transport(server) {
|
|
268
|
-
if (server === undefined)
|
|
269
|
-
return transport(STRIPE_API_BASE_URL);
|
|
270
|
-
if (server === FILES_ORIGIN)
|
|
271
|
-
return transport(FILES_ORIGIN);
|
|
272
|
-
if (server === METER_EVENTS_ORIGIN) {
|
|
273
|
-
return "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.";
|
|
274
|
-
}
|
|
275
|
-
return `This operation is served from ${server}, which this connector does not reach.`;
|
|
276
|
-
},
|
|
277
|
-
failure: (status, headers, body, call) => stripeFailure(status, headers, body, call ? SAFETY.withholdsErrors(call.op) : false),
|
|
278
|
-
readPosts: READ_POSTS,
|
|
279
|
-
valueSafety: SAFETY,
|
|
280
|
-
admit(call) {
|
|
281
|
-
if (call.method === "GET" ||
|
|
282
|
-
call.method === "HEAD" ||
|
|
283
|
-
READ_POSTS.some(([method, path]) => method === call.method && path === call.op.path))
|
|
284
|
-
return;
|
|
285
|
-
refuseWithheldLinks([call.body, call.query, call.path], "Stripe");
|
|
286
|
-
},
|
|
287
|
-
refuse,
|
|
288
|
-
encode,
|
|
289
|
-
page,
|
|
290
|
-
idempotencyHeader: "Idempotency-Key",
|
|
291
|
-
upload: "Upload files in the Stripe Dashboard; this connector sends no multipart bodies.",
|
|
292
|
-
bodyHint: "v1 bodies are form-encoded for you, v2 bodies sent as JSON",
|
|
293
|
-
};
|
|
294
|
-
const livemode = mode === "production";
|
|
295
|
-
const tools = [
|
|
296
|
-
{
|
|
297
|
-
name: "get_stripe_account_info",
|
|
298
|
-
description: "Read the Stripe account this key reaches: id, name, country, default currency, mode, and connected account. Use it to confirm scope first.",
|
|
299
|
-
annotations: { readOnlyHint: true },
|
|
300
|
-
inputSchema: { type: "object", properties: {}, required: [], additionalProperties: false },
|
|
301
|
-
outputSchema: {
|
|
302
|
-
type: "object",
|
|
303
|
-
properties: {
|
|
304
|
-
accountId: { type: "string" },
|
|
305
|
-
name: { type: ["string", "null"] },
|
|
306
|
-
country: { type: ["string", "null"] },
|
|
307
|
-
defaultCurrency: { type: ["string", "null"] },
|
|
308
|
-
mode: { type: "string", enum: ["production", "sandbox"] },
|
|
309
|
-
livemode: { type: "boolean" },
|
|
310
|
-
connectedAccount: { type: ["string", "null"], description: "Set when every call acts as this account." },
|
|
311
|
-
chargesEnabled: { type: ["boolean", "null"] },
|
|
312
|
-
payoutsEnabled: { type: ["boolean", "null"] },
|
|
313
|
-
},
|
|
314
|
-
required: ["accountId", "mode", "livemode", "connectedAccount"],
|
|
315
|
-
},
|
|
316
|
-
handler: async (_args, ctx) => {
|
|
317
|
-
const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/account"), ctx);
|
|
318
|
-
const account = record(data);
|
|
319
|
-
const profile = record(account["business_profile"]);
|
|
320
|
-
const dashboard = record(record(account["settings"])["dashboard"]);
|
|
321
|
-
return {
|
|
322
|
-
accountId: String(account["id"] ?? ""),
|
|
323
|
-
name: text(profile["name"]) ?? text(dashboard["display_name"]) ?? null,
|
|
324
|
-
country: text(account["country"]) ?? null,
|
|
325
|
-
defaultCurrency: text(account["default_currency"]) ?? null,
|
|
326
|
-
mode,
|
|
327
|
-
livemode,
|
|
328
|
-
connectedAccount: connectedAccount ?? null,
|
|
329
|
-
chargesEnabled: typeof account["charges_enabled"] === "boolean" ? account["charges_enabled"] : null,
|
|
330
|
-
payoutsEnabled: typeof account["payouts_enabled"] === "boolean" ? account["payouts_enabled"] : null,
|
|
331
|
-
};
|
|
332
|
-
},
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
name: "get_balance_summary",
|
|
336
|
-
description: "Read the account's available and pending Stripe balance per currency, in minor units. Excludes balance transactions; list those with stripe_api_read.",
|
|
337
|
-
annotations: { readOnlyHint: true },
|
|
338
|
-
inputSchema: { type: "object", properties: {}, required: [], additionalProperties: false },
|
|
339
|
-
outputSchema: {
|
|
340
|
-
type: "object",
|
|
341
|
-
properties: {
|
|
342
|
-
livemode: { type: "boolean" },
|
|
343
|
-
available: { type: "array", description: "Funds available to pay out, per currency." },
|
|
344
|
-
pending: { type: "array", description: "Funds not yet available, per currency." },
|
|
345
|
-
instantAvailable: { type: "array" },
|
|
346
|
-
connectReserved: { type: "array" },
|
|
347
|
-
},
|
|
348
|
-
required: ["livemode", "available", "pending"],
|
|
349
|
-
},
|
|
350
|
-
handler: async (_args, ctx) => {
|
|
351
|
-
const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/balance"), ctx);
|
|
352
|
-
const balance = record(data);
|
|
353
|
-
const amounts = (value) => Array.isArray(value)
|
|
354
|
-
? value.map((entry) => ({ amount: record(entry)["amount"], currency: record(entry)["currency"] }))
|
|
355
|
-
: [];
|
|
356
|
-
return {
|
|
357
|
-
livemode: balance["livemode"] === true,
|
|
358
|
-
available: amounts(balance["available"]),
|
|
359
|
-
pending: amounts(balance["pending"]),
|
|
360
|
-
...(Array.isArray(balance["instant_available"])
|
|
361
|
-
? { instantAvailable: amounts(balance["instant_available"]) }
|
|
362
|
-
: {}),
|
|
363
|
-
...(Array.isArray(balance["connect_reserved"])
|
|
364
|
-
? { connectReserved: amounts(balance["connect_reserved"]) }
|
|
365
|
-
: {}),
|
|
366
|
-
};
|
|
367
|
-
},
|
|
368
|
-
},
|
|
369
|
-
];
|
|
370
|
-
return {
|
|
371
|
-
vendor,
|
|
372
|
-
tools,
|
|
373
|
-
async testCredential(value, ctx) {
|
|
374
|
-
const key = value.trim();
|
|
375
|
-
const problem = stripeKeyProblem(key, mode);
|
|
376
|
-
if (problem)
|
|
377
|
-
return { ok: false, message: problem };
|
|
378
|
-
try {
|
|
379
|
-
const { data } = await callRest(vendor, restCall(vendor, "GET", "/v1/account"), {
|
|
380
|
-
...ctx,
|
|
381
|
-
credential: { get: async () => key, getAll: async () => ({ value: key }) },
|
|
382
|
-
});
|
|
383
|
-
const account = record(data);
|
|
384
|
-
const name = text(record(account["business_profile"])["name"]);
|
|
385
|
-
return {
|
|
386
|
-
ok: true,
|
|
387
|
-
message: `Authenticated to ${String(account["id"] ?? "the Stripe account")}${name ? ` (${name})` : ""} with a ${livemode ? "live" : "test"}-mode key.`,
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
catch (error) {
|
|
391
|
-
if (error instanceof ConnectorCallError && error.code === "provider_permission_denied") {
|
|
392
|
-
// Stripe authenticated the key; only the account read is outside its permissions.
|
|
393
|
-
return {
|
|
394
|
-
ok: true,
|
|
395
|
-
message: `Stripe accepted the ${livemode ? "live" : "test"}-mode key; it cannot read the account object, which only get_stripe_account_info needs.`,
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
return { ok: false, message: error instanceof ConnectorCallError ? error.message : "Stripe rejected the key." };
|
|
399
|
-
}
|
|
400
|
-
},
|
|
401
|
-
};
|
|
402
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { ApiTool } from "../../connectors/api-connector.js";
|
|
2
|
-
import type { ConnectorContext, CredentialTestResult } from "../../types.js";
|
|
3
|
-
import { type RestVendor } from "../_shared/rest/tools.js";
|
|
4
|
-
/** Vercel's public REST origin. Override only for a proxy or test double. */
|
|
5
|
-
export declare const VERCEL_API_BASE_URL = "https://api.vercel.com";
|
|
6
|
-
/**
|
|
7
|
-
* Items of a possibly cut-off JSON array, or complete NDJSON lines: a bounded
|
|
8
|
-
* log read stops mid-body, and the rows it finished are still the answer.
|
|
9
|
-
*/
|
|
10
|
-
export declare function completeRows(body: string): unknown[];
|
|
11
|
-
export interface VercelRest {
|
|
12
|
-
vendor: RestVendor;
|
|
13
|
-
tools: ApiTool[];
|
|
14
|
-
testCredential(value: string, ctx: ConnectorContext): Promise<CredentialTestResult>;
|
|
15
|
-
}
|
|
16
|
-
/** Vercel's REST vendor, its named tools, and its credential test, for one connection. */
|
|
17
|
-
export declare function vercelRest(options: {
|
|
18
|
-
baseUrl: string;
|
|
19
|
-
teamId: string | undefined;
|
|
20
|
-
}): VercelRest;
|