@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
package/dist/catalog.js
CHANGED
|
@@ -155,9 +155,13 @@ const CONVERSATIONAL_QUERY_WORDS = new Set([
|
|
|
155
155
|
* search into an unfiltered catalog browse.
|
|
156
156
|
*/
|
|
157
157
|
export function lexicalSearchQuery(query) {
|
|
158
|
+
return lexicalSearchContent(query) || query;
|
|
159
|
+
}
|
|
160
|
+
/** Normalized content only; empty means every query word was framing. */
|
|
161
|
+
export function lexicalSearchContent(query) {
|
|
158
162
|
const terms = normalized(query).split(/\s+/).filter(Boolean);
|
|
159
163
|
const contentTerms = terms.filter((term) => !CONVERSATIONAL_QUERY_WORDS.has(term));
|
|
160
|
-
return contentTerms.
|
|
164
|
+
return contentTerms.join(" ");
|
|
161
165
|
}
|
|
162
166
|
const searchIndexes = new WeakMap();
|
|
163
167
|
function indexFor(tools) {
|
package/dist/concurrency.js
CHANGED
|
@@ -1,30 +1,5 @@
|
|
|
1
1
|
import { CONFIG_DEFAULTS } from "./config-defaults.js";
|
|
2
|
-
import { Effect } from "effect";
|
|
3
|
-
import { runEdge } from "./runtime/run.js";
|
|
4
2
|
const DEFAULT_DISCOVERY_CONCURRENCY = CONFIG_DEFAULTS.discovery.concurrency;
|
|
5
3
|
export function resolveDiscoveryConcurrency(value) {
|
|
6
4
|
return value !== undefined && Number.isInteger(value) && value > 0 ? value : DEFAULT_DISCOVERY_CONCURRENCY;
|
|
7
5
|
}
|
|
8
|
-
/**
|
|
9
|
-
* Run `fn` over `items` with at most `limit` operations in flight, settling
|
|
10
|
-
* every one: a rejection lands in its slot instead of cancelling the rest.
|
|
11
|
-
* Results keep input order whatever order the work finishes in. A limit below
|
|
12
|
-
* one runs the items one at a time.
|
|
13
|
-
*/
|
|
14
|
-
export function mapSettledWithConcurrency(items, limit, fn) {
|
|
15
|
-
return runEdge(Effect.forEach(items, (item, index) => Effect.tryPromise({
|
|
16
|
-
// Promise.resolve keeps a non-promise return from `fn` working, as
|
|
17
|
-
// `await` did; a synchronous throw is caught either way.
|
|
18
|
-
try: () => Promise.resolve(fn(item, index)),
|
|
19
|
-
catch: (reason) => reason,
|
|
20
|
-
}).pipe(Effect.match({
|
|
21
|
-
onSuccess: (value) => ({
|
|
22
|
-
status: "fulfilled",
|
|
23
|
-
value,
|
|
24
|
-
}),
|
|
25
|
-
onFailure: (reason) => ({
|
|
26
|
-
status: "rejected",
|
|
27
|
-
reason,
|
|
28
|
-
}),
|
|
29
|
-
})), { concurrency: limit >= 1 ? Math.floor(limit) : 1 }));
|
|
30
|
-
}
|
package/dist/config-defaults.js
CHANGED
package/dist/config-schema.d.ts
CHANGED
|
@@ -34,6 +34,8 @@ interface Variants {
|
|
|
34
34
|
readonly key: readonly string[];
|
|
35
35
|
readonly cases: Readonly<Record<string, Shape>>;
|
|
36
36
|
readonly otherwise?: string;
|
|
37
|
+
/** Migration guards that throw rather than construct; omit them from valid choices. */
|
|
38
|
+
readonly rejected?: readonly string[];
|
|
37
39
|
}
|
|
38
40
|
type InputOf<F> = F extends Field<infer In, unknown, boolean> ? In : never;
|
|
39
41
|
type OutputOf<F> = F extends Field<unknown, infer Out, boolean> ? Out : never;
|
|
@@ -129,7 +131,7 @@ export declare function instance<F extends AnyField>(field: F): F & {
|
|
|
129
131
|
* its path and the valid values, so no union falls through to "no case". Only
|
|
130
132
|
* the walk reads variants; the factory validates the remaining values itself.
|
|
131
133
|
*/
|
|
132
|
-
export declare function variants(key: string | readonly string[], cases: Readonly<Record<string, Shape>>, otherwise?: string): Field<unknown, unknown, true>;
|
|
134
|
+
export declare function variants(key: string | readonly string[], cases: Readonly<Record<string, Shape>>, otherwise?: string, rejected?: readonly string[]): Field<unknown, unknown, true>;
|
|
133
135
|
/**
|
|
134
136
|
* A closed object for the unknown-key walk only: each named key may hold
|
|
135
137
|
* anything, which its factory validates. For the options of a built-in
|
package/dist/config-schema.js
CHANGED
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
// Deliberately small. Opaque fields (connectors, modules, functions) are
|
|
12
12
|
// checked by identity or shape and passed through untouched, never cloned, so
|
|
13
13
|
// a private-field receiver or a frozen object reaches core as configured.
|
|
14
|
+
import { keepErrorName } from "./redaction-identity.js";
|
|
14
15
|
/** A structural configuration mistake, thrown before construction does work. */
|
|
15
16
|
export class ConfigError extends TypeError {
|
|
16
17
|
name = "ConfigError";
|
|
17
18
|
}
|
|
19
|
+
keepErrorName(ConfigError, "ConfigError");
|
|
18
20
|
function fail(message) {
|
|
19
21
|
throw new ConfigError(message);
|
|
20
22
|
}
|
|
@@ -192,13 +194,18 @@ export function instance(field) {
|
|
|
192
194
|
* its path and the valid values, so no union falls through to "no case". Only
|
|
193
195
|
* the walk reads variants; the factory validates the remaining values itself.
|
|
194
196
|
*/
|
|
195
|
-
export function variants(key, cases, otherwise) {
|
|
197
|
+
export function variants(key, cases, otherwise, rejected) {
|
|
196
198
|
const path = typeof key === "string" ? [key] : [...key];
|
|
197
199
|
if (path.length === 0)
|
|
198
200
|
throw new Error("variants() requires a discriminant key.");
|
|
199
201
|
return {
|
|
200
202
|
...opaque(),
|
|
201
|
-
variants: {
|
|
203
|
+
variants: {
|
|
204
|
+
key: path,
|
|
205
|
+
cases,
|
|
206
|
+
...(otherwise !== undefined ? { otherwise } : {}),
|
|
207
|
+
...(rejected ? { rejected } : {}),
|
|
208
|
+
},
|
|
202
209
|
};
|
|
203
210
|
}
|
|
204
211
|
/**
|
|
@@ -233,7 +240,9 @@ export function assertKnownOptions(value, path, field) {
|
|
|
233
240
|
if (read.unknown.length === 0)
|
|
234
241
|
return read.value;
|
|
235
242
|
return fail(`Unknown option${read.unknown.length === 1 ? "" : "s"}: ${read.unknown.join(", ")}. ` +
|
|
236
|
-
|
|
243
|
+
(read.unknown.some((key) => key.endsWith(".classify"))
|
|
244
|
+
? "classify was removed; use ConnectaConfig.classification."
|
|
245
|
+
: "Check the spelling against the factory's options type."));
|
|
237
246
|
}
|
|
238
247
|
/**
|
|
239
248
|
* Own property descriptors, read without invoking any accessor. A config
|
|
@@ -317,6 +326,7 @@ function inspectRecord(value, path, field) {
|
|
|
317
326
|
function selectShape(inspected, path, variants) {
|
|
318
327
|
const at = `${path}.${variants.key.join(".")}`;
|
|
319
328
|
const valid = Object.keys(variants.cases)
|
|
329
|
+
.filter((name) => !variants.rejected?.includes(name))
|
|
320
330
|
.map((name) => JSON.stringify(name))
|
|
321
331
|
.join(", ");
|
|
322
332
|
// Walk the key path one plain object at a time, reading descriptors only.
|
package/dist/config.d.ts
CHANGED
|
@@ -90,6 +90,8 @@ declare const codeAdmission: {
|
|
|
90
90
|
retryAfterMs: import("./config-schema.js").Field<number, number, true>;
|
|
91
91
|
};
|
|
92
92
|
declare const requestAdmission: {
|
|
93
|
+
/** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
|
|
94
|
+
maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
|
|
93
95
|
/** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
|
|
94
96
|
maxDurationMs: import("./config-schema.js").Field<number, number, true>;
|
|
95
97
|
/** Simultaneous work admitted to this pool. */
|
|
@@ -107,12 +109,14 @@ declare const admission: {
|
|
|
107
109
|
* 5-second maximum wait.
|
|
108
110
|
*/
|
|
109
111
|
requests: import("./config-schema.js").Field<{
|
|
112
|
+
maxBodyBytes?: number | undefined;
|
|
110
113
|
maxDurationMs?: number | undefined;
|
|
111
114
|
concurrency?: number | undefined;
|
|
112
115
|
maxQueueSize?: number | undefined;
|
|
113
116
|
queueTimeoutMs?: number | undefined;
|
|
114
117
|
retryAfterMs?: number | undefined;
|
|
115
118
|
}, {
|
|
119
|
+
readonly maxBodyBytes: number;
|
|
116
120
|
readonly maxDurationMs: number;
|
|
117
121
|
readonly concurrency: number;
|
|
118
122
|
readonly maxQueueSize: number;
|
|
@@ -120,6 +124,8 @@ declare const admission: {
|
|
|
120
124
|
readonly retryAfterMs: number;
|
|
121
125
|
}, true> & {
|
|
122
126
|
readonly shape: {
|
|
127
|
+
/** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
|
|
128
|
+
maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
|
|
123
129
|
/** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
|
|
124
130
|
maxDurationMs: import("./config-schema.js").Field<number, number, true>;
|
|
125
131
|
/** Simultaneous work admitted to this pool. */
|
|
@@ -194,6 +200,19 @@ declare const pool: {
|
|
|
194
200
|
* `/mcp` never shows it.
|
|
195
201
|
*/
|
|
196
202
|
description: import("./config-schema.js").Field<string, string | undefined, true>;
|
|
203
|
+
/**
|
|
204
|
+
* The tools this pool's endpoints list. `"meta"`, the default, is the six
|
|
205
|
+
* meta-tools. `"native"` lists each downstream tool directly, named
|
|
206
|
+
* `<connector>__<tool>` and annotated from its classification, for clients
|
|
207
|
+
* that run their own tool search; calls take the same invocation path.
|
|
208
|
+
*/
|
|
209
|
+
surface: import("./config-schema.js").Field<"native" | "meta", "native" | "meta" | undefined, true>;
|
|
210
|
+
/**
|
|
211
|
+
* `false` drops `execute_code` from a native pool and lists `read_result`
|
|
212
|
+
* for paging instead. Only valid with `surface: "native"`: the meta surface
|
|
213
|
+
* always includes it.
|
|
214
|
+
*/
|
|
215
|
+
executeCode: import("./config-schema.js").Field<boolean, boolean | undefined, true>;
|
|
197
216
|
};
|
|
198
217
|
declare const connectaConfig: {
|
|
199
218
|
connectors: import("./config-schema.js").Field<Connector[], readonly Connector[], false>;
|
|
@@ -201,13 +220,16 @@ declare const connectaConfig: {
|
|
|
201
220
|
auth: import("./config-schema.js").Field<InboundAuth | InboundAuth[], readonly InboundAuth[], true>;
|
|
202
221
|
/**
|
|
203
222
|
* Agents, declared by name: lowercase letters, digits, `_` and `-`, each
|
|
204
|
-
* unique.
|
|
223
|
+
* unique. With `accessTokens`, each has one `cta_` slot operators issue, rotate, and
|
|
205
224
|
* revoke; nothing outside code adds, renames, or rebinds an agent. Removing
|
|
206
|
-
* a name stops its
|
|
225
|
+
* a name stops its credentials on the next request. A string name requires
|
|
226
|
+
* `accessTokens`; `{ name, vercel: { team, project, environments? } }` also
|
|
227
|
+
* accepts Vercel OIDC. Requires an immutable team_ ID; prefer a prj_ ID for the project. Environments
|
|
228
|
+
* default to production. Both credential types may coexist.
|
|
207
229
|
* An admitted agent carries `identity.agent` and has no principal, so
|
|
208
230
|
* personal connectors are absent for it. Defaults to none.
|
|
209
231
|
*/
|
|
210
|
-
agents: import("./config-schema.js").Field<readonly
|
|
232
|
+
agents: import("./config-schema.js").Field<readonly import("./agent-config.js").AgentConfig[], readonly import("./agent-config.js").ResolvedAgent[], true>;
|
|
211
233
|
/**
|
|
212
234
|
* The people who may use plain `/mcp`, which serves the whole catalog with
|
|
213
235
|
* the deployment's `readOnly`, and who administer the deployment. Same
|
|
@@ -220,6 +242,8 @@ declare const connectaConfig: {
|
|
|
220
242
|
readOnly?: boolean | undefined;
|
|
221
243
|
owner?: string | undefined;
|
|
222
244
|
description?: string | undefined;
|
|
245
|
+
surface?: "native" | "meta" | undefined;
|
|
246
|
+
executeCode?: boolean | undefined;
|
|
223
247
|
tools: readonly string[];
|
|
224
248
|
members: readonly MemberRef[];
|
|
225
249
|
}>, Readonly<Record<string, {
|
|
@@ -228,9 +252,12 @@ declare const connectaConfig: {
|
|
|
228
252
|
readonly members: readonly MemberRef[];
|
|
229
253
|
readonly owner: string | undefined;
|
|
230
254
|
readonly description: string | undefined;
|
|
255
|
+
readonly surface: "native" | "meta" | undefined;
|
|
256
|
+
readonly executeCode: boolean | undefined;
|
|
231
257
|
}>> | undefined, true>;
|
|
232
|
-
/** Exact connector id -> tool name -> verdict.
|
|
233
|
-
|
|
258
|
+
/** Exact connector id -> tool name -> verdict. Hidden tools cannot be discovered or called.
|
|
259
|
+
* Unknown static names fail construction; absent runtime names stay dormant and are reported. */
|
|
260
|
+
classification: import("./config-schema.js").Field<Record<string, Record<string, "read" | "write" | "hidden">>, Readonly<Record<string, Readonly<Record<string, "read" | "write" | "hidden">>>> | undefined, true>;
|
|
234
261
|
/**
|
|
235
262
|
* The deployment's one store: `d1Storage(env.CONNECTA_DB)` from
|
|
236
263
|
* `@zackbart/connecta/d1` on Workers, `sqliteStorage(path)` from
|
|
@@ -391,6 +418,7 @@ declare const connectaConfig: {
|
|
|
391
418
|
*/
|
|
392
419
|
admission: import("./config-schema.js").Field<{
|
|
393
420
|
requests?: {
|
|
421
|
+
maxBodyBytes?: number | undefined;
|
|
394
422
|
maxDurationMs?: number | undefined;
|
|
395
423
|
concurrency?: number | undefined;
|
|
396
424
|
maxQueueSize?: number | undefined;
|
|
@@ -405,6 +433,7 @@ declare const connectaConfig: {
|
|
|
405
433
|
} | undefined;
|
|
406
434
|
}, {
|
|
407
435
|
readonly requests: {
|
|
436
|
+
readonly maxBodyBytes: number;
|
|
408
437
|
readonly maxDurationMs: number;
|
|
409
438
|
readonly concurrency: number;
|
|
410
439
|
readonly maxQueueSize: number;
|
|
@@ -424,12 +453,14 @@ declare const connectaConfig: {
|
|
|
424
453
|
* 5-second maximum wait.
|
|
425
454
|
*/
|
|
426
455
|
requests: import("./config-schema.js").Field<{
|
|
456
|
+
maxBodyBytes?: number | undefined;
|
|
427
457
|
maxDurationMs?: number | undefined;
|
|
428
458
|
concurrency?: number | undefined;
|
|
429
459
|
maxQueueSize?: number | undefined;
|
|
430
460
|
queueTimeoutMs?: number | undefined;
|
|
431
461
|
retryAfterMs?: number | undefined;
|
|
432
462
|
}, {
|
|
463
|
+
readonly maxBodyBytes: number;
|
|
433
464
|
readonly maxDurationMs: number;
|
|
434
465
|
readonly concurrency: number;
|
|
435
466
|
readonly maxQueueSize: number;
|
|
@@ -437,6 +468,8 @@ declare const connectaConfig: {
|
|
|
437
468
|
readonly retryAfterMs: number;
|
|
438
469
|
}, true> & {
|
|
439
470
|
readonly shape: {
|
|
471
|
+
/** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
|
|
472
|
+
maxBodyBytes: import("./config-schema.js").Field<number, number, true>;
|
|
440
473
|
/** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
|
|
441
474
|
maxDurationMs: import("./config-schema.js").Field<number, number, true>;
|
|
442
475
|
/** Simultaneous work admitted to this pool. */
|
|
@@ -566,7 +599,8 @@ type Parsed = ConfigOutput<typeof connectaConfig>;
|
|
|
566
599
|
* The configuration a Connecta runs with: validated, every default applied,
|
|
567
600
|
* auth ordered, and `serverInfo` named and versioned. Built once by createConnecta; nothing downstream re-derives it.
|
|
568
601
|
*/
|
|
569
|
-
export interface ResolvedConfig extends Omit<Parsed, "serverInfo"> {
|
|
602
|
+
export interface ResolvedConfig extends Omit<Parsed, "serverInfo" | "agents"> {
|
|
603
|
+
readonly agents: readonly string[];
|
|
570
604
|
/** `serverInfo` with its name and version defaults applied. */
|
|
571
605
|
readonly serverInfo: {
|
|
572
606
|
readonly name: string;
|
package/dist/config.js
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
// The schema below is the canonical record of the configuration surface. It
|
|
4
|
-
// produces the TypeScript type a deployment writes (`ConnectaConfig`), the
|
|
5
|
-
// unknown-key rejection createConnecta runs before reading anything, every
|
|
6
|
-
// default (src/config-defaults.ts), and one validation policy: a present value
|
|
7
|
-
// that is wrong throws with its path at construction (INV-11). Each field's
|
|
8
|
-
// default and operator-facing meaning belongs in its doc comment here, where a
|
|
9
|
-
// deployment author reads it from the editor.
|
|
10
|
-
//
|
|
11
|
-
// `resolveConfig` turns an accepted config into the `ResolvedConfig` core
|
|
12
|
-
// reads, with defaults applied once, so no later layer re-derives a value or
|
|
13
|
-
// re-plumbs a field.
|
|
1
|
+
import { registerAgentDescriptions } from "./agent-description.js";
|
|
14
2
|
import { CONFIG_DEFAULTS as D } from "./config-defaults.js";
|
|
15
3
|
import { array, ConfigError, object, opaque, record, required, seconds, readPlain, text, whole, } from "./config-schema.js";
|
|
16
|
-
import {
|
|
4
|
+
import { agentConfig } from "./agent-config.js";
|
|
5
|
+
import { vercelAgentAuth } from "./auth/vercel-agent.js";
|
|
17
6
|
import { assertExecutor } from "./executor-contract.js";
|
|
18
7
|
import { memoryStorage } from "./storage/memory.js";
|
|
19
8
|
import { CONNECTA_VERSION } from "./version.js";
|
|
@@ -156,6 +145,8 @@ function admissionPool(defaults) {
|
|
|
156
145
|
const codeAdmission = admissionPool(D.admission.code);
|
|
157
146
|
const requestAdmission = {
|
|
158
147
|
...admissionPool(D.admission.requests),
|
|
148
|
+
/** Authenticated MCP body limit in bytes, checked while reading. Default 4 MiB. */
|
|
149
|
+
maxBodyBytes: whole({ min: 1, default: D.admission.requests.maxBodyBytes }),
|
|
159
150
|
/** Hard lifetime of an admitted /mcp request. Default 300,000 ms. */
|
|
160
151
|
maxDurationMs: whole({
|
|
161
152
|
min: 1,
|
|
@@ -261,6 +252,24 @@ const pool = {
|
|
|
261
252
|
* `/mcp` never shows it.
|
|
262
253
|
*/
|
|
263
254
|
description: opaque({ check: assertPoolDescription }),
|
|
255
|
+
/**
|
|
256
|
+
* The tools this pool's endpoints list. `"meta"`, the default, is the six
|
|
257
|
+
* meta-tools. `"native"` lists each downstream tool directly, named
|
|
258
|
+
* `<connector>__<tool>` and annotated from its classification, for clients
|
|
259
|
+
* that run their own tool search; calls take the same invocation path.
|
|
260
|
+
*/
|
|
261
|
+
surface: opaque({
|
|
262
|
+
check: (value, path) => {
|
|
263
|
+
if (value !== "meta" && value !== "native")
|
|
264
|
+
throw new ConfigError(`${path} must be "meta" or "native".`);
|
|
265
|
+
},
|
|
266
|
+
}),
|
|
267
|
+
/**
|
|
268
|
+
* `false` drops `execute_code` from a native pool and lists `read_result`
|
|
269
|
+
* for paging instead. Only valid with `surface: "native"`: the meta surface
|
|
270
|
+
* always includes it.
|
|
271
|
+
*/
|
|
272
|
+
executeCode: opaque({ check: assertFlag }),
|
|
264
273
|
};
|
|
265
274
|
const icon = {
|
|
266
275
|
src: required(text()),
|
|
@@ -315,16 +324,16 @@ const connectaConfig = {
|
|
|
315
324
|
}),
|
|
316
325
|
/**
|
|
317
326
|
* Agents, declared by name: lowercase letters, digits, `_` and `-`, each
|
|
318
|
-
* unique.
|
|
327
|
+
* unique. With `accessTokens`, each has one `cta_` slot operators issue, rotate, and
|
|
319
328
|
* revoke; nothing outside code adds, renames, or rebinds an agent. Removing
|
|
320
|
-
* a name stops its
|
|
329
|
+
* a name stops its credentials on the next request. A string name requires
|
|
330
|
+
* `accessTokens`; `{ name, vercel: { team, project, environments? } }` also
|
|
331
|
+
* accepts Vercel OIDC. Requires an immutable team_ ID; prefer a prj_ ID for the project. Environments
|
|
332
|
+
* default to production. Both credential types may coexist.
|
|
321
333
|
* An admitted agent carries `identity.agent` and has no principal, so
|
|
322
334
|
* personal connectors are absent for it. Defaults to none.
|
|
323
335
|
*/
|
|
324
|
-
agents:
|
|
325
|
-
check: (value, path) => assertAgentNames(value, path),
|
|
326
|
-
resolve: (value) => Object.freeze([...(value ?? [])]),
|
|
327
|
-
}),
|
|
336
|
+
agents: agentConfig,
|
|
328
337
|
/**
|
|
329
338
|
* The people who may use plain `/mcp`, which serves the whole catalog with
|
|
330
339
|
* the deployment's `readOnly`, and who administer the deployment. Same
|
|
@@ -334,11 +343,12 @@ const connectaConfig = {
|
|
|
334
343
|
maintainers: opaque({ check: assertMemberList }),
|
|
335
344
|
/** Named tool pools, each served at `/mcp/<name>` to its members only. */
|
|
336
345
|
pools: record(object(pool)),
|
|
337
|
-
/** Exact connector id -> tool name -> verdict.
|
|
346
|
+
/** Exact connector id -> tool name -> verdict. Hidden tools cannot be discovered or called.
|
|
347
|
+
* Unknown static names fail construction; absent runtime names stay dormant and are reported. */
|
|
338
348
|
classification: record(record(opaque({
|
|
339
349
|
check: (value, path) => {
|
|
340
|
-
if (value !== "read" && value !== "write") {
|
|
341
|
-
throw new ConfigError(`${path} must be "read" or "
|
|
350
|
+
if (value !== "read" && value !== "write" && value !== "hidden") {
|
|
351
|
+
throw new ConfigError(`${path} must be "read", "write", or "hidden".`);
|
|
342
352
|
}
|
|
343
353
|
},
|
|
344
354
|
}))),
|
|
@@ -566,7 +576,7 @@ function assertCoherent(config) {
|
|
|
566
576
|
config.discovery.catalogMaxTtlSeconds > 86_400) {
|
|
567
577
|
throw new ConfigError("ConnectaConfig.discovery requires catalogMinTtlSeconds <= catalogMaxTtlSeconds <= 86400.");
|
|
568
578
|
}
|
|
569
|
-
if (config.agents.
|
|
579
|
+
if (config.agents.some((agent) => !agent.vercel) && !config.accessTokens) {
|
|
570
580
|
throw new ConfigError("ConnectaConfig.agents needs accessTokens: accessTokens(storage) from @zackbart/connecta/auth/access-tokens " +
|
|
571
581
|
"holds each agent's token slot.");
|
|
572
582
|
}
|
|
@@ -598,14 +608,18 @@ export function readConfig(config) {
|
|
|
598
608
|
version: parsed.serverInfo.version ?? CONNECTA_VERSION,
|
|
599
609
|
};
|
|
600
610
|
// The token module admits exactly the agents this configuration declares.
|
|
601
|
-
const
|
|
611
|
+
const agents = Object.freeze(parsed.agents.map((agent) => agent.name));
|
|
612
|
+
const accessTokens = parsed.accessTokens?.forAgents(agents);
|
|
613
|
+
const vercel = vercelAgentAuth(parsed.agents, parsed.logger);
|
|
602
614
|
const resolved = Object.freeze({
|
|
603
615
|
...parsed,
|
|
616
|
+
agents,
|
|
604
617
|
accessTokens,
|
|
605
618
|
// A managed-token module contributes one more provider, ordered with the rest.
|
|
606
|
-
auth: accessTokens ?
|
|
619
|
+
auth: normalizeAuth([...(accessTokens ? [accessTokens.auth] : []), ...(vercel ? [vercel] : []), ...parsed.auth]),
|
|
607
620
|
serverInfo: Object.freeze(info),
|
|
608
621
|
});
|
|
622
|
+
registerAgentDescriptions(resolved, parsed.agents, accessTokens !== undefined);
|
|
609
623
|
return { input, resolved };
|
|
610
624
|
}
|
|
611
625
|
/**
|
|
@@ -18,5 +18,9 @@ export interface ConnectorCaller {
|
|
|
18
18
|
*/
|
|
19
19
|
poolOwner?: string;
|
|
20
20
|
}
|
|
21
|
+
/** Mark a connector whose downstream identity depends on the admitted caller. */
|
|
22
|
+
export declare function tagCallerIdentity<C extends object>(connector: C): C;
|
|
23
|
+
/** Provider construction may wrap a connector in an inheriting object. */
|
|
24
|
+
export declare function usesCallerIdentity(connector: object): boolean;
|
|
21
25
|
export declare function attachCaller(ctx: ConnectorContext, caller: ConnectorCaller | undefined): ConnectorContext;
|
|
22
26
|
export declare function callerOf(ctx: ConnectorContext): ConnectorCaller | undefined;
|
package/dist/connector-caller.js
CHANGED
|
@@ -19,12 +19,25 @@
|
|
|
19
19
|
// through an inbound-auth provider configured to read one (a bearer's asserted
|
|
20
20
|
// principal). A context no request admitted, such as an operator probe, has no caller, and a delegated provider fails closed on it,
|
|
21
21
|
// as it does on the anonymous caller an open deployment admits.
|
|
22
|
-
|
|
22
|
+
import { Caller, serviceFor, setViewService } from "./runtime/call.js";
|
|
23
|
+
const callerIdentities = new WeakSet();
|
|
24
|
+
/** Mark a connector whose downstream identity depends on the admitted caller. */
|
|
25
|
+
export function tagCallerIdentity(connector) {
|
|
26
|
+
callerIdentities.add(connector);
|
|
27
|
+
return connector;
|
|
28
|
+
}
|
|
29
|
+
/** Provider construction may wrap a connector in an inheriting object. */
|
|
30
|
+
export function usesCallerIdentity(connector) {
|
|
31
|
+
for (let current = connector; current; current = Object.getPrototypeOf(current)) {
|
|
32
|
+
if (callerIdentities.has(current))
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
23
37
|
export function attachCaller(ctx, caller) {
|
|
24
|
-
|
|
25
|
-
callers.set(ctx, caller);
|
|
38
|
+
setViewService(ctx, Caller, caller);
|
|
26
39
|
return ctx;
|
|
27
40
|
}
|
|
28
41
|
export function callerOf(ctx) {
|
|
29
|
-
return
|
|
42
|
+
return serviceFor(ctx, Caller);
|
|
30
43
|
}
|
|
@@ -42,6 +42,10 @@ export interface ApiOAuthConfig {
|
|
|
42
42
|
authorizationEndpoint: string;
|
|
43
43
|
/** Where codes are exchanged and refresh tokens redeemed. Absolute https URL. */
|
|
44
44
|
tokenEndpoint: string;
|
|
45
|
+
/** Trusted RFC 7009 endpoint; disconnect removes the local grant then attempts revocation once. */
|
|
46
|
+
revocationEndpoint?: string;
|
|
47
|
+
/** Revocation body encoding, default form. JSON omits the RFC 7009 token_type_hint. */
|
|
48
|
+
revocationRequestFormat?: "form" | "json";
|
|
45
49
|
/** The client id the provider issued for this deployment. */
|
|
46
50
|
clientId: string;
|
|
47
51
|
/**
|
|
@@ -64,6 +68,15 @@ export interface ApiOAuthConfig {
|
|
|
64
68
|
* `access_type`. The grant's own parameters cannot be overridden.
|
|
65
69
|
*/
|
|
66
70
|
authorizationParams?: Record<string, string>;
|
|
71
|
+
/**
|
|
72
|
+
* Fixed provider callback parameters, such as a configured company id.
|
|
73
|
+
* After pending-state verification, each must occur exactly once with this
|
|
74
|
+
* exact value, before issuer validation or code exchange. OAuth response
|
|
75
|
+
* fields (code, state, iss, error, error_description, error_uri) are reserved.
|
|
76
|
+
* Names must be nonempty ASCII letters, digits, dots, underscores or hyphens;
|
|
77
|
+
* values must be nonempty strings. Values are never described or returned.
|
|
78
|
+
*/
|
|
79
|
+
expectedCallbackParameters?: Readonly<Record<string, string>>;
|
|
67
80
|
/**
|
|
68
81
|
* Headers added to every token-endpoint request — the code exchange and
|
|
69
82
|
* each refresh — for a provider whose token endpoint demands its own
|
|
@@ -85,9 +98,12 @@ export interface ApiOAuthAccess {
|
|
|
85
98
|
/**
|
|
86
99
|
* `fetch` with the calling owner's access token as `Authorization: Bearer`.
|
|
87
100
|
* Only to `apiOrigins`; redirects are returned unfollowed. A 401 earns one
|
|
88
|
-
* coordinated refresh
|
|
89
|
-
*
|
|
90
|
-
*
|
|
101
|
+
* coordinated refresh. Only a positively read-classified GET/HEAD without
|
|
102
|
+
* method-override headers is sent once more; a write's never is, and the call fails with `connector_call_failed`
|
|
103
|
+
* whose outcome is unknown, so the agent checks the target before
|
|
104
|
+
* repeating it. A second 401, a refused refresh, or no grant at all throws
|
|
105
|
+
* `auth_required`, and an authorization-server outage throws a retryable
|
|
106
|
+
* `unavailable`.
|
|
91
107
|
*/
|
|
92
108
|
fetch(input: string | URL, init?: RequestInit): Promise<Response>;
|
|
93
109
|
}
|
|
@@ -196,6 +212,7 @@ export declare const API_OPTIONS: import("../config-schema.js").Field<unknown, u
|
|
|
196
212
|
oauth: import("../config-schema.js").Field<unknown, unknown, true> & {
|
|
197
213
|
readonly shape: {
|
|
198
214
|
authorizationParams: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
|
|
215
|
+
expectedCallbackParameters: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
|
|
199
216
|
tokenRequestHeaders: import("../config-schema.js").Field<Record<string, string>, Readonly<Record<string, string>> | undefined, true>;
|
|
200
217
|
scope: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
201
218
|
authorizationEndpoint: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
@@ -205,15 +222,17 @@ export declare const API_OPTIONS: import("../config-schema.js").Field<unknown, u
|
|
|
205
222
|
pkce: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
206
223
|
clientId: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
207
224
|
clientSecret: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
225
|
+
revocationEndpoint: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
226
|
+
revocationRequestFormat: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
208
227
|
};
|
|
209
228
|
};
|
|
210
229
|
tools: import("../config-schema.js").Field<unknown[], readonly unknown[] | undefined, true>;
|
|
211
230
|
title: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
231
|
+
authScope: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
232
|
+
maxResultBytes: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
212
233
|
description: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
213
234
|
testCredential: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
214
235
|
testCredentials: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
215
|
-
authScope: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
216
|
-
maxResultBytes: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
217
236
|
validateArgs: import("../config-schema.js").Field<unknown, unknown, true>;
|
|
218
237
|
};
|
|
219
238
|
};
|
|
@@ -230,12 +249,15 @@ export interface ApiOAuthHooks {
|
|
|
230
249
|
}): Promise<ConnectorStatus>;
|
|
231
250
|
disconnectAuth(ctx: ConnectorContext): Promise<void>;
|
|
232
251
|
verifyState(state: string | null, ctx: ConnectorContext): Promise<boolean>;
|
|
252
|
+
verifyCallbackParameters(params: URLSearchParams, ctx: ConnectorContext): Promise<boolean>;
|
|
233
253
|
verifyCallbackIssuer(issuer: string | null, ctx: ConnectorContext): Promise<boolean>;
|
|
234
254
|
consumeAuthError(ctx: ConnectorContext): Promise<void>;
|
|
235
255
|
/** Requires callbackParams with a nonempty state, including without PKCE. */
|
|
236
256
|
finishAuth(code: string, ctx: ConnectorContext, callbackParams: URLSearchParams): Promise<void>;
|
|
237
|
-
/** The handler-facing accessor for one call's context. */
|
|
238
|
-
access(ctx: ConnectorContext
|
|
257
|
+
/** The handler-facing accessor for one call's context; a write's request is never resent. */
|
|
258
|
+
access(ctx: ConnectorContext, call: {
|
|
259
|
+
write: boolean;
|
|
260
|
+
}): ApiOAuthAccess;
|
|
239
261
|
}
|
|
240
262
|
/**
|
|
241
263
|
* A static connector; every tool passes {@link checkToolContract} first.
|