@zackbart/connecta 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +393 -0
- package/README.md +62 -105
- package/SECURITY.md +3 -2
- package/bin/connecta.mjs +41 -16
- package/bin/version.mjs +1 -1
- package/dist/access-tokens.d.ts +2 -1
- package/dist/access-tokens.js +66 -30
- package/dist/activity.d.ts +1 -1
- package/dist/activity.js +2 -0
- package/dist/agent-config.d.ts +23 -0
- package/dist/agent-config.js +59 -0
- package/dist/agent-description.js +16 -0
- package/dist/agent-identity.js +4 -4
- package/dist/agent-observation.js +39 -0
- package/dist/auth/clerk-sdk/client.d.ts +2 -0
- package/dist/auth/clerk-sdk/generated.js +554 -563
- package/dist/auth/clerk-transport.js +70 -3
- package/dist/auth/clerk.d.ts +13 -0
- package/dist/auth/clerk.js +653 -246
- package/dist/auth/cloudflare-access.js +46 -42
- package/dist/auth/downstream-client-metadata.js +2 -2
- package/dist/auth/downstream-oauth.js +2051 -1160
- package/dist/auth/downstream-revocation.js +88 -88
- package/dist/auth/native-call.js +20 -0
- package/dist/auth/native.js +184 -0
- package/dist/auth/oauth-start-reset.js +11 -5
- package/dist/auth/oauth-token-response.js +121 -102
- package/dist/auth/oauth-v2-migration.js +97 -78
- package/dist/auth/renewable-grant.js +10 -0
- package/dist/auth/static-oauth.js +663 -271
- package/dist/auth/vercel-agent.js +266 -0
- package/dist/auth-admission.js +204 -0
- package/dist/auth-elicitation.js +350 -241
- package/dist/authorization-handoff.js +164 -90
- package/dist/call-admission-context.js +3 -10
- package/dist/call-admission.js +2 -0
- package/dist/call-classification.js +9 -0
- package/dist/call-recovery.js +32 -13
- package/dist/canonical-json.js +8 -0
- package/dist/catalog-cache.js +369 -213
- package/dist/catalog-service.js +659 -530
- package/dist/catalog.js +5 -1
- package/dist/concurrency.js +0 -25
- package/dist/config-defaults.d.ts +1 -0
- package/dist/config-defaults.js +1 -0
- package/dist/config-schema.d.ts +3 -1
- package/dist/config-schema.js +13 -3
- package/dist/config.d.ts +40 -6
- package/dist/config.js +40 -26
- package/dist/connector-caller.d.ts +4 -0
- package/dist/connector-caller.js +17 -4
- package/dist/connectors/api-connector.d.ts +15 -7
- package/dist/connectors/api-connector.js +147 -57
- package/dist/connectors/guarded-fetch.d.ts +51 -17
- package/dist/connectors/guarded-fetch.js +215 -121
- package/dist/connectors/negotiation-cache.js +20 -10
- package/dist/connectors/option-shapes.js +1 -1
- package/dist/connectors/remote-mcp.d.ts +12 -30
- package/dist/connectors/remote-mcp.js +960 -564
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +5 -1
- package/dist/describe-config.js +3 -0
- package/dist/downstream-input.js +347 -260
- package/dist/errors.d.ts +87 -6
- package/dist/errors.js +114 -4
- package/dist/execute.js +87 -50
- package/dist/executor-admission.js +3 -0
- package/dist/executors/quickjs.js +163 -112
- package/dist/guarded-transport.js +50 -0
- package/dist/guest-runtime.js +1 -1
- package/dist/http/client.js +439 -0
- package/dist/http/errors.js +558 -0
- package/dist/http/fields.js +49 -0
- package/dist/http/hatch-paging.js +318 -0
- package/dist/http/hatch.js +1279 -0
- package/dist/http/json-schema.js +267 -0
- package/dist/http/node-transport.js +241 -0
- package/dist/http/oauth.js +162 -0
- package/dist/http/paging.js +228 -0
- package/dist/http/provider.js +221 -0
- package/dist/http/safety.js +82 -0
- package/dist/http/services.js +79 -0
- package/dist/http/tools.js +383 -0
- package/dist/http/vendor-index.js +138 -0
- package/dist/http/vendor.js +448 -0
- package/dist/http/write-request.js +66 -0
- package/dist/http-policy.d.ts +11 -0
- package/dist/http-policy.js +45 -0
- package/dist/inbound-credential.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -0
- package/dist/invocation-auth.js +30 -19
- package/dist/invocation.js +221 -87
- package/dist/mcp-result.js +0 -4
- package/dist/membership.d.ts +4 -0
- package/dist/meta-output.js +1 -1
- package/dist/meta-tools.js +534 -408
- package/dist/native-recovery.js +52 -0
- package/dist/native-tools.js +382 -0
- package/dist/node.d.ts +4 -3
- package/dist/node.js +45 -8
- package/dist/oauth-handoff.js +177 -104
- package/dist/oauth-partition.js +6 -20
- package/dist/oauth-sealing.js +6 -7
- package/dist/operation-vocabulary.js +101 -0
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +17 -4
- package/dist/operator-ui/agents.d.ts +5 -4
- package/dist/operator-ui/agents.js +17 -7
- package/dist/operator-ui/config-summary.js +8 -4
- package/dist/operator-ui/connection-map.js +9 -6
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +5 -14
- package/dist/operator-ui/fix-prompts.d.ts +1 -1
- package/dist/operator-ui/fix-prompts.js +0 -8
- package/dist/operator-ui/generated.js +3 -3
- package/dist/operator-ui/health.js +52 -0
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +11 -19
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +5 -29
- package/dist/operator-ui/view.js +3 -59
- package/dist/program-writes.js +47 -26
- package/dist/provider-call-facts.d.ts +115 -0
- package/dist/provider-call-facts.js +182 -0
- package/dist/provider-call.d.ts +112 -0
- package/dist/provider-call.js +271 -0
- package/dist/provider.d.ts +71 -32
- package/dist/provider.js +134 -40
- package/dist/providers/_shared/google/hatch.js +91 -0
- package/dist/providers/_shared/google/kit.js +537 -0
- package/dist/providers/_shared/google/result-size.js +15 -2
- package/dist/providers/_shared/google/service-account.d.ts +2 -1
- package/dist/providers/_shared/google/service-account.js +8 -4
- package/dist/providers/_shared/google/workspace.d.ts +8 -209
- package/dist/providers/_shared/google/workspace.js +7 -426
- package/dist/providers/_shared/rest/compact-index.js +86 -0
- package/dist/providers/_shared/rest/dispatch.js +3 -23
- package/dist/providers/_shared/rest/kit.js +546 -0
- package/dist/providers/_shared/rest/operation-index.js +230 -14
- package/dist/providers/_shared/rest/response-media.js +11 -0
- package/dist/providers/_shared/rest/tools.js +101 -78
- package/dist/providers/_shared/rest/value-safety.js +353 -195
- package/dist/providers/_shared/sensitive-fields.js +27 -0
- package/dist/providers/breeze/api.js +584 -0
- package/dist/providers/breeze/index.d.ts +3 -3
- package/dist/providers/breeze/index.js +67 -1420
- package/dist/providers/breeze/openapi.generated.js +60 -0
- package/dist/providers/breeze/skill.generated.js +2 -6
- package/dist/providers/breeze/tools.js +696 -0
- package/dist/providers/ccb/api.js +496 -0
- package/dist/providers/ccb/index.d.ts +17 -37
- package/dist/providers/ccb/index.js +77 -1702
- package/dist/providers/ccb/lib/constants.d.ts +34 -0
- package/dist/providers/ccb/lib/constants.js +74 -0
- package/dist/providers/ccb/lib/guide.js +9 -0
- package/dist/providers/ccb/lib/verdicts.js +387 -0
- package/dist/providers/ccb/openapi.generated.js +397 -0
- package/dist/providers/ccb/safety.js +295 -0
- package/dist/providers/ccb/skill.generated.js +2 -6
- package/dist/providers/ccb/tools.js +853 -0
- package/dist/providers/cloudflare/api.js +1066 -0
- package/dist/providers/cloudflare/index.d.ts +7 -22
- package/dist/providers/cloudflare/index.js +80 -194
- package/dist/providers/cloudflare/lib/config.d.ts +16 -0
- package/dist/providers/cloudflare/lib/config.js +2 -0
- package/dist/providers/cloudflare/lib/discovery.js +29 -0
- package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
- package/dist/providers/cloudflare/lib/hatch.js +103 -0
- package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
- package/dist/providers/cloudflare/lib/response-media.js +75 -0
- package/dist/providers/cloudflare/openapi.generated.js +3299 -3208
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +538 -18
- package/dist/providers/cloudflare/skill.generated.js +2 -10
- package/dist/providers/cloudflare/tools.js +360 -0
- package/dist/providers/docs/api.js +51 -0
- package/dist/providers/docs/index.d.ts +1 -12
- package/dist/providers/docs/index.js +53 -1165
- package/dist/providers/docs/lib/constants.d.ts +18 -0
- package/dist/providers/docs/lib/constants.js +18 -0
- package/dist/providers/docs/lib/discovery.js +26 -0
- package/dist/providers/docs/lib/requests.js +48 -0
- package/dist/providers/docs/lib/schemas.js +168 -0
- package/dist/providers/docs/openapi.generated.js +16 -0
- package/dist/providers/docs/safety.js +54 -0
- package/dist/providers/docs/skill.generated.js +2 -6
- package/dist/providers/docs/tools.js +802 -0
- package/dist/providers/drive/api.js +177 -0
- package/dist/providers/drive/index.d.ts +1 -12
- package/dist/providers/drive/index.js +38 -1448
- package/dist/providers/drive/lib/constants.d.ts +6 -0
- package/dist/providers/drive/lib/constants.js +6 -0
- package/dist/providers/drive/lib/contracts.js +532 -0
- package/dist/providers/drive/lib/hatch.js +197 -0
- package/dist/providers/drive/openapi.generated.js +77 -0
- package/dist/providers/drive/safety.js +90 -0
- package/dist/providers/drive/skill.generated.js +2 -6
- package/dist/providers/drive/tools.js +1290 -0
- package/dist/providers/forms/api.js +71 -0
- package/dist/providers/forms/index.d.ts +1 -12
- package/dist/providers/forms/index.js +49 -1145
- package/dist/providers/forms/lib/constants.d.ts +14 -0
- package/dist/providers/forms/lib/constants.js +19 -0
- package/dist/providers/forms/lib/hatch.js +72 -0
- package/dist/providers/forms/openapi.generated.js +23 -0
- package/dist/providers/forms/safety.js +34 -0
- package/dist/providers/forms/skill.generated.js +2 -8
- package/dist/providers/forms/tools.js +1024 -0
- package/dist/providers/github/api.js +150 -0
- package/dist/providers/github/index.d.ts +4 -5
- package/dist/providers/github/index.js +30 -87
- package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
- package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
- package/dist/providers/github/lib/discovery.js +132 -0
- package/dist/providers/github/lib/operations.js +58 -0
- package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
- package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
- package/dist/providers/github/openapi.generated.js +1216 -0
- package/dist/providers/github/safety.js +216 -0
- package/dist/providers/github/skill.generated.js +2 -5
- package/dist/providers/github/tools.js +506 -0
- package/dist/providers/gmail/api.js +114 -0
- package/dist/providers/gmail/index.d.ts +1 -12
- package/dist/providers/gmail/index.js +73 -1621
- package/dist/providers/gmail/lib/constants.d.ts +13 -0
- package/dist/providers/gmail/lib/constants.js +16 -0
- package/dist/providers/gmail/lib/index.js +173 -0
- package/dist/providers/gmail/lib/schemas.js +176 -0
- package/dist/providers/gmail/lib/threading.js +120 -0
- package/dist/providers/gmail/openapi.generated.js +92 -0
- package/dist/providers/gmail/safety.js +21 -0
- package/dist/providers/gmail/skill.generated.js +2 -6
- package/dist/providers/gmail/tools.js +1435 -0
- package/dist/providers/overflow/api.js +1008 -0
- package/dist/providers/overflow/index.d.ts +3 -17
- package/dist/providers/overflow/index.js +60 -1488
- package/dist/providers/overflow/skill.generated.js +2 -5
- package/dist/providers/overflow/tools.js +873 -0
- package/dist/providers/planning-center/api.js +467 -0
- package/dist/providers/planning-center/index.d.ts +6 -35
- package/dist/providers/planning-center/index.js +69 -2445
- package/dist/providers/planning-center/lib/constants.d.ts +58 -0
- package/dist/providers/planning-center/lib/constants.js +83 -0
- package/dist/providers/planning-center/lib/discovery.js +40 -0
- package/dist/providers/planning-center/lib/guide.js +39 -0
- package/dist/providers/planning-center/lib/json-api.js +83 -0
- package/dist/providers/planning-center/lib/verdicts.js +1758 -0
- package/dist/providers/planning-center/openapi.generated.js +1764 -0
- package/dist/providers/planning-center/safety.js +188 -0
- package/dist/providers/planning-center/skill.generated.js +2 -27
- package/dist/providers/planning-center/tools.js +1010 -0
- package/dist/providers/sheets/api.js +133 -0
- package/dist/providers/sheets/index.d.ts +4 -16
- package/dist/providers/sheets/index.js +61 -1172
- package/dist/providers/sheets/lib/constants.d.ts +14 -0
- package/dist/providers/sheets/lib/constants.js +14 -0
- package/dist/providers/sheets/lib/hatch.js +163 -0
- package/dist/providers/sheets/lib/requests.js +105 -0
- package/dist/providers/sheets/lib/schemas.js +138 -0
- package/dist/providers/sheets/openapi.generated.js +30 -0
- package/dist/providers/sheets/safety.js +27 -0
- package/dist/providers/sheets/skill.generated.js +2 -7
- package/dist/providers/sheets/tools.js +734 -0
- package/dist/providers/slides/api.js +147 -0
- package/dist/providers/slides/index.d.ts +2 -10
- package/dist/providers/slides/index.js +48 -2555
- package/dist/providers/slides/lib/constants.d.ts +11 -0
- package/dist/providers/slides/lib/constants.js +11 -0
- package/dist/providers/slides/lib/requests.js +60 -0
- package/dist/providers/slides/lib/schemas.js +565 -0
- package/dist/providers/slides/openapi.generated.js +18 -0
- package/dist/providers/slides/skill.generated.js +2 -6
- package/dist/providers/slides/tools.js +1968 -0
- package/dist/providers/stripe/api.js +401 -0
- package/dist/providers/stripe/index.d.ts +7 -27
- package/dist/providers/stripe/index.js +75 -191
- package/dist/providers/stripe/lib/config.d.ts +4 -0
- package/dist/providers/stripe/lib/config.js +2 -0
- package/dist/providers/stripe/openapi.generated.js +4 -3
- package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
- package/dist/providers/stripe/skill.generated.js +2 -10
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +19 -0
- package/dist/providers/tithely/index.js +86 -965
- package/dist/providers/tithely/skill.generated.js +2 -5
- package/dist/providers/tithely/tools.js +426 -0
- package/dist/providers/vercel/api.js +551 -0
- package/dist/providers/vercel/index.d.ts +11 -25
- package/dist/providers/vercel/index.js +67 -261
- package/dist/providers/vercel/lib/config.d.ts +2 -0
- package/dist/providers/vercel/lib/config.js +2 -0
- package/dist/providers/vercel/lib/index.js +117 -0
- package/dist/providers/vercel/lib/logs.js +100 -0
- package/dist/providers/vercel/lib/pin.js +270 -0
- package/dist/providers/vercel/openapi.generated.js +398 -376
- package/dist/providers/vercel/{value-safety.js → safety.js} +261 -42
- package/dist/providers/vercel/skill.generated.js +2 -7
- package/dist/providers/vercel/tools.js +642 -0
- package/dist/redaction-identity.js +47 -0
- package/dist/redaction-marker.js +125 -0
- package/dist/registry.d.ts +30 -28
- package/dist/registry.js +446 -413
- package/dist/routes/access-tokens.js +1 -1
- package/dist/routes/actor-labels.js +1 -1
- package/dist/routes/connect.js +1 -1
- package/dist/routes/dispatch.js +103 -0
- package/dist/routes/mcp.js +170 -79
- package/dist/routes/oauth.js +3 -1
- package/dist/routes/operator.js +2 -2
- package/dist/routes/shared.d.ts +5 -4
- package/dist/routes/shared.js +244 -177
- package/dist/routes/skills.js +10 -8
- package/dist/routes/ui-config.js +27 -3
- package/dist/routes/ui-data.js +29 -22
- package/dist/routes/ui.js +1 -1
- package/dist/runtime/call-admission.js +0 -26
- package/dist/runtime/call-entry.js +30 -0
- package/dist/runtime/call.js +556 -0
- package/dist/runtime/connector-scope.js +7 -0
- package/dist/runtime/credential-probe.js +34 -0
- package/dist/runtime/executor.js +40 -0
- package/dist/runtime/native-storage.js +63 -0
- package/dist/runtime/registry.js +27 -0
- package/dist/runtime/request-scope.js +72 -0
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/shared-read.js +34 -5
- package/dist/runtime/storage.js +34 -21
- package/dist/sent-secrets.d.ts +194 -37
- package/dist/sent-secrets.js +1743 -340
- package/dist/server.js +5 -56
- package/dist/skills.js +330 -224
- package/dist/sqlite.js +15 -14
- package/dist/storage/d1-copy.js +255 -0
- package/dist/storage/d1-driver.js +15 -0
- package/dist/storage/keys.js +28 -0
- package/dist/storage/sql-driver.js +88 -0
- package/dist/storage/sql-native.js +544 -0
- package/dist/storage/sql-schema.d.ts +6 -0
- package/dist/storage/sql-schema.js +15 -0
- package/dist/storage/sql.d.ts +14 -20
- package/dist/storage/sql.js +29 -535
- package/dist/timeout.js +0 -26
- package/dist/tool-safety.js +20 -10
- package/dist/types.d.ts +11 -99
- package/dist/upward.js +3 -0
- package/dist/usage-guide.js +3 -1
- package/dist/validate.d.ts +4 -2
- package/dist/validate.js +86 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.js +312 -292
- package/dist/workspace-subject.js +5 -1
- package/dist/write-outcome.js +454 -34
- package/documentation/README.md +27 -7
- package/documentation/architecture.md +2550 -186
- package/documentation/auth.md +821 -98
- package/documentation/code-mode.md +56 -21
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +144 -105
- package/documentation/meta-tools.md +411 -34
- package/documentation/operating.md +28 -4
- package/documentation/operator-tests.md +11 -2
- package/documentation/operator-ui.md +103 -33
- package/documentation/provider-auth-migration.md +38 -63
- package/documentation/provider-migration-0.29.md +10 -5
- package/documentation/provider-migration-0.35.md +975 -0
- package/documentation/providers.md +965 -0
- package/examples/worker/AGENTS.md +23 -9
- package/examples/worker/README.md +254 -135
- package/examples/worker/alchemy.run.ts +116 -0
- package/examples/worker/gitignore +10 -0
- package/examples/worker/src/connecta.config.ts +23 -21
- package/examples/worker/wrangler.jsonc +14 -5
- package/guides/connecting-agents.md +157 -0
- package/guides/how-it-works.md +156 -0
- package/guides/safety-and-trust.md +153 -0
- package/package.json +27 -42
- package/templates/node/.env.example +3 -0
- package/templates/node/README.md +22 -2
- package/templates/node/docker-compose.yml +1 -0
- package/templates/node/package.json +3 -2
- package/templates/node/src/connecta.config.ts +8 -0
- package/dist/catalog-drift.d.ts +0 -134
- package/dist/catalog-drift.js +0 -493
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
- package/dist/providers/_shared/rest/tools.d.ts +0 -141
- package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
- package/dist/providers/basecamp/index.d.ts +0 -43
- package/dist/providers/basecamp/index.js +0 -997
- package/dist/providers/basecamp/skill.generated.js +0 -9
- package/dist/providers/cloudflare/rest.d.ts +0 -37
- package/dist/providers/cloudflare/rest.js +0 -1078
- package/dist/providers/github/hosted.js +0 -218
- package/dist/providers/github/rest.js +0 -321
- package/dist/providers/infisical/index.d.ts +0 -7
- package/dist/providers/infisical/index.js +0 -713
- package/dist/providers/infisical/skill.generated.js +0 -8
- package/dist/providers/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -352
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -57
- package/dist/providers/mixpanel/index.js +0 -468
- package/dist/providers/mixpanel/operations.js +0 -20
- package/dist/providers/mixpanel/rest.js +0 -603
- package/dist/providers/mixpanel/skill.generated.js +0 -10
- package/dist/providers/mixpanel/value-safety.js +0 -16
- package/dist/providers/notion/index.d.ts +0 -65
- package/dist/providers/notion/index.js +0 -368
- package/dist/providers/notion/openapi.generated.js +0 -75
- package/dist/providers/notion/rest.d.ts +0 -24
- package/dist/providers/notion/rest.js +0 -1226
- package/dist/providers/notion/skill.generated.js +0 -11
- package/dist/providers/notion/value-safety.js +0 -56
- package/dist/providers/revenuecat/index.d.ts +0 -49
- package/dist/providers/revenuecat/index.js +0 -557
- package/dist/providers/revenuecat/skill.generated.js +0 -11
- package/dist/providers/stripe/rest.d.ts +0 -14
- package/dist/providers/stripe/rest.js +0 -402
- package/dist/providers/vercel/rest.d.ts +0 -20
- package/dist/providers/vercel/rest.js +0 -1020
- package/dist/providers/wispr-flow/index.d.ts +0 -14
- package/dist/providers/wispr-flow/index.js +0 -117
- package/dist/providers/wispr-flow/skill.generated.js +0 -8
- /package/dist/providers/github/{key.js → lib/key.js} +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { runEdge } from "../runtime/run.js";
|
|
2
|
+
import { authCall, authFlow, authInvoke, authProgram, registerAuth } from "./native.js";
|
|
1
3
|
// The token endpoint's answers as downstream OAuth classifies them and the SDK
|
|
2
4
|
// gets to parse them: a refresh's re-consent verdict, and every failure
|
|
3
5
|
// rebuilt from its OAuth `error` code alone, so nothing else a token endpoint
|
|
@@ -55,47 +57,54 @@ class OversizedRefreshResponse extends Error {
|
|
|
55
57
|
super(`OAuth refresh response exceeded ${MAX_REFRESH_RESPONSE_BYTES} bytes.`);
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
60
|
+
function readRefreshResponse(response, signal, clone = true) {
|
|
61
|
+
return runEdge(authProgram(readRefreshResponseNative, [response, signal, clone]));
|
|
62
|
+
}
|
|
63
|
+
const readRefreshResponseNative = /* @__PURE__ */ registerAuth(readRefreshResponse, function (response, signal, clone = true) {
|
|
64
|
+
return authFlow(function* () {
|
|
65
|
+
if (Number(response.headers.get("content-length")) > MAX_REFRESH_RESPONSE_BYTES) {
|
|
66
|
+
void response.body?.cancel().catch(() => { });
|
|
67
|
+
throw new OversizedRefreshResponse();
|
|
68
|
+
}
|
|
69
|
+
const reader = (clone ? response.clone() : response).body?.getReader();
|
|
70
|
+
if (!reader)
|
|
71
|
+
return undefined;
|
|
72
|
+
void reader.closed.catch(() => { });
|
|
73
|
+
const cancel = () => {
|
|
74
|
+
void reader.cancel().catch(() => { });
|
|
75
|
+
void response.body?.cancel().catch(() => { });
|
|
76
|
+
};
|
|
77
|
+
signal?.addEventListener("abort", cancel, { once: true });
|
|
78
|
+
if (signal?.aborted)
|
|
79
|
+
cancel();
|
|
80
|
+
const decoder = new TextDecoder();
|
|
81
|
+
let size = 0;
|
|
82
|
+
let text = "";
|
|
83
|
+
try {
|
|
84
|
+
while (true) {
|
|
85
|
+
const { done, value } = (yield authInvoke(reader, "read", []));
|
|
86
|
+
if (done)
|
|
87
|
+
break;
|
|
88
|
+
size += value.byteLength;
|
|
89
|
+
if (size > MAX_REFRESH_RESPONSE_BYTES) {
|
|
90
|
+
// A cloned body's cancellation can await its sibling. Cancel both,
|
|
91
|
+
// without making the refusal wait for the provider to finish sending.
|
|
92
|
+
void reader.cancel().catch(() => { });
|
|
93
|
+
void response.body?.cancel().catch(() => { });
|
|
94
|
+
throw new OversizedRefreshResponse();
|
|
95
|
+
}
|
|
96
|
+
text += decoder.decode(value, { stream: true });
|
|
89
97
|
}
|
|
90
|
-
text
|
|
98
|
+
return JSON.parse(text + decoder.decode());
|
|
91
99
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
100
|
+
finally {
|
|
101
|
+
if (signal?.aborted)
|
|
102
|
+
cancel();
|
|
103
|
+
signal?.removeEventListener("abort", cancel);
|
|
104
|
+
reader.releaseLock();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
99
108
|
function oauthErrorCode(body) {
|
|
100
109
|
if (!body || typeof body !== "object" || Array.isArray(body))
|
|
101
110
|
return undefined;
|
|
@@ -148,24 +157,29 @@ function sdkTokenFailure(original, code, status = original.status) {
|
|
|
148
157
|
* the registered set becomes `invalid_request`, and a body without a string
|
|
149
158
|
* code becomes `server_error`, the classes the SDK already gave them.
|
|
150
159
|
*/
|
|
151
|
-
export
|
|
152
|
-
|
|
153
|
-
return sdkTokenFailure(response, "invalid_request", 400);
|
|
154
|
-
}
|
|
155
|
-
let parsed;
|
|
156
|
-
try {
|
|
157
|
-
parsed = await readRefreshResponse(response);
|
|
158
|
-
}
|
|
159
|
-
catch {
|
|
160
|
-
// Not JSON, or too large to be a token response: only the status is left.
|
|
161
|
-
return sdkTokenFailure(response, "server_error");
|
|
162
|
-
}
|
|
163
|
-
if (response.ok && sdkAcceptsOAuthTokens(parsed)) {
|
|
164
|
-
await accept?.(parsed);
|
|
165
|
-
return response;
|
|
166
|
-
}
|
|
167
|
-
return sdkTokenFailure(response, oauthErrorCode(parsed) ?? "server_error");
|
|
160
|
+
export function sdkSafeTokenResponse(response, accept) {
|
|
161
|
+
return runEdge(authProgram(sdkSafeTokenResponseNative, [response, accept]));
|
|
168
162
|
}
|
|
163
|
+
const sdkSafeTokenResponseNative = /* @__PURE__ */ registerAuth(sdkSafeTokenResponse, function (response, accept) {
|
|
164
|
+
return authFlow(function* () {
|
|
165
|
+
if (response.status >= 300 && response.status < 400) {
|
|
166
|
+
return sdkTokenFailure(response, "invalid_request", 400);
|
|
167
|
+
}
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = (yield authCall(readRefreshResponse, [response]));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Not JSON, or too large to be a token response: only the status is left.
|
|
174
|
+
return sdkTokenFailure(response, "server_error");
|
|
175
|
+
}
|
|
176
|
+
if (response.ok && sdkAcceptsOAuthTokens(parsed)) {
|
|
177
|
+
(yield authCall(accept, [parsed]));
|
|
178
|
+
return response;
|
|
179
|
+
}
|
|
180
|
+
return sdkTokenFailure(response, oauthErrorCode(parsed) ?? "server_error");
|
|
181
|
+
});
|
|
182
|
+
});
|
|
169
183
|
/**
|
|
170
184
|
* Classify the token endpoint's answer once with a bounded read, and keep the parsed
|
|
171
185
|
* tokens: a valid response has already consumed the rotating refresh token, so
|
|
@@ -180,52 +194,57 @@ export async function sdkSafeTokenResponse(response, accept) {
|
|
|
180
194
|
* Provider hooks preserve the re-consent verdict for passive calls. Rebuilding
|
|
181
195
|
* the response keeps provider text out of SDK output.
|
|
182
196
|
*/
|
|
183
|
-
export
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
197
|
+
export function refreshResponseOutcome(response, signal) {
|
|
198
|
+
return runEdge(authProgram(refreshResponseOutcomeNative, [response, signal]));
|
|
199
|
+
}
|
|
200
|
+
const refreshResponseOutcomeNative = /* @__PURE__ */ registerAuth(refreshResponseOutcome, function (response, signal) {
|
|
201
|
+
return authFlow(function* () {
|
|
202
|
+
if (response.status >= 300 && response.status < 400) {
|
|
203
|
+
return {
|
|
204
|
+
failure: new Error("OAuth token endpoint redirected; authorization required."),
|
|
205
|
+
verdict: { kind: "dead" },
|
|
206
|
+
forSdk: sdkTokenFailure(response, "invalid_grant", 400),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (!response.ok) {
|
|
210
|
+
let code;
|
|
211
|
+
try {
|
|
212
|
+
const body = (yield authCall(readRefreshResponse, [response, signal, false]));
|
|
213
|
+
if (body && typeof body === "object" && ("access_token" in body || "refresh_token" in body)) {
|
|
214
|
+
// A provider issuing tokens while reporting failure may have rotated.
|
|
215
|
+
throw new Error("OAuth refresh failure response may contain a rotation.");
|
|
216
|
+
}
|
|
217
|
+
code = oauthErrorCode(body);
|
|
198
218
|
}
|
|
199
|
-
|
|
219
|
+
catch (error) {
|
|
220
|
+
// Complete non-JSON failures still require re-consent. A lost body or
|
|
221
|
+
// evidence of issued tokens cannot prove a committed outcome.
|
|
222
|
+
if (!(error instanceof SyntaxError))
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
const failure = new Error(`OAuth refresh failed with HTTP ${response.status}.`);
|
|
226
|
+
return {
|
|
227
|
+
failure,
|
|
228
|
+
verdict: { kind: "dead" },
|
|
229
|
+
forSdk: sdkTokenFailure(response, code === "invalid_client" || code === "unauthorized_client" ? code : "invalid_grant", 400),
|
|
230
|
+
};
|
|
200
231
|
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
232
|
+
// A successful HTTP status may have consumed the token even when its
|
|
233
|
+
// body cannot be read or parsed. The coordinator refuses the fingerprint.
|
|
234
|
+
const parsed = (yield authCall(readRefreshResponse, [response, signal, false]));
|
|
235
|
+
if (sdkAcceptsOAuthTokens(parsed)) {
|
|
236
|
+
// An `issuer` names the server a grant is bound to, and only the client
|
|
237
|
+
// stamps it — never the server answering, as the SDK's own parse agrees.
|
|
238
|
+
const { issuer: _ignored, ...tokens } = parsed;
|
|
239
|
+
return { tokens };
|
|
206
240
|
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
if (sdkAcceptsOAuthTokens(parsed)) {
|
|
218
|
-
// An `issuer` names the server a grant is bound to, and only the client
|
|
219
|
-
// stamps it — never the server answering, as the SDK's own parse agrees.
|
|
220
|
-
const { issuer: _ignored, ...tokens } = parsed;
|
|
221
|
-
return { tokens };
|
|
222
|
-
}
|
|
223
|
-
if (oauthErrorCode(parsed) !== undefined) {
|
|
224
|
-
return {
|
|
225
|
-
failure: new Error("OAuth refresh was refused by the authorization server."),
|
|
226
|
-
verdict: { kind: "dead" },
|
|
227
|
-
forSdk: sdkTokenFailure(response, "invalid_grant", 400),
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
throw new Error("OAuth refresh response did not match the token schema.");
|
|
231
|
-
}
|
|
241
|
+
if (oauthErrorCode(parsed) !== undefined) {
|
|
242
|
+
return {
|
|
243
|
+
failure: new Error("OAuth refresh was refused by the authorization server."),
|
|
244
|
+
verdict: { kind: "dead" },
|
|
245
|
+
forSdk: sdkTokenFailure(response, "invalid_grant", 400),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
throw new Error("OAuth refresh response did not match the token schema.");
|
|
249
|
+
});
|
|
250
|
+
});
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { runEdge } from "../runtime/run.js";
|
|
1
2
|
import { oauthV2Keys } from "../storage/keys.js";
|
|
3
|
+
import { authAll, authCall, authFlow, authInvoke, authMap, authMethod, authProgram, authStorage, registerAuth, } from "./native.js";
|
|
2
4
|
function plainObject(value) {
|
|
3
5
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
4
6
|
}
|
|
@@ -29,88 +31,105 @@ export function discoveryIssuer(state) {
|
|
|
29
31
|
* discovery names, if any; otherwise it migrates empty and needs consent.
|
|
30
32
|
* One-shot consent state (pending URL, verifier, state) is not carried.
|
|
31
33
|
*/
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (!generation.startsWith("v2:") && generation !== "legacy") {
|
|
40
|
-
// An unfinished reset, or a numeric generation from before epochs.
|
|
41
|
-
return { disconnected: false, body: {} };
|
|
42
|
-
}
|
|
43
|
-
const epoch = generation === "legacy" ? null : generation;
|
|
44
|
-
const read = async (field) => {
|
|
45
|
-
const physicalKey = oauthV2Keys.value(field, epoch);
|
|
46
|
-
const raw = await storage.get(physicalKey);
|
|
47
|
-
if (raw === null)
|
|
34
|
+
export function readV2Grant(storage, sealer) {
|
|
35
|
+
return runEdge(authProgram(readV2GrantNative, [storage, sealer]));
|
|
36
|
+
}
|
|
37
|
+
const readV2GrantNative = /* @__PURE__ */ registerAuth(readV2Grant, function (storage, sealer) {
|
|
38
|
+
return authFlow(function* () {
|
|
39
|
+
const keys = (yield authCall(listV2Keys, [storage]));
|
|
40
|
+
if (keys.length === 0)
|
|
48
41
|
return undefined;
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
42
|
+
const generation = (yield authStorage(storage, "get", [oauthV2Keys.generation])) ?? "legacy";
|
|
43
|
+
if (generation.startsWith("disconnected:"))
|
|
44
|
+
return { disconnected: true, body: {} };
|
|
45
|
+
if (!generation.startsWith("v2:") && generation !== "legacy") {
|
|
46
|
+
// An unfinished reset, or a numeric generation from before epochs.
|
|
47
|
+
return { disconnected: false, body: {} };
|
|
59
48
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const [client, tokens, discovery] = await Promise.all([
|
|
78
|
-
read(oauthV2Keys.field.client),
|
|
79
|
-
read(oauthV2Keys.field.tokens),
|
|
80
|
-
read(oauthV2Keys.field.discovery),
|
|
81
|
-
]);
|
|
82
|
-
const named = discovery ? discoveryIssuer(discovery.value) : undefined;
|
|
83
|
-
const credentials = [client, tokens].filter((value) => value !== undefined);
|
|
84
|
-
const issuer = credentials[0]?.issuer ?? named;
|
|
85
|
-
const consistent = credentials.every((value) => value.issuer !== undefined && value.issuer === issuer && plainObject(value.value)) &&
|
|
86
|
-
(named === undefined || named === issuer);
|
|
87
|
-
if (!consistent || issuer === undefined)
|
|
88
|
-
return { disconnected: false, body: {} };
|
|
89
|
-
return {
|
|
90
|
-
disconnected: false,
|
|
91
|
-
body: {
|
|
92
|
-
issuer,
|
|
93
|
-
...(client
|
|
94
|
-
? {
|
|
95
|
-
client: {
|
|
96
|
-
value: client.value,
|
|
97
|
-
...(client.binding !== undefined ? { binding: client.binding } : {}),
|
|
98
|
-
...(client.carried ? { carried: true } : {}),
|
|
99
|
-
},
|
|
49
|
+
const epoch = generation === "legacy" ? null : generation;
|
|
50
|
+
const read = authMethod((field) => {
|
|
51
|
+
return authFlow(function* () {
|
|
52
|
+
const physicalKey = oauthV2Keys.value(field, epoch);
|
|
53
|
+
const raw = (yield authStorage(storage, "get", [physicalKey]));
|
|
54
|
+
if (raw === null)
|
|
55
|
+
return undefined;
|
|
56
|
+
let parsed = parse(raw);
|
|
57
|
+
if (plainObject(parsed) && parsed.connectaOAuthSealed === 1 && typeof parsed.sealed === "string") {
|
|
58
|
+
if (!sealer)
|
|
59
|
+
return undefined;
|
|
60
|
+
try {
|
|
61
|
+
parsed = parse((yield authInvoke(sealer, "open", [physicalKey, parsed.sealed])));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
100
66
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
67
|
+
if (plainObject(parsed) &&
|
|
68
|
+
parsed.connectaOAuthVersion === 2 &&
|
|
69
|
+
parsed.generation === generation &&
|
|
70
|
+
(parsed.issuer === undefined || typeof parsed.issuer === "string") &&
|
|
71
|
+
(parsed.binding === undefined || typeof parsed.binding === "string")) {
|
|
72
|
+
return {
|
|
73
|
+
value: parsed.value,
|
|
74
|
+
...(parsed.issuer !== undefined ? { issuer: parsed.issuer } : {}),
|
|
75
|
+
...(parsed.binding !== undefined ? { binding: parsed.binding } : {}),
|
|
76
|
+
...(parsed.carried === true ? { carried: true } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Layout 2 wrote discovery bare under the legacy generation.
|
|
80
|
+
return field === oauthV2Keys.field.discovery && epoch === null && discoveryIssuer(parsed)
|
|
81
|
+
? { value: parsed }
|
|
82
|
+
: undefined;
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
const [client, tokens, discovery] = (yield authAll([
|
|
86
|
+
authCall(read, [oauthV2Keys.field.client]),
|
|
87
|
+
authCall(read, [oauthV2Keys.field.tokens]),
|
|
88
|
+
authCall(read, [oauthV2Keys.field.discovery]),
|
|
89
|
+
], false));
|
|
90
|
+
const named = discovery ? discoveryIssuer(discovery.value) : undefined;
|
|
91
|
+
const credentials = [client, tokens].filter((value) => value !== undefined);
|
|
92
|
+
const issuer = credentials[0]?.issuer ?? named;
|
|
93
|
+
const consistent = credentials.every((value) => value.issuer !== undefined && value.issuer === issuer && plainObject(value.value)) &&
|
|
94
|
+
(named === undefined || named === issuer);
|
|
95
|
+
if (!consistent || issuer === undefined)
|
|
96
|
+
return { disconnected: false, body: {} };
|
|
97
|
+
return {
|
|
98
|
+
disconnected: false,
|
|
99
|
+
body: {
|
|
100
|
+
issuer,
|
|
101
|
+
...(client
|
|
102
|
+
? {
|
|
103
|
+
client: {
|
|
104
|
+
value: client.value,
|
|
105
|
+
...(client.binding !== undefined ? { binding: client.binding } : {}),
|
|
106
|
+
...(client.carried ? { carried: true } : {}),
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
: {}),
|
|
110
|
+
...(tokens ? { tokens: tokens.value } : {}),
|
|
111
|
+
...(discovery && named !== undefined ? { discovery: discovery.value } : {}),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
});
|
|
107
116
|
/** Only historical families are removed, never grants, flows, or leases. */
|
|
108
|
-
|
|
109
|
-
return (
|
|
117
|
+
function listV2Keys(storage) {
|
|
118
|
+
return runEdge(authProgram(listV2KeysNative, [storage]));
|
|
110
119
|
}
|
|
120
|
+
const listV2KeysNative = /* @__PURE__ */ registerAuth(listV2Keys, function (storage) {
|
|
121
|
+
return authFlow(function* () {
|
|
122
|
+
return (yield authStorage(storage, "list", [oauthV2Keys.scan])).filter((key) => oauthV2Keys.family.prefixes.some((prefix) => key.startsWith(prefix)));
|
|
123
|
+
});
|
|
124
|
+
});
|
|
111
125
|
/** Return true only when every historical key was deleted. */
|
|
112
|
-
export
|
|
113
|
-
|
|
114
|
-
const results = await Promise.allSettled(keys.map((key) => storage.delete(key)));
|
|
115
|
-
return results.every((result) => result.status === "fulfilled");
|
|
126
|
+
export function deleteV2Keys(storage) {
|
|
127
|
+
return runEdge(authProgram(deleteV2KeysNative, [storage]));
|
|
116
128
|
}
|
|
129
|
+
const deleteV2KeysNative = /* @__PURE__ */ registerAuth(deleteV2Keys, function (storage) {
|
|
130
|
+
return authFlow(function* () {
|
|
131
|
+
const keys = (yield authCall(listV2Keys, [storage]));
|
|
132
|
+
const results = (yield authMap(keys, (key) => authStorage(storage, "delete", [key]), true));
|
|
133
|
+
return results.every((result) => result.status === "fulfilled");
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const grants = new WeakMap();
|
|
2
|
+
/** The raw OAuth facade has no provider response ceiling; bound discarded 401 challenges independently. */
|
|
3
|
+
export const OAUTH_CHALLENGE_MAX_BYTES = 1024 * 1024;
|
|
4
|
+
export function bindRenewableGrant(facade, grant) {
|
|
5
|
+
grants.set(facade, grant);
|
|
6
|
+
return facade;
|
|
7
|
+
}
|
|
8
|
+
export function renewableGrantFor(facade) {
|
|
9
|
+
return grants.get(facade);
|
|
10
|
+
}
|