@zackbart/connecta 0.34.1 → 0.36.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 +418 -0
- package/README.md +65 -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 +2044 -1161
- 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 +751 -281
- 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 +29 -7
- package/dist/connectors/api-connector.js +145 -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/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 +227 -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 +379 -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/contract.d.ts +8 -3
- package/dist/operator-ui/generated.js +4 -4
- package/dist/operator-ui/model.d.ts +2 -3
- 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 +427 -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/kit.js +146 -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/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 +801 -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 +1023 -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/quickbooks/api.js +299 -0
- package/dist/providers/quickbooks/index.d.ts +13 -0
- package/dist/providers/quickbooks/index.js +93 -0
- package/dist/providers/quickbooks/lib/query.js +118 -0
- package/dist/providers/quickbooks/lib/writes.js +168 -0
- package/dist/providers/quickbooks/safety.js +222 -0
- package/dist/providers/quickbooks/skill.generated.js +5 -0
- package/dist/providers/quickbooks/tools.js +117 -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 +733 -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 +65 -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 +6 -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 +552 -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 -223
- 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 +9 -109
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +0 -1
- 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 +28 -7
- package/documentation/architecture.md +2409 -255
- package/documentation/auth.md +867 -114
- 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 +84 -48
- 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 +1347 -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 +30 -50
- 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/operator-ui/agents.d.ts +0 -74
- package/dist/operator-ui/agents.js +0 -104
- package/dist/operator-ui/config-summary.js +0 -565
- package/dist/operator-ui/connection-map.js +0 -376
- package/dist/operator-ui/endpoints.js +0 -221
- package/dist/operator-ui/fix-prompts.d.ts +0 -18
- package/dist/operator-ui/fix-prompts.js +0 -87
- package/dist/operator-ui/health.js +0 -52
- package/dist/operator-ui/member-page.js +0 -97
- package/dist/operator-ui/overview.js +0 -123
- package/dist/operator-ui/setup-commands.js +0 -51
- package/dist/operator-ui/view.d.ts +0 -401
- package/dist/operator-ui/view.js +0 -705
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/dispatch.js +0 -41
- 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/tools.js +0 -569
- 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
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// Generated by scripts/generate-providers.mjs; do not edit.
|
|
2
|
-
export const skill = {
|
|
3
|
-
"content": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- The documented `get-product-store-state-operation`, `create-product-prices`, `equalize-subscription-prices`, `set-product-store-state`, and `upload-product-store-state-screenshot` tools are deprecated; they remain supported when the server exposes them. Store changes use the plan workflow: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. The reviewed catalog is a superset, not a promise that every reviewed tool is available. RevenueCat gates parts of its MCP catalog by API key permissions, plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `list-app-subscription-groups`, `preview-audience`, and `render-paywall-screenshot` are reviewed reads. Audience preview uses an observational POST that returns matching customers without creating an audience; screenshot rendering previews a paywall without editing or publishing it.\n- `validate-app-credentials` stays classified as write conservatively: the MCP reference labels it Read and says credentials are unchanged, but the live annotation says otherwise and the public API v2 app contract does not establish whether validation status or results persist. Do not infer permission to call it from its presence under a read-only API key.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Use discovery's effective classification for routing rather than inferring safety from a name or HTTP method. Creates, updates, archives, grants, publishes, and store changes are writes; audience previews and screenshot rendering are reads. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: \n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n. RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key has per-resource permissions. RevenueCat can omit tools this key cannot use from its live catalog; Connecta serves the returned catalog rather than adding missing tools from its reviewed superset. Catalog presence alone does not prove a call is permitted. A served tool can still fail at RevenueCat for missing permissions; read that refusal and route the call to a connector with the required permissions. A read-only Connecta endpoint independently omits and blocks tools classified as writes.\n",
|
|
4
|
-
"instructionsHeading": "Project instructions",
|
|
5
|
-
"fragments": {
|
|
6
|
-
"guide_0": "\n- Inspect result framing before accessing fields. A text result is not automatically an object; parse it only if the returned text is valid JSON. Do not iterate fields that the response does not contain.\n- Resolve ids before acting; never guess one. `list-projects` yields the `project_id` every project-scoped call takes. `list-apps`, `list-products`, `list-entitlements`, `list-offerings`, `list-paywalls`, `list-audiences`, and `list-customers` yield the ids their `get-`, `update-`, `archive-`, and `delete-` counterparts expect. A plausible-looking id belongs to another project or to nobody.\n- Customers are addressed by the app user id your SDK set, not by an internal key. Find one with `list-customers` before `get-customer`, and carry the id it returned unchanged.\n- Customer and subscription objects are large, and a customer's history is larger. Page with the cursor the list returned rather than raising the page size, and reduce inside `execute_code` — select the fields the question needs and return those, not the whole object.\n- Whether a customer should have access is `gives_access` on each subscription from `list-subscriptions`, which RevenueCat calls the authoritative flag. `status` and `expires_date` describe the store-side state and disagree with it during grace periods, billing retries, and promotional grants — answer access questions from `gives_access` and say which subscription it came from.\n- `get-chart-data` is the metrics path: read `get-chart-options-schema` for the chart you want before calling it, rather than guessing an option name. `get-overview-metrics` and `get-revenue-metric` answer the summary questions in one call.\n- `create-paywall-ai` and `edit-paywall-ai` are asynchronous. Poll the task id they return with `get-paywall-ai-task` rather than assuming the work finished when the call returned.\n- The documented `get-product-store-state-operation`, `create-product-prices`, `equalize-subscription-prices`, `set-product-store-state`, and `upload-product-store-state-screenshot` tools are deprecated; they remain supported when the server exposes them. Store changes use the plan workflow: `create-product-store-state-plan`, then `plan-product-store-state-plan`, then `apply-product-store-state-plan`. Every step past the create is asynchronous — read the plan back with `get-product-store-state-plan` between steps instead of assuming the last one finished.\n- This connection's tool list is not a fixed set. The reviewed catalog is a superset, not a promise that every reviewed tool is available. RevenueCat gates parts of its MCP catalog by API key permissions, plan, platform, and beta enrollment — paywall AI editing, benchmarks, experiments, virtual currencies, and the account-billing tools are the usual absentees — so search this connector for what it actually exposes rather than assuming a documented tool is here.\n- `list-app-subscription-groups`, `preview-audience`, and `render-paywall-screenshot` are reviewed reads. Audience preview uses an observational POST that returns matching customers without creating an audience; screenshot rendering previews a paywall without editing or publishing it.\n- `validate-app-credentials` stays classified as write conservatively: the MCP reference labels it Read and says credentials are unchanged, but the live annotation says otherwise and the public API v2 app contract does not establish whether validation status or results persist. Do not infer permission to call it from its presence under a read-only API key.\n- RevenueCat meters API v2 per minute and per domain, and the domains differ: 480 requests per minute for customer information and virtual currencies, 60 for project configuration and audiences, 25 for charts and metrics. It answers a breach with `429`, a `Retry-After` header, and a `backoff_ms` field. Back off on that rather than retrying immediately, and expect chart sweeps to hit the ceiling long before customer reads do.\n- Use discovery's effective classification for routing rather than inferring safety from a name or HTTP method. Creates, updates, archives, grants, publishes, and store changes are writes; audience previews and screenshot rendering are reads. For guest calls, classification, and routing, fetch `skills({ name: \"usage\" })`.\n- An `auth_required` failure means this connector's RevenueCat authorization is missing or expired: run `authorize_connector` for this connector id, then retry the same call unchanged. A rejected argument, a permission gap, or a plan restriction comes back in RevenueCat's own words instead — read it rather than re-authorizing.\n",
|
|
7
|
-
"guide_1": "# RevenueCat usage\n\nAccount-scoped connection: this OAuth session reaches every RevenueCat project the account can see. Connector purpose: ",
|
|
8
|
-
"guide_2": "\n\nCall `list-projects` first and carry the exact `project_id` it returned into every project-scoped call. Connecta does not pick a project, and the connector id, title, and purpose are routing hints rather than proof of which project a call will land in. If more than one project fits the request, stop and ask; never guess a `project_id`.\n",
|
|
9
|
-
"guide_3": ". RevenueCat secret API keys are project-wide, so this key reaches exactly one project and nothing outside it. A second project is a second connector with its own key and its own id — never a `project_id` argument pointed somewhere else.\n\nConfirm the project on first use: `list-projects` returns the one project this key can see, and its `project_id` is the one every project-scoped call takes. An empty or unexpected result means wrong connector, not missing data.\n\nA RevenueCat secret key has per-resource permissions. RevenueCat can omit tools this key cannot use from its live catalog; Connecta serves the returned catalog rather than adding missing tools from its reviewed superset. Catalog presence alone does not prove a call is permitted. A served tool can still fail at RevenueCat for missing permissions; read that refusal and route the call to a connector with the required permissions. A read-only Connecta endpoint independently omits and blocks tools classified as writes.\n"
|
|
10
|
-
}
|
|
11
|
-
};
|
|
@@ -1,14 +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
|
-
/** Which Stripe environment a key reaches. */
|
|
5
|
-
export type StripeMode = "production" | "sandbox";
|
|
6
|
-
/** Stripe's REST origin. */
|
|
7
|
-
export declare const STRIPE_API_BASE_URL = "https://api.stripe.com";
|
|
8
|
-
export interface StripeRest {
|
|
9
|
-
vendor: RestVendor;
|
|
10
|
-
tools: ApiTool[];
|
|
11
|
-
testCredential(value: string, ctx: ConnectorContext): Promise<CredentialTestResult>;
|
|
12
|
-
}
|
|
13
|
-
/** Stripe's REST vendor, its named tools, and its credential test, for one mode. */
|
|
14
|
-
export declare function stripeRest(mode: StripeMode, connectedAccount: string | undefined): StripeRest;
|
|
@@ -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;
|