@zackbart/connecta 0.34.1 → 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 +363 -0
- package/README.md +62 -106
- 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 +12 -7
- package/dist/connectors/api-connector.js +142 -56
- 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 +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 +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/agents.d.ts +5 -4
- package/dist/operator-ui/agents.js +17 -7
- package/dist/operator-ui/config-summary.js +5 -4
- package/dist/operator-ui/connection-map.js +7 -5
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +4 -13
- 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/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +5 -2
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +2 -25
- package/dist/operator-ui/view.js +2 -76
- 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 +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 +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/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 +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 +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 +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/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 +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 +66 -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 +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 +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 +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 +322 -222
- 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 +7 -109
- 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 +2547 -226
- package/documentation/auth.md +821 -98
- 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 +68 -45
- 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 +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 -46
- 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/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 -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
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ConnectorCallAdmissionPolicy } from "../../../types.js";
|
|
2
|
+
/** Planning Center's REST origin. Override only for a proxy or test double. */
|
|
3
|
+
export declare const PLANNING_CENTER_API_BASE_URL = "https://api.planningcenteronline.com";
|
|
4
|
+
/** The products behind `/<app>/v2`, in the order their guides list them. */
|
|
5
|
+
export declare const PLANNING_CENTER_APPS: readonly ["people", "services", "groups", "check-ins", "calendar", "registrations", "giving", "publishing", "webhooks", "api"];
|
|
6
|
+
export type PlanningCenterApp = (typeof PLANNING_CENTER_APPS)[number];
|
|
7
|
+
/**
|
|
8
|
+
* A product a deployment may remove from this connection. People is the one
|
|
9
|
+
* it may not: every product joins through its person ids, and the credential
|
|
10
|
+
* test reads `/people/v2/me`.
|
|
11
|
+
*/
|
|
12
|
+
export type PlanningCenterExcludableApp = Exclude<PlanningCenterApp, "people">;
|
|
13
|
+
/**
|
|
14
|
+
* One reviewed `X-PCO-API-Version` per product, sent on every request.
|
|
15
|
+
*
|
|
16
|
+
* The header is optional, and omitting it is the trap: Planning Center then
|
|
17
|
+
* applies a per-application default chosen in a web dashboard, so behavior
|
|
18
|
+
* would follow whoever last clicked there rather than this file. Each date is
|
|
19
|
+
* the newest non-beta version in the product's documentation graph on
|
|
20
|
+
* 2026-10-05, and every projection below is written against it. A breaking
|
|
21
|
+
* change arrives as a new dated version, never inside this one, so moving a
|
|
22
|
+
* pin is a reviewed change to this table, its drift manifest, and whatever
|
|
23
|
+
* projection the version's change list touches. Notes worth keeping:
|
|
24
|
+
*
|
|
25
|
+
* - groups `2023-07-10` removed every person attribute from `Membership`, so a
|
|
26
|
+
* membership is nameless without `include=person`.
|
|
27
|
+
* - calendar `2026-06-22` may return `BookedEvent*` stubs in place of events on
|
|
28
|
+
* booking and conflict traversals for users without access to the event.
|
|
29
|
+
* - webhooks `2022-10-20` renamed `Subscription` to `WebhookSubscription`.
|
|
30
|
+
* - services `2018-11-01` and giving `2019-10-18` are simply the newest there is.
|
|
31
|
+
*
|
|
32
|
+
* Every request uses the pin for its product; another version requires a
|
|
33
|
+
* reviewed pin and regenerated operation index.
|
|
34
|
+
*/
|
|
35
|
+
export declare const PLANNING_CENTER_API_VERSIONS: Readonly<Record<PlanningCenterApp, string>>;
|
|
36
|
+
/** Planning Center's own cap on `per_page`; its default is 25. */
|
|
37
|
+
export declare const MAX_PAGE_SIZE = 100;
|
|
38
|
+
export declare const DEFAULT_PAGE_SIZE = 25;
|
|
39
|
+
/**
|
|
40
|
+
* A ceiling on absurdity, not a budget. `per_page` tops out at 100, and the
|
|
41
|
+
* heaviest projection here — 100 people with emails and phone numbers
|
|
42
|
+
* included — is a few hundred kilobytes.
|
|
43
|
+
*/
|
|
44
|
+
export declare const PLANNING_CENTER_MAX_RESPONSE_BYTES: number;
|
|
45
|
+
/**
|
|
46
|
+
* Planning Center documents 100 requests per 20 seconds per authenticated user
|
|
47
|
+
* (429 with `Retry-After` in seconds past it, and `X-PCO-API-Request-Rate-*`
|
|
48
|
+
* headers on every response). The rolling window transcribes that number, as
|
|
49
|
+
* Cloudflare's per-user limit is transcribed: a per-runtime approximation, not
|
|
50
|
+
* an enforcement, because N isolates each keep their own counter and every
|
|
51
|
+
* other integration the token's user runs draws on the same bucket.
|
|
52
|
+
* `maxConcurrency: 5` is connecta's choice, not Planning Center's — the bound
|
|
53
|
+
* that stops one `execute_code` fan-out from spending the window in a tick.
|
|
54
|
+
* Admission meters tool calls, not requests: `get_plan` spends three.
|
|
55
|
+
*/
|
|
56
|
+
export declare const PLANNING_CENTER_ADMISSION: ConnectorCallAdmissionPolicy;
|
|
57
|
+
/** Planning Center refuses a request without a descriptive one (HTTP 403). */
|
|
58
|
+
export declare const DEFAULT_USER_AGENT = "connecta/0.35.0 (+https://github.com/zackbart/connecta)";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { CONNECTA_VERSION } from "../../../version.js";
|
|
2
|
+
/** Planning Center's REST origin. Override only for a proxy or test double. */
|
|
3
|
+
export const PLANNING_CENTER_API_BASE_URL = "https://api.planningcenteronline.com";
|
|
4
|
+
/** The products behind `/<app>/v2`, in the order their guides list them. */
|
|
5
|
+
export const PLANNING_CENTER_APPS = [
|
|
6
|
+
"people",
|
|
7
|
+
"services",
|
|
8
|
+
"groups",
|
|
9
|
+
"check-ins",
|
|
10
|
+
"calendar",
|
|
11
|
+
"registrations",
|
|
12
|
+
"giving",
|
|
13
|
+
"publishing",
|
|
14
|
+
"webhooks",
|
|
15
|
+
"api",
|
|
16
|
+
];
|
|
17
|
+
/**
|
|
18
|
+
* One reviewed `X-PCO-API-Version` per product, sent on every request.
|
|
19
|
+
*
|
|
20
|
+
* The header is optional, and omitting it is the trap: Planning Center then
|
|
21
|
+
* applies a per-application default chosen in a web dashboard, so behavior
|
|
22
|
+
* would follow whoever last clicked there rather than this file. Each date is
|
|
23
|
+
* the newest non-beta version in the product's documentation graph on
|
|
24
|
+
* 2026-10-05, and every projection below is written against it. A breaking
|
|
25
|
+
* change arrives as a new dated version, never inside this one, so moving a
|
|
26
|
+
* pin is a reviewed change to this table, its drift manifest, and whatever
|
|
27
|
+
* projection the version's change list touches. Notes worth keeping:
|
|
28
|
+
*
|
|
29
|
+
* - groups `2023-07-10` removed every person attribute from `Membership`, so a
|
|
30
|
+
* membership is nameless without `include=person`.
|
|
31
|
+
* - calendar `2026-06-22` may return `BookedEvent*` stubs in place of events on
|
|
32
|
+
* booking and conflict traversals for users without access to the event.
|
|
33
|
+
* - webhooks `2022-10-20` renamed `Subscription` to `WebhookSubscription`.
|
|
34
|
+
* - services `2018-11-01` and giving `2019-10-18` are simply the newest there is.
|
|
35
|
+
*
|
|
36
|
+
* Every request uses the pin for its product; another version requires a
|
|
37
|
+
* reviewed pin and regenerated operation index.
|
|
38
|
+
*/
|
|
39
|
+
export const PLANNING_CENTER_API_VERSIONS = {
|
|
40
|
+
people: "2026-06-04",
|
|
41
|
+
services: "2018-11-01",
|
|
42
|
+
groups: "2023-07-10",
|
|
43
|
+
"check-ins": "2025-05-28",
|
|
44
|
+
calendar: "2026-06-22",
|
|
45
|
+
registrations: "2025-05-01",
|
|
46
|
+
giving: "2019-10-18",
|
|
47
|
+
publishing: "2024-03-25",
|
|
48
|
+
webhooks: "2022-10-20",
|
|
49
|
+
api: "2026-09-24",
|
|
50
|
+
};
|
|
51
|
+
/** Planning Center's own cap on `per_page`; its default is 25. */
|
|
52
|
+
export const MAX_PAGE_SIZE = 100;
|
|
53
|
+
export const DEFAULT_PAGE_SIZE = 25;
|
|
54
|
+
/**
|
|
55
|
+
* A ceiling on absurdity, not a budget. `per_page` tops out at 100, and the
|
|
56
|
+
* heaviest projection here — 100 people with emails and phone numbers
|
|
57
|
+
* included — is a few hundred kilobytes.
|
|
58
|
+
*/
|
|
59
|
+
export const PLANNING_CENTER_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
60
|
+
/**
|
|
61
|
+
* Planning Center documents 100 requests per 20 seconds per authenticated user
|
|
62
|
+
* (429 with `Retry-After` in seconds past it, and `X-PCO-API-Request-Rate-*`
|
|
63
|
+
* headers on every response). The rolling window transcribes that number, as
|
|
64
|
+
* Cloudflare's per-user limit is transcribed: a per-runtime approximation, not
|
|
65
|
+
* an enforcement, because N isolates each keep their own counter and every
|
|
66
|
+
* other integration the token's user runs draws on the same bucket.
|
|
67
|
+
* `maxConcurrency: 5` is connecta's choice, not Planning Center's — the bound
|
|
68
|
+
* that stops one `execute_code` fan-out from spending the window in a tick.
|
|
69
|
+
* Admission meters tool calls, not requests: `get_plan` spends three.
|
|
70
|
+
*/
|
|
71
|
+
export const PLANNING_CENTER_ADMISSION = {
|
|
72
|
+
rules: [
|
|
73
|
+
{
|
|
74
|
+
maxConcurrency: 5,
|
|
75
|
+
budget: { kind: "rolling-window", maxCalls: 100, windowMs: 20_000 },
|
|
76
|
+
maxQueueSize: 32,
|
|
77
|
+
queueTimeoutMs: 5_000,
|
|
78
|
+
retryAfterMs: 1_000,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
};
|
|
82
|
+
/** Planning Center refuses a request without a descriptive one (HTTP 403). */
|
|
83
|
+
export const DEFAULT_USER_AGENT = `connecta/${CONNECTA_VERSION} (+https://github.com/zackbart/connecta)`;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { OperationIndex } from "../../_shared/rest/operation-index.js";
|
|
2
|
+
/** Reviewed workflow vocabulary over the unchanged vendor paths and contracts. */
|
|
3
|
+
const summaries = {
|
|
4
|
+
"GET /people/v2/people": "Find and search People profiles: a person, contact details, active or inactive members, name, email or phone.",
|
|
5
|
+
"GET /people/v2/people/{person_id}": "Get one person's People profile and contact details; include emails, phone numbers, addresses and household.",
|
|
6
|
+
"PATCH /people/v2/people/{person_id}": "Update or archive a person: inactive archives the People profile; active restores it without deleting history.",
|
|
7
|
+
"GET /people/v2/person_mergers": "Find merged person history and the surviving People id for a removed duplicate profile.",
|
|
8
|
+
"POST /people/v2/people/{person_id}/emails": "Add an email address to a person as a separate People Email record.",
|
|
9
|
+
"POST /people/v2/people/{person_id}/phone_numbers": "Add a phone number to a person as a separate People PhoneNumber record.",
|
|
10
|
+
"GET /people/v2/field_definitions": "List custom field definitions, names and data types for People profiles.",
|
|
11
|
+
"GET /people/v2/people/{person_id}/field_data": "List a person's custom field values; join field definitions for their names and data types.",
|
|
12
|
+
"GET /people/v2/people/{person_id}/notes": "List a person's profile note records and their categories.",
|
|
13
|
+
"GET /services/v2/people": "List Services volunteers and person identities for a volunteer roster; use plans for who is serving on a date.",
|
|
14
|
+
"GET /services/v2/teams": "List volunteer teams and roster roles across Services service types.",
|
|
15
|
+
"GET /services/v2/service_types": "List service types to resolve the worship service before finding its dated plan and order of service.",
|
|
16
|
+
"GET /services/v2/service_types/{service_type_id}/plans": "List dated Services plans for an order of service; choose the plan before reading items or the volunteer roster.",
|
|
17
|
+
"GET /services/v2/service_types/{service_type_id}/plans/{plan_id}/items": "Read the order of service: ordered plan items, songs, durations and worship-service positions.",
|
|
18
|
+
"GET /services/v2/service_types/{service_type_id}/plans/{plan_id}/team_members": "List a plan's volunteer roster and serving team members, with person, team and position identities.",
|
|
19
|
+
"POST /services/v2/service_types/{service_type_id}/plans/{plan_id}/team_members": "Schedule a volunteer into one plan's serving roster with the person's team and position.",
|
|
20
|
+
"GET /groups/v2/groups": "Find church groups, then resolve group leaders and members through their memberships.",
|
|
21
|
+
"GET /groups/v2/groups/{group_id}/memberships": "List church group leaders and members; each group membership joins a person and their leader role.",
|
|
22
|
+
"GET /giving/v2/donations": "List donations by person, date or fund; include designations for fund identities.",
|
|
23
|
+
};
|
|
24
|
+
/** Reviewed vocabulary; shared hatch ranking keeps the full index reachable. */
|
|
25
|
+
export class PlanningCenterIndex extends OperationIndex {
|
|
26
|
+
constructor(data) {
|
|
27
|
+
super({
|
|
28
|
+
...data,
|
|
29
|
+
ops: data.ops.map(([method, path, id, summary, tag, server]) => {
|
|
30
|
+
const reviewed = summaries[`${method} ${path}`];
|
|
31
|
+
// PCO omits operation ids: preserve the generated CRUD/resource words
|
|
32
|
+
// alongside workflow synonyms so verb-led queries remain discoverable.
|
|
33
|
+
const combined = reviewed ? `${reviewed} (${summary.replace(/ — Planning Center \w[\w-]*$/, "")})` : summary;
|
|
34
|
+
return server === undefined
|
|
35
|
+
? [method, path, id, combined, tag]
|
|
36
|
+
: [method, path, id, combined, tag, server];
|
|
37
|
+
}),
|
|
38
|
+
}, { vendor: "pco", title: "Planning Center" });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { PLANNING_CENTER_APPS, isApp } from "../api.js";
|
|
2
|
+
/** `a, b, and c`, the way the guide and description list products. */
|
|
3
|
+
export function series(items) {
|
|
4
|
+
return items.length < 3 ? items.join(" and ") : `${items.slice(0, -1).join(", ")}, and ${items.at(-1)}`;
|
|
5
|
+
}
|
|
6
|
+
/** The products the description names: those with named tools for staff work. */
|
|
7
|
+
export const DESCRIBED_APPS = [
|
|
8
|
+
"people",
|
|
9
|
+
"services",
|
|
10
|
+
"groups",
|
|
11
|
+
"check-ins",
|
|
12
|
+
"calendar",
|
|
13
|
+
"registrations",
|
|
14
|
+
"giving",
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* `excludeApps` as a set, refusing at construction what cannot be meant
|
|
18
|
+
* (INV-11): a product Planning Center does not have, a misspelling, or People.
|
|
19
|
+
*/
|
|
20
|
+
export function excludedApps(value) {
|
|
21
|
+
const excluded = new Set();
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return excluded;
|
|
24
|
+
const excludable = PLANNING_CENTER_APPS.filter((app) => app !== "people").join(", ");
|
|
25
|
+
if (!Array.isArray(value)) {
|
|
26
|
+
throw new Error(`planningCenter() excludeApps must be an array of app names from: ${excludable}.`);
|
|
27
|
+
}
|
|
28
|
+
for (const entry of value) {
|
|
29
|
+
if (entry === "people") {
|
|
30
|
+
throw new Error('planningCenter() excludeApps cannot exclude "people": every product joins through People person ids, and the credential test reads /people/v2/me.');
|
|
31
|
+
}
|
|
32
|
+
if (typeof entry !== "string" || !isApp(entry)) {
|
|
33
|
+
const lower = typeof entry === "string" ? entry.trim().toLowerCase() : "";
|
|
34
|
+
throw new Error(`planningCenter() excludeApps has unknown app ${JSON.stringify(entry)}; expected any of ${excludable}.${isApp(lower) && lower !== "people" ? ` App names are lowercase path segments: "${lower}".` : ""}`);
|
|
35
|
+
}
|
|
36
|
+
excluded.add(entry);
|
|
37
|
+
}
|
|
38
|
+
return excluded;
|
|
39
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ConnectorCallError } from "../../../errors.js";
|
|
2
|
+
export function asRecord(value) {
|
|
3
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
4
|
+
}
|
|
5
|
+
export function asArray(value) {
|
|
6
|
+
return Array.isArray(value) ? value : [];
|
|
7
|
+
}
|
|
8
|
+
export function compact(value) {
|
|
9
|
+
return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
|
|
10
|
+
}
|
|
11
|
+
export function isResource(value) {
|
|
12
|
+
const record = asRecord(value);
|
|
13
|
+
return typeof record["id"] === "string" && typeof record["type"] === "string";
|
|
14
|
+
}
|
|
15
|
+
export function resources(value) {
|
|
16
|
+
return (Array.isArray(value) ? value : value ? [value] : []).filter(isResource);
|
|
17
|
+
}
|
|
18
|
+
export function indexIncluded(document) {
|
|
19
|
+
const index = new Map();
|
|
20
|
+
for (const resource of resources(document["included"])) {
|
|
21
|
+
index.set(`${resource.type}:${resource.id}`, resource);
|
|
22
|
+
}
|
|
23
|
+
return index;
|
|
24
|
+
}
|
|
25
|
+
export function relationshipData(resource, name) {
|
|
26
|
+
return resource.relationships?.[name]?.data;
|
|
27
|
+
}
|
|
28
|
+
/** The related id, `null` when Planning Center says there is none. */
|
|
29
|
+
export function relId(resource, name) {
|
|
30
|
+
const data = relationshipData(resource, name);
|
|
31
|
+
if (data === null)
|
|
32
|
+
return null;
|
|
33
|
+
const id = asRecord(data)["id"];
|
|
34
|
+
return typeof id === "string" ? id : undefined;
|
|
35
|
+
}
|
|
36
|
+
export function related(resource, name, index) {
|
|
37
|
+
const data = asRecord(relationshipData(resource, name));
|
|
38
|
+
return typeof data["type"] === "string" && typeof data["id"] === "string"
|
|
39
|
+
? index.get(`${data["type"]}:${data["id"]}`)
|
|
40
|
+
: undefined;
|
|
41
|
+
}
|
|
42
|
+
export function relatedMany(resource, name, index) {
|
|
43
|
+
return asArray(relationshipData(resource, name))
|
|
44
|
+
.map((entry) => {
|
|
45
|
+
const ref = asRecord(entry);
|
|
46
|
+
return index.get(`${String(ref["type"])}:${String(ref["id"])}`);
|
|
47
|
+
})
|
|
48
|
+
.filter((item) => item !== undefined);
|
|
49
|
+
}
|
|
50
|
+
/** `{ id, ...the named attributes }`, keeping Planning Center's own names. */
|
|
51
|
+
export function pick(resource, names) {
|
|
52
|
+
const attributes = resource.attributes ?? {};
|
|
53
|
+
const out = { id: resource.id };
|
|
54
|
+
for (const name of names) {
|
|
55
|
+
if (attributes[name] !== undefined)
|
|
56
|
+
out[name] = attributes[name];
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
export function attribute(resource, name) {
|
|
61
|
+
return resource?.attributes?.[name];
|
|
62
|
+
}
|
|
63
|
+
/** A JSON:API write document. `undefined` drops a key; `null` clears a field. */
|
|
64
|
+
export function writeDocument(type, attributes) {
|
|
65
|
+
return { data: { type, attributes: compact(attributes) } };
|
|
66
|
+
}
|
|
67
|
+
/** One branchable signal: `meta.next.offset`, Planning Center's own cursor. */
|
|
68
|
+
export function pageOf(document, offset = 0) {
|
|
69
|
+
const meta = asRecord(document["meta"]);
|
|
70
|
+
const next = asRecord(meta["next"])["offset"];
|
|
71
|
+
const total = meta["total_count"];
|
|
72
|
+
if (meta["next"] != null && (next === undefined || !Number.isSafeInteger(next) || next <= offset)) {
|
|
73
|
+
throw new ConnectorCallError("connector_call_failed", "Planning Center returned invalid paging metadata.", {
|
|
74
|
+
retryable: false,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const nextOffset = next === undefined ? null : next;
|
|
78
|
+
return {
|
|
79
|
+
hasMore: nextOffset !== null,
|
|
80
|
+
nextOffset,
|
|
81
|
+
totalCount: typeof total === "number" && Number.isSafeInteger(total) && total >= 0 ? total : null,
|
|
82
|
+
};
|
|
83
|
+
}
|