@zackbart/connecta 0.34.0 → 0.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +393 -0
- package/README.md +62 -105
- package/SECURITY.md +3 -2
- package/bin/connecta.mjs +41 -16
- package/bin/version.mjs +1 -1
- package/dist/access-tokens.d.ts +2 -1
- package/dist/access-tokens.js +66 -30
- package/dist/activity.d.ts +1 -1
- package/dist/activity.js +2 -0
- package/dist/agent-config.d.ts +23 -0
- package/dist/agent-config.js +59 -0
- package/dist/agent-description.js +16 -0
- package/dist/agent-identity.js +4 -4
- package/dist/agent-observation.js +39 -0
- package/dist/auth/clerk-sdk/client.d.ts +2 -0
- package/dist/auth/clerk-sdk/generated.js +554 -563
- package/dist/auth/clerk-transport.js +70 -3
- package/dist/auth/clerk.d.ts +13 -0
- package/dist/auth/clerk.js +653 -246
- package/dist/auth/cloudflare-access.js +46 -42
- package/dist/auth/downstream-client-metadata.js +2 -2
- package/dist/auth/downstream-oauth.js +2051 -1160
- package/dist/auth/downstream-revocation.js +88 -88
- package/dist/auth/native-call.js +20 -0
- package/dist/auth/native.js +184 -0
- package/dist/auth/oauth-start-reset.js +11 -5
- package/dist/auth/oauth-token-response.js +121 -102
- package/dist/auth/oauth-v2-migration.js +97 -78
- package/dist/auth/renewable-grant.js +10 -0
- package/dist/auth/static-oauth.js +663 -271
- package/dist/auth/vercel-agent.js +266 -0
- package/dist/auth-admission.js +204 -0
- package/dist/auth-elicitation.js +350 -241
- package/dist/authorization-handoff.js +164 -90
- package/dist/call-admission-context.js +3 -10
- package/dist/call-admission.js +2 -0
- package/dist/call-classification.js +9 -0
- package/dist/call-recovery.js +32 -13
- package/dist/canonical-json.js +8 -0
- package/dist/catalog-cache.js +369 -213
- package/dist/catalog-service.js +659 -530
- package/dist/catalog.js +5 -1
- package/dist/concurrency.js +0 -25
- package/dist/config-defaults.d.ts +1 -0
- package/dist/config-defaults.js +1 -0
- package/dist/config-schema.d.ts +3 -1
- package/dist/config-schema.js +13 -3
- package/dist/config.d.ts +40 -6
- package/dist/config.js +40 -26
- package/dist/connector-caller.d.ts +4 -0
- package/dist/connector-caller.js +17 -4
- package/dist/connectors/api-connector.d.ts +15 -7
- package/dist/connectors/api-connector.js +147 -57
- package/dist/connectors/guarded-fetch.d.ts +51 -17
- package/dist/connectors/guarded-fetch.js +215 -121
- package/dist/connectors/negotiation-cache.js +20 -10
- package/dist/connectors/option-shapes.js +1 -1
- package/dist/connectors/remote-mcp.d.ts +12 -30
- package/dist/connectors/remote-mcp.js +960 -564
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +5 -1
- package/dist/describe-config.js +3 -0
- package/dist/downstream-input.js +347 -260
- package/dist/errors.d.ts +87 -6
- package/dist/errors.js +114 -4
- package/dist/execute.js +87 -50
- package/dist/executor-admission.js +3 -0
- package/dist/executors/quickjs.js +163 -112
- package/dist/guarded-transport.js +50 -0
- package/dist/guest-runtime.js +1 -1
- package/dist/http/client.js +439 -0
- package/dist/http/errors.js +558 -0
- package/dist/http/fields.js +49 -0
- package/dist/http/hatch-paging.js +318 -0
- package/dist/http/hatch.js +1279 -0
- package/dist/http/json-schema.js +267 -0
- package/dist/http/node-transport.js +241 -0
- package/dist/http/oauth.js +162 -0
- package/dist/http/paging.js +228 -0
- package/dist/http/provider.js +221 -0
- package/dist/http/safety.js +82 -0
- package/dist/http/services.js +79 -0
- package/dist/http/tools.js +383 -0
- package/dist/http/vendor-index.js +138 -0
- package/dist/http/vendor.js +448 -0
- package/dist/http/write-request.js +66 -0
- package/dist/http-policy.d.ts +11 -0
- package/dist/http-policy.js +45 -0
- package/dist/inbound-credential.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -0
- package/dist/invocation-auth.js +30 -19
- package/dist/invocation.js +221 -87
- package/dist/mcp-result.js +0 -4
- package/dist/membership.d.ts +4 -0
- package/dist/meta-output.js +1 -1
- package/dist/meta-tools.js +534 -408
- package/dist/native-recovery.js +52 -0
- package/dist/native-tools.js +382 -0
- package/dist/node.d.ts +4 -3
- package/dist/node.js +45 -8
- package/dist/oauth-handoff.js +177 -104
- package/dist/oauth-partition.js +6 -20
- package/dist/oauth-sealing.js +6 -7
- package/dist/operation-vocabulary.js +101 -0
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +17 -4
- package/dist/operator-ui/agents.d.ts +5 -4
- package/dist/operator-ui/agents.js +17 -7
- package/dist/operator-ui/config-summary.js +8 -4
- package/dist/operator-ui/connection-map.js +9 -6
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +5 -14
- package/dist/operator-ui/fix-prompts.d.ts +1 -1
- package/dist/operator-ui/fix-prompts.js +0 -8
- package/dist/operator-ui/generated.js +3 -3
- package/dist/operator-ui/health.js +52 -0
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +11 -19
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +5 -29
- package/dist/operator-ui/view.js +3 -59
- package/dist/program-writes.js +47 -26
- package/dist/provider-call-facts.d.ts +115 -0
- package/dist/provider-call-facts.js +182 -0
- package/dist/provider-call.d.ts +112 -0
- package/dist/provider-call.js +271 -0
- package/dist/provider.d.ts +71 -32
- package/dist/provider.js +134 -40
- package/dist/providers/_shared/google/hatch.js +91 -0
- package/dist/providers/_shared/google/kit.js +537 -0
- package/dist/providers/_shared/google/result-size.js +15 -2
- package/dist/providers/_shared/google/service-account.d.ts +2 -1
- package/dist/providers/_shared/google/service-account.js +8 -4
- package/dist/providers/_shared/google/workspace.d.ts +8 -209
- package/dist/providers/_shared/google/workspace.js +7 -426
- package/dist/providers/_shared/rest/compact-index.js +86 -0
- package/dist/providers/_shared/rest/dispatch.js +3 -23
- package/dist/providers/_shared/rest/kit.js +546 -0
- package/dist/providers/_shared/rest/operation-index.js +230 -14
- package/dist/providers/_shared/rest/response-media.js +11 -0
- package/dist/providers/_shared/rest/tools.js +101 -78
- package/dist/providers/_shared/rest/value-safety.js +353 -195
- package/dist/providers/_shared/sensitive-fields.js +27 -0
- package/dist/providers/breeze/api.js +584 -0
- package/dist/providers/breeze/index.d.ts +3 -3
- package/dist/providers/breeze/index.js +67 -1420
- package/dist/providers/breeze/openapi.generated.js +60 -0
- package/dist/providers/breeze/skill.generated.js +2 -6
- package/dist/providers/breeze/tools.js +696 -0
- package/dist/providers/ccb/api.js +496 -0
- package/dist/providers/ccb/index.d.ts +17 -37
- package/dist/providers/ccb/index.js +77 -1702
- package/dist/providers/ccb/lib/constants.d.ts +34 -0
- package/dist/providers/ccb/lib/constants.js +74 -0
- package/dist/providers/ccb/lib/guide.js +9 -0
- package/dist/providers/ccb/lib/verdicts.js +387 -0
- package/dist/providers/ccb/openapi.generated.js +397 -0
- package/dist/providers/ccb/safety.js +295 -0
- package/dist/providers/ccb/skill.generated.js +2 -6
- package/dist/providers/ccb/tools.js +853 -0
- package/dist/providers/cloudflare/api.js +1066 -0
- package/dist/providers/cloudflare/index.d.ts +7 -22
- package/dist/providers/cloudflare/index.js +80 -194
- package/dist/providers/cloudflare/lib/config.d.ts +16 -0
- package/dist/providers/cloudflare/lib/config.js +2 -0
- package/dist/providers/cloudflare/lib/discovery.js +29 -0
- package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
- package/dist/providers/cloudflare/lib/hatch.js +103 -0
- package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
- package/dist/providers/cloudflare/lib/response-media.js +75 -0
- package/dist/providers/cloudflare/openapi.generated.js +3299 -3208
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +538 -18
- package/dist/providers/cloudflare/skill.generated.js +2 -10
- package/dist/providers/cloudflare/tools.js +360 -0
- package/dist/providers/docs/api.js +51 -0
- package/dist/providers/docs/index.d.ts +1 -12
- package/dist/providers/docs/index.js +53 -1165
- package/dist/providers/docs/lib/constants.d.ts +18 -0
- package/dist/providers/docs/lib/constants.js +18 -0
- package/dist/providers/docs/lib/discovery.js +26 -0
- package/dist/providers/docs/lib/requests.js +48 -0
- package/dist/providers/docs/lib/schemas.js +168 -0
- package/dist/providers/docs/openapi.generated.js +16 -0
- package/dist/providers/docs/safety.js +54 -0
- package/dist/providers/docs/skill.generated.js +2 -6
- package/dist/providers/docs/tools.js +802 -0
- package/dist/providers/drive/api.js +177 -0
- package/dist/providers/drive/index.d.ts +1 -12
- package/dist/providers/drive/index.js +38 -1448
- package/dist/providers/drive/lib/constants.d.ts +6 -0
- package/dist/providers/drive/lib/constants.js +6 -0
- package/dist/providers/drive/lib/contracts.js +532 -0
- package/dist/providers/drive/lib/hatch.js +197 -0
- package/dist/providers/drive/openapi.generated.js +77 -0
- package/dist/providers/drive/safety.js +90 -0
- package/dist/providers/drive/skill.generated.js +2 -6
- package/dist/providers/drive/tools.js +1290 -0
- package/dist/providers/forms/api.js +71 -0
- package/dist/providers/forms/index.d.ts +1 -12
- package/dist/providers/forms/index.js +49 -1145
- package/dist/providers/forms/lib/constants.d.ts +14 -0
- package/dist/providers/forms/lib/constants.js +19 -0
- package/dist/providers/forms/lib/hatch.js +72 -0
- package/dist/providers/forms/openapi.generated.js +23 -0
- package/dist/providers/forms/safety.js +34 -0
- package/dist/providers/forms/skill.generated.js +2 -8
- package/dist/providers/forms/tools.js +1024 -0
- package/dist/providers/github/api.js +150 -0
- package/dist/providers/github/index.d.ts +4 -5
- package/dist/providers/github/index.js +30 -87
- package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
- package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
- package/dist/providers/github/lib/discovery.js +132 -0
- package/dist/providers/github/lib/operations.js +58 -0
- package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
- package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
- package/dist/providers/github/openapi.generated.js +1216 -0
- package/dist/providers/github/safety.js +216 -0
- package/dist/providers/github/skill.generated.js +2 -5
- package/dist/providers/github/tools.js +506 -0
- package/dist/providers/gmail/api.js +114 -0
- package/dist/providers/gmail/index.d.ts +1 -12
- package/dist/providers/gmail/index.js +73 -1621
- package/dist/providers/gmail/lib/constants.d.ts +13 -0
- package/dist/providers/gmail/lib/constants.js +16 -0
- package/dist/providers/gmail/lib/index.js +173 -0
- package/dist/providers/gmail/lib/schemas.js +176 -0
- package/dist/providers/gmail/lib/threading.js +120 -0
- package/dist/providers/gmail/openapi.generated.js +92 -0
- package/dist/providers/gmail/safety.js +21 -0
- package/dist/providers/gmail/skill.generated.js +2 -6
- package/dist/providers/gmail/tools.js +1435 -0
- package/dist/providers/overflow/api.js +1008 -0
- package/dist/providers/overflow/index.d.ts +3 -17
- package/dist/providers/overflow/index.js +60 -1488
- package/dist/providers/overflow/skill.generated.js +2 -5
- package/dist/providers/overflow/tools.js +873 -0
- package/dist/providers/planning-center/api.js +467 -0
- package/dist/providers/planning-center/index.d.ts +6 -35
- package/dist/providers/planning-center/index.js +69 -2445
- package/dist/providers/planning-center/lib/constants.d.ts +58 -0
- package/dist/providers/planning-center/lib/constants.js +83 -0
- package/dist/providers/planning-center/lib/discovery.js +40 -0
- package/dist/providers/planning-center/lib/guide.js +39 -0
- package/dist/providers/planning-center/lib/json-api.js +83 -0
- package/dist/providers/planning-center/lib/verdicts.js +1758 -0
- package/dist/providers/planning-center/openapi.generated.js +1764 -0
- package/dist/providers/planning-center/safety.js +188 -0
- package/dist/providers/planning-center/skill.generated.js +2 -27
- package/dist/providers/planning-center/tools.js +1010 -0
- package/dist/providers/sheets/api.js +133 -0
- package/dist/providers/sheets/index.d.ts +4 -16
- package/dist/providers/sheets/index.js +61 -1172
- package/dist/providers/sheets/lib/constants.d.ts +14 -0
- package/dist/providers/sheets/lib/constants.js +14 -0
- package/dist/providers/sheets/lib/hatch.js +163 -0
- package/dist/providers/sheets/lib/requests.js +105 -0
- package/dist/providers/sheets/lib/schemas.js +138 -0
- package/dist/providers/sheets/openapi.generated.js +30 -0
- package/dist/providers/sheets/safety.js +27 -0
- package/dist/providers/sheets/skill.generated.js +2 -7
- package/dist/providers/sheets/tools.js +734 -0
- package/dist/providers/slides/api.js +147 -0
- package/dist/providers/slides/index.d.ts +2 -10
- package/dist/providers/slides/index.js +48 -2555
- package/dist/providers/slides/lib/constants.d.ts +11 -0
- package/dist/providers/slides/lib/constants.js +11 -0
- package/dist/providers/slides/lib/requests.js +60 -0
- package/dist/providers/slides/lib/schemas.js +565 -0
- package/dist/providers/slides/openapi.generated.js +18 -0
- package/dist/providers/slides/skill.generated.js +2 -6
- package/dist/providers/slides/tools.js +1968 -0
- package/dist/providers/stripe/api.js +401 -0
- package/dist/providers/stripe/index.d.ts +7 -27
- package/dist/providers/stripe/index.js +75 -191
- package/dist/providers/stripe/lib/config.d.ts +4 -0
- package/dist/providers/stripe/lib/config.js +2 -0
- package/dist/providers/stripe/openapi.generated.js +4 -3
- package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
- package/dist/providers/stripe/skill.generated.js +2 -10
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +19 -0
- package/dist/providers/tithely/index.js +86 -965
- package/dist/providers/tithely/skill.generated.js +2 -5
- package/dist/providers/tithely/tools.js +426 -0
- package/dist/providers/vercel/api.js +551 -0
- package/dist/providers/vercel/index.d.ts +11 -25
- package/dist/providers/vercel/index.js +67 -261
- package/dist/providers/vercel/lib/config.d.ts +2 -0
- package/dist/providers/vercel/lib/config.js +2 -0
- package/dist/providers/vercel/lib/index.js +117 -0
- package/dist/providers/vercel/lib/logs.js +100 -0
- package/dist/providers/vercel/lib/pin.js +270 -0
- package/dist/providers/vercel/openapi.generated.js +398 -376
- package/dist/providers/vercel/{value-safety.js → safety.js} +261 -42
- package/dist/providers/vercel/skill.generated.js +2 -7
- package/dist/providers/vercel/tools.js +642 -0
- package/dist/redaction-identity.js +47 -0
- package/dist/redaction-marker.js +125 -0
- package/dist/registry.d.ts +30 -28
- package/dist/registry.js +446 -413
- package/dist/routes/access-tokens.js +1 -1
- package/dist/routes/actor-labels.js +1 -1
- package/dist/routes/connect.js +1 -1
- package/dist/routes/dispatch.js +103 -0
- package/dist/routes/mcp.js +170 -79
- package/dist/routes/oauth.js +3 -1
- package/dist/routes/operator.js +2 -2
- package/dist/routes/shared.d.ts +5 -4
- package/dist/routes/shared.js +244 -177
- package/dist/routes/skills.js +10 -8
- package/dist/routes/ui-config.js +27 -3
- package/dist/routes/ui-data.js +29 -22
- package/dist/routes/ui.js +1 -1
- package/dist/runtime/call-admission.js +0 -26
- package/dist/runtime/call-entry.js +30 -0
- package/dist/runtime/call.js +556 -0
- package/dist/runtime/connector-scope.js +7 -0
- package/dist/runtime/credential-probe.js +34 -0
- package/dist/runtime/executor.js +40 -0
- package/dist/runtime/native-storage.js +63 -0
- package/dist/runtime/registry.js +27 -0
- package/dist/runtime/request-scope.js +72 -0
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/shared-read.js +34 -5
- package/dist/runtime/storage.js +34 -21
- package/dist/sent-secrets.d.ts +194 -37
- package/dist/sent-secrets.js +1743 -340
- package/dist/server.js +5 -56
- package/dist/skills.js +330 -224
- package/dist/sqlite.js +15 -14
- package/dist/storage/d1-copy.js +255 -0
- package/dist/storage/d1-driver.js +15 -0
- package/dist/storage/keys.js +28 -0
- package/dist/storage/sql-driver.js +88 -0
- package/dist/storage/sql-native.js +544 -0
- package/dist/storage/sql-schema.d.ts +6 -0
- package/dist/storage/sql-schema.js +15 -0
- package/dist/storage/sql.d.ts +14 -20
- package/dist/storage/sql.js +29 -535
- package/dist/timeout.js +0 -26
- package/dist/tool-safety.js +20 -10
- package/dist/types.d.ts +11 -99
- package/dist/upward.js +3 -0
- package/dist/usage-guide.js +3 -1
- package/dist/validate.d.ts +4 -2
- package/dist/validate.js +86 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.js +312 -292
- package/dist/workspace-subject.js +5 -1
- package/dist/write-outcome.js +454 -34
- package/documentation/README.md +27 -7
- package/documentation/architecture.md +2550 -186
- package/documentation/auth.md +821 -98
- package/documentation/code-mode.md +56 -21
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +144 -105
- package/documentation/meta-tools.md +411 -34
- package/documentation/operating.md +28 -4
- package/documentation/operator-tests.md +11 -2
- package/documentation/operator-ui.md +103 -33
- package/documentation/provider-auth-migration.md +38 -63
- package/documentation/provider-migration-0.29.md +10 -5
- package/documentation/provider-migration-0.35.md +975 -0
- package/documentation/providers.md +965 -0
- package/examples/worker/AGENTS.md +23 -9
- package/examples/worker/README.md +254 -135
- package/examples/worker/alchemy.run.ts +116 -0
- package/examples/worker/gitignore +10 -0
- package/examples/worker/src/connecta.config.ts +23 -21
- package/examples/worker/wrangler.jsonc +14 -5
- package/guides/connecting-agents.md +157 -0
- package/guides/how-it-works.md +156 -0
- package/guides/safety-and-trust.md +153 -0
- package/package.json +27 -42
- package/templates/node/.env.example +3 -0
- package/templates/node/README.md +22 -2
- package/templates/node/docker-compose.yml +1 -0
- package/templates/node/package.json +3 -2
- package/templates/node/src/connecta.config.ts +8 -0
- package/dist/catalog-drift.d.ts +0 -134
- package/dist/catalog-drift.js +0 -493
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
- package/dist/providers/_shared/rest/tools.d.ts +0 -141
- package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
- package/dist/providers/basecamp/index.d.ts +0 -43
- package/dist/providers/basecamp/index.js +0 -997
- package/dist/providers/basecamp/skill.generated.js +0 -9
- package/dist/providers/cloudflare/rest.d.ts +0 -37
- package/dist/providers/cloudflare/rest.js +0 -1078
- package/dist/providers/github/hosted.js +0 -218
- package/dist/providers/github/rest.js +0 -321
- package/dist/providers/infisical/index.d.ts +0 -7
- package/dist/providers/infisical/index.js +0 -713
- package/dist/providers/infisical/skill.generated.js +0 -8
- package/dist/providers/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -352
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -57
- package/dist/providers/mixpanel/index.js +0 -468
- package/dist/providers/mixpanel/operations.js +0 -20
- package/dist/providers/mixpanel/rest.js +0 -603
- package/dist/providers/mixpanel/skill.generated.js +0 -10
- package/dist/providers/mixpanel/value-safety.js +0 -16
- package/dist/providers/notion/index.d.ts +0 -65
- package/dist/providers/notion/index.js +0 -368
- package/dist/providers/notion/openapi.generated.js +0 -75
- package/dist/providers/notion/rest.d.ts +0 -24
- package/dist/providers/notion/rest.js +0 -1226
- package/dist/providers/notion/skill.generated.js +0 -11
- package/dist/providers/notion/value-safety.js +0 -56
- package/dist/providers/revenuecat/index.d.ts +0 -49
- package/dist/providers/revenuecat/index.js +0 -557
- package/dist/providers/revenuecat/skill.generated.js +0 -11
- package/dist/providers/stripe/rest.d.ts +0 -14
- package/dist/providers/stripe/rest.js +0 -402
- package/dist/providers/vercel/rest.d.ts +0 -20
- package/dist/providers/vercel/rest.js +0 -1020
- package/dist/providers/wispr-flow/index.d.ts +0 -14
- package/dist/providers/wispr-flow/index.js +0 -117
- package/dist/providers/wispr-flow/skill.generated.js +0 -8
- /package/dist/providers/github/{key.js → lib/key.js} +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Alchemy stack that deploys this Worker: the script, its D1 database,
|
|
3
|
+
* Worker Loader, vars and secrets, the Worker-level Cloudflare Access
|
|
4
|
+
* application with Managed OAuth, and the `/agent/*` bypass application.
|
|
5
|
+
* README.md § "Deploy" walks through it; wrangler.jsonc serves only
|
|
6
|
+
* `wrangler dev`.
|
|
7
|
+
*
|
|
8
|
+
* Deploy, update, and plan with an explicit stage, from this folder:
|
|
9
|
+
* npx alchemy deploy --stage production
|
|
10
|
+
* Alchemy reads CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, and the two
|
|
11
|
+
* secrets below from the environment or `.env`. Never commit `.env` or
|
|
12
|
+
* `.alchemy/`: local state records secret values in plaintext.
|
|
13
|
+
*/
|
|
14
|
+
import * as Alchemy from "alchemy";
|
|
15
|
+
import * as Cloudflare from "alchemy/Cloudflare";
|
|
16
|
+
import * as Output from "alchemy/Output";
|
|
17
|
+
import * as Config from "effect/Config";
|
|
18
|
+
import * as Effect from "effect/Effect";
|
|
19
|
+
|
|
20
|
+
// Who may sign in. Replace with the deployment's own Access rule.
|
|
21
|
+
const signIn = { emailDomain: "example.com" };
|
|
22
|
+
|
|
23
|
+
export default Alchemy.Stack(
|
|
24
|
+
"Connecta",
|
|
25
|
+
{ providers: Cloudflare.providers(), state: Alchemy.localState() },
|
|
26
|
+
Effect.gen(function* () {
|
|
27
|
+
// The one database. Retained on destroy: `alchemy destroy` forgets it
|
|
28
|
+
// instead of deleting every grant, credential, and token in it, and the
|
|
29
|
+
// next deploy adopts it again by name. connecta creates its tables.
|
|
30
|
+
const database = yield* Cloudflare.D1.Database("ConnectaDB", { name: "connecta" }).pipe(
|
|
31
|
+
Alchemy.RemovalPolicy.retain(),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Optional R2 bucket, for an api() connector handler that stores files.
|
|
35
|
+
// connecta itself never uses one. Bind it as FILES in env below.
|
|
36
|
+
// const files = yield* Cloudflare.R2.Bucket("Files", { name: "connecta-files" }).pipe(
|
|
37
|
+
// Alchemy.RemovalPolicy.retain(),
|
|
38
|
+
// );
|
|
39
|
+
|
|
40
|
+
// Attached to the Worker itself, so Access supplies ctx.access. Managed
|
|
41
|
+
// OAuth's allowlist must keep all three redirect URIs (AGENTS.md).
|
|
42
|
+
const access = yield* Cloudflare.Access.Application("ConnectaAccess", {
|
|
43
|
+
type: "self_hosted",
|
|
44
|
+
name: "connecta",
|
|
45
|
+
policies: [
|
|
46
|
+
{ decision: "allow", include: [signIn] },
|
|
47
|
+
// Admits a service token at the edge for `connecta doctor`'s /health
|
|
48
|
+
// read; connecta refuses service identities on MCP and operator routes.
|
|
49
|
+
// { decision: "non_identity", include: [{ serviceToken: "<service token id>" }] },
|
|
50
|
+
],
|
|
51
|
+
oauthConfiguration: {
|
|
52
|
+
enabled: true,
|
|
53
|
+
dynamicClientRegistration: {
|
|
54
|
+
enabled: true,
|
|
55
|
+
allowedUris: [
|
|
56
|
+
"https://claude.ai/api/mcp/auth_callback",
|
|
57
|
+
"https://chatgpt.com/connector_platform_oauth_redirect",
|
|
58
|
+
"https://chatgpt.com/connector/oauth/*",
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const worker = yield* Cloudflare.Worker("Connecta", {
|
|
65
|
+
name: "connecta",
|
|
66
|
+
main: "./src/index.ts",
|
|
67
|
+
// Keep enable_request_signal: a client disconnect aborts its request.
|
|
68
|
+
// Keep enable_weak_ref: it releases an authentication charge whose
|
|
69
|
+
// cancelled work can never settle.
|
|
70
|
+
compatibility: {
|
|
71
|
+
date: "2025-01-01",
|
|
72
|
+
flags: [
|
|
73
|
+
"nodejs_compat",
|
|
74
|
+
"enable_request_signal",
|
|
75
|
+
"enable_weak_ref",
|
|
76
|
+
"unhandled_rejection_after_microtask_checkpoint",
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
access,
|
|
80
|
+
env: {
|
|
81
|
+
CONNECTA_DB: database,
|
|
82
|
+
// Required by execute_code; Dynamic Workers use the Workers Paid plan.
|
|
83
|
+
LOADER: Cloudflare.WorkerLoader(),
|
|
84
|
+
// FILES: files,
|
|
85
|
+
// The Worker's own URL: its custom domain if any, else workers.dev.
|
|
86
|
+
PUBLIC_URL: Cloudflare.Worker.URL,
|
|
87
|
+
// Comma-separated Access user ids (user_uuid, else email).
|
|
88
|
+
CONNECTA_MAINTAINERS: "operator@example.com",
|
|
89
|
+
// CONNECTA_ACTIVITY: "on",
|
|
90
|
+
// Declare every secret here. Each deploy replaces the Worker's whole
|
|
91
|
+
// binding set, deleting secrets set any other way.
|
|
92
|
+
DOWNSTREAM_TOKEN: Config.Redacted("DOWNSTREAM_TOKEN"),
|
|
93
|
+
CREDENTIAL_ENCRYPTION_KEY: Config.Redacted("CREDENTIAL_ENCRYPTION_KEY"),
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Lets agents reach /agent/<pool> with only their cta_ token. It bypasses
|
|
98
|
+
// Access on the Worker's primary URL host and never on any other path.
|
|
99
|
+
const agents = yield* Cloudflare.Access.Application("ConnectaAgents", {
|
|
100
|
+
type: "self_hosted",
|
|
101
|
+
name: "connecta agents",
|
|
102
|
+
destinations: Output.map(worker.url, (url) => [
|
|
103
|
+
{ type: "public" as const, uri: `${new URL(url!).host}/agent/*` },
|
|
104
|
+
]),
|
|
105
|
+
policies: [{ decision: "bypass", include: ["everyone"] }],
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
url: worker.url,
|
|
110
|
+
workerId: worker.workerId,
|
|
111
|
+
databaseId: database.databaseId,
|
|
112
|
+
accessApplicationId: access.applicationId,
|
|
113
|
+
agentsApplicationId: agents.applicationId,
|
|
114
|
+
};
|
|
115
|
+
}),
|
|
116
|
+
);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Rename this file to .gitignore in a copied deployment, before the first
|
|
2
|
+
# `git add`: npm strips .gitignore files from published packages.
|
|
3
|
+
# Alchemy local state records deployed secret values in plaintext.
|
|
4
|
+
.alchemy/
|
|
5
|
+
.env
|
|
6
|
+
.env.*
|
|
7
|
+
.dev.vars
|
|
8
|
+
.dev.vars.*
|
|
9
|
+
.wrangler/
|
|
10
|
+
node_modules/
|
|
@@ -18,29 +18,31 @@
|
|
|
18
18
|
* Setup (this example has no package.json of its own — it self-references the
|
|
19
19
|
* installed `@zackbart/connecta` package):
|
|
20
20
|
* 1. `pnpm install` in the connecta repository root (../../ from here) so the
|
|
21
|
-
* package import and
|
|
22
|
-
* installs `@zackbart/connecta @cloudflare/codemode`
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
21
|
+
* package import and alchemy resolve. A copy in its own repository
|
|
22
|
+
* installs `@zackbart/connecta @cloudflare/codemode` plus the exact
|
|
23
|
+
* alchemy and effect pins instead (README.md § "Copied into its own
|
|
24
|
+
* repository"). Codemode is an optional peer.
|
|
25
|
+
* 2. alchemy.run.ts declares the deployment: this Worker, its one D1
|
|
26
|
+
* database (connecta creates its tables on first use), the Worker Loader,
|
|
27
|
+
* the vars, and the DOWNSTREAM_TOKEN and CREDENTIAL_ENCRYPTION_KEY
|
|
28
|
+
* secrets, read from the environment or .env at deploy time. Declare
|
|
29
|
+
* every secret there: each deploy removes bindings set any other way.
|
|
30
|
+
* 3. It attaches Cloudflare Access to this Worker with Managed OAuth and
|
|
31
31
|
* Dynamic Client Registration. Its Allowed redirect URIs must include
|
|
32
32
|
* Claude's https://claude.ai/api/mcp/auth_callback plus ChatGPT's
|
|
33
33
|
* https://chatgpt.com/connector_platform_oauth_redirect and
|
|
34
34
|
* https://chatgpt.com/connector/oauth/* forms (see ../AGENTS.md).
|
|
35
|
-
*
|
|
36
|
-
* `<host>/agent/*`
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* its email) in the CONNECTA_MAINTAINERS var, comma-separated
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
35
|
+
* A second self-hosted application bypasses Access for
|
|
36
|
+
* `<host>/agent/*` only, so agents send only their cta_ token
|
|
37
|
+
* (README.md § "Let agents through Access").
|
|
38
|
+
* 4. Use the Workers Paid plan required by the Worker Loader binding.
|
|
39
|
+
* 5. List the maintainers' Access user ids (the identity's user_uuid, else
|
|
40
|
+
* its email) in the CONNECTA_MAINTAINERS var, comma-separated, and set
|
|
41
|
+
* the stack's Access sign-in rule.
|
|
42
|
+
* 6. `npx alchemy deploy --stage production` from this folder
|
|
43
|
+
* (examples/worker). Never commit .env or .alchemy/. Point a
|
|
44
|
+
* maintainer's MCP client at `<PUBLIC_URL>/mcp`, and an agent's at
|
|
45
|
+
* `<PUBLIC_URL>/agent/ci`. wrangler.jsonc serves only `wrangler dev`.
|
|
44
46
|
*/
|
|
45
47
|
import { api, defineConfig, remoteMcp } from "@zackbart/connecta";
|
|
46
48
|
import { activityHistory } from "@zackbart/connecta/activity";
|
|
@@ -67,7 +69,7 @@ export interface Env {
|
|
|
67
69
|
/** "on" switches on activity history, in CONNECTA_DB. */
|
|
68
70
|
CONNECTA_ACTIVITY?: string;
|
|
69
71
|
/**
|
|
70
|
-
* Worker Loader binding (
|
|
72
|
+
* Worker Loader binding (alchemy.run.ts `LOADER`) powering
|
|
71
73
|
* execute_code. Dynamic Workers require the Workers Paid plan.
|
|
72
74
|
*/
|
|
73
75
|
LOADER: WorkerLoader;
|
|
@@ -138,7 +140,7 @@ export default defineConfig((env: Env) => {
|
|
|
138
140
|
// with a static key: the operator manages it inside its connection
|
|
139
141
|
// in the operator UI, so no Worker secret holds it.
|
|
140
142
|
// type: "credential",
|
|
141
|
-
// credential: { label: "
|
|
143
|
+
// credential: { label: "Downstream token accepted by the hosted server" },
|
|
142
144
|
},
|
|
143
145
|
// Use `authScope: "personal"` with OAuth or credential auth when each
|
|
144
146
|
// Access user connects their own downstream account. Literal headers
|
|
@@ -1,13 +1,22 @@
|
|
|
1
|
+
// Local development only: `wrangler dev` runs this Worker with local D1 and a
|
|
2
|
+
// simulated Access identity. Deploy with alchemy.run.ts, never with this file,
|
|
3
|
+
// and keep its vars, flags, and bindings in step with that stack.
|
|
1
4
|
{
|
|
2
5
|
"$schema": "node_modules/wrangler/config-schema.json",
|
|
3
6
|
"name": "connecta-example",
|
|
4
7
|
"main": "src/index.ts",
|
|
5
8
|
"compatibility_date": "2025-01-01",
|
|
6
|
-
"compatibility_flags": [
|
|
9
|
+
"compatibility_flags": [
|
|
10
|
+
"nodejs_compat",
|
|
11
|
+
"enable_request_signal",
|
|
12
|
+
"enable_weak_ref",
|
|
13
|
+
"unhandled_rejection_after_microtask_checkpoint",
|
|
14
|
+
],
|
|
7
15
|
"observability": { "enabled": true },
|
|
8
16
|
|
|
9
|
-
// Plain vars.
|
|
10
|
-
//
|
|
17
|
+
// Plain vars. Local secrets (CREDENTIAL_ENCRYPTION_KEY, DOWNSTREAM_TOKEN) go
|
|
18
|
+
// in an uncommitted .dev.vars file; deployed ones are declared in
|
|
19
|
+
// alchemy.run.ts.
|
|
11
20
|
// CONNECTA_ACTIVITY switches on activity history in src/connecta.config.ts
|
|
12
21
|
// when "on"; its data stays in CONNECTA_DB.
|
|
13
22
|
"vars": {
|
|
@@ -28,8 +37,8 @@
|
|
|
28
37
|
},
|
|
29
38
|
},
|
|
30
39
|
|
|
31
|
-
// The one database
|
|
32
|
-
//
|
|
40
|
+
// The one database, local under `wrangler dev`; alchemy.run.ts creates the
|
|
41
|
+
// deployed one. connecta creates its tables on first use; nothing to apply.
|
|
33
42
|
"d1_databases": [
|
|
34
43
|
{
|
|
35
44
|
"binding": "CONNECTA_DB",
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Connecting an agent
|
|
2
|
+
|
|
3
|
+
Your **operator** is the person or team running the Connecta server. They
|
|
4
|
+
choose which agent can connect, which tools it can use, and which service
|
|
5
|
+
accounts those tools use. The model cannot grant itself more access.
|
|
6
|
+
|
|
7
|
+
This guide explains those choices. The [operator documentation](../documentation/README.md)
|
|
8
|
+
has exact setup and verification steps.
|
|
9
|
+
|
|
10
|
+
## Choose the pool first
|
|
11
|
+
|
|
12
|
+
Imagine an agent named `assistant` that helps with CRM records and tickets.
|
|
13
|
+
Its operator creates a pool with the actions needed for that job and adds
|
|
14
|
+
the agent as a member. The pool can be read-only if updates must be impossible.
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
flowchart LR
|
|
18
|
+
Identity["Agent · assistant"] --> Pool["Member of pool · tickets"]
|
|
19
|
+
Pool --> Tools["Allowed CRM and ticket tools"]
|
|
20
|
+
Tools --> Accounts["Connecta uses each connection's configured account"]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The address uses the **pool name**, not the agent name. If `assistant` belongs
|
|
24
|
+
to a pool called `tickets`, its address is `/agent/tickets` on your Connecta
|
|
25
|
+
server. For a pool called `assistant`, it is `/agent/assistant`.
|
|
26
|
+
Ask your operator for the complete URL, such as
|
|
27
|
+
`https://connecta.example.com/agent/tickets`; the model should not guess it.
|
|
28
|
+
|
|
29
|
+
For shared organization access, a maintainer connects the service accounts
|
|
30
|
+
once. The agent proves its identity to Connecta and never needs the CRM's
|
|
31
|
+
password or the ticket service's API key. The operator should enable the
|
|
32
|
+
[encrypted credential vault](../documentation/auth.md#connect-a-shared-credential)
|
|
33
|
+
before saving those credentials or connecting accounts.
|
|
34
|
+
|
|
35
|
+
## What to ask your operator for
|
|
36
|
+
|
|
37
|
+
- **The pool name and complete endpoint URL.** Confirm this agent is a member.
|
|
38
|
+
- **The authentication method.** Ask how the AI app will receive the agent
|
|
39
|
+
credential privately; keep it out of prompts and source files.
|
|
40
|
+
- **The tools and accounts.** Know which actions are available, whose account
|
|
41
|
+
they use, and whether changes are allowed. In 0.35.0, a pool can offer
|
|
42
|
+
[native tools](../documentation/meta-tools.md#tool-presentation) for apps
|
|
43
|
+
with their own tool search.
|
|
44
|
+
- **The approval policy.** Find out whether writes ask a person or run unattended.
|
|
45
|
+
- **A safe first test.** Agree on a small read, such as listing one ticket,
|
|
46
|
+
and the result you expect.
|
|
47
|
+
|
|
48
|
+
People use separate sign-in endpoints. The
|
|
49
|
+
[pool reference](../documentation/auth.md#pools) owns the address and membership rules.
|
|
50
|
+
|
|
51
|
+
## Choose how the agent proves its identity
|
|
52
|
+
|
|
53
|
+
| Method | Best fit | What the operator provides |
|
|
54
|
+
| ------------------------ | --------------------------- | -------------------------------------------------------------- |
|
|
55
|
+
| Connecta agent token | An agent running anywhere | A `cta_` secret issued for the declared agent. |
|
|
56
|
+
| Vercel workload identity | An agent deployed on Vercel | Permission for a trusted project and its allowed environments. |
|
|
57
|
+
|
|
58
|
+
An agent token stays in the AI app's secret store. The app presents it when
|
|
59
|
+
it connects. Vercel identity uses a signed project token instead of a
|
|
60
|
+
separately provisioned Connecta secret.
|
|
61
|
+
|
|
62
|
+
```mermaid
|
|
63
|
+
sequenceDiagram
|
|
64
|
+
participant H as AI app
|
|
65
|
+
participant C as Connecta
|
|
66
|
+
H->>C: Present the configured agent credential
|
|
67
|
+
C->>C: Verify the credential and pool membership
|
|
68
|
+
C-->>H: Serve the pool's permitted tools
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Anyone who obtains either token can act as the agent. Trust the Vercel
|
|
72
|
+
project code and build steps that can obtain its tokens, and enable only
|
|
73
|
+
environments that should have the pool's access.
|
|
74
|
+
|
|
75
|
+
The [token management guide](../documentation/auth.md#issue-rotate-or-revoke-an-agent-token)
|
|
76
|
+
and [Vercel identity guide](../documentation/auth.md#vercel-workload-credentials)
|
|
77
|
+
own availability, setup, rotation, and revocation. If both methods are
|
|
78
|
+
enabled, stopping one does not stop the other.
|
|
79
|
+
|
|
80
|
+
## An optional integration for Eve
|
|
81
|
+
|
|
82
|
+
**Eve** is an app framework for building agents. If your agent uses Eve,
|
|
83
|
+
`@zackbart/connecta-eve` can connect it to a pool and load the endpoint's
|
|
84
|
+
instructions at the start of a turn. The helper runs in the Eve app; your
|
|
85
|
+
Connecta server runs separately.
|
|
86
|
+
|
|
87
|
+
The [helper's README](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md)
|
|
88
|
+
owns installation, supported Node/Eve versions, environment setup, and the
|
|
89
|
+
Vercel variant. The following two files illustrate its two jobs after your
|
|
90
|
+
operator has configured the endpoint and credential.
|
|
91
|
+
|
|
92
|
+
`agent/connections/connecta.ts` connects to the pool:
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
import { connectaConnection } from "@zackbart/connecta-eve";
|
|
96
|
+
|
|
97
|
+
export default connectaConnection({
|
|
98
|
+
pool: "tickets",
|
|
99
|
+
description: "Shared CRM and tickets for the assistant.",
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`agent/instructions/connecta.ts` supplies guidance for using it:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { connectaInstructions } from "@zackbart/connecta-eve";
|
|
107
|
+
|
|
108
|
+
export default connectaInstructions({ pool: "tickets" });
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Both files must use the same endpoint and credential source. The helper uses
|
|
112
|
+
the configured agent credential, without forwarding the chatting person's
|
|
113
|
+
identity. Instructions help the model use tools; they grant no permissions.
|
|
114
|
+
|
|
115
|
+
## Decide whether writes need a person
|
|
116
|
+
|
|
117
|
+
The helper defaults to unattended execution of authorized writes. Connecting
|
|
118
|
+
an agent does not automatically add an approval step.
|
|
119
|
+
|
|
120
|
+
```mermaid
|
|
121
|
+
flowchart TB
|
|
122
|
+
Call["Agent requests a change"] --> Ask{"App asks for approval?"}
|
|
123
|
+
Ask -->|Yes| Approved{"Person approves?"}
|
|
124
|
+
Approved -->|No| Stop["Stop"]
|
|
125
|
+
Approved -->|Yes| Pool{"Connecta allows this write?"}
|
|
126
|
+
Ask -->|No| Pool
|
|
127
|
+
Pool -->|No| Refuse["Refuse before sending"]
|
|
128
|
+
Pool -->|Yes| Send["Send the change"]
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
For an interactive Eve agent, `gateWrites: true` asks before tools not marked
|
|
132
|
+
read-only. An explicit Eve approval policy takes precedence. If the agent
|
|
133
|
+
must never update data, use a read-only pool.
|
|
134
|
+
|
|
135
|
+
Approval may rely on an earlier tool label. A writable pool can execute a
|
|
136
|
+
newly classified write without a fresh approval; a read-only pool refuses it.
|
|
137
|
+
[Safety and trust](./safety-and-trust.md) explains the boundary, and the
|
|
138
|
+
[helper guide](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md#approval-and-writes)
|
|
139
|
+
explains the policy mechanics.
|
|
140
|
+
|
|
141
|
+
## When accounts or audiences differ
|
|
142
|
+
|
|
143
|
+
Personal connections belong to a signed-in person and are absent for agents.
|
|
144
|
+
Google Workspace has an explicit exception: an operator can assign a pool
|
|
145
|
+
owner whose account the agent will use. See
|
|
146
|
+
[Workspace pool owners](../documentation/auth.md#pool-owners-for-google-workspace)
|
|
147
|
+
before connecting an agent to someone's account.
|
|
148
|
+
|
|
149
|
+
An assistant serving several people must use a pool appropriate for everyone
|
|
150
|
+
in the conversation. Its app chooses that pool; the model does not choose
|
|
151
|
+
its own access level. Keep private results out of broader conversations.
|
|
152
|
+
The [pool layout guide](../documentation/auth.md#organizing-an-agents-pools)
|
|
153
|
+
owns that policy.
|
|
154
|
+
|
|
155
|
+
After setup, run the agreed small read with your operator. Use the
|
|
156
|
+
[verification guide](../documentation/deploying.md#verify-and-diagnose)
|
|
157
|
+
when the connection or access differs from what you expected.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# How Connecta works
|
|
2
|
+
|
|
3
|
+
Connecta is a front door for the services your agent needs. It gives the
|
|
4
|
+
agent one connection, then checks each request before it reaches a service.
|
|
5
|
+
Your **operator**, the person or team running Connecta, chooses what belongs
|
|
6
|
+
behind that door.
|
|
7
|
+
|
|
8
|
+
This guide explains the pieces. The [operator documentation](../documentation/README.md)
|
|
9
|
+
owns exact setup and behavior.
|
|
10
|
+
|
|
11
|
+
## Start with connections
|
|
12
|
+
|
|
13
|
+
A **connector** is one connection to a service. For example, a connector
|
|
14
|
+
called `crm` could reach your shared CRM account, where you keep customer
|
|
15
|
+
records. Its tools might find a person or update their address.
|
|
16
|
+
A second connector could reach a different account at the same service.
|
|
17
|
+
|
|
18
|
+
An **API** is the interface a service gives other software. Connecta can wrap
|
|
19
|
+
that interface in tools, or connect to a hosted MCP server that already offers
|
|
20
|
+
tools. MCP is the standard used to make those tools available to AI apps.
|
|
21
|
+
|
|
22
|
+
```mermaid
|
|
23
|
+
flowchart LR
|
|
24
|
+
Connecta --> Maintained["Maintained integration"] --> Vendor["Vendor API"]
|
|
25
|
+
Connecta --> Remote["Remote MCP connection"] --> Hosted["Hosted tools"]
|
|
26
|
+
Connecta --> Custom["Your API connection"] --> CRM["Your CRM API"]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A maintained integration comes with Connecta's tools and guidance. A remote
|
|
30
|
+
MCP connection uses the tools the server offers to that account. A custom
|
|
31
|
+
API connection lets your operator describe selected actions.
|
|
32
|
+
|
|
33
|
+
All three go through Connecta's access checks. A remote server's list of
|
|
34
|
+
actions can change, and Connecta relies on truthful descriptions of which
|
|
35
|
+
actions change data.
|
|
36
|
+
|
|
37
|
+
The README lists [maintained connections](../README.md#what-you-can-connect).
|
|
38
|
+
For setup and migrations, see [Integrating services](../documentation/integrating.md).
|
|
39
|
+
|
|
40
|
+
## A pool is a smaller front door
|
|
41
|
+
|
|
42
|
+
A **pool** is a named selection of tools and the people or agents allowed
|
|
43
|
+
to use them. The operator creates it and gives it an **endpoint**: a
|
|
44
|
+
connection address for that pool.
|
|
45
|
+
|
|
46
|
+
One pool might let the assistant read CRM records. Another might let a
|
|
47
|
+
person update tickets. Tools and accounts are separate choices: a pool
|
|
48
|
+
chooses the actions, while each connection uses its configured account.
|
|
49
|
+
|
|
50
|
+
```mermaid
|
|
51
|
+
flowchart LR
|
|
52
|
+
Alice["alice · person"] --> Tickets["tickets pool<br/>ticket tools"]
|
|
53
|
+
Assistant["assistant · agent"] --> CRM["crm pool<br/>CRM reads"]
|
|
54
|
+
Tickets --> Check["Connecta checks access"]
|
|
55
|
+
CRM --> Check
|
|
56
|
+
Check --> Accounts["Use each connection's configured account"]
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
People sign in. Agents use an identity configured by the operator.
|
|
60
|
+
The model cannot change that identity or add itself to a pool.
|
|
61
|
+
|
|
62
|
+
Each request uses one pool. Belonging to two pools does not merge them.
|
|
63
|
+
An AI app can switch between pools it is allowed to use; its software must
|
|
64
|
+
choose the right one for the conversation. The model does not choose its
|
|
65
|
+
own access level.
|
|
66
|
+
|
|
67
|
+
Maintainers run the deployment and can reach its whole tool list through
|
|
68
|
+
the main human endpoint. Other people use their assigned pools.
|
|
69
|
+
Agents use shared accounts selected by the operator. They do not inherit
|
|
70
|
+
the account of the person chatting with them.
|
|
71
|
+
|
|
72
|
+
[Connecting agents](./connecting-agents.md) explains pool addresses and
|
|
73
|
+
account choices, including the Google Workspace exception.
|
|
74
|
+
|
|
75
|
+
## Finding a tool and using it are separate steps
|
|
76
|
+
|
|
77
|
+
First the agent finds an action and learns what information it needs.
|
|
78
|
+
Then it calls that action. The default connection gives the AI app six small
|
|
79
|
+
**meta-tools** to help it do this without loading every service's tools into
|
|
80
|
+
the conversation.
|
|
81
|
+
|
|
82
|
+
| Tool | Job |
|
|
83
|
+
| ----------------------- | ---------------------------------------------------------------------------- |
|
|
84
|
+
| `search_tools` | Find available actions. |
|
|
85
|
+
| `call_tool` | Call a discovered action that reads data. |
|
|
86
|
+
| `call_destructive_tool` | Call a discovered action that changes data, under the app's approval policy. |
|
|
87
|
+
| `execute_code` | Combine discovery, actions, and a small answer in a program. |
|
|
88
|
+
| `authorize_connector` | Request the permitted account-connection handoff. |
|
|
89
|
+
| `skills` | Read guidance for using a connection. |
|
|
90
|
+
|
|
91
|
+
In 0.35.0, **native tools** let apps with their own tool search find service
|
|
92
|
+
actions directly. The operator chooses the pool's presentation.
|
|
93
|
+
|
|
94
|
+
```mermaid
|
|
95
|
+
flowchart TB
|
|
96
|
+
Meta["Default · meta-tools<br/>Connecta helps find the action"] --> Checks
|
|
97
|
+
Native["Optional · native tools<br/>the app finds the action"] --> Checks
|
|
98
|
+
Checks["Same access checks"] --> Service["Service action"]
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The presentation changes how an action is found, without granting more
|
|
102
|
+
access. The [tool reference](../documentation/meta-tools.md#tool-presentation)
|
|
103
|
+
tracks availability and supported behavior.
|
|
104
|
+
|
|
105
|
+
## Why run code inside Connecta?
|
|
106
|
+
|
|
107
|
+
Suppose the agent needs a count of open tickets for each CRM account.
|
|
108
|
+
Instead of returning every record to the conversation, a short JavaScript
|
|
109
|
+
program can fetch the records, match their IDs, and return a small table.
|
|
110
|
+
|
|
111
|
+
The program runs in a restricted environment. It can use only this endpoint's
|
|
112
|
+
tools, and cannot create connections, choose another identity, or obtain
|
|
113
|
+
service credentials. Limits keep it from running indefinitely or returning
|
|
114
|
+
unbounded data.
|
|
115
|
+
|
|
116
|
+
With meta-tools, one discovered read can use a direct call. Finding an unfamiliar
|
|
117
|
+
action, combining several calls, or reducing a large answer belongs in a program.
|
|
118
|
+
On a writable endpoint, a program may also change data. The AI app decides
|
|
119
|
+
whether to ask for approval before running it.
|
|
120
|
+
|
|
121
|
+
The [endpoint workflow](../documentation/operating.md) and
|
|
122
|
+
[code reference](../documentation/code-mode.md) explain the mechanics.
|
|
123
|
+
|
|
124
|
+
## Follow one call
|
|
125
|
+
|
|
126
|
+
```mermaid
|
|
127
|
+
sequenceDiagram
|
|
128
|
+
participant A as AI app
|
|
129
|
+
participant C as Connecta
|
|
130
|
+
participant S as Service
|
|
131
|
+
A->>C: Request an action through a pool
|
|
132
|
+
C->>C: Check caller, allowed tools, and read-only rules
|
|
133
|
+
C->>S: Send with the configured service credential
|
|
134
|
+
S-->>C: Result or failure
|
|
135
|
+
C-->>A: Bounded result with known secrets redacted
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
These checks also apply to calls inside programs. Guessing a tool name does
|
|
139
|
+
not bypass them. Read-only rules refuse tools marked as writes before they
|
|
140
|
+
are sent.
|
|
141
|
+
|
|
142
|
+
For tools marked as writes, Connecta does not automatically repeat a sent
|
|
143
|
+
change after an uncertain failure. Truthful tool classification matters;
|
|
144
|
+
[Safety and trust](./safety-and-trust.md) explains the limit and recovery.
|
|
145
|
+
|
|
146
|
+
## Why an answer may be shorter
|
|
147
|
+
|
|
148
|
+
Programs can filter, count, join, and summarize records before returning
|
|
149
|
+
them. Connecta also limits output size. Some large results return a preview
|
|
150
|
+
and a handle for retrieving more; some tools shorten fields and report it.
|
|
151
|
+
A preview is not necessarily the whole answer.
|
|
152
|
+
|
|
153
|
+
The [result reference](../documentation/meta-tools.md#result-representation)
|
|
154
|
+
explains how to retrieve more. Never repeat a change just to recover its
|
|
155
|
+
output. Redaction keeps known secrets out of results; it does not make
|
|
156
|
+
business records safe to share with everyone.
|