@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
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
// Internal opt-in adapters for the standard hatch. No maintained provider opts
|
|
2
|
+
// in until its separate step-2 migration. Inputs have crossed connection safety.
|
|
3
|
+
import { ConnectorCallError } from "../errors.js";
|
|
4
|
+
function record(value) {
|
|
5
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
6
|
+
}
|
|
7
|
+
function bad() {
|
|
8
|
+
throw new ConnectorCallError("connector_call_failed", "The vendor returned invalid paging metadata.", {
|
|
9
|
+
retryable: false,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
function integer(cursor) {
|
|
13
|
+
const value = Number(cursor);
|
|
14
|
+
if (!/^\d+$/.test(String(cursor)) || !Number.isSafeInteger(value) || value < 1) {
|
|
15
|
+
throw new ConnectorCallError("invalid_args", "This paging cursor contains no valid page number.");
|
|
16
|
+
}
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
/** Google list methods explicitly opt in; row count and resultSizeEstimate are irrelevant. */
|
|
20
|
+
export const googlePageToken = {
|
|
21
|
+
param: "pageToken",
|
|
22
|
+
in: "query",
|
|
23
|
+
cursorInputMessage: "Omit pageToken on the first call; pass page.nextCursor unchanged as top-level cursor thereafter.",
|
|
24
|
+
decode(cursor) {
|
|
25
|
+
if (typeof cursor !== "string" ||
|
|
26
|
+
!cursor.trim() ||
|
|
27
|
+
/^[a-z][a-z0-9+.-]*:/i.test(cursor) ||
|
|
28
|
+
[...cursor].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127))
|
|
29
|
+
throw new ConnectorCallError("invalid_args", "This paging cursor contains no valid Google page token.");
|
|
30
|
+
return cursor;
|
|
31
|
+
},
|
|
32
|
+
prepareQuery(query) {
|
|
33
|
+
const mask = query["fields"];
|
|
34
|
+
if (mask === undefined)
|
|
35
|
+
return query;
|
|
36
|
+
// Google's field-mask grammar includes balanced nested selectors. Restrict
|
|
37
|
+
// to that grammar; no wild guessing after the vendor drops its token.
|
|
38
|
+
if (typeof mask !== "string" || !mask || !/^[A-Za-z0-9_*/(),]+$/.test(mask))
|
|
39
|
+
throw new ConnectorCallError("invalid_args", "query.fields must be a Google field mask; omit it to read the full JSON response.");
|
|
40
|
+
const tokens = mask.match(/[A-Za-z_][A-Za-z0-9_]*|\*|[/(),]/g) ?? [];
|
|
41
|
+
let depth = 0, hasToken = false, name = true, child = false, valid = tokens.join("") === mask;
|
|
42
|
+
for (const [position, token] of tokens.entries()) {
|
|
43
|
+
if (token === "(") {
|
|
44
|
+
if (name || !child)
|
|
45
|
+
valid = false;
|
|
46
|
+
depth++;
|
|
47
|
+
name = true;
|
|
48
|
+
child = false;
|
|
49
|
+
}
|
|
50
|
+
else if (token === ")") {
|
|
51
|
+
if (name || depth === 0)
|
|
52
|
+
valid = false;
|
|
53
|
+
depth--;
|
|
54
|
+
name = false;
|
|
55
|
+
child = false;
|
|
56
|
+
}
|
|
57
|
+
else if (token === ",") {
|
|
58
|
+
if (name)
|
|
59
|
+
valid = false;
|
|
60
|
+
name = true;
|
|
61
|
+
child = false;
|
|
62
|
+
}
|
|
63
|
+
else if (token === "/") {
|
|
64
|
+
if (name || !child)
|
|
65
|
+
valid = false;
|
|
66
|
+
name = true;
|
|
67
|
+
child = false;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
if (depth === 0 &&
|
|
71
|
+
(position === 0 || tokens[position - 1] === ",") &&
|
|
72
|
+
token === "nextPageToken" &&
|
|
73
|
+
(position === tokens.length - 1 || tokens[position + 1] === ","))
|
|
74
|
+
hasToken = true;
|
|
75
|
+
if (!name)
|
|
76
|
+
valid = false;
|
|
77
|
+
name = false;
|
|
78
|
+
child = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (!valid || name || depth !== 0)
|
|
82
|
+
throw new ConnectorCallError("invalid_args", "query.fields has invalid selectors.");
|
|
83
|
+
return hasToken ? query : { ...query, fields: `${mask},nextPageToken` };
|
|
84
|
+
},
|
|
85
|
+
next(data) {
|
|
86
|
+
const token = record(data)["nextPageToken"];
|
|
87
|
+
if (token === undefined || token === "")
|
|
88
|
+
return null;
|
|
89
|
+
if (typeof token !== "string")
|
|
90
|
+
return bad();
|
|
91
|
+
try {
|
|
92
|
+
return googlePageToken.decode(token);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return bad();
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
/** Stripe forward lists: never infer another page from a full result. */
|
|
100
|
+
export const stripePage = {
|
|
101
|
+
param: "starting_after",
|
|
102
|
+
in: "query",
|
|
103
|
+
initialAnchor: true,
|
|
104
|
+
decode: (cursor) => {
|
|
105
|
+
if (typeof cursor !== "string" || !cursor) {
|
|
106
|
+
throw new ConnectorCallError("invalid_args", "This paging cursor contains no valid item id.");
|
|
107
|
+
}
|
|
108
|
+
return cursor;
|
|
109
|
+
},
|
|
110
|
+
next(data) {
|
|
111
|
+
const body = record(data);
|
|
112
|
+
if (body["has_more"] === undefined)
|
|
113
|
+
return undefined;
|
|
114
|
+
if (body["has_more"] === false)
|
|
115
|
+
return null;
|
|
116
|
+
if (body["has_more"] !== true || !Array.isArray(body["data"]))
|
|
117
|
+
return bad();
|
|
118
|
+
const id = record(body["data"].at(-1))["id"];
|
|
119
|
+
return typeof id === "string" && id ? id : bad();
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
/** Stripe reverse lists use the first safe row as the ending_before anchor. */
|
|
123
|
+
export const stripeBackwardPage = {
|
|
124
|
+
...stripePage,
|
|
125
|
+
param: "ending_before",
|
|
126
|
+
next(data, call) {
|
|
127
|
+
const body = record(data);
|
|
128
|
+
return stripePage.next(Array.isArray(body["data"]) ? { ...body, data: [...body["data"]].reverse() } : data, call);
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
/** Search cursors are vendor tokens, distinct from v1 list record-id anchors. */
|
|
132
|
+
export const stripeSearchPage = {
|
|
133
|
+
param: "page",
|
|
134
|
+
in: "query",
|
|
135
|
+
decode: stripePage.decode,
|
|
136
|
+
next(data) {
|
|
137
|
+
const body = record(data);
|
|
138
|
+
if (body["has_more"] === undefined)
|
|
139
|
+
return undefined;
|
|
140
|
+
if (body["has_more"] === false)
|
|
141
|
+
return null;
|
|
142
|
+
const next = body["next_page"];
|
|
143
|
+
return body["has_more"] === true && typeof next === "string" && next ? next : bad();
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
/** Extract only a v2 page token; every subsequent request retains its original path and filters. */
|
|
147
|
+
export const stripeV2Page = {
|
|
148
|
+
param: "page",
|
|
149
|
+
in: "query",
|
|
150
|
+
decode: stripePage.decode,
|
|
151
|
+
next(data, call) {
|
|
152
|
+
const body = record(data);
|
|
153
|
+
if (!Object.hasOwn(body, "next_page_url"))
|
|
154
|
+
return undefined;
|
|
155
|
+
if (body["next_page_url"] === null)
|
|
156
|
+
return null;
|
|
157
|
+
if (typeof body["next_page_url"] !== "string" || !body["next_page_url"])
|
|
158
|
+
return bad();
|
|
159
|
+
let next;
|
|
160
|
+
try {
|
|
161
|
+
next = new URL(body["next_page_url"], "https://api.stripe.com");
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return bad();
|
|
165
|
+
}
|
|
166
|
+
if (next.origin !== "https://api.stripe.com" ||
|
|
167
|
+
next.pathname !== call.path ||
|
|
168
|
+
next.username ||
|
|
169
|
+
next.password ||
|
|
170
|
+
next.hash)
|
|
171
|
+
return bad();
|
|
172
|
+
const pages = next.searchParams.getAll("page");
|
|
173
|
+
if (pages.length !== 1 || !pages[0])
|
|
174
|
+
return bad();
|
|
175
|
+
// URLs can omit filters: preserve them from the original call. Reject any
|
|
176
|
+
// filter the URL does state unless it has exactly the original wire values.
|
|
177
|
+
const expected = new URLSearchParams();
|
|
178
|
+
for (const [name, value] of Object.entries(call.query)) {
|
|
179
|
+
if (name === "page" || value === undefined)
|
|
180
|
+
continue;
|
|
181
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
182
|
+
if (!["string", "number", "boolean"].includes(typeof item))
|
|
183
|
+
return bad();
|
|
184
|
+
expected.append(name, String(item));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
let extra = false;
|
|
188
|
+
for (const name of new Set(next.searchParams.keys())) {
|
|
189
|
+
if (name !== "page" && !expected.has(name)) {
|
|
190
|
+
extra = true;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (name !== "page" &&
|
|
194
|
+
JSON.stringify(next.searchParams.getAll(name).sort()) !== JSON.stringify(expected.getAll(name).sort()))
|
|
195
|
+
return bad();
|
|
196
|
+
}
|
|
197
|
+
// A URL may echo vendor defaults absent from the original call. Keep the
|
|
198
|
+
// fetched data, without minting a cursor that would silently drop them.
|
|
199
|
+
return extra ? { hasMore: true } : pages[0];
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
/** Cloudflare page-number lists; preserve result_info until the adapter runs. */
|
|
203
|
+
export const cloudflarePage = {
|
|
204
|
+
param: "page",
|
|
205
|
+
in: "query",
|
|
206
|
+
decode: integer,
|
|
207
|
+
next(data) {
|
|
208
|
+
const info = record(record(data)["result_info"]);
|
|
209
|
+
if (Object.keys(info).length === 0)
|
|
210
|
+
return undefined;
|
|
211
|
+
const page = info["page"];
|
|
212
|
+
const total = info["total_pages"];
|
|
213
|
+
// Cursor-style result_info belongs to a separately declared token adapter.
|
|
214
|
+
if (page === undefined)
|
|
215
|
+
return undefined;
|
|
216
|
+
if (!Number.isSafeInteger(page) || page < 1)
|
|
217
|
+
return bad();
|
|
218
|
+
const perPage = info["per_page"] ?? 0;
|
|
219
|
+
const totalCount = info["total_count"];
|
|
220
|
+
const count = info["count"] ?? 0;
|
|
221
|
+
for (const value of [total, totalCount, perPage, count]) {
|
|
222
|
+
if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))
|
|
223
|
+
return bad();
|
|
224
|
+
}
|
|
225
|
+
const hasMore = total !== undefined
|
|
226
|
+
? page < total
|
|
227
|
+
: totalCount !== undefined
|
|
228
|
+
? page * perPage < totalCount
|
|
229
|
+
: perPage > 0 && count >= perPage;
|
|
230
|
+
return hasMore ? page + 1 : null;
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
/** Vercel's pagination.next is sent back as until, as a timestamp or token. */
|
|
234
|
+
export const vercelPage = {
|
|
235
|
+
param: "until",
|
|
236
|
+
in: "query",
|
|
237
|
+
decode: (cursor) => {
|
|
238
|
+
if ((typeof cursor === "number" && (!Number.isSafeInteger(cursor) || cursor < 0)) || cursor === "") {
|
|
239
|
+
throw new ConnectorCallError("invalid_args", "This paging cursor contains no valid timestamp.");
|
|
240
|
+
}
|
|
241
|
+
return cursor;
|
|
242
|
+
},
|
|
243
|
+
next(data) {
|
|
244
|
+
const pagination = record(record(data)["pagination"]);
|
|
245
|
+
if (!Object.hasOwn(pagination, "next"))
|
|
246
|
+
return undefined;
|
|
247
|
+
const next = pagination["next"];
|
|
248
|
+
if (next === null)
|
|
249
|
+
return null;
|
|
250
|
+
if (typeof next === "number" && Number.isSafeInteger(next) && next >= 0)
|
|
251
|
+
return next;
|
|
252
|
+
return typeof next === "string" && next && !/^[a-z][a-z0-9+.-]*:\/\//i.test(next) ? next : bad();
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
/** GitHub Link: extract only page, from the same origin and unchanged filters. */
|
|
256
|
+
export function githubPage(baseUrl) {
|
|
257
|
+
const base = new URL(baseUrl.replace(/\/+$/, "") + "/");
|
|
258
|
+
if (!/^https?:$/.test(base.protocol) || base.username || base.password || base.search || base.hash) {
|
|
259
|
+
throw new Error("GitHub hatch paging needs a confined API base URL.");
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
param: "page",
|
|
263
|
+
in: "query",
|
|
264
|
+
headers: ["link"],
|
|
265
|
+
decode: integer,
|
|
266
|
+
next(_data, call) {
|
|
267
|
+
const header = call.headers["link"];
|
|
268
|
+
if (!header)
|
|
269
|
+
return null;
|
|
270
|
+
const links = [...header.matchAll(/<([^<>]+)>([^<>]*)/g)].filter((match) => {
|
|
271
|
+
const rel = /;\s*rel\s*=\s*(?:"([^"]*)"|([^\s;,]+))/i.exec(match[2]);
|
|
272
|
+
return (rel?.[1] ?? rel?.[2])?.split(/\s+/).includes("next");
|
|
273
|
+
});
|
|
274
|
+
if (links.length === 0)
|
|
275
|
+
return null;
|
|
276
|
+
if (links.length !== 1)
|
|
277
|
+
return bad();
|
|
278
|
+
const target = new URL(call.path.replace(/^\//, ""), base);
|
|
279
|
+
let next;
|
|
280
|
+
try {
|
|
281
|
+
next = new URL(links[0][1], target);
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
return bad();
|
|
285
|
+
}
|
|
286
|
+
if (next.origin !== target.origin || next.username || next.password || next.hash)
|
|
287
|
+
return bad();
|
|
288
|
+
// GitHub can replace /repos/owner/name with /repositories/id. Only the
|
|
289
|
+
// page is extracted; the next request always keeps its original path.
|
|
290
|
+
// Compare parsed wire values as multisets, preserving duplicate counts
|
|
291
|
+
// while tolerating parameter order and equivalent URL encodings.
|
|
292
|
+
const expected = new URLSearchParams();
|
|
293
|
+
for (const [name, value] of Object.entries(call.query)) {
|
|
294
|
+
if (name === "page" || value === undefined)
|
|
295
|
+
continue;
|
|
296
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
297
|
+
if (typeof item !== "string" &&
|
|
298
|
+
typeof item !== "boolean" &&
|
|
299
|
+
!(typeof item === "number" && Number.isFinite(item)))
|
|
300
|
+
return bad();
|
|
301
|
+
expected.append(name, String(item));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
const actual = new URLSearchParams(next.search);
|
|
305
|
+
const pages = actual.getAll("page");
|
|
306
|
+
actual.delete("page");
|
|
307
|
+
const ordered = (params) => JSON.stringify([...params].sort(([ak, av], [bk, bv]) => (ak < bk ? -1 : ak > bk ? 1 : av < bv ? -1 : av > bv ? 1 : 0)));
|
|
308
|
+
if (ordered(expected) !== ordered(actual) || pages.length !== 1)
|
|
309
|
+
return bad();
|
|
310
|
+
try {
|
|
311
|
+
return integer(pages[0]);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
return bad();
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
}
|