@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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Forms API root. Every path the tools send sits beneath `/forms`; there
|
|
3
|
+
* is no user segment, because a form is a Drive file the token's subject can
|
|
4
|
+
* or cannot open.
|
|
5
|
+
*/
|
|
6
|
+
export declare const FORMS_API_BASE_URL = "https://forms.googleapis.com/v1";
|
|
7
|
+
/**
|
|
8
|
+
* Exactly the scopes this connection requests, and exactly what the Admin
|
|
9
|
+
* console's domain-wide delegation entry must list (comma-separated there).
|
|
10
|
+
* `forms.body` reads and edits forms; responses are read-only.
|
|
11
|
+
*/
|
|
12
|
+
export declare const FORMS_SCOPES: readonly ["https://www.googleapis.com/auth/forms.body", "https://www.googleapis.com/auth/forms.responses.readonly"];
|
|
13
|
+
/** A large form with embedded media metadata, or a page of long answers. */
|
|
14
|
+
export declare const FORMS_MAX_RESPONSE_BYTES: number;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Public Forms constants, kept outside the kit declarations so the published
|
|
2
|
+
// entry names no Effect type.
|
|
3
|
+
/**
|
|
4
|
+
* The Forms API root. Every path the tools send sits beneath `/forms`; there
|
|
5
|
+
* is no user segment, because a form is a Drive file the token's subject can
|
|
6
|
+
* or cannot open.
|
|
7
|
+
*/
|
|
8
|
+
export const FORMS_API_BASE_URL = "https://forms.googleapis.com/v1";
|
|
9
|
+
/**
|
|
10
|
+
* Exactly the scopes this connection requests, and exactly what the Admin
|
|
11
|
+
* console's domain-wide delegation entry must list (comma-separated there).
|
|
12
|
+
* `forms.body` reads and edits forms; responses are read-only.
|
|
13
|
+
*/
|
|
14
|
+
export const FORMS_SCOPES = [
|
|
15
|
+
"https://www.googleapis.com/auth/forms.body",
|
|
16
|
+
"https://www.googleapis.com/auth/forms.responses.readonly",
|
|
17
|
+
];
|
|
18
|
+
/** A large form with embedded media metadata, or a page of long answers. */
|
|
19
|
+
export const FORMS_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { googlePageToken } from "../../../http/hatch-paging.js";
|
|
2
|
+
import { googleBatchGuard, googleHatchBinding } from "../../_shared/google/hatch.js";
|
|
3
|
+
import { OperationIndex } from "../../_shared/rest/operation-index.js";
|
|
4
|
+
import { openapi } from "../openapi.generated.js";
|
|
5
|
+
export const formsIndex = new OperationIndex(openapi, {
|
|
6
|
+
vendor: "forms",
|
|
7
|
+
title: "Google Forms",
|
|
8
|
+
pathMatching: "uri-template",
|
|
9
|
+
});
|
|
10
|
+
export const FORMS_REQUEST_KINDS = [
|
|
11
|
+
"createItem",
|
|
12
|
+
"updateItem",
|
|
13
|
+
"deleteItem",
|
|
14
|
+
"moveItem",
|
|
15
|
+
"updateFormInfo",
|
|
16
|
+
"updateSettings",
|
|
17
|
+
];
|
|
18
|
+
export const FORMS_REFUSALS = {
|
|
19
|
+
"POST /forms/{formId}:setPublishSettings": "Publishing and response availability changes require separate product authorization; the owner can change them in Forms.",
|
|
20
|
+
"POST /forms/{formId}/watches": "Watch registration creates persistent Pub/Sub delivery and requires separate product authorization.",
|
|
21
|
+
"GET /forms/{formId}/watches": "Watch administration is outside this connection; manage watches through the approved operator workflow.",
|
|
22
|
+
"POST /forms/{formId}/watches/{watchId}:renew": "Watch renewal extends persistent Pub/Sub delivery and requires separate product authorization.",
|
|
23
|
+
"DELETE /forms/{formId}/watches/{watchId}": "Watch administration is outside this connection; manage watches through the approved operator workflow.",
|
|
24
|
+
};
|
|
25
|
+
export function formsBinding(connection) {
|
|
26
|
+
return googleHatchBinding(connection, {
|
|
27
|
+
index: formsIndex,
|
|
28
|
+
review: "Five reviewed Forms JSON methods, confined below /v1 with delegated subject, shared safety and revision-checked batches; publish settings and watches refused.",
|
|
29
|
+
refusal: (op) => FORMS_REFUSALS[`${op.method} ${op.path}`],
|
|
30
|
+
refuse: (call) => {
|
|
31
|
+
const refusal = FORMS_REFUSALS[`${call.method} ${call.op.path}`];
|
|
32
|
+
if (refusal)
|
|
33
|
+
return refusal;
|
|
34
|
+
const pageSize = call.query["pageSize"];
|
|
35
|
+
if (call.op.path === "/forms/{formId}/responses" &&
|
|
36
|
+
pageSize !== undefined &&
|
|
37
|
+
(typeof pageSize !== "number" || !Number.isInteger(pageSize) || pageSize < 1 || pageSize > 5000))
|
|
38
|
+
return "Forms query.pageSize must be an integer from 1 to 5000; omit it for the default.";
|
|
39
|
+
return call.op.path === "/forms/{formId}:batchUpdate"
|
|
40
|
+
? googleBatchGuard(call.body, { kinds: FORMS_REQUEST_KINDS, revision: true })
|
|
41
|
+
: undefined;
|
|
42
|
+
},
|
|
43
|
+
revisionGuarded: (call) => call.op.path === "/forms/{formId}:batchUpdate",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export const FORMS_HATCH = {
|
|
47
|
+
name: "forms",
|
|
48
|
+
title: "Google Forms",
|
|
49
|
+
index: formsIndex,
|
|
50
|
+
pathExample: "/forms/form_123",
|
|
51
|
+
verdicts: {
|
|
52
|
+
"GET /forms/{formId}": "read",
|
|
53
|
+
"POST /forms": "write",
|
|
54
|
+
"POST /forms/{formId}:batchUpdate": "destructive",
|
|
55
|
+
"GET /forms/{formId}/responses": "read",
|
|
56
|
+
"GET /forms/{formId}/responses/{responseId}": "read",
|
|
57
|
+
"POST /forms/{formId}:setPublishSettings": "refuse",
|
|
58
|
+
"POST /forms/{formId}/watches": "refuse",
|
|
59
|
+
"GET /forms/{formId}/watches": "refuse",
|
|
60
|
+
"POST /forms/{formId}/watches/{watchId}:renew": "refuse",
|
|
61
|
+
"DELETE /forms/{formId}/watches/{watchId}": "refuse",
|
|
62
|
+
},
|
|
63
|
+
named: {
|
|
64
|
+
"GET /forms/{formId}": "get_form",
|
|
65
|
+
"POST /forms": "create_form",
|
|
66
|
+
"POST /forms/{formId}:batchUpdate": "batch_update_form",
|
|
67
|
+
"GET /forms/{formId}/responses": "list_responses",
|
|
68
|
+
"GET /forms/{formId}/responses/{responseId}": "get_response",
|
|
69
|
+
},
|
|
70
|
+
pages: { "GET /forms/{formId}/responses": googlePageToken },
|
|
71
|
+
pageCursor: "argument",
|
|
72
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { compactOpenApi } from "../_shared/rest/compact-index.js";
|
|
2
|
+
export const openapi = compactOpenApi({
|
|
3
|
+
source: "https://forms.googleapis.com/$discovery/rest?version=v1",
|
|
4
|
+
revision: "20261022",
|
|
5
|
+
digest: "sha256:2e867ccaa2a404efaffc20705102b90510d1be5cb47ca23795a776cfa0548869",
|
|
6
|
+
version: "v1",
|
|
7
|
+
servers: ["https://forms.googleapis.com/v1"],
|
|
8
|
+
tags: ["forms", "forms.responses", "forms.watches"],
|
|
9
|
+
ops: [
|
|
10
|
+
["POST", "/forms", "forms.forms.create", "Create add an empty form with title and optional Drive document title.", 0],
|
|
11
|
+
["GET", "/forms/{formId}", "forms.forms.get", "Get read form question options, quiz grading answer key, images and section navigation.", 0],
|
|
12
|
+
["GET", "/forms/{formId}/responses", "forms.forms.responses.list", "List find form responses since a timestamp, submitted answers and respondent email.", 1],
|
|
13
|
+
["GET", "/forms/{formId}/responses/{responseId}", "forms.forms.responses.get", "Get read one form response with answers, quiz grades and feedback.", 1],
|
|
14
|
+
["GET", "/forms/{formId}/watches", "forms.forms.watches.list", "Refused: list watch form response registrations is outside this connection.", 2],
|
|
15
|
+
["POST", "/forms/{formId}/watches", "forms.forms.watches.create", "Refused: register watch form responses with persistent Pub/Sub delivery requires separate authorization.", 2],
|
|
16
|
+
["DELETE", "/forms/{formId}/watches/{watchId}", "forms.forms.watches.delete", "Refused: delete watch form response registration is outside this connection.", 2],
|
|
17
|
+
["POST", "/forms/{formId}/watches/{watchId}:renew", "forms.forms.watches.renew", "Refused: renew watch form response delivery requires separate authorization.", 2],
|
|
18
|
+
["POST", "/forms/{formId}:batchUpdate", "forms.forms.batchUpdate", "Edit form: change name/title/quiz settings/correct answer key, rename choice option, add/delete/move item/question.", 0],
|
|
19
|
+
["POST", "/forms/{formId}:setPublishSettings", "forms.forms.setPublishSettings", "Refused: publish form settings and response availability require separate authorization.", 0],
|
|
20
|
+
],
|
|
21
|
+
fields: "{\"p\":[\"answers\",\"createTime\",\"errorType\",\"eventType\",\"expireTime\",\"form\",\"formId\",\"id\",\"info\",\"items\",\"items[].description\",\"items[].imageItem\",\"items[].itemId\",\"items[].pageBreakItem\",\"items[].questionGroupItem\",\"items[].questionItem\",\"items[].textItem\",\"items[].title\",\"items[].videoItem\",\"lastSubmittedTime\",\"linkedSheetId\",\"nextPageToken\",\"publishSettings\",\"replies\",\"replies[].createItem\",\"respondentEmail\",\"responderUri\",\"responseId\",\"responses\",\"responses[].answers\",\"responses[].createTime\",\"responses[].formId\",\"responses[].lastSubmittedTime\",\"responses[].respondentEmail\",\"responses[].responseId\",\"responses[].totalScore\",\"revisionId\",\"settings\",\"state\",\"target\",\"totalScore\",\"watches\",\"watches[].createTime\",\"watches[].errorType\",\"watches[].eventType\",\"watches[].expireTime\",\"watches[].id\",\"watches[].state\",\"watches[].target\",\"writeControl\"],\"d\":[[6,8,9,10,11,12,13,14,15,16,17,18,20,22,26,36,37],[21,28,29,30,31,32,33,34,35],[0,1,6,19,25,27,40],[41,42,43,44,45,46,47,48],[1,2,3,4,7,38,39],[],[5,23,24,49],[6,22]],\"o\":[0,0,1,2,3,4,5,4,6,7]}",
|
|
22
|
+
requestSchemas: "{\"definitions\":{\"Input_Form\":{\"description\":\"A Google Forms document.\",\"properties\":{\"info\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Info\"},\"items\":{\"description\":\"Required.\",\"items\":{\"$ref\":\"#/$defs/Input_Item\"},\"type\":\"array\"},\"settings\":{\"description\":\"The form's settings.\",\"$ref\":\"#/$defs/Input_FormSettings\"}},\"type\":\"object\"},\"Input_Info\":{\"description\":\"The general information for a form.\",\"properties\":{\"description\":{\"description\":\"The description of the form.\",\"type\":\"string\"},\"title\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_Item\":{\"description\":\"A single item of the form.\",\"properties\":{\"description\":{\"description\":\"The description of the item.\",\"type\":\"string\"},\"imageItem\":{\"description\":\"Displays an image on the page.\",\"$ref\":\"#/$defs/Input_ImageItem\"},\"itemId\":{\"description\":\"The item ID.\",\"type\":\"string\"},\"pageBreakItem\":{\"description\":\"Starts a new page with a title.\",\"$ref\":\"#/$defs/Input_PageBreakItem\"},\"questionGroupItem\":{\"description\":\"Poses one or more questions to the user with a single major prompt.\",\"$ref\":\"#/$defs/Input_QuestionGroupItem\"},\"questionItem\":{\"description\":\"Poses a question to the user.\",\"$ref\":\"#/$defs/Input_QuestionItem\"},\"textItem\":{\"description\":\"Displays a title and description on the page.\",\"$ref\":\"#/$defs/Input_TextItem\"},\"title\":{\"description\":\"The title of the item.\",\"type\":\"string\"},\"videoItem\":{\"description\":\"Displays a video on the page.\",\"$ref\":\"#/$defs/Input_VideoItem\"}},\"type\":\"object\"},\"Input_ImageItem\":{\"description\":\"An item containing an image.\",\"properties\":{\"image\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Image\"}},\"type\":\"object\"},\"Input_Image\":{\"description\":\"Data representing an image.\",\"properties\":{\"altText\":{\"description\":\"A description of the image that is shown on hover and read by screenreaders.\",\"type\":\"string\"},\"properties\":{\"description\":\"Properties of an image.\",\"$ref\":\"#/$defs/Input_MediaProperties\"},\"sourceUri\":{\"description\":\"Input only.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_MediaProperties\":{\"description\":\"Properties of the media.\",\"properties\":{\"alignment\":{\"description\":\"Position of the media.\",\"enum\":[\"ALIGNMENT_UNSPECIFIED\",\"LEFT\",\"RIGHT\",\"CENTER\"],\"type\":\"string\"},\"width\":{\"description\":\"The width of the media in pixels.\",\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"Input_PageBreakItem\":{\"additionalProperties\":true,\"description\":\"A page break.\",\"properties\":{},\"type\":\"object\"},\"Input_QuestionGroupItem\":{\"description\":\"Defines a question that comprises multiple questions grouped together.\",\"properties\":{\"grid\":{\"description\":\"The question group is a grid with rows of multiple choice questions that share the same options.\",\"$ref\":\"#/$defs/Input_Grid\"},\"image\":{\"description\":\"The image displayed within the question group above the specific questions.\",\"$ref\":\"#/$defs/Input_Image\"},\"questions\":{\"description\":\"Required.\",\"items\":{\"$ref\":\"#/$defs/Input_Question\"},\"type\":\"array\"}},\"type\":\"object\"},\"Input_Grid\":{\"description\":\"A grid of choices (radio or check boxes) with each row constituting a separate question.\",\"properties\":{\"columns\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_ChoiceQuestion\"},\"shuffleQuestions\":{\"description\":\"If `true`, the questions are randomly ordered.\",\"type\":\"boolean\"}},\"type\":\"object\"},\"Input_ChoiceQuestion\":{\"description\":\"A radio/checkbox/dropdown question.\",\"properties\":{\"options\":{\"description\":\"Required.\",\"items\":{\"$ref\":\"#/$defs/Input_Option\"},\"type\":\"array\"},\"shuffle\":{\"description\":\"Whether the options should be displayed in random order for different instances of the quiz.\",\"type\":\"boolean\"},\"type\":{\"description\":\"Required.\",\"enum\":[\"CHOICE_TYPE_UNSPECIFIED\",\"RADIO\",\"CHECKBOX\",\"DROP_DOWN\"],\"type\":\"string\"}},\"type\":\"object\"},\"Input_Option\":{\"description\":\"An option for a Choice question.\",\"properties\":{\"goToAction\":{\"description\":\"Section navigation type.\",\"enum\":[\"GO_TO_ACTION_UNSPECIFIED\",\"NEXT_SECTION\",\"RESTART_FORM\",\"SUBMIT_FORM\"],\"type\":\"string\"},\"goToSectionId\":{\"description\":\"Item ID of section header to go to.\",\"type\":\"string\"},\"image\":{\"description\":\"Display image as an option.\",\"$ref\":\"#/$defs/Input_Image\"},\"isOther\":{\"description\":\"Whether the option is \\\"other\\\".\",\"type\":\"boolean\"},\"value\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_Question\":{\"description\":\"Any question.\",\"properties\":{\"choiceQuestion\":{\"description\":\"A respondent can choose from a pre-defined set of options.\",\"$ref\":\"#/$defs/Input_ChoiceQuestion\"},\"dateQuestion\":{\"description\":\"A respondent can enter a date.\",\"$ref\":\"#/$defs/Input_DateQuestion\"},\"fileUploadQuestion\":{\"description\":\"A respondent can upload one or more files.\",\"$ref\":\"#/$defs/Input_FileUploadQuestion\"},\"grading\":{\"description\":\"Grading setup for the question.\",\"$ref\":\"#/$defs/Input_Grading\"},\"questionId\":{\"description\":\"Read only.\",\"type\":\"string\"},\"ratingQuestion\":{\"description\":\"A respondent can choose a rating from a pre-defined set of icons.\",\"$ref\":\"#/$defs/Input_RatingQuestion\"},\"required\":{\"description\":\"Whether the question must be answered in order for a respondent to submit their response.\",\"type\":\"boolean\"},\"rowQuestion\":{\"description\":\"A row of a QuestionGroupItem.\",\"$ref\":\"#/$defs/Input_RowQuestion\"},\"scaleQuestion\":{\"description\":\"A respondent can choose a number from a range.\",\"$ref\":\"#/$defs/Input_ScaleQuestion\"},\"textQuestion\":{\"description\":\"A respondent can enter a free text response.\",\"$ref\":\"#/$defs/Input_TextQuestion\"},\"timeQuestion\":{\"description\":\"A respondent can enter a time.\",\"$ref\":\"#/$defs/Input_TimeQuestion\"}},\"type\":\"object\"},\"Input_DateQuestion\":{\"description\":\"A date question.\",\"properties\":{\"includeTime\":{\"description\":\"Whether to include the time as part of the question.\",\"type\":\"boolean\"},\"includeYear\":{\"description\":\"Whether to include the year as part of the question.\",\"type\":\"boolean\"}},\"type\":\"object\"},\"Input_FileUploadQuestion\":{\"description\":\"A file upload question.\",\"properties\":{\"folderId\":{\"description\":\"Required.\",\"type\":\"string\"},\"maxFileSize\":{\"description\":\"Maximum number of bytes allowed for any single file uploaded to this question.\",\"format\":\"int64\",\"type\":\"string\"},\"maxFiles\":{\"description\":\"Maximum number of files that can be uploaded for this question in a single response.\",\"format\":\"int32\",\"type\":\"integer\"},\"types\":{\"description\":\"File types accepted by this question.\",\"items\":{\"enum\":[\"FILE_TYPE_UNSPECIFIED\",\"ANY\",\"DOCUMENT\",\"PRESENTATION\",\"SPREADSHEET\",\"DRAWING\",\"PDF\",\"IMAGE\",\"VIDEO\",\"AUDIO\"],\"type\":\"string\"},\"type\":\"array\"}},\"type\":\"object\"},\"Input_Grading\":{\"description\":\"Grading for a single question\",\"properties\":{\"correctAnswers\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_CorrectAnswers\"},\"generalFeedback\":{\"description\":\"The feedback displayed for all answers.\",\"$ref\":\"#/$defs/Input_Feedback\"},\"pointValue\":{\"description\":\"Required.\",\"format\":\"int32\",\"type\":\"integer\"},\"whenRight\":{\"description\":\"The feedback displayed for correct responses.\",\"$ref\":\"#/$defs/Input_Feedback\"},\"whenWrong\":{\"description\":\"The feedback displayed for incorrect responses.\",\"$ref\":\"#/$defs/Input_Feedback\"}},\"type\":\"object\"},\"Input_CorrectAnswers\":{\"description\":\"The answer key for a question.\",\"properties\":{\"answers\":{\"description\":\"A list of correct answers.\",\"items\":{\"$ref\":\"#/$defs/Input_CorrectAnswer\"},\"type\":\"array\"}},\"type\":\"object\"},\"Input_CorrectAnswer\":{\"description\":\"A single correct answer for a question.\",\"properties\":{\"value\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_Feedback\":{\"description\":\"Feedback for a respondent about their response to a question.\",\"properties\":{\"material\":{\"description\":\"Additional information provided as part of the feedback, often used to point the respondent to more reading and resources.\",\"items\":{\"$ref\":\"#/$defs/Input_ExtraMaterial\"},\"type\":\"array\"},\"text\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_ExtraMaterial\":{\"description\":\"Supplementary material to the feedback.\",\"properties\":{\"link\":{\"description\":\"Text feedback.\",\"$ref\":\"#/$defs/Input_TextLink\"},\"video\":{\"description\":\"Video feedback.\",\"$ref\":\"#/$defs/Input_VideoLink\"}},\"type\":\"object\"},\"Input_TextLink\":{\"description\":\"Link for text.\",\"properties\":{\"displayText\":{\"description\":\"Required.\",\"type\":\"string\"},\"uri\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_VideoLink\":{\"description\":\"Link to a video.\",\"properties\":{\"displayText\":{\"description\":\"Required.\",\"type\":\"string\"},\"youtubeUri\":{\"description\":\"The URI of a YouTube video.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_RatingQuestion\":{\"description\":\"A rating question.\",\"properties\":{\"iconType\":{\"description\":\"Required.\",\"enum\":[\"RATING_ICON_TYPE_UNSPECIFIED\",\"STAR\",\"HEART\",\"THUMB_UP\"],\"type\":\"string\"},\"ratingScaleLevel\":{\"description\":\"Required.\",\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"Input_RowQuestion\":{\"description\":\"Configuration for a question that is part of a question group.\",\"properties\":{\"title\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_ScaleQuestion\":{\"description\":\"A scale question.\",\"properties\":{\"high\":{\"description\":\"Required.\",\"format\":\"int32\",\"type\":\"integer\"},\"highLabel\":{\"description\":\"The label to display describing the highest point on the scale.\",\"type\":\"string\"},\"low\":{\"description\":\"Required.\",\"format\":\"int32\",\"type\":\"integer\"},\"lowLabel\":{\"description\":\"The label to display describing the lowest point on the scale.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_TextQuestion\":{\"description\":\"A text-based question.\",\"properties\":{\"paragraph\":{\"description\":\"Whether the question is a paragraph question or not.\",\"type\":\"boolean\"}},\"type\":\"object\"},\"Input_TimeQuestion\":{\"description\":\"A time question.\",\"properties\":{\"duration\":{\"description\":\"`true` if the question is about an elapsed time.\",\"type\":\"boolean\"}},\"type\":\"object\"},\"Input_QuestionItem\":{\"description\":\"A form item containing a single question.\",\"properties\":{\"image\":{\"description\":\"The image displayed within the question.\",\"$ref\":\"#/$defs/Input_Image\"},\"question\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Question\"}},\"type\":\"object\"},\"Input_TextItem\":{\"additionalProperties\":true,\"description\":\"A text item.\",\"properties\":{},\"type\":\"object\"},\"Input_VideoItem\":{\"description\":\"An item containing a video.\",\"properties\":{\"caption\":{\"description\":\"The text displayed below the video.\",\"type\":\"string\"},\"video\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Video\"}},\"type\":\"object\"},\"Input_Video\":{\"description\":\"Data representing a video.\",\"properties\":{\"properties\":{\"description\":\"Properties of a video.\",\"$ref\":\"#/$defs/Input_MediaProperties\"},\"youtubeUri\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_FormSettings\":{\"description\":\"A form's settings.\",\"properties\":{\"emailCollectionType\":{\"description\":\"Optional.\",\"enum\":[\"EMAIL_COLLECTION_TYPE_UNSPECIFIED\",\"DO_NOT_COLLECT\",\"VERIFIED\",\"RESPONDER_INPUT\"],\"type\":\"string\"},\"quizSettings\":{\"description\":\"Settings related to quiz forms and grading.\",\"$ref\":\"#/$defs/Input_QuizSettings\"}},\"type\":\"object\"},\"Input_QuizSettings\":{\"description\":\"Settings related to quiz forms and grading.\",\"properties\":{\"isQuiz\":{\"description\":\"Whether this form is a quiz or not.\",\"type\":\"boolean\"}},\"type\":\"object\"},\"Input_CreateWatchRequest\":{\"description\":\"Create a new watch.\",\"properties\":{\"watch\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Watch\"},\"watchId\":{\"description\":\"The ID to use for the watch.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_Watch\":{\"description\":\"A watch for events for a form.\",\"properties\":{\"eventType\":{\"description\":\"Required.\",\"enum\":[\"EVENT_TYPE_UNSPECIFIED\",\"SCHEMA\",\"RESPONSES\"],\"type\":\"string\"},\"target\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_WatchTarget\"}},\"type\":\"object\"},\"Input_WatchTarget\":{\"description\":\"The target for notification delivery.\",\"properties\":{\"topic\":{\"description\":\"A Pub/Sub topic.\",\"$ref\":\"#/$defs/Input_CloudPubsubTopic\"}},\"type\":\"object\"},\"Input_CloudPubsubTopic\":{\"description\":\"A Pub/Sub topic.\",\"properties\":{\"topicName\":{\"description\":\"Required.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_RenewWatchRequest\":{\"additionalProperties\":true,\"description\":\"Renew an existing Watch for seven days.\",\"properties\":{},\"type\":\"object\"},\"Input_BatchUpdateFormRequest\":{\"description\":\"A batch of updates to perform on a form.\",\"properties\":{\"includeFormInResponse\":{\"description\":\"Whether to return an updated version of the model in the response.\",\"type\":\"boolean\"},\"requests\":{\"description\":\"Required.\",\"items\":{\"$ref\":\"#/$defs/Input_Request\"},\"type\":\"array\"},\"writeControl\":{\"description\":\"Provides control over how write requests are executed.\",\"$ref\":\"#/$defs/Input_WriteControl\"}},\"type\":\"object\"},\"Input_Request\":{\"description\":\"The kinds of update requests that can be made.\",\"properties\":{\"createItem\":{\"description\":\"Create a new item.\",\"$ref\":\"#/$defs/Input_CreateItemRequest\"},\"deleteItem\":{\"description\":\"Delete an item.\",\"$ref\":\"#/$defs/Input_DeleteItemRequest\"},\"moveItem\":{\"description\":\"Move an item to a specified location.\",\"$ref\":\"#/$defs/Input_MoveItemRequest\"},\"updateFormInfo\":{\"description\":\"Update Form's Info.\",\"$ref\":\"#/$defs/Input_UpdateFormInfoRequest\"},\"updateItem\":{\"description\":\"Update an item.\",\"$ref\":\"#/$defs/Input_UpdateItemRequest\"},\"updateSettings\":{\"description\":\"Updates the Form's settings.\",\"$ref\":\"#/$defs/Input_UpdateSettingsRequest\"}},\"type\":\"object\"},\"Input_CreateItemRequest\":{\"description\":\"Create an item in a form.\",\"properties\":{\"item\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Item\"},\"location\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Location\"}},\"type\":\"object\"},\"Input_Location\":{\"description\":\"A specific location in a form.\",\"properties\":{\"index\":{\"description\":\"The index of an item in the form.\",\"format\":\"int32\",\"type\":\"integer\"}},\"type\":\"object\"},\"Input_DeleteItemRequest\":{\"description\":\"Delete an item in a form.\",\"properties\":{\"location\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Location\"}},\"type\":\"object\"},\"Input_MoveItemRequest\":{\"description\":\"Move an item in a form.\",\"properties\":{\"newLocation\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Location\"},\"originalLocation\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Location\"}},\"type\":\"object\"},\"Input_UpdateFormInfoRequest\":{\"description\":\"Update Form's Info.\",\"properties\":{\"info\":{\"description\":\"The info to update.\",\"$ref\":\"#/$defs/Input_Info\"},\"updateMask\":{\"description\":\"Required.\",\"format\":\"google-fieldmask\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_UpdateItemRequest\":{\"description\":\"Update an item in a form.\",\"properties\":{\"item\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Item\"},\"location\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_Location\"},\"updateMask\":{\"description\":\"Required.\",\"format\":\"google-fieldmask\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_UpdateSettingsRequest\":{\"description\":\"Update Form's FormSettings.\",\"properties\":{\"settings\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_FormSettings\"},\"updateMask\":{\"description\":\"Required.\",\"format\":\"google-fieldmask\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_WriteControl\":{\"description\":\"Provides control over how write requests are executed.\",\"properties\":{\"requiredRevisionId\":{\"description\":\"The revision ID of the form that the write request is applied to.\",\"type\":\"string\"},\"targetRevisionId\":{\"description\":\"The target revision ID of the form that the write request is applied to.\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_SetPublishSettingsRequest\":{\"description\":\"Updates the publish settings of a Form.\",\"properties\":{\"publishSettings\":{\"description\":\"Required.\",\"$ref\":\"#/$defs/Input_PublishSettings\"},\"updateMask\":{\"description\":\"Optional.\",\"format\":\"google-fieldmask\",\"type\":\"string\"}},\"type\":\"object\"},\"Input_PublishSettings\":{\"description\":\"The publishing settings of a form.\",\"properties\":{\"publishState\":{\"description\":\"Optional.\",\"$ref\":\"#/$defs/Input_PublishState\"}},\"type\":\"object\"},\"Input_PublishState\":{\"description\":\"The publishing state of a form.\",\"properties\":{\"isAcceptingResponses\":{\"description\":\"Required.\",\"type\":\"boolean\"},\"isPublished\":{\"description\":\"Required.\",\"type\":\"boolean\"}},\"type\":\"object\"}},\"roots\":[{\"$ref\":\"#/$defs/Input_Form\"},null,null,null,null,{\"$ref\":\"#/$defs/Input_CreateWatchRequest\"},null,{\"$ref\":\"#/$defs/Input_RenewWatchRequest\"},{\"$ref\":\"#/$defs/Input_BatchUpdateFormRequest\"},{\"$ref\":\"#/$defs/Input_SetPublishSettingsRequest\"}]}",
|
|
23
|
+
}, { "length": 6875, "definitions": "[{\"t\":\"object\",\"p\":{\"altText\":{\"t\":\"string\"},\"properties\":{\"t\":\"object\",\"x\":1},\"sourceUri\":{\"t\":\"string\"}}},{\"t\":\"string\",\"e\":[\"EMAIL_COLLECTION_TYPE_UNSPECIFIED\",\"DO_NOT_COLLECT\",\"VERIFIED\",\"RESPONDER_INPUT\"]},{\"t\":\"object\",\"p\":{\"description\":{\"t\":\"string\"},\"imageItem\":{\"t\":\"object\",\"x\":1},\"itemId\":{\"t\":\"string\"},\"pageBreakItem\":{\"t\":\"object\",\"x\":1},\"questionGroupItem\":{\"t\":\"object\",\"x\":1},\"questionItem\":{\"t\":\"object\",\"x\":1},\"textItem\":{\"t\":\"object\",\"x\":1},\"title\":{\"t\":\"string\"},\"videoItem\":{\"t\":\"object\",\"x\":1}}}]", "parameters": ["[\"prettyPrint\",\"query\",0,{\"t\":\"boolean\"},\"Returns response with indentations and line breaks.\"]", "[\"fields\",\"query\",0,{\"t\":\"string\"},\"Selector specifying which fields to include in a partial response.\"]", "[\"unpublished\",\"query\",0,{\"t\":\"boolean\"},\"Optional.\"]", "[\"formId\",\"path\",1,{\"t\":\"string\"},\"Required.\"]", "[\"pageToken\",\"query\",0,{\"t\":\"string\"},\"A page token returned by a previous list response.\"]", "[\"filter\",\"query\",0,{\"t\":\"string\"},\"Which form responses to return.\"]", "[\"pageSize\",\"query\",0,{\"t\":\"integer\",\"f\":\"int32\"},\"The maximum number of responses to return.\"]", "[\"responseId\",\"path\",1,{\"t\":\"string\"},\"Required.\"]", "[\"watchId\",\"path\",1,{\"t\":\"string\"},\"Required.\"]"], "operations": [[[0, 1, 2], "[\"application/json\",{\"t\":\"object\",\"p\":{\"info\":{\"t\":\"object\",\"d\":\"The general information for a form.\",\"p\":{\"description\":{\"t\":\"string\"},\"title\":{\"t\":\"string\"}}},\"items\":{\"t\":\"array\",\"d\":\"Required.\",\"i\":{\"t\":\"object\",\"p\":{\"description\":{\"t\":\"string\"},\"imageItem\":{\"t\":\"object\",\"p\":{\"image\":{\"$\":0}}},\"itemId\":{\"t\":\"string\"},\"pageBreakItem\":{\"t\":\"object\",\"p\":{},\"m\":{}},\"questionGroupItem\":{\"t\":\"object\",\"p\":{\"grid\":{\"t\":\"object\",\"p\":{\"columns\":{\"t\":\"object\",\"x\":1},\"shuffleQuestions\":{\"t\":\"boolean\"}}},\"image\":{\"$\":0},\"questions\":{\"t\":\"array\",\"i\":{\"t\":\"object\",\"x\":1}}}},\"questionItem\":{\"t\":\"object\",\"p\":{\"image\":{\"$\":0},\"question\":{\"t\":\"object\",\"p\":{\"choiceQuestion\":{\"t\":\"object\",\"x\":1},\"dateQuestion\":{\"t\":\"object\",\"x\":1},\"fileUploadQuestion\":{\"t\":\"object\",\"x\":1},\"grading\":{\"t\":\"object\",\"x\":1},\"questionId\":{\"t\":\"string\"},\"ratingQuestion\":{\"t\":\"object\",\"x\":1},\"required\":{\"t\":\"boolean\"},\"rowQuestion\":{\"t\":\"object\",\"x\":1},\"scaleQuestion\":{\"t\":\"object\",\"x\":1},\"textQuestion\":{\"t\":\"object\",\"x\":1},\"timeQuestion\":{\"t\":\"object\",\"x\":1}}}}},\"textItem\":{\"t\":\"object\",\"p\":{},\"m\":{}},\"title\":{\"t\":\"string\"},\"videoItem\":{\"t\":\"object\",\"p\":{\"caption\":{\"t\":\"string\"},\"video\":{\"t\":\"object\",\"p\":{\"properties\":{\"t\":\"object\",\"x\":1},\"youtubeUri\":{\"t\":\"string\"}}}}}}}},\"settings\":{\"t\":\"object\",\"d\":\"A form's settings.\",\"p\":{\"emailCollectionType\":{\"$\":1},\"quizSettings\":{\"t\":\"object\",\"p\":{\"isQuiz\":{\"t\":\"boolean\"}}}}}}},1]"], [[0, 1, 3], "0"], [[0, 1, 3, 4, 5, 6], "0"], [[0, 1, 7, 3], "0"], [[0, 1, 3], "0"], [[0, 1, 3], "[\"application/json\",{\"t\":\"object\",\"p\":{\"watch\":{\"t\":\"object\",\"d\":\"A watch for events for a form.\",\"p\":{\"eventType\":{\"t\":\"string\",\"e\":[\"EVENT_TYPE_UNSPECIFIED\",\"SCHEMA\",\"RESPONSES\"]},\"target\":{\"t\":\"object\",\"p\":{\"topic\":{\"t\":\"object\",\"p\":{\"topicName\":{\"t\":\"string\"}}}}}}},\"watchId\":{\"t\":\"string\",\"d\":\"The ID to use for the watch.\"}}},1]"], [[0, 1, 8, 3], "0"], [[0, 1, 8, 3], "[\"application/json\",{\"t\":\"object\",\"p\":{},\"m\":{}},1]"], [[0, 1, 3], "[\"application/json\",{\"t\":\"object\",\"p\":{\"includeFormInResponse\":{\"t\":\"boolean\",\"d\":\"Whether to return an updated version of the model in the response.\"},\"requests\":{\"t\":\"array\",\"d\":\"Required.\",\"i\":{\"t\":\"object\",\"p\":{\"createItem\":{\"t\":\"object\",\"p\":{\"item\":{\"$\":2},\"location\":{\"t\":\"object\",\"p\":{\"index\":{\"t\":\"integer\",\"f\":\"int32\"}}}}},\"deleteItem\":{\"t\":\"object\",\"p\":{\"location\":{\"t\":\"object\",\"p\":{\"index\":{\"t\":\"integer\",\"f\":\"int32\"}}}}},\"moveItem\":{\"t\":\"object\",\"p\":{\"newLocation\":{\"t\":\"object\",\"p\":{\"index\":{\"t\":\"integer\",\"f\":\"int32\"}}},\"originalLocation\":{\"t\":\"object\",\"p\":{\"index\":{\"t\":\"integer\",\"f\":\"int32\"}}}}},\"updateFormInfo\":{\"t\":\"object\",\"p\":{\"info\":{\"t\":\"object\",\"p\":{\"description\":{\"t\":\"string\"},\"title\":{\"t\":\"string\"}}},\"updateMask\":{\"t\":\"string\",\"f\":\"google-fieldmask\"}}},\"updateItem\":{\"t\":\"object\",\"p\":{\"item\":{\"$\":2},\"location\":{\"t\":\"object\",\"p\":{\"index\":{\"t\":\"integer\",\"f\":\"int32\"}}},\"updateMask\":{\"t\":\"string\",\"f\":\"google-fieldmask\"}}},\"updateSettings\":{\"t\":\"object\",\"p\":{\"settings\":{\"t\":\"object\",\"p\":{\"emailCollectionType\":{\"$\":1},\"quizSettings\":{\"t\":\"object\",\"x\":1}}},\"updateMask\":{\"t\":\"string\",\"f\":\"google-fieldmask\"}}}}}},\"writeControl\":{\"t\":\"object\",\"d\":\"Provides control over how write requests are executed.\",\"p\":{\"requiredRevisionId\":{\"t\":\"string\"},\"targetRevisionId\":{\"t\":\"string\"}}}}},1]"], [[0, 1, 3], "[\"application/json\",{\"t\":\"object\",\"p\":{\"publishSettings\":{\"t\":\"object\",\"d\":\"The publishing settings of a form.\",\"p\":{\"publishState\":{\"t\":\"object\",\"p\":{\"isAcceptingResponses\":{\"t\":\"boolean\"},\"isPublished\":{\"t\":\"boolean\"}}}}},\"updateMask\":{\"t\":\"string\",\"f\":\"google-fieldmask\",\"d\":\"Optional.\"}}},1]"]] });
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Reviewed against archived Forms Discovery revision 20261022.
|
|
2
|
+
// Form/response bodies are user data: grading answer keys and respondent email
|
|
3
|
+
// remain available. Image.contentUri is a vendor-minted temporary bearer
|
|
4
|
+
// destination and is permanently withheld, including in batch.form expansions.
|
|
5
|
+
// User-authored sourceUri, responderUri, video URLs and feedback links are
|
|
6
|
+
// ordinary references. No generic credential URL-name rule is applied there;
|
|
7
|
+
// global signing-name defense still covers free text and error bodies.
|
|
8
|
+
import { safe, redact, refuse, vendorErrors } from "../_shared/rest/value-safety.js";
|
|
9
|
+
const imagePaths = [
|
|
10
|
+
"items[].imageItem.image.contentUri",
|
|
11
|
+
"items[].questionGroupItem.questions[].choiceQuestion.options[].image.contentUri",
|
|
12
|
+
"items[].questionGroupItem.grid.columns.options[].image.contentUri",
|
|
13
|
+
"items[].questionGroupItem.image.contentUri",
|
|
14
|
+
"items[].questionItem.question.choiceQuestion.options[].image.contentUri",
|
|
15
|
+
"items[].questionItem.image.contentUri",
|
|
16
|
+
];
|
|
17
|
+
export const FORMS_VALUE_SAFETY = {
|
|
18
|
+
title: "Google Forms",
|
|
19
|
+
embeddedUrls: {},
|
|
20
|
+
operations: {
|
|
21
|
+
"GET /forms/{formId}": vendorErrors(redact("Temporary image download destinations convey private access; form structure and quiz answer keys remain requested user data.", imagePaths)),
|
|
22
|
+
"POST /forms": vendorErrors(redact("Created forms use the same permanent image destination boundary.", imagePaths)),
|
|
23
|
+
"POST /forms/{formId}:batchUpdate": vendorErrors(redact("Expanded batch forms use the same permanent image destination boundary.", imagePaths.map((path) => `form.${path}`))),
|
|
24
|
+
"GET /forms/{formId}/responses": vendorErrors(safe("Responses and respondent email are requested user data; nextPageToken is only a continuation, not an authentication credential.", ["nextPageToken"])),
|
|
25
|
+
"POST /forms/{formId}/watches": refuse("Persistent Pub/Sub watch registration requires separate product authorization."),
|
|
26
|
+
"POST /forms/{formId}:setPublishSettings": refuse("Publishing and response availability changes require separate product authorization."),
|
|
27
|
+
},
|
|
28
|
+
fields: {
|
|
29
|
+
nextPageToken: {
|
|
30
|
+
verdict: "keep",
|
|
31
|
+
reason: "Opaque Forms pagination metadata, usable only with the delegated grant; not an access credential.",
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
};
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
// Generated by scripts/generate-providers.mjs; do not edit.
|
|
2
2
|
export const skill = {
|
|
3
|
-
"content": "
|
|
4
|
-
"instructionsHeading": "Connection instructions"
|
|
5
|
-
"fragments": {
|
|
6
|
-
"guide_0": "# Google Forms usage\n\nActs as the signed-in person in Google Forms through Workspace delegation: read and edit their forms, read responses, never submit or delete.\n\nConnection purpose: ",
|
|
7
|
-
"guide_1": "\n\n## Whose forms\n\nEvery call reaches only the forms the Workspace user deployment config maps\nthe caller to can open; an agent acts as the owner of the pool it came through, unless the deployment fixes one shared account that every caller, agent or person, acts as. No argument names a user. A call with none mapped fails `auth_required`; only an operator can change\nthat. A form id\nthat does not exist and one not shared with that user fail alike, as\n`connector_call_failed`: Google does not say which.\n\n## Finding forms\n\nThere is no list or search here: the Forms API has none. Find a form in\nDrive, or take its id from an edit URL (`/forms/d/<formId>/edit`). The\n`/forms/d/e/…` responder link is not the form id.\n\n## Reading\n\n- Every result stays inside ",
|
|
8
|
-
"guide_2": " KiB, so it crosses into\n `execute_code` whole. A page that would outgrow that ends early with\n `page.hasMore`; follow `page.nextCursor` rather than raising `limit`.\n- `get_form` lists items with their `questions`: one for a question,\n one per row for a grid, none for sections and media. Answers are keyed by\n those `questionId`s. A large form pages its items (`itemCount` is the\n total), and a grid too large for one page continues on the next: the item\n repeats with `questionsFrom`, the index of its first row there, and\n `moreQuestions` counts rows still to come. A cursor from a form that has\n since changed fails `conflict`.\n Long text is cut with a marker; `raw: true` returns Google's whole Form\n resource, or refuses one too large for a result.\n- `list_responses` labels each answer with its question's title, in form\n order; an answer to a since-deleted question has no title. Answers longer\n than ",
|
|
9
|
-
"guide_3": " characters end with a truncation marker; `get_response`\n reads one whole. Page with `page.nextCursor` and the same\n `submittedAfter`. To read only new responses, pass the newest\n `lastSubmittedTime` already seen as `submittedAfter`. A cursor\n continues after the last response it returned; if Google's page has\n changed since (new, deleted, or reordered responses), it fails\n `conflict` — start again, or use `submittedAfter`.\n- A response too large for one result comes back cut, with the answers left\n out named in `omittedQuestionIds`; pass them to `get_response` as\n `questionIds`.\n\n## Editing\n\n- `create_form` makes an empty form: Google takes only its title and Drive\n file name at creation. Add a description and questions afterwards.\n- `update_form_info` replaces the title or description.\n- `batch_update_form` is the escape hatch for everything else, and always\n needs approval. It takes Google's own Request objects, applied all or none,\n with the form's current `revisionId` as `requiredRevisionId`: a form\n someone changed since you read it is refused as `conflict`, so re-read it\n and rebuild the edit. Its reply carries the new `revisionId` and each created item's id.\n A reply too large to return whole comes back with `truncated: true`: the\n batch still applied; read the rest with `get_form`. An `updateItem` needs an `updateMask`; read `raw: true` first so the\n item it replaces keeps its grading, images, and navigation.\n- Publishing, sharing, deleting, and watches are not in this connection; the\n owner does those in Forms or Drive. Responses are read-only.\n"
|
|
10
|
-
}
|
|
3
|
+
"content": "## Finding forms and joining answers\n\nThe Forms API cannot list or search forms. Find the file through Drive, or use\nthe id after `/forms/d/` in its edit URL. The `/forms/d/e/…` responder link is\nnot a form id. A form id is also its Drive file id.\n\nA form contains items; an item may ask one question, several grid questions,\nor no question. Responses join by `questionId`, never by `itemId`. Named\nresponse reads label answers with the current question titles in form order;\nan answer to a deleted question has no title. A response may contain several\nvalues or uploaded-file references for one question. File ids join to Drive.\n\n## Reading complete responses\n\nResponses and respondent emails can contain personal information. Filter and\naggregate in `execute_code`, returning named answers only when the task needs\nthem. `submittedAfter` is exclusive UTC: retain the newest `lastSubmittedTime`\nfor the next incremental read. Google does not promise a stable response\nsnapshot. A continuation inside a changed vendor page fails `conflict`; start\nagain or use that newest timestamp.\n\nLarge grids continue inside the same item: `questionsFrom` places the returned\nrows. `omittedQuestionIds` identifies answers left out for size; read those ids\nwith `get_response`. The structural hatch exposes quiz grading and correct\nanswers, images, and option navigation that named projections omit. Temporary\nimage access destinations remain withheld.\n\n## Editing without losing structure\n\nRead the form's current revision before editing. A stale revision refuses the\nbatch as `conflict`; re-read and rebuild the requested edit. A revision guards\nconcurrent changes and does not make a repeated write safe.\n\nCreation sets only title and Drive file name. Add descriptions or questions\nafterward. `updateItem` can replace grading, images and section navigation;\nread the full item through the hatch first and use a precise `updateMask`.\nItem locations are indexes, while response answers use question ids.\n\nPublishing, sharing, deleting forms, and watch administration are outside this\nconnection. Responses are read-only; no tool submits or deletes a response.\n\n## Conventions\n\n- **Paging:** while `page.hasMore` is true, continue with `page.nextCursor` unchanged. For `forms_api_details`, `forms_api_read`, `forms_api_search`, `get_form`, `list_responses`, pass it as the top-level `cursor`; omit raw paging anchors on continuations. Keep the original method, path, filters, page size, fields and headers. Paged `list_*` and `search_*` reads take `limit` (default 25, at most 100). The last page has no `nextCursor`. If `page.hasMore` is true without a cursor, the data is incomplete and continuation was withheld. When approaching execute_code's per-program call limit, return page.nextCursor before the call that would exceed it and continue in the next program; don't restart.\n- **Results:** `fields` narrows a read's result to the dot paths you name. `truncated` lists the dot paths a result cut for size; the ids that fetch what was cut stay in the result.\n- **Hatch:** `forms_api_search` finds this API's operations and reads no account data, `forms_api_details` shows one operation's contract, and `forms_api_read` calls a reviewed read. `forms_api_write` calls a reviewed write; the host may ask the user to confirm it. An operation without a reviewed verdict is refused. 5 operations are refused by design; use `forms_api_details` with the method and path to inspect the original operation summary and its separate refusal. Use details for refused methods outside the read/write call schemas; those methods remain unavailable.\n- **Writes:** a write is sent once and never retried. When its outcome is unknown, read the target before repeating it. Writes take no idempotency key.\n- **Errors:** codes come from the vendor's statuses and error facts, never its prose. An unknown id, or one these credentials cannot reach, fails as `connector_call_failed`; this API does not tell the two apart. `conflict` means: A revision-guarded batch update returned ABORTED or FAILED_PRECONDITION with HTTP 400 or 409.\n- **Withheld values:** a value withheld for safety reads `\"[redacted]\"`. Writes refuse whole marker values and withheld links; longer prose may mention the marker. Paths and queries refuse any containment.",
|
|
4
|
+
"instructionsHeading": "Connection instructions"
|
|
11
5
|
};
|