@zackbart/connecta 0.34.1 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +418 -0
- package/README.md +65 -105
- package/SECURITY.md +3 -2
- package/bin/connecta.mjs +41 -16
- package/bin/version.mjs +1 -1
- package/dist/access-tokens.d.ts +2 -1
- package/dist/access-tokens.js +66 -30
- package/dist/activity.d.ts +1 -1
- package/dist/activity.js +2 -0
- package/dist/agent-config.d.ts +23 -0
- package/dist/agent-config.js +59 -0
- package/dist/agent-description.js +16 -0
- package/dist/agent-identity.js +4 -4
- package/dist/agent-observation.js +39 -0
- package/dist/auth/clerk-sdk/client.d.ts +2 -0
- package/dist/auth/clerk-sdk/generated.js +554 -563
- package/dist/auth/clerk-transport.js +70 -3
- package/dist/auth/clerk.d.ts +13 -0
- package/dist/auth/clerk.js +653 -246
- package/dist/auth/cloudflare-access.js +46 -42
- package/dist/auth/downstream-client-metadata.js +2 -2
- package/dist/auth/downstream-oauth.js +2044 -1161
- package/dist/auth/downstream-revocation.js +88 -88
- package/dist/auth/native-call.js +20 -0
- package/dist/auth/native.js +184 -0
- package/dist/auth/oauth-start-reset.js +11 -5
- package/dist/auth/oauth-token-response.js +121 -102
- package/dist/auth/oauth-v2-migration.js +97 -78
- package/dist/auth/renewable-grant.js +10 -0
- package/dist/auth/static-oauth.js +751 -281
- package/dist/auth/vercel-agent.js +266 -0
- package/dist/auth-admission.js +204 -0
- package/dist/auth-elicitation.js +350 -241
- package/dist/authorization-handoff.js +164 -90
- package/dist/call-admission-context.js +3 -10
- package/dist/call-admission.js +2 -0
- package/dist/call-classification.js +9 -0
- package/dist/call-recovery.js +32 -13
- package/dist/canonical-json.js +8 -0
- package/dist/catalog-cache.js +369 -213
- package/dist/catalog-service.js +659 -530
- package/dist/catalog.js +5 -1
- package/dist/concurrency.js +0 -25
- package/dist/config-defaults.d.ts +1 -0
- package/dist/config-defaults.js +1 -0
- package/dist/config-schema.d.ts +3 -1
- package/dist/config-schema.js +13 -3
- package/dist/config.d.ts +40 -6
- package/dist/config.js +40 -26
- package/dist/connector-caller.d.ts +4 -0
- package/dist/connector-caller.js +17 -4
- package/dist/connectors/api-connector.d.ts +29 -7
- package/dist/connectors/api-connector.js +145 -57
- package/dist/connectors/guarded-fetch.d.ts +51 -17
- package/dist/connectors/guarded-fetch.js +215 -121
- package/dist/connectors/negotiation-cache.js +20 -10
- package/dist/connectors/remote-mcp.d.ts +10 -30
- package/dist/connectors/remote-mcp.js +955 -563
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +3 -1
- package/dist/describe-config.js +2 -0
- package/dist/downstream-input.js +347 -260
- package/dist/errors.d.ts +87 -6
- package/dist/errors.js +114 -4
- package/dist/execute.js +87 -50
- package/dist/executor-admission.js +3 -0
- package/dist/executors/quickjs.js +163 -112
- package/dist/guarded-transport.js +50 -0
- package/dist/guest-runtime.js +1 -1
- package/dist/http/client.js +439 -0
- package/dist/http/errors.js +558 -0
- package/dist/http/fields.js +49 -0
- package/dist/http/hatch-paging.js +318 -0
- package/dist/http/hatch.js +1279 -0
- package/dist/http/json-schema.js +267 -0
- package/dist/http/node-transport.js +241 -0
- package/dist/http/oauth.js +162 -0
- package/dist/http/paging.js +227 -0
- package/dist/http/provider.js +221 -0
- package/dist/http/safety.js +82 -0
- package/dist/http/services.js +79 -0
- package/dist/http/tools.js +379 -0
- package/dist/http/vendor-index.js +138 -0
- package/dist/http/vendor.js +448 -0
- package/dist/http/write-request.js +66 -0
- package/dist/http-policy.d.ts +11 -0
- package/dist/http-policy.js +45 -0
- package/dist/inbound-credential.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -0
- package/dist/invocation-auth.js +30 -19
- package/dist/invocation.js +218 -85
- package/dist/mcp-result.js +0 -4
- package/dist/membership.d.ts +4 -0
- package/dist/meta-output.js +1 -1
- package/dist/meta-tools.js +531 -406
- package/dist/native-recovery.js +52 -0
- package/dist/native-tools.js +382 -0
- package/dist/node.d.ts +4 -3
- package/dist/node.js +45 -8
- package/dist/oauth-handoff.js +177 -104
- package/dist/oauth-partition.js +6 -20
- package/dist/oauth-sealing.js +6 -7
- package/dist/operation-vocabulary.js +101 -0
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +17 -4
- package/dist/operator-ui/contract.d.ts +8 -3
- package/dist/operator-ui/generated.js +4 -4
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/program-writes.js +47 -26
- package/dist/provider-call-facts.d.ts +115 -0
- package/dist/provider-call-facts.js +182 -0
- package/dist/provider-call.d.ts +112 -0
- package/dist/provider-call.js +271 -0
- package/dist/provider.d.ts +65 -31
- package/dist/provider.js +116 -39
- package/dist/providers/_shared/google/hatch.js +91 -0
- package/dist/providers/_shared/google/kit.js +427 -0
- package/dist/providers/_shared/google/result-size.js +15 -2
- package/dist/providers/_shared/google/service-account.d.ts +2 -1
- package/dist/providers/_shared/google/service-account.js +8 -4
- package/dist/providers/_shared/google/workspace.d.ts +6 -210
- package/dist/providers/_shared/google/workspace.js +6 -425
- package/dist/providers/_shared/rest/compact-index.js +86 -0
- package/dist/providers/_shared/rest/kit.js +146 -0
- package/dist/providers/_shared/rest/operation-index.js +230 -14
- package/dist/providers/_shared/rest/response-media.js +11 -0
- package/dist/providers/_shared/rest/value-safety.js +353 -195
- package/dist/providers/_shared/sensitive-fields.js +27 -0
- package/dist/providers/breeze/api.js +584 -0
- package/dist/providers/breeze/index.d.ts +1 -3
- package/dist/providers/breeze/index.js +67 -1420
- package/dist/providers/breeze/openapi.generated.js +60 -0
- package/dist/providers/breeze/skill.generated.js +2 -6
- package/dist/providers/breeze/tools.js +696 -0
- package/dist/providers/ccb/api.js +496 -0
- package/dist/providers/ccb/index.d.ts +15 -37
- package/dist/providers/ccb/index.js +77 -1702
- package/dist/providers/ccb/lib/constants.d.ts +34 -0
- package/dist/providers/ccb/lib/constants.js +74 -0
- package/dist/providers/ccb/lib/guide.js +9 -0
- package/dist/providers/ccb/lib/verdicts.js +387 -0
- package/dist/providers/ccb/openapi.generated.js +397 -0
- package/dist/providers/ccb/safety.js +295 -0
- package/dist/providers/ccb/skill.generated.js +2 -6
- package/dist/providers/ccb/tools.js +853 -0
- package/dist/providers/cloudflare/api.js +1066 -0
- package/dist/providers/cloudflare/index.d.ts +5 -22
- package/dist/providers/cloudflare/index.js +79 -197
- package/dist/providers/cloudflare/lib/config.d.ts +16 -0
- package/dist/providers/cloudflare/lib/config.js +2 -0
- package/dist/providers/cloudflare/lib/discovery.js +29 -0
- package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
- package/dist/providers/cloudflare/lib/hatch.js +103 -0
- package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
- package/dist/providers/cloudflare/lib/response-media.js +75 -0
- package/dist/providers/cloudflare/openapi.generated.js +4 -3
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
- package/dist/providers/cloudflare/skill.generated.js +2 -10
- package/dist/providers/cloudflare/tools.js +360 -0
- package/dist/providers/docs/api.js +51 -0
- package/dist/providers/docs/index.d.ts +1 -12
- package/dist/providers/docs/index.js +53 -1165
- package/dist/providers/docs/lib/constants.d.ts +18 -0
- package/dist/providers/docs/lib/constants.js +18 -0
- package/dist/providers/docs/lib/discovery.js +26 -0
- package/dist/providers/docs/lib/requests.js +48 -0
- package/dist/providers/docs/lib/schemas.js +168 -0
- package/dist/providers/docs/openapi.generated.js +16 -0
- package/dist/providers/docs/safety.js +54 -0
- package/dist/providers/docs/skill.generated.js +2 -6
- package/dist/providers/docs/tools.js +801 -0
- package/dist/providers/drive/api.js +177 -0
- package/dist/providers/drive/index.d.ts +1 -12
- package/dist/providers/drive/index.js +38 -1448
- package/dist/providers/drive/lib/constants.d.ts +6 -0
- package/dist/providers/drive/lib/constants.js +6 -0
- package/dist/providers/drive/lib/contracts.js +532 -0
- package/dist/providers/drive/lib/hatch.js +197 -0
- package/dist/providers/drive/openapi.generated.js +77 -0
- package/dist/providers/drive/safety.js +90 -0
- package/dist/providers/drive/skill.generated.js +2 -6
- package/dist/providers/drive/tools.js +1290 -0
- package/dist/providers/forms/api.js +71 -0
- package/dist/providers/forms/index.d.ts +1 -12
- package/dist/providers/forms/index.js +49 -1145
- package/dist/providers/forms/lib/constants.d.ts +14 -0
- package/dist/providers/forms/lib/constants.js +19 -0
- package/dist/providers/forms/lib/hatch.js +72 -0
- package/dist/providers/forms/openapi.generated.js +23 -0
- package/dist/providers/forms/safety.js +34 -0
- package/dist/providers/forms/skill.generated.js +2 -8
- package/dist/providers/forms/tools.js +1023 -0
- package/dist/providers/github/api.js +150 -0
- package/dist/providers/github/index.d.ts +4 -5
- package/dist/providers/github/index.js +30 -87
- package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
- package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
- package/dist/providers/github/lib/discovery.js +132 -0
- package/dist/providers/github/lib/operations.js +58 -0
- package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
- package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
- package/dist/providers/github/openapi.generated.js +1216 -0
- package/dist/providers/github/safety.js +216 -0
- package/dist/providers/github/skill.generated.js +2 -5
- package/dist/providers/github/tools.js +506 -0
- package/dist/providers/gmail/api.js +114 -0
- package/dist/providers/gmail/index.d.ts +1 -12
- package/dist/providers/gmail/index.js +73 -1621
- package/dist/providers/gmail/lib/constants.d.ts +13 -0
- package/dist/providers/gmail/lib/constants.js +16 -0
- package/dist/providers/gmail/lib/index.js +173 -0
- package/dist/providers/gmail/lib/schemas.js +176 -0
- package/dist/providers/gmail/lib/threading.js +120 -0
- package/dist/providers/gmail/openapi.generated.js +92 -0
- package/dist/providers/gmail/safety.js +21 -0
- package/dist/providers/gmail/skill.generated.js +2 -6
- package/dist/providers/gmail/tools.js +1435 -0
- package/dist/providers/overflow/api.js +1008 -0
- package/dist/providers/overflow/index.d.ts +1 -17
- package/dist/providers/overflow/index.js +60 -1488
- package/dist/providers/overflow/skill.generated.js +2 -5
- package/dist/providers/overflow/tools.js +873 -0
- package/dist/providers/planning-center/api.js +467 -0
- package/dist/providers/planning-center/index.d.ts +4 -35
- package/dist/providers/planning-center/index.js +69 -2445
- package/dist/providers/planning-center/lib/constants.d.ts +58 -0
- package/dist/providers/planning-center/lib/constants.js +83 -0
- package/dist/providers/planning-center/lib/discovery.js +40 -0
- package/dist/providers/planning-center/lib/guide.js +39 -0
- package/dist/providers/planning-center/lib/json-api.js +83 -0
- package/dist/providers/planning-center/lib/verdicts.js +1758 -0
- package/dist/providers/planning-center/openapi.generated.js +1764 -0
- package/dist/providers/planning-center/safety.js +188 -0
- package/dist/providers/planning-center/skill.generated.js +2 -27
- package/dist/providers/planning-center/tools.js +1010 -0
- package/dist/providers/quickbooks/api.js +299 -0
- package/dist/providers/quickbooks/index.d.ts +13 -0
- package/dist/providers/quickbooks/index.js +93 -0
- package/dist/providers/quickbooks/lib/query.js +118 -0
- package/dist/providers/quickbooks/lib/writes.js +168 -0
- package/dist/providers/quickbooks/safety.js +222 -0
- package/dist/providers/quickbooks/skill.generated.js +5 -0
- package/dist/providers/quickbooks/tools.js +117 -0
- package/dist/providers/sheets/api.js +133 -0
- package/dist/providers/sheets/index.d.ts +4 -16
- package/dist/providers/sheets/index.js +61 -1172
- package/dist/providers/sheets/lib/constants.d.ts +14 -0
- package/dist/providers/sheets/lib/constants.js +14 -0
- package/dist/providers/sheets/lib/hatch.js +163 -0
- package/dist/providers/sheets/lib/requests.js +105 -0
- package/dist/providers/sheets/lib/schemas.js +138 -0
- package/dist/providers/sheets/openapi.generated.js +30 -0
- package/dist/providers/sheets/safety.js +27 -0
- package/dist/providers/sheets/skill.generated.js +2 -7
- package/dist/providers/sheets/tools.js +733 -0
- package/dist/providers/slides/api.js +147 -0
- package/dist/providers/slides/index.d.ts +2 -10
- package/dist/providers/slides/index.js +48 -2555
- package/dist/providers/slides/lib/constants.d.ts +11 -0
- package/dist/providers/slides/lib/constants.js +11 -0
- package/dist/providers/slides/lib/requests.js +60 -0
- package/dist/providers/slides/lib/schemas.js +565 -0
- package/dist/providers/slides/openapi.generated.js +18 -0
- package/dist/providers/slides/skill.generated.js +2 -6
- package/dist/providers/slides/tools.js +1968 -0
- package/dist/providers/stripe/api.js +401 -0
- package/dist/providers/stripe/index.d.ts +5 -27
- package/dist/providers/stripe/index.js +74 -210
- package/dist/providers/stripe/lib/config.d.ts +4 -0
- package/dist/providers/stripe/lib/config.js +2 -0
- package/dist/providers/stripe/openapi.generated.js +4 -3
- package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
- package/dist/providers/stripe/skill.generated.js +2 -11
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +17 -0
- package/dist/providers/tithely/index.js +86 -965
- package/dist/providers/tithely/skill.generated.js +2 -5
- package/dist/providers/tithely/tools.js +426 -0
- package/dist/providers/vercel/api.js +551 -0
- package/dist/providers/vercel/index.d.ts +9 -25
- package/dist/providers/vercel/index.js +65 -260
- package/dist/providers/vercel/lib/config.d.ts +2 -0
- package/dist/providers/vercel/lib/config.js +2 -0
- package/dist/providers/vercel/lib/index.js +117 -0
- package/dist/providers/vercel/lib/logs.js +100 -0
- package/dist/providers/vercel/lib/pin.js +270 -0
- package/dist/providers/vercel/openapi.generated.js +10 -5
- package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
- package/dist/providers/vercel/skill.generated.js +2 -7
- package/dist/providers/vercel/tools.js +642 -0
- package/dist/redaction-identity.js +47 -0
- package/dist/redaction-marker.js +125 -0
- package/dist/registry.d.ts +21 -15
- package/dist/registry.js +409 -376
- package/dist/routes/access-tokens.js +1 -1
- package/dist/routes/actor-labels.js +1 -1
- package/dist/routes/connect.js +1 -1
- package/dist/routes/dispatch.js +103 -0
- package/dist/routes/mcp.js +170 -79
- package/dist/routes/oauth.js +6 -1
- package/dist/routes/operator.js +2 -2
- package/dist/routes/shared.d.ts +5 -4
- package/dist/routes/shared.js +244 -177
- package/dist/routes/skills.js +10 -8
- package/dist/routes/ui-config.js +27 -3
- package/dist/routes/ui-data.js +21 -20
- package/dist/routes/ui.js +1 -1
- package/dist/runtime/call-admission.js +0 -26
- package/dist/runtime/call-entry.js +30 -0
- package/dist/runtime/call.js +552 -0
- package/dist/runtime/connector-scope.js +7 -0
- package/dist/runtime/credential-probe.js +34 -0
- package/dist/runtime/executor.js +40 -0
- package/dist/runtime/native-storage.js +63 -0
- package/dist/runtime/registry.js +27 -0
- package/dist/runtime/request-scope.js +72 -0
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/shared-read.js +34 -5
- package/dist/runtime/storage.js +34 -21
- package/dist/sent-secrets.d.ts +194 -37
- package/dist/sent-secrets.js +1743 -340
- package/dist/server.js +5 -56
- package/dist/skills.js +322 -223
- package/dist/sqlite.js +15 -14
- package/dist/storage/d1-copy.js +255 -0
- package/dist/storage/d1-driver.js +15 -0
- package/dist/storage/keys.js +28 -0
- package/dist/storage/sql-driver.js +88 -0
- package/dist/storage/sql-native.js +544 -0
- package/dist/storage/sql-schema.d.ts +6 -0
- package/dist/storage/sql-schema.js +15 -0
- package/dist/storage/sql.d.ts +14 -20
- package/dist/storage/sql.js +29 -535
- package/dist/timeout.js +0 -26
- package/dist/tool-safety.js +20 -10
- package/dist/types.d.ts +9 -109
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +0 -1
- package/dist/upward.js +3 -0
- package/dist/usage-guide.js +3 -1
- package/dist/validate.d.ts +4 -2
- package/dist/validate.js +86 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.js +312 -292
- package/dist/workspace-subject.js +5 -1
- package/dist/write-outcome.js +454 -34
- package/documentation/README.md +28 -7
- package/documentation/architecture.md +2409 -255
- package/documentation/auth.md +867 -114
- package/documentation/code-mode.md +49 -16
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +129 -144
- package/documentation/meta-tools.md +409 -32
- package/documentation/operating.md +27 -3
- package/documentation/operator-tests.md +3 -0
- package/documentation/operator-ui.md +84 -48
- package/documentation/provider-auth-migration.md +16 -63
- package/documentation/provider-migration-0.29.md +10 -5
- package/documentation/provider-migration-0.35.md +975 -0
- package/documentation/providers.md +1347 -0
- package/examples/worker/AGENTS.md +23 -9
- package/examples/worker/README.md +254 -135
- package/examples/worker/alchemy.run.ts +116 -0
- package/examples/worker/gitignore +10 -0
- package/examples/worker/src/connecta.config.ts +23 -21
- package/examples/worker/wrangler.jsonc +14 -5
- package/guides/connecting-agents.md +157 -0
- package/guides/how-it-works.md +156 -0
- package/guides/safety-and-trust.md +153 -0
- package/package.json +30 -50
- package/templates/node/.env.example +3 -0
- package/templates/node/README.md +22 -2
- package/templates/node/docker-compose.yml +1 -0
- package/templates/node/package.json +3 -2
- package/templates/node/src/connecta.config.ts +8 -0
- package/dist/catalog-drift.d.ts +0 -138
- package/dist/catalog-drift.js +0 -578
- package/dist/operator-ui/agents.d.ts +0 -74
- package/dist/operator-ui/agents.js +0 -104
- package/dist/operator-ui/config-summary.js +0 -565
- package/dist/operator-ui/connection-map.js +0 -376
- package/dist/operator-ui/endpoints.js +0 -221
- package/dist/operator-ui/fix-prompts.d.ts +0 -18
- package/dist/operator-ui/fix-prompts.js +0 -87
- package/dist/operator-ui/health.js +0 -52
- package/dist/operator-ui/member-page.js +0 -97
- package/dist/operator-ui/overview.js +0 -123
- package/dist/operator-ui/setup-commands.js +0 -51
- package/dist/operator-ui/view.d.ts +0 -401
- package/dist/operator-ui/view.js +0 -705
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/dispatch.js +0 -41
- package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
- package/dist/providers/_shared/rest/tools.d.ts +0 -141
- package/dist/providers/_shared/rest/tools.js +0 -569
- package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
- package/dist/providers/basecamp/index.d.ts +0 -45
- package/dist/providers/basecamp/index.js +0 -997
- package/dist/providers/basecamp/skill.generated.js +0 -9
- package/dist/providers/cloudflare/rest.d.ts +0 -37
- package/dist/providers/cloudflare/rest.js +0 -1097
- package/dist/providers/github/hosted.js +0 -218
- package/dist/providers/github/rest.js +0 -321
- package/dist/providers/infisical/index.d.ts +0 -7
- package/dist/providers/infisical/index.js +0 -713
- package/dist/providers/infisical/skill.generated.js +0 -8
- package/dist/providers/intercom/index.d.ts +0 -24
- package/dist/providers/intercom/index.js +0 -121
- package/dist/providers/intercom/skill.generated.js +0 -8
- package/dist/providers/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -537
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -59
- package/dist/providers/mixpanel/index.js +0 -472
- package/dist/providers/mixpanel/operations.js +0 -20
- package/dist/providers/mixpanel/rest.js +0 -603
- package/dist/providers/mixpanel/skill.generated.js +0 -10
- package/dist/providers/mixpanel/value-safety.js +0 -16
- package/dist/providers/notion/index.d.ts +0 -67
- package/dist/providers/notion/index.js +0 -368
- package/dist/providers/notion/openapi.generated.js +0 -75
- package/dist/providers/notion/rest.d.ts +0 -24
- package/dist/providers/notion/rest.js +0 -1226
- package/dist/providers/notion/skill.generated.js +0 -11
- package/dist/providers/notion/value-safety.js +0 -56
- package/dist/providers/revenuecat/index.d.ts +0 -51
- package/dist/providers/revenuecat/index.js +0 -697
- package/dist/providers/revenuecat/skill.generated.js +0 -11
- package/dist/providers/stripe/rest.d.ts +0 -14
- package/dist/providers/stripe/rest.js +0 -402
- package/dist/providers/vercel/rest.d.ts +0 -20
- package/dist/providers/vercel/rest.js +0 -1020
- package/dist/providers/wispr-flow/index.d.ts +0 -14
- package/dist/providers/wispr-flow/index.js +0 -117
- package/dist/providers/wispr-flow/skill.generated.js +0 -8
- /package/dist/providers/github/{key.js → lib/key.js} +0 -0
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/** In-memory tokens and credential-bound login flights shared only inside one request. */
|
|
2
|
-
import { ConnectorCallError } from "../../errors.js";
|
|
3
|
-
const LOGIN_TIMEOUT_MS = 15_000;
|
|
4
|
-
const MAX_CACHED_TOKENS = 512;
|
|
5
|
-
/** Each provider instance owns its cache, so no credential crosses an API origin. */
|
|
6
|
-
export function requestTokenCache(source) {
|
|
7
|
-
const tokens = new Map();
|
|
8
|
-
const requests = new WeakMap();
|
|
9
|
-
function start(auth, ctx) {
|
|
10
|
-
const controller = new AbortController();
|
|
11
|
-
const timer = setTimeout(() => controller.abort(new ConnectorCallError("unavailable", "Machine identity login timed out.")), LOGIN_TIMEOUT_MS);
|
|
12
|
-
const flight = { controller, waiters: 0, settled: false, promise: Promise.resolve("") };
|
|
13
|
-
flight.promise = auth
|
|
14
|
-
.mint({ ...ctx, signal: controller.signal })
|
|
15
|
-
.then((minted) => {
|
|
16
|
-
// An abandoned login must not seed a token after cancellation.
|
|
17
|
-
controller.signal.throwIfAborted();
|
|
18
|
-
tokens.delete(auth.key);
|
|
19
|
-
tokens.set(auth.key, minted);
|
|
20
|
-
while (tokens.size > MAX_CACHED_TOKENS)
|
|
21
|
-
tokens.delete(tokens.keys().next().value);
|
|
22
|
-
return minted.accessToken;
|
|
23
|
-
})
|
|
24
|
-
.finally(() => {
|
|
25
|
-
flight.settled = true;
|
|
26
|
-
clearTimeout(timer);
|
|
27
|
-
});
|
|
28
|
-
// All waiters may cancel before the transport observes its abort.
|
|
29
|
-
void flight.promise.catch(() => { });
|
|
30
|
-
return flight;
|
|
31
|
-
}
|
|
32
|
-
async function follow(flight, signal) {
|
|
33
|
-
signal?.throwIfAborted();
|
|
34
|
-
flight.waiters++;
|
|
35
|
-
let onAbort;
|
|
36
|
-
try {
|
|
37
|
-
const aborted = new Promise((_, reject) => {
|
|
38
|
-
if (!signal)
|
|
39
|
-
return;
|
|
40
|
-
onAbort = () => reject(signal.reason);
|
|
41
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
42
|
-
});
|
|
43
|
-
return await Promise.race([flight.promise, aborted]);
|
|
44
|
-
}
|
|
45
|
-
finally {
|
|
46
|
-
if (onAbort)
|
|
47
|
-
signal?.removeEventListener("abort", onAbort);
|
|
48
|
-
flight.waiters--;
|
|
49
|
-
if (!flight.settled && flight.waiters === 0)
|
|
50
|
-
flight.controller.abort();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return {
|
|
54
|
-
async token(ctx, rejected) {
|
|
55
|
-
ctx.signal?.throwIfAborted();
|
|
56
|
-
const auth = await source(ctx);
|
|
57
|
-
ctx.signal?.throwIfAborted();
|
|
58
|
-
const cached = tokens.get(auth.key);
|
|
59
|
-
if (cached && cached.accessToken !== rejected && cached.expiresAt > Date.now())
|
|
60
|
-
return cached.accessToken;
|
|
61
|
-
const scope = ctx.requestScope ?? ctx;
|
|
62
|
-
let perCredential = requests.get(scope);
|
|
63
|
-
if (!perCredential) {
|
|
64
|
-
perCredential = new Map();
|
|
65
|
-
requests.set(scope, perCredential);
|
|
66
|
-
}
|
|
67
|
-
let request = perCredential.get(auth.key);
|
|
68
|
-
if (!request) {
|
|
69
|
-
request = {};
|
|
70
|
-
perCredential.set(auth.key, request);
|
|
71
|
-
}
|
|
72
|
-
if (rejected !== undefined) {
|
|
73
|
-
// Keep the recovery outcome for the request, including failures. Later
|
|
74
|
-
// 401s can never turn this into a fresh-login loop.
|
|
75
|
-
request.recovery ??= start(auth, ctx);
|
|
76
|
-
return await follow(request.recovery, ctx.signal);
|
|
77
|
-
}
|
|
78
|
-
if (!request.initial || request.initial.settled || request.initial.controller.signal.aborted)
|
|
79
|
-
request.initial = start(auth, ctx);
|
|
80
|
-
return await follow(request.initial, ctx.signal);
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// Auth selects the implementation (decisions/0005): a `"dual"` provider sends
|
|
2
|
-
// OAuth to the vendor's hosted MCP server and a key to Connecta's own REST
|
|
3
|
-
// connector. The choice is made once, at construction, from `auth.type`; one
|
|
4
|
-
// connector id is one implementation, and a failure on one is never replayed
|
|
5
|
-
// against the other (INV-9).
|
|
6
|
-
import { remoteMcp } from "../../../connectors/remote-mcp.js";
|
|
7
|
-
/**
|
|
8
|
-
* A provider `create` that dispatches on `options.auth.type`. Pair it with
|
|
9
|
-
* `variants(["auth", "type"], …)` options, which refuse a missing or unknown
|
|
10
|
-
* type, and options the selected case does not accept, before this runs.
|
|
11
|
-
*/
|
|
12
|
-
export function byAuth(cases) {
|
|
13
|
-
return (id, options, provider) => {
|
|
14
|
-
const type = options.auth?.type;
|
|
15
|
-
const create = typeof type === "string" && Object.hasOwn(cases, type) ? cases[type] : undefined;
|
|
16
|
-
if (!create) {
|
|
17
|
-
throw new Error(`auth.type must be one of ${Object.keys(cases)
|
|
18
|
-
.map((name) => JSON.stringify(name))
|
|
19
|
-
.join(", ")}.`);
|
|
20
|
-
}
|
|
21
|
-
return create(id, options, provider);
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* The vendor's hosted MCP server, OAuth only: no bearer token, header, or
|
|
26
|
-
* operator credential reaches a hosted endpoint. The provider's reviewed
|
|
27
|
-
* classification classifies its catalog.
|
|
28
|
-
*/
|
|
29
|
-
export function hostedOAuth(id, provider, options) {
|
|
30
|
-
return remoteMcp(id, {
|
|
31
|
-
url: options.url,
|
|
32
|
-
...provider.connectorOptions,
|
|
33
|
-
title: options.title,
|
|
34
|
-
description: options.description,
|
|
35
|
-
auth: { type: "oauth" },
|
|
36
|
-
requireHttps: true,
|
|
37
|
-
classify: provider.classify,
|
|
38
|
-
...(options.callAdmission ? { callAdmission: options.callAdmission } : {}),
|
|
39
|
-
usageGuide: options.usageGuide,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import type { JsonSchema } from "../../../types.js";
|
|
2
|
-
export type RestMethod = "GET" | "HEAD" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
3
|
-
/**
|
|
4
|
-
* One request-side schema, compacted: `t` type, `e` enum, `f` format (only
|
|
5
|
-
* `binary`), `n` nullable, `d` description, `a` anyOf/oneOf, `p` properties,
|
|
6
|
-
* `r` required, `i` items, `m` additionalProperties, `x` truncated at the
|
|
7
|
-
* generation depth (unvalidated below), `$` a shared subtree.
|
|
8
|
-
*/
|
|
9
|
-
export interface SchemaNode {
|
|
10
|
-
readonly t?: string | readonly string[];
|
|
11
|
-
readonly e?: readonly unknown[];
|
|
12
|
-
readonly f?: string;
|
|
13
|
-
readonly n?: 1;
|
|
14
|
-
readonly d?: string;
|
|
15
|
-
readonly a?: readonly SchemaNode[];
|
|
16
|
-
readonly p?: Readonly<Record<string, SchemaNode>>;
|
|
17
|
-
readonly r?: readonly string[];
|
|
18
|
-
readonly i?: SchemaNode;
|
|
19
|
-
readonly m?: SchemaNode;
|
|
20
|
-
readonly x?: 1;
|
|
21
|
-
readonly $?: number;
|
|
22
|
-
}
|
|
23
|
-
/** `[method, path template, operationId, summary, tag index, server index?]` */
|
|
24
|
-
type OperationRow = readonly [string, string, string, string, number, number?];
|
|
25
|
-
/** What `scripts/generate-openapi.mjs` writes to `openapi.generated.ts`. */
|
|
26
|
-
export interface OpenApiData {
|
|
27
|
-
/** The pinned document's URL. */
|
|
28
|
-
readonly source: string;
|
|
29
|
-
/** The pin: a tag, commit, or content hash. */
|
|
30
|
-
readonly revision: string;
|
|
31
|
-
/** `sha256:` digest of the pinned document's bytes. */
|
|
32
|
-
readonly digest: string;
|
|
33
|
-
/** The document's `info.version`; Stripe sends it as `Stripe-Version`. */
|
|
34
|
-
readonly version: string;
|
|
35
|
-
/** `[0]` is the default origin; later entries are per-operation servers. */
|
|
36
|
-
readonly servers: readonly string[];
|
|
37
|
-
readonly tags: readonly string[];
|
|
38
|
-
readonly ops: readonly OperationRow[];
|
|
39
|
-
/** JSON: `{ d: SchemaNode[], o: (0 | [params, body])[] }`, aligned with `ops`. */
|
|
40
|
-
readonly details: string;
|
|
41
|
-
}
|
|
42
|
-
export interface Operation {
|
|
43
|
-
readonly method: RestMethod;
|
|
44
|
-
/** The path template, e.g. `/v1/customers/{customer}`. */
|
|
45
|
-
readonly path: string;
|
|
46
|
-
readonly operationId: string;
|
|
47
|
-
readonly summary: string;
|
|
48
|
-
readonly tag: string;
|
|
49
|
-
/** A non-default origin this operation is served from, if any. */
|
|
50
|
-
readonly server: string | undefined;
|
|
51
|
-
/** Position in `OpenApiData.ops`. */
|
|
52
|
-
readonly row: number;
|
|
53
|
-
}
|
|
54
|
-
/** A concrete call matched to its operation. */
|
|
55
|
-
export interface OperationMatch {
|
|
56
|
-
readonly op: Operation;
|
|
57
|
-
/** Path parameter values, exactly as the caller sent them. */
|
|
58
|
-
readonly params: Readonly<Record<string, string>>;
|
|
59
|
-
}
|
|
60
|
-
/** One operation's request contract, expanded to JSON Schema for an agent. */
|
|
61
|
-
export interface OperationContract {
|
|
62
|
-
method: RestMethod;
|
|
63
|
-
path: string;
|
|
64
|
-
operationId: string;
|
|
65
|
-
summary: string;
|
|
66
|
-
server?: string;
|
|
67
|
-
parameters: {
|
|
68
|
-
name: string;
|
|
69
|
-
in: "path" | "query";
|
|
70
|
-
required: boolean;
|
|
71
|
-
description?: string;
|
|
72
|
-
schema: JsonSchema;
|
|
73
|
-
}[];
|
|
74
|
-
body?: {
|
|
75
|
-
contentType: string;
|
|
76
|
-
required?: true;
|
|
77
|
-
schema: JsonSchema;
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/** The read side of one vendor's pinned index. */
|
|
81
|
-
export declare class OperationIndex {
|
|
82
|
-
#private;
|
|
83
|
-
readonly version: string;
|
|
84
|
-
readonly revision: string;
|
|
85
|
-
readonly ops: readonly Operation[];
|
|
86
|
-
/** The methods any operation uses, in a stable order. */
|
|
87
|
-
readonly methods: readonly RestMethod[];
|
|
88
|
-
/**
|
|
89
|
-
* `vendor` is the tool-name prefix; `title` the display name in refusals.
|
|
90
|
-
* `slashParams` names path parameters whose values may carry an encoded
|
|
91
|
-
* "/" (`%2F`), such as an object key, and only as the path's last segment.
|
|
92
|
-
*/
|
|
93
|
-
constructor(data: OpenApiData, names: {
|
|
94
|
-
vendor: string;
|
|
95
|
-
title: string;
|
|
96
|
-
slashParams?: readonly string[];
|
|
97
|
-
});
|
|
98
|
-
/** The operation with this exact method and path template, if any. */
|
|
99
|
-
operation(method: string, template: string): Operation | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* Match a concrete call to its operation. Literal segments outrank
|
|
102
|
-
* parameters, as OpenAPI requires (`/v1/customers/search` before
|
|
103
|
-
* `/v1/customers/{customer}`); the most specific template that fits decides,
|
|
104
|
-
* and a method it does not define is refused rather than retried against a
|
|
105
|
-
* looser template.
|
|
106
|
-
*/
|
|
107
|
-
resolve(method: string, path: string): OperationMatch;
|
|
108
|
-
/** Up to five operations whose paths most resemble a missed one. */
|
|
109
|
-
nearest(method: string, segments: readonly string[]): string[];
|
|
110
|
-
/**
|
|
111
|
-
* Rank operations for a free-text query: every query word must appear in
|
|
112
|
-
* the path, summary, operationId, or tag (plural-insensitive, prefixes of
|
|
113
|
-
* three letters count), and path matches weigh most. A query that starts
|
|
114
|
-
* with "/" also matches the templates that fit it.
|
|
115
|
-
*/
|
|
116
|
-
search(query: string, options: {
|
|
117
|
-
method?: RestMethod;
|
|
118
|
-
limit: number;
|
|
119
|
-
}): Operation[];
|
|
120
|
-
/** Whether the operation takes a body, and in which framing. */
|
|
121
|
-
bodyType(op: Operation): string | undefined;
|
|
122
|
-
/** The operation's request contract as JSON Schema, optionally one parameter only. */
|
|
123
|
-
contract(op: Operation, only?: string): OperationContract;
|
|
124
|
-
/**
|
|
125
|
-
* Check query and body names, required members, enums, and object/array
|
|
126
|
-
* shapes against the operation, to the depth the index carries. Scalars are
|
|
127
|
-
* not type-policed beyond that: vendors coerce form strings, and a wrong
|
|
128
|
-
* number is the vendor's to explain. `null` and `""` pass anywhere, since
|
|
129
|
-
* they are how form APIs unset a field.
|
|
130
|
-
*/
|
|
131
|
-
check(op: Operation, query: Readonly<Record<string, unknown>>, body: unknown): void;
|
|
132
|
-
}
|
|
133
|
-
export {};
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import type { ApiTool } from "../../../connectors/api-connector.js";
|
|
2
|
-
import { type GuardedFetchOptions, type GuardedRequest, type GuardedTransport } from "../../../connectors/guarded-fetch.js";
|
|
3
|
-
import { ConnectorCallError } from "../../../errors.js";
|
|
4
|
-
import type { ConnectorContext } from "../../../types.js";
|
|
5
|
-
import type { Operation, OperationIndex, RestMethod } from "./operation-index.js";
|
|
6
|
-
import type { ValueSafety } from "./value-safety.js";
|
|
7
|
-
/** One call matched to its operation, after the vendor's defaults and pins. */
|
|
8
|
-
export interface RestCall {
|
|
9
|
-
readonly method: RestMethod;
|
|
10
|
-
/** The concrete path the caller named. */
|
|
11
|
-
readonly path: string;
|
|
12
|
-
readonly op: Operation;
|
|
13
|
-
/** Path parameter values by template name. */
|
|
14
|
-
readonly params: Readonly<Record<string, string>>;
|
|
15
|
-
readonly query: Readonly<Record<string, unknown>>;
|
|
16
|
-
readonly body: unknown;
|
|
17
|
-
/** Request headers from the vendor's reviewed `headers` allowlist. */
|
|
18
|
-
readonly headers?: Readonly<Record<string, string>>;
|
|
19
|
-
}
|
|
20
|
-
/** How the vendor frames one call on the wire. */
|
|
21
|
-
export interface RestFraming {
|
|
22
|
-
query?: GuardedRequest["query"];
|
|
23
|
-
/** A JSON body; exclusive with `rawBody`. */
|
|
24
|
-
body?: unknown;
|
|
25
|
-
/** A pre-framed body, such as a form-encoded string, with its own `Content-Type` header. */
|
|
26
|
-
rawBody?: BodyInit;
|
|
27
|
-
headers?: Record<string, string | undefined>;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* The cursor for the next page: pass `next` back as `param`, a query
|
|
31
|
-
* parameter unless `in` says the operation takes it in its body (Notion's
|
|
32
|
-
* read-only POST queries do). `path` names a different GET that continues
|
|
33
|
-
* the list, when the first page came from a call that created it (Notion's
|
|
34
|
-
* view queries). `hasMore` without `next` means the operation has no cursor.
|
|
35
|
-
*/
|
|
36
|
-
export interface RestPage {
|
|
37
|
-
hasMore: boolean;
|
|
38
|
-
next?: string;
|
|
39
|
-
param?: string;
|
|
40
|
-
in?: "query" | "body";
|
|
41
|
-
path?: string;
|
|
42
|
-
}
|
|
43
|
-
export interface RestResult {
|
|
44
|
-
status: number;
|
|
45
|
-
data: unknown;
|
|
46
|
-
page?: RestPage;
|
|
47
|
-
}
|
|
48
|
-
/** A reviewed POST that only reads: `[method, path template, reason]`. */
|
|
49
|
-
export type RestReadPost = readonly [method: RestMethod, path: string, reason: string];
|
|
50
|
-
export interface RestVendor {
|
|
51
|
-
/** Lowercase tool-name prefix: `${vendor}_api_search` and so on. */
|
|
52
|
-
readonly vendor: string;
|
|
53
|
-
/** Display name in descriptions and refusals. */
|
|
54
|
-
readonly title: string;
|
|
55
|
-
readonly index: OperationIndex;
|
|
56
|
-
/**
|
|
57
|
-
* The transport for an operation's server (`undefined` is the default
|
|
58
|
-
* origin), or a refusal that says where to go instead.
|
|
59
|
-
*/
|
|
60
|
-
transport(server: string | undefined): GuardedTransport | string;
|
|
61
|
-
/** Map a failed response to what the caller does next (H11); `call` lets a vendor withhold text for secret families. */
|
|
62
|
-
failure(status: number, headers: Headers, body: unknown, call?: RestCall): ConnectorCallError;
|
|
63
|
-
/** Reviewed POSTs that only read; `_api_read` admits exactly these. */
|
|
64
|
-
readonly readPosts?: readonly RestReadPost[];
|
|
65
|
-
/**
|
|
66
|
-
* The vendor's reviewed value-safety table: `refuse` verdicts are refused
|
|
67
|
-
* by the generic tools before any request, and every successful body is
|
|
68
|
-
* redacted (decision 0005, "Value safety"). Failure mappers ask it which
|
|
69
|
-
* operations withhold vendor error text.
|
|
70
|
-
*/
|
|
71
|
-
readonly valueSafety: ValueSafety;
|
|
72
|
-
/** Reviewed refusals that depend on arguments: return the reason to refuse, before any request. */
|
|
73
|
-
refuse?(call: RestCall): string | undefined;
|
|
74
|
-
/** Rewrite a caller's path before it is matched, such as filling configured default ids. */
|
|
75
|
-
path?(path: string): string;
|
|
76
|
-
/** Apply configured defaults and enforce pins; throw to refuse. */
|
|
77
|
-
scope?(call: RestCall): RestCall;
|
|
78
|
-
/**
|
|
79
|
-
* Admit one prepared call before it is sent; throw to refuse. Runs in
|
|
80
|
-
* `callRest`, so generic and named tools alike pass through it, and may
|
|
81
|
-
* await, as a pin check that resolves which account owns a zone does.
|
|
82
|
-
*/
|
|
83
|
-
admit?(call: RestCall, ctx: ConnectorContext): void | Promise<void>;
|
|
84
|
-
/**
|
|
85
|
-
* Map a successful body into the envelope's `data`, such as unwrapping a
|
|
86
|
-
* vendor envelope; throw to fail a success-status body that reports an
|
|
87
|
-
* error. `page` still reads the body as it arrived.
|
|
88
|
-
*/
|
|
89
|
-
result?(body: unknown, call: RestCall, response: {
|
|
90
|
-
status: number;
|
|
91
|
-
headers: Headers;
|
|
92
|
-
}): unknown;
|
|
93
|
-
/** Request headers the generic tools accept, by name, with what each does; the vendor validates values. */
|
|
94
|
-
readonly headers?: Readonly<Record<string, string>>;
|
|
95
|
-
/** Whether the generic tools accept a string body, for operations framed as text. */
|
|
96
|
-
readonly textBodies?: boolean;
|
|
97
|
-
/** A concrete path in this vendor's API, for the path argument's description. */
|
|
98
|
-
readonly pathExample?: string;
|
|
99
|
-
/** Frame the request. Defaults to scalar query values and a JSON body. */
|
|
100
|
-
encode?(call: RestCall): RestFraming;
|
|
101
|
-
/** Read the next-page cursor from a successful body. */
|
|
102
|
-
page?(data: unknown, call: RestCall): RestPage | undefined;
|
|
103
|
-
/** A header write tools fill with a caller key or a generated one, and return. */
|
|
104
|
-
readonly idempotencyHeader?: string;
|
|
105
|
-
/** Where multipart or binary uploads go instead of `_api_write`. */
|
|
106
|
-
readonly upload?: string;
|
|
107
|
-
/** One clause on how `_api_write` frames bodies, for its schema. */
|
|
108
|
-
readonly bodyHint?: string;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* A guarded transport whose requests, response bodies included, end after
|
|
112
|
-
* `timeoutMs`: a stream the vendor never closes cannot hold a call open past
|
|
113
|
-
* it. The request's own signal still cancels first.
|
|
114
|
-
*/
|
|
115
|
-
export declare function restTransport(options: Omit<GuardedFetchOptions, "fetch"> & {
|
|
116
|
-
timeoutMs: number;
|
|
117
|
-
}): GuardedTransport;
|
|
118
|
-
/** Match a call to its operation and apply the vendor's defaults and pins. */
|
|
119
|
-
export declare function restCall(vendor: RestVendor, method: RestMethod, path: string, input?: {
|
|
120
|
-
query?: Readonly<Record<string, unknown>>;
|
|
121
|
-
body?: unknown;
|
|
122
|
-
headers?: Readonly<Record<string, string>>;
|
|
123
|
-
}): RestCall;
|
|
124
|
-
/**
|
|
125
|
-
* A request that is not safe to repeat (a write without an idempotency key)
|
|
126
|
-
* must never be advertised as retryable after it may have reached the vendor
|
|
127
|
-
* (INV-9). Definite answers pass through: refusals and 4xx verdicts, a failure
|
|
128
|
-
* proven to precede any connection, and timeouts, which the invocation layer
|
|
129
|
-
* already reports as `write_outcome_unknown`. Exported so a named write tool
|
|
130
|
-
* with its own transport (an upload) applies the same rule.
|
|
131
|
-
*/
|
|
132
|
-
export declare function unknownOutcome(vendor: RestVendor, error: unknown, responded: boolean): unknown;
|
|
133
|
-
/**
|
|
134
|
-
* Send one prepared call and read it into the envelope. No validation and no
|
|
135
|
-
* refusal tables run here: the generic tools do both first, and named tools
|
|
136
|
-
* build their calls from fixed operations. `visibleHeaders` carry values the
|
|
137
|
-
* result returns to the caller, such as an idempotency key.
|
|
138
|
-
*/
|
|
139
|
-
export declare function callRest(vendor: RestVendor, call: RestCall, ctx: ConnectorContext, visibleHeaders?: Record<string, string>): Promise<RestResult>;
|
|
140
|
-
/** The four generic tools over one vendor's index. */
|
|
141
|
-
export declare function restTools(vendor: RestVendor): ApiTool[];
|