@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
|
@@ -3,6 +3,7 @@ import { ConnectorCallError } from "../errors.js";
|
|
|
3
3
|
import { fromSignal, runEdge } from "../runtime/run.js";
|
|
4
4
|
import { classifyHost } from "../url-safety.js";
|
|
5
5
|
import { authenticateRemoteClient, remoteClientAuthMethod, } from "./downstream-client-metadata.js";
|
|
6
|
+
import { authCall, authFlow, authProgram, registerAuth } from "./native.js";
|
|
6
7
|
import { discoveryIssuer } from "./oauth-v2-migration.js";
|
|
7
8
|
/** Local removal succeeded; provider-side removal needs the operator's attention. */
|
|
8
9
|
export class OAuthRevocationError extends ConnectorCallError {
|
|
@@ -12,95 +13,94 @@ export class OAuthRevocationError extends ConnectorCallError {
|
|
|
12
13
|
}
|
|
13
14
|
const REVOCATION_DEADLINE_MS = 20_000;
|
|
14
15
|
/** Revoke only the issuer-bound snapshot removed by a successful reset CAS, once. */
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
target.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
token
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
signal: deadline.signal,
|
|
89
|
-
|
|
16
|
+
export function revokeDownstreamGrant(body, send, configuredClient) {
|
|
17
|
+
return runEdge(authProgram(revokeDownstreamGrantNative, [body, send, configuredClient]));
|
|
18
|
+
}
|
|
19
|
+
const revokeDownstreamGrantNative = /* @__PURE__ */ registerAuth(revokeDownstreamGrant, function (body, send, configuredClient) {
|
|
20
|
+
return authFlow(function* () {
|
|
21
|
+
const metadata = body.discovery?.authorizationServerMetadata;
|
|
22
|
+
const revocation = metadata;
|
|
23
|
+
const endpoint = revocation?.revocation_endpoint;
|
|
24
|
+
if (endpoint === undefined || !body.tokens)
|
|
25
|
+
return;
|
|
26
|
+
const deadline = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => deadline.abort(), REVOCATION_DEADLINE_MS);
|
|
28
|
+
try {
|
|
29
|
+
if (typeof endpoint !== "string" ||
|
|
30
|
+
!body.issuer ||
|
|
31
|
+
discoveryIssuer(body.discovery) !== body.issuer ||
|
|
32
|
+
!body.client ||
|
|
33
|
+
(body.client.value.issuer !== undefined && body.client.value.issuer !== body.issuer))
|
|
34
|
+
throw new OAuthRevocationError();
|
|
35
|
+
const target = new URL(endpoint);
|
|
36
|
+
// An operator-trusted HTTP MCP origin does not authorize plaintext
|
|
37
|
+
// credential endpoints. Only the existing loopback development exception
|
|
38
|
+
// is eligible; the connector's destination guard still checks that scope.
|
|
39
|
+
if ((target.protocol !== "https:" &&
|
|
40
|
+
!(target.protocol === "http:" && classifyHost(target.hostname) === "loopback")) ||
|
|
41
|
+
target.username ||
|
|
42
|
+
target.password ||
|
|
43
|
+
target.hash)
|
|
44
|
+
throw new OAuthRevocationError();
|
|
45
|
+
const information = body.client.value;
|
|
46
|
+
const secret = configuredClient ? configuredClient.clientSecret : information.client_secret;
|
|
47
|
+
if (configuredClient &&
|
|
48
|
+
(body.issuer !== configuredClient.issuer || information.client_id !== configuredClient.clientId))
|
|
49
|
+
throw new OAuthRevocationError();
|
|
50
|
+
const advertisedMethods = revocation?.revocation_endpoint_auth_methods_supported;
|
|
51
|
+
if (advertisedMethods !== undefined &&
|
|
52
|
+
(!Array.isArray(advertisedMethods) || !advertisedMethods.every((method) => typeof method === "string")))
|
|
53
|
+
throw new OAuthRevocationError();
|
|
54
|
+
const methods = advertisedMethods;
|
|
55
|
+
const declared = configuredClient
|
|
56
|
+
? remoteClientAuthMethod(configuredClient)
|
|
57
|
+
: "token_endpoint_auth_method" in information
|
|
58
|
+
? information.token_endpoint_auth_method
|
|
59
|
+
: undefined;
|
|
60
|
+
const method = declared ??
|
|
61
|
+
(secret === undefined
|
|
62
|
+
? "none"
|
|
63
|
+
: methods?.includes("client_secret_basic") || !methods
|
|
64
|
+
? "client_secret_basic"
|
|
65
|
+
: "client_secret_post");
|
|
66
|
+
if ((method !== "none" && method !== "client_secret_basic" && method !== "client_secret_post") ||
|
|
67
|
+
(method === "none") !== (secret === undefined) ||
|
|
68
|
+
(methods && !methods.includes(method)))
|
|
69
|
+
throw new OAuthRevocationError();
|
|
70
|
+
const token = body.tokens.refresh_token ?? body.tokens.access_token;
|
|
71
|
+
if (typeof token !== "string" || !token)
|
|
72
|
+
throw new OAuthRevocationError();
|
|
73
|
+
const params = new URLSearchParams({
|
|
74
|
+
token,
|
|
75
|
+
token_type_hint: body.tokens.refresh_token ? "refresh_token" : "access_token",
|
|
76
|
+
});
|
|
77
|
+
const headers = new Headers({ "Content-Type": "application/x-www-form-urlencoded" });
|
|
78
|
+
authenticateRemoteClient({
|
|
79
|
+
issuer: body.issuer,
|
|
80
|
+
clientId: information.client_id,
|
|
81
|
+
...(secret !== undefined ? { clientSecret: secret } : {}),
|
|
82
|
+
tokenEndpointAuthMethod: method,
|
|
83
|
+
}, headers, params);
|
|
84
|
+
(yield Effect.raceAllFirst([
|
|
85
|
+
fromSignal(deadline.signal),
|
|
86
|
+
authFlow(function* () {
|
|
87
|
+
const response = (yield authCall(send, [
|
|
88
|
+
target,
|
|
89
|
+
{ method: "POST", headers, body: params, redirect: "manual", signal: deadline.signal },
|
|
90
|
+
]));
|
|
90
91
|
// RFC 7009's success is HTTP 200. Bodies and headers never explain a failure.
|
|
91
92
|
void response.body?.cancel().catch(() => { });
|
|
92
93
|
if (response.status !== 200)
|
|
93
94
|
throw new OAuthRevocationError();
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
95
|
+
}),
|
|
96
|
+
]));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// No provider text, credential-bearing URL, original exception, or cause survives.
|
|
100
|
+
throw new OAuthRevocationError();
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Request/call Context belongs only to downstream auth, outside metadata/UI.
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { viewServices, viewSignal } from "../runtime/call.js";
|
|
4
|
+
import { RequestScope } from "../runtime/request-scope.js";
|
|
5
|
+
import { fromSignal } from "../runtime/run.js";
|
|
6
|
+
import { authCall } from "./native.js";
|
|
7
|
+
export function authView(ctx, work, requestOwned = false) {
|
|
8
|
+
return RequestScope.use((owner) => {
|
|
9
|
+
const signal = viewSignal(ctx, requestOwned);
|
|
10
|
+
if (!owner.open || signal.aborted)
|
|
11
|
+
return Effect.fail(signal.reason);
|
|
12
|
+
// Settlement facts from all synchronous abort observers precede cleanup,
|
|
13
|
+
// as they did at the Promise boundary. This grants no live authority.
|
|
14
|
+
const abort = Effect.catch(fromSignal(signal), (error) => Effect.andThen(Effect.yieldNow, Effect.fail(error)));
|
|
15
|
+
return Effect.raceFirst(authCall(work, [signal]), abort).pipe(Effect.flatMap((value) => {
|
|
16
|
+
const current = viewSignal(ctx, requestOwned);
|
|
17
|
+
return current.aborted ? Effect.fail(current.reason) : Effect.succeed(value);
|
|
18
|
+
}));
|
|
19
|
+
}).pipe(Effect.provideContext(viewServices(ctx)));
|
|
20
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
// Private auth programs. Promise methods are SDK/custom edges; owned programs
|
|
2
|
+
// compose directly by function identity, including inherited implementations.
|
|
3
|
+
import { Cause, Context, Effect, Exit, Scheduler } from "effect";
|
|
4
|
+
import { getNativeStorage } from "../runtime/native-storage.js";
|
|
5
|
+
import { causeError, detach, fromSignal, runEdge } from "../runtime/run.js";
|
|
6
|
+
const programs = new WeakMap();
|
|
7
|
+
const methods = new WeakMap();
|
|
8
|
+
export class AuthenticationWork extends Context.Service()("connecta/auth/Work") {
|
|
9
|
+
}
|
|
10
|
+
export function hasAuthProgram(edge) {
|
|
11
|
+
return programs.has(edge);
|
|
12
|
+
}
|
|
13
|
+
/** A bounded coordinator/submitted platform operation has its own settlement. */
|
|
14
|
+
export function authDetached(effect, waitUntil) {
|
|
15
|
+
return Effect.flatMap(Effect.serviceOption(AuthenticationWork), (work) => Effect.callback((resume) => {
|
|
16
|
+
const settlement = detach(effect.pipe(Effect.onExit((exit) => Effect.sync(() => {
|
|
17
|
+
resume(Exit.isSuccess(exit) ? Effect.succeed(exit.value) : Effect.failCause(exit.cause));
|
|
18
|
+
}))));
|
|
19
|
+
if (work._tag === "Some")
|
|
20
|
+
work.value.track(settlement);
|
|
21
|
+
try {
|
|
22
|
+
waitUntil?.(settlement);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
/* The bounded coordinator is already running. */
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
export function registerAuth(edge, program) {
|
|
30
|
+
programs.set(edge, program);
|
|
31
|
+
return program;
|
|
32
|
+
}
|
|
33
|
+
export function authProgram(program, args) {
|
|
34
|
+
return Effect.suspend(() => program(...args)).pipe(Effect.catchDefect(Effect.fail));
|
|
35
|
+
}
|
|
36
|
+
export function registerAuthMethod(prototype, key, program, own) {
|
|
37
|
+
let entries = methods.get(prototype);
|
|
38
|
+
if (!entries)
|
|
39
|
+
methods.set(prototype, (entries = new Map()));
|
|
40
|
+
entries.set(key, program);
|
|
41
|
+
registerAuth(own, program);
|
|
42
|
+
}
|
|
43
|
+
export function authOwnMethod(prototype, receiver, key, args) {
|
|
44
|
+
return Effect.suspend(() => methods.get(prototype).get(key).apply(receiver, args)).pipe(Effect.catchDefect(Effect.fail));
|
|
45
|
+
}
|
|
46
|
+
function authOwn(edge, receiver, args) {
|
|
47
|
+
return Effect.suspend(() => programs.get(edge).apply(receiver, args)).pipe(Effect.catchDefect(Effect.fail));
|
|
48
|
+
}
|
|
49
|
+
export function authMethod(program) {
|
|
50
|
+
function edge(...args) {
|
|
51
|
+
return runEdge(authOwn(edge, this, args));
|
|
52
|
+
}
|
|
53
|
+
registerAuth(edge, program);
|
|
54
|
+
return edge;
|
|
55
|
+
}
|
|
56
|
+
export function authValue(work) {
|
|
57
|
+
return Effect.suspend(() => {
|
|
58
|
+
const value = work();
|
|
59
|
+
if (Effect.isEffect(value))
|
|
60
|
+
return value;
|
|
61
|
+
if (!value || typeof value.then !== "function")
|
|
62
|
+
return Effect.succeed(value);
|
|
63
|
+
const pending = Promise.resolve(value);
|
|
64
|
+
return Effect.flatMap(Effect.serviceOption(AuthenticationWork), (lifetime) => {
|
|
65
|
+
if (lifetime._tag === "Some")
|
|
66
|
+
lifetime.value.track(pending);
|
|
67
|
+
return awaitAuthPromise(pending);
|
|
68
|
+
});
|
|
69
|
+
}).pipe(Effect.catchDefect(Effect.fail));
|
|
70
|
+
}
|
|
71
|
+
// Keep the platform wait separate from the synchronous service lookup.
|
|
72
|
+
// Accounting remains attached to the actual platform promise's settlement.
|
|
73
|
+
function awaitAuthPromise(pending) {
|
|
74
|
+
return Effect.tryPromise({ try: () => pending, catch: (error) => error });
|
|
75
|
+
}
|
|
76
|
+
export function authCall(fn, args, receiver) {
|
|
77
|
+
return fn === undefined
|
|
78
|
+
? Effect.succeed(undefined)
|
|
79
|
+
: Effect.suspend(() => programs.has(fn) ? authOwn(fn, receiver, args) : authValue(() => fn.apply(receiver, args)));
|
|
80
|
+
}
|
|
81
|
+
export function authInvoke(receiver, key, args) {
|
|
82
|
+
return Effect.suspend(() => {
|
|
83
|
+
const method = receiver[key];
|
|
84
|
+
return typeof method === "function"
|
|
85
|
+
? authCall(method, args, receiver)
|
|
86
|
+
: authValue(() => Reflect.apply(method, receiver, args));
|
|
87
|
+
}).pipe(Effect.catchDefect(Effect.fail));
|
|
88
|
+
}
|
|
89
|
+
export function authStorage(storage, key, args, beforeSubmit) {
|
|
90
|
+
return Effect.suspend(() => {
|
|
91
|
+
const native = getNativeStorage(storage);
|
|
92
|
+
const operation = native
|
|
93
|
+
? authValue(() => Reflect.get(native, key).apply(native, args))
|
|
94
|
+
: authInvoke(storage, key, args);
|
|
95
|
+
// Ownership transfer and native/custom storage submission are one JS
|
|
96
|
+
// reaction, including D2's lazy typed wrapper. Actual I/O can still wait.
|
|
97
|
+
const submitted = beforeSubmit ? authSubmission(operation, beforeSubmit) : operation;
|
|
98
|
+
if (!native)
|
|
99
|
+
return submitted;
|
|
100
|
+
return Effect.flatMap(Effect.serviceOption(AuthenticationWork), (work) => work._tag === "Some" ? authDetached(submitted) : submitted);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
function authSubmission(operation, beforeSubmit) {
|
|
104
|
+
return Effect.flatMap(Scheduler.Scheduler, (parent) => {
|
|
105
|
+
let submitting = false;
|
|
106
|
+
const scheduler = {
|
|
107
|
+
executionMode: parent.executionMode,
|
|
108
|
+
shouldYield: (fiber) => !submitting && parent.shouldYield(fiber),
|
|
109
|
+
makeDispatcher: () => parent.makeDispatcher(),
|
|
110
|
+
};
|
|
111
|
+
return Effect.suspend(() => {
|
|
112
|
+
submitting = true;
|
|
113
|
+
// Resume ordinary scheduling before any pending I/O can continue. This
|
|
114
|
+
// gate covers only submission's current JS reaction, including throws.
|
|
115
|
+
queueMicrotask(() => {
|
|
116
|
+
submitting = false;
|
|
117
|
+
});
|
|
118
|
+
beforeSubmit();
|
|
119
|
+
return operation;
|
|
120
|
+
}).pipe(Effect.provideService(Scheduler.Scheduler, scheduler));
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function authThen(effect, success, failure) {
|
|
124
|
+
return Effect.matchEffect(effect, {
|
|
125
|
+
onSuccess: (value) => (success ? authCall(success, [value]) : Effect.succeed(value)),
|
|
126
|
+
onFailure: (error) => (failure ? authCall(failure, [error]) : Effect.fail(error)),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
export function authCatch(effect, failure) {
|
|
130
|
+
return Effect.catch(effect, (error) => authCall(failure, [error]));
|
|
131
|
+
}
|
|
132
|
+
export function authAll(values, settled = false) {
|
|
133
|
+
return Effect.all(Array.from(values, (value) => {
|
|
134
|
+
const effect = authValue(() => value);
|
|
135
|
+
return settled
|
|
136
|
+
? Effect.match(effect, {
|
|
137
|
+
onSuccess: (value) => ({ status: "fulfilled", value }),
|
|
138
|
+
onFailure: (reason) => ({ status: "rejected", reason }),
|
|
139
|
+
})
|
|
140
|
+
: effect;
|
|
141
|
+
}), { concurrency: "unbounded" });
|
|
142
|
+
}
|
|
143
|
+
export function authAwait(effect, signal) {
|
|
144
|
+
return signal ? Effect.raceFirst(effect, fromSignal(signal)) : effect;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Drive native auth control flow, delivering typed failures to its local
|
|
148
|
+
* catch clauses. Interruption remains interruption and closes the generator;
|
|
149
|
+
* its yielded finally blocks still run, including asynchronous body cleanup.
|
|
150
|
+
* Every yielded operation is an Effect, never an async orchestration thunk.
|
|
151
|
+
*/
|
|
152
|
+
export function authFlow(make) {
|
|
153
|
+
return Effect.suspend(() => {
|
|
154
|
+
const iterator = make();
|
|
155
|
+
let done = false;
|
|
156
|
+
const drive = (step) => Effect.gen(function* () {
|
|
157
|
+
while (!step.done) {
|
|
158
|
+
const result = yield* Effect.exit(step.value.pipe(Effect.catchDefect(Effect.fail)));
|
|
159
|
+
if (Exit.isSuccess(result))
|
|
160
|
+
step = iterator.next(result.value);
|
|
161
|
+
else {
|
|
162
|
+
if (result.cause.reasons.some(Cause.isInterruptReason))
|
|
163
|
+
return yield* Effect.failCause(result.cause);
|
|
164
|
+
step = iterator.throw(causeError(result.cause));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
done = true;
|
|
168
|
+
return step.value;
|
|
169
|
+
}).pipe(Effect.catchDefect(Effect.fail));
|
|
170
|
+
return Effect.suspend(() => drive(iterator.next())).pipe(Effect.ensuring(Effect.suspend(() => done ? Effect.void : drive(iterator.return(undefined)).pipe(Effect.orDie, Effect.asVoid))));
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/** Parallel native mapping without eagerly starting Promise shells. */
|
|
174
|
+
export function authMap(values, program, settled = false) {
|
|
175
|
+
return authAll(values.map((value) => program(value)), settled);
|
|
176
|
+
}
|
|
177
|
+
/** The physical fetch leaf also owns cancellation of a late response body. */
|
|
178
|
+
export function authFetch(input, init) {
|
|
179
|
+
return authValue(() => fetch(input, init).then((response) => {
|
|
180
|
+
if (init?.signal?.aborted)
|
|
181
|
+
void response.body?.cancel().catch(() => { });
|
|
182
|
+
return response;
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { runEdge } from "../runtime/run.js";
|
|
2
|
+
import { authAll, authFlow, authProgram, registerAuth } from "./native.js";
|
|
1
3
|
// The operator route must not answer while a storage reset it started can
|
|
2
4
|
// still publish an older generation. Storage has no cancellation contract.
|
|
3
5
|
const startResets = new WeakMap();
|
|
@@ -12,9 +14,13 @@ export function trackOAuthStartReset(scope, reset) {
|
|
|
12
14
|
// unhandled rejection merely because its caller timed out first.
|
|
13
15
|
void reset.then(() => pending.delete(reset), () => pending.delete(reset));
|
|
14
16
|
}
|
|
15
|
-
export
|
|
16
|
-
|
|
17
|
-
while (pending && pending.size > 0) {
|
|
18
|
-
await Promise.allSettled(pending);
|
|
19
|
-
}
|
|
17
|
+
export function drainOAuthStartResets(scope) {
|
|
18
|
+
return runEdge(authProgram(drainOAuthStartResetsNative, [scope]));
|
|
20
19
|
}
|
|
20
|
+
const drainOAuthStartResetsNative = /* @__PURE__ */ registerAuth(drainOAuthStartResets, function (scope) {
|
|
21
|
+
return authFlow(function* () {
|
|
22
|
+
const pending = startResets.get(scope);
|
|
23
|
+
while (pending && pending.size > 0)
|
|
24
|
+
yield authAll(pending, true);
|
|
25
|
+
});
|
|
26
|
+
});
|