@jskit-ai/connectors-catalog 0.1.1
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/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Google Analytics
|
|
2
|
+
|
|
3
|
+
## Delivery target and current implementation
|
|
4
|
+
|
|
5
|
+
This connector configures website tracking with an application-owned GA4
|
|
6
|
+
Measurement ID. The definition and editor now accept the public setting without a connection
|
|
7
|
+
command. Controlled shared-form, dashboard and chat checks pass. Generated-application
|
|
8
|
+
wiring and live traffic are not exercised.
|
|
9
|
+
Saving this configuration is not evidence that tracking is installed.
|
|
10
|
+
|
|
11
|
+
## Get the application's Measurement ID
|
|
12
|
+
|
|
13
|
+
1. Open [Google Analytics](https://analytics.google.com/) and select the
|
|
14
|
+
application's Analytics property. Create a property and a Web data stream if
|
|
15
|
+
the application does not have one yet.
|
|
16
|
+
2. Open **Admin → Data collection and modification → Data streams** and select
|
|
17
|
+
that web stream. Use the application's published website address when setting
|
|
18
|
+
up the stream.
|
|
19
|
+
3. Copy the **Measurement ID** from **Stream details**. For this GA4 website
|
|
20
|
+
configuration, use the stream's `G-` identifier.
|
|
21
|
+
4. Save that public identifier in the integration's Measurement ID field. It is
|
|
22
|
+
intended to appear in the published website; it is not an API key or proof
|
|
23
|
+
that the editor owns the Analytics property.
|
|
24
|
+
5. Have the application's framework install the Google tag using that setting.
|
|
25
|
+
Check the application's existing tag manager first to avoid installing it
|
|
26
|
+
twice. The application controls when tracking loads and its consent behavior.
|
|
27
|
+
|
|
28
|
+
Google's [ID instructions](https://support.google.com/analytics/answer/9539598?hl=en)
|
|
29
|
+
and [tag installation instructions](https://support.google.com/analytics/answer/15756615?hl=en-GB)
|
|
30
|
+
are the provider references. This flow does not require a Google OAuth client,
|
|
31
|
+
client secret, callback URL, or Vibe64-owned Google registration.
|
|
32
|
+
|
|
33
|
+
## Configuration and ownership contract to implement
|
|
34
|
+
|
|
35
|
+
The intended `integrations.json` slot is:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"schemaVersion": 1,
|
|
40
|
+
"integrations": {
|
|
41
|
+
"website-analytics": {
|
|
42
|
+
"provider": "google-analytics",
|
|
43
|
+
"displayName": "Website analytics",
|
|
44
|
+
"accountMode": "shared",
|
|
45
|
+
"scopes": [],
|
|
46
|
+
"authentication": { "method": "none" },
|
|
47
|
+
"settings": { "measurementId": "G-XXXXXXXXXX" }
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"registrations": {}
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The shared field component and CLI validator use this same format. The public ID can live directly in the text configuration; a
|
|
55
|
+
framework can expose it through its normal public build configuration. No
|
|
56
|
+
secret-resolution service is needed.
|
|
57
|
+
|
|
58
|
+
Vibe64 Public owns the editor experience. Online uses that same experience and
|
|
59
|
+
the selected project's configuration. Saving must report **Configured**, with
|
|
60
|
+
an explanation that application wiring and event delivery are separate. It must
|
|
61
|
+
not start OAuth, call a connection-status command, send a test tracking event,
|
|
62
|
+
or show an account as verified. Changing or removing the setting is an ordinary
|
|
63
|
+
configuration change; it does not revoke a Google account.
|
|
64
|
+
|
|
65
|
+
JSKIT owns the JavaScript definition, validation, shared form and usage guidance.
|
|
66
|
+
The generated application owns loading the tag, navigation/page-view handling,
|
|
67
|
+
consent behavior, and the lifecycle of its deployed configuration. Laravel uses
|
|
68
|
+
its own layout, asset and configuration tools; it does not need JSKIT at runtime.
|
|
69
|
+
An assistant can wire either framework from the saved public setting. Creating
|
|
70
|
+
or selecting the actual Analytics property requires the owner's access; saving
|
|
71
|
+
this ID does not authorize Admin API calls to do that automatically.
|
|
72
|
+
|
|
73
|
+
## Framework handoff
|
|
74
|
+
|
|
75
|
+
The assistant should inspect the application's selected framework and existing
|
|
76
|
+
tracking before editing code. It receives the slot name, not a copied credential.
|
|
77
|
+
Use these steps for the saved `website-analytics` example:
|
|
78
|
+
|
|
79
|
+
1. Read and validate the application's own `integrations.json` during its normal
|
|
80
|
+
configuration loading or build. Select
|
|
81
|
+
`integrations["website-analytics"].settings.measurementId`. A missing slot
|
|
82
|
+
means tracking is disabled; do not silently substitute another property's ID.
|
|
83
|
+
2. Expose only this public ID to the frontend. Never serialize the whole
|
|
84
|
+
integrations file or registrations into HTML or a browser bundle.
|
|
85
|
+
3. Wire the ID into the existing Google tag or tag-manager installation. If none
|
|
86
|
+
exists, use Google's documented tag installation through the framework's
|
|
87
|
+
normal document/layout entry point. Preserve consent controls and avoid a
|
|
88
|
+
second installation or duplicate navigation events.
|
|
89
|
+
4. Treat removal as disabling this application's tag configuration on the next
|
|
90
|
+
application reload/build/deployment, according to its normal configuration
|
|
91
|
+
lifecycle. It does not delete the Analytics property or historical data.
|
|
92
|
+
An already-loaded page may need reloading; removing a file entry does not
|
|
93
|
+
reach into running browsers and undo previously sent events.
|
|
94
|
+
5. Keep controlled tests local: mock the tag boundary and verify the selected ID,
|
|
95
|
+
consent gating, missing-slot behavior, and no duplicate initialization. Do not
|
|
96
|
+
send real Analytics events merely to prove that configuration saves.
|
|
97
|
+
|
|
98
|
+
For Node/JSKIT, import `googleAnalyticsDefinition` from
|
|
99
|
+
`@jskit-ai/connectors-catalog/shared` and validate using
|
|
100
|
+
`validateIntegrationConfiguration` from
|
|
101
|
+
`@jskit-ai/connectors-core/shared/configuration`, registering that definition.
|
|
102
|
+
The framework still owns document rendering, public configuration and navigation.
|
|
103
|
+
No connection service or token store is required for this provider.
|
|
104
|
+
|
|
105
|
+
For Laravel, read the same project-owned JSON through the application's normal
|
|
106
|
+
configuration/bootstrap code and expose the selected public ID to its Blade or
|
|
107
|
+
frontend entry point. If configuration is cached or assets are built, incorporate
|
|
108
|
+
changes through that existing lifecycle. Use Laravel-native validation and
|
|
109
|
+
rendering; do not install JSKIT or a JavaScript connection daemon just to read
|
|
110
|
+
this setting. Escape any value rendered into HTML or JavaScript with the
|
|
111
|
+
framework's normal safe serialization.
|
|
112
|
+
|
|
113
|
+
These are implementation instructions. They do not claim that a generated
|
|
114
|
+
application, consent implementation or live Analytics delivery has been tested.
|
|
115
|
+
|
|
116
|
+
## Delivery checklist
|
|
117
|
+
|
|
118
|
+
- [x] Replace the unpublished OAuth definition with the public Measurement ID
|
|
119
|
+
field and no-credential, shared configuration.
|
|
120
|
+
- [x] Make the editor distinguish configured settings from verified accounts,
|
|
121
|
+
including its automatic status checks and assistant setup request.
|
|
122
|
+
- [x] Remove the mismatched Admin reader and its direct package references,
|
|
123
|
+
tests and provider instructions without a compatibility alias.
|
|
124
|
+
- [x] Verify UI/CLI round-trip, invalid input, persistence and removal using
|
|
125
|
+
controlled fixtures. Prove configuration does not initiate provider requests.
|
|
126
|
+
- [x] Provide the framework setup instructions without claiming a generated
|
|
127
|
+
application or live Analytics traffic has been tested.
|
|
128
|
+
|
|
129
|
+
For this pre-release migration, existing Admin-reader users must explicitly
|
|
130
|
+
remove or replace that integration. An OAuth registration cannot be converted to
|
|
131
|
+
a Measurement ID. Remove its Env secrets only after checking no other slot uses
|
|
132
|
+
them; revoke any old grant through the existing application before removing its
|
|
133
|
+
runtime. Framework-native Admin API use remains a separate application concern.
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
## Optional JavaScript browser helper
|
|
137
|
+
|
|
138
|
+
Import `createGoogleAnalytics` from
|
|
139
|
+
`@jskit-ai/connectors-catalog/client/google-analytics` after browser hydration.
|
|
140
|
+
It owns one Measurement ID per page and loads the Google tag only after explicit
|
|
141
|
+
consent. Reusing the same instance/ID does not insert another script or config.
|
|
142
|
+
If the app already has a Google tag or Tag Manager, use that existing owner;
|
|
143
|
+
the helper refuses a competing installation. It does not build a consent banner.
|
|
144
|
+
|
|
145
|
+
```js
|
|
146
|
+
import { createGoogleAnalytics } from '@jskit-ai/connectors-catalog/client/google-analytics';
|
|
147
|
+
// Expose just this public field from the selected validated integration slot.
|
|
148
|
+
const analytics = createGoogleAnalytics({ measurementId: publicSettings.measurementId });
|
|
149
|
+
function consentChanged(allowed) {
|
|
150
|
+
analytics.setConsent(allowed);
|
|
151
|
+
if (allowed) analytics.pageView({ location: location.origin + location.pathname, title: document.title });
|
|
152
|
+
}
|
|
153
|
+
// Call from your framework's completed navigation hook, using redacted URLs.
|
|
154
|
+
function routeChanged(publicUrl, title) {
|
|
155
|
+
analytics.pageView({ location: publicUrl, title });
|
|
156
|
+
}
|
|
157
|
+
// Call once when the app has confirmed the business event, not on every render.
|
|
158
|
+
function bookingCompleted() { analytics.event('generate_lead'); }
|
|
159
|
+
// On app teardown/removal: unsubscribe the app's route/consent hooks, then:
|
|
160
|
+
// analytics.dispose();
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Before consent, no tag loads and events return false. Consent withdrawal sets
|
|
164
|
+
Google's per-property disable flag and stops this helper's events; it does not
|
|
165
|
+
delete existing cookies or erase events already sent. The app's consent manager
|
|
166
|
+
owns that policy. This is basic consent-gated loading, not an implementation of
|
|
167
|
+
advanced Consent Mode or advertising consent. Script blockers/network/CSP can
|
|
168
|
+
prevent delivery even after enabling; no Connected/verified claim is made.
|
|
169
|
+
|
|
170
|
+
For manual SPA page views, open the GA4 web stream's Enhanced measurement
|
|
171
|
+
settings, Page views, Show advanced settings, and disable **Page changes based
|
|
172
|
+
on browser history events**. The helper already sends `send_page_view: false`;
|
|
173
|
+
that alone does not disable Enhanced Measurement's independent history listener.
|
|
174
|
+
Use exactly one navigation hook. Repeated consecutive views of the same URL are
|
|
175
|
+
suppressed; navigating away and back produces another view.
|
|
176
|
+
|
|
177
|
+
For a conversion, emit a suitable recommended event such as `generate_lead` or
|
|
178
|
+
`purchase` only when the app confirms that action. In Analytics **Admin → Data
|
|
179
|
+
display → Events**, mark the event as a key event (create the named event there
|
|
180
|
+
if it has not arrived yet). Google Ads conversion import is separate. The helper
|
|
181
|
+
does not enforce paid entitlements, deduplicate business transactions or confirm
|
|
182
|
+
that Google received an event. Do not include emails, message text, sensitive
|
|
183
|
+
query parameters or other personal data in events or page URLs.
|
|
184
|
+
|
|
185
|
+
Disposal disables this ID and removes the inserted script element. Loaded
|
|
186
|
+
Google code cannot be unloaded and prior events cannot be recalled. Reload the
|
|
187
|
+
page to change properties or reinitialize after disposal. Removing the JSON slot
|
|
188
|
+
must also remove its wiring on the app's next configuration/build/deploy cycle.
|
|
189
|
+
A missing slot must not instantiate a tracker.
|
|
190
|
+
|
|
191
|
+
Other frameworks use their existing tag/Tag Manager support and native consent
|
|
192
|
+
and route hooks with the same public ID. They do not need the JavaScript helper
|
|
193
|
+
or a Node daemon. The app/framework remains the tracking owner; Vibe64 only edits
|
|
194
|
+
configuration and supplies guidance. See Google's
|
|
195
|
+
[manual page views](https://developers.google.com/analytics/devguides/collection/ga4/views)
|
|
196
|
+
and [disable flag](https://developers.google.com/tag-platform/security/guides/privacy).
|
|
197
|
+
|
|
198
|
+
**LIMITATIONS:** no reporting/Admin API, property provisioning, consent banner,
|
|
199
|
+
advanced Consent Mode, Ads conversion import or live delivery verification.
|
|
200
|
+
Example: a configured booking app can send a consented page view and generate_lead;
|
|
201
|
+
the owner still marks that event as a key event in Analytics and the framework
|
|
202
|
+
wires navigation/consent. Existing tag installations use their existing tools.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Google Docs setup and runtime
|
|
2
|
+
|
|
3
|
+
Documentation checked: 13 September 2026. Automated tests use simulated provider
|
|
4
|
+
responses and real private JSON state; live provider use is outside this delivery.
|
|
5
|
+
|
|
6
|
+
## Registration and manual setup
|
|
7
|
+
|
|
8
|
+
Follow all numbered steps in [Google registration setup](google-oauth.md).
|
|
9
|
+
For this connector, choose **Google Docs API** in APIs & Services → Library and enable
|
|
10
|
+
`docs.googleapis.com` in the selected Cloud project. Create a Web application client
|
|
11
|
+
with the exact backend callback URI. Set the client ID, secret reference and
|
|
12
|
+
callback URL reference in the same registration fields used by the CLI.
|
|
13
|
+
|
|
14
|
+
In Google Auth Platform → Data Access, select
|
|
15
|
+
`https://www.googleapis.com/auth/drive.file` for create-first access. Also enable
|
|
16
|
+
**Google Drive API** (`drive.googleapis.com`) for the blank-ID connection check.
|
|
17
|
+
For read-only access to an existing document, choose `documents.readonly` and
|
|
18
|
+
supply its Document ID. `documents` permits account-accessible document writes.
|
|
19
|
+
Changing selected permissions requires reconnecting. Use External plus explicit
|
|
20
|
+
test users while testing outside an eligible internal Workspace audience.
|
|
21
|
+
|
|
22
|
+
## Fields and useful fragment
|
|
23
|
+
|
|
24
|
+
Provider ID: `google-docs`. Import its provider from
|
|
25
|
+
`@jskit-ai/connectors-catalog/server/google-docs`. Display name, scopes, account mode,
|
|
26
|
+
Client ID/secret and callback references follow the shared field mapping.
|
|
27
|
+
Membership and project access are enforced by the host/application policy,
|
|
28
|
+
not by storing untrusted people IDs in application source.
|
|
29
|
+
|
|
30
|
+
Operations: `connection.verify`, `documents.get`, `documents.create`,
|
|
31
|
+
`documents.batchUpdate`. Verification input is optional.
|
|
32
|
+
|
|
33
|
+
- With the recommended `drive.file`, leave Document ID blank. Verification lists
|
|
34
|
+
one accessible Drive file's metadata; an empty file list is valid. This creates
|
|
35
|
+
nothing and proves neither Docs API enablement nor access to every document.
|
|
36
|
+
- With `documents.readonly` or `documents` alone, provide
|
|
37
|
+
`{ "documentId": "the_id_between_d_and_edit" }` to verify by reading the document.
|
|
38
|
+
Supplying a file ID does not share it with the app. `drive.file` grants access
|
|
39
|
+
only to app-created files or files explicitly selected/opened for this app.
|
|
40
|
+
Google Picker is app-owned wiring, not an embedded editor feature.
|
|
41
|
+
- `documents.get` includes all tabs using includeTabsContent=true. Preserve tab IDs,
|
|
42
|
+
document content and revisionId in the app; there is no result pagination.
|
|
43
|
+
- `documents.create` accepts `{title}` and returns a blank document. Store its ID
|
|
44
|
+
under the authorized application user, then call batchUpdate to add content.
|
|
45
|
+
Do not retry an uncertain creation without reconciling the user's files.
|
|
46
|
+
- `documents.batchUpdate` accepts documentId, 1–100 native Google Docs `requests`
|
|
47
|
+
within 1 MiB, and optional `requiredRevisionId`. Each request contains one native
|
|
48
|
+
operation object. Google validates operation names, resource-dependent indices,
|
|
49
|
+
styles and atomic batch semantics; this adapter validates the envelope, not a
|
|
50
|
+
duplicate version of Google's request schema. Errors remain errors, not success.
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
const created = await connections.invoke({ context, integrationId: "docs",
|
|
54
|
+
operation: "documents.create", input: { title: "Appointment notes" } });
|
|
55
|
+
await connections.invoke({ context, integrationId: "docs",
|
|
56
|
+
operation: "documents.batchUpdate", input: {
|
|
57
|
+
documentId: created.documentId,
|
|
58
|
+
requests: [{ insertText: { endOfSegmentLocation: {}, text: "Customer notes\n" } }]
|
|
59
|
+
} });
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
For a multi-tab document, read tabs first and target the intended tabId in each
|
|
63
|
+
native request. Use UTF-16 indices from Google's document representation; do not
|
|
64
|
+
calculate text positions by byte count. Native requests support insertion,
|
|
65
|
+
replacement/deletion, styles and tables. Fetch a current revision and supply
|
|
66
|
+
requiredRevisionId to reject an edit against a changed document, then refetch and
|
|
67
|
+
review a conflict rather than blindly retrying. The app renders content safely,
|
|
68
|
+
authorizes user/document mappings and reviews destructive edits.
|
|
69
|
+
|
|
70
|
+
Other frameworks use the same config and private Env references with their
|
|
71
|
+
native Google Docs client or HTTP. No JSKIT requirement or Vibe64 service applies.
|
|
72
|
+
|
|
73
|
+
**Limitations:** no visual editor, Google Picker component, sharing/Drive exports,
|
|
74
|
+
comment/suggestion review UI, autonomous editing agent or editor chat attachment.
|
|
75
|
+
For example, an app can create a booking report and format its text, but saving
|
|
76
|
+
this connector does not let Vibe64's coding assistant edit the report. Fixtures
|
|
77
|
+
prove request flow, not Google's live document rendering or approval.
|
|
78
|
+
|
|
79
|
+
References: [create](https://developers.google.com/workspace/docs/api/reference/rest/v1/documents/create),
|
|
80
|
+
[batchUpdate](https://developers.google.com/workspace/docs/api/reference/rest/v1/documents/batchUpdate),
|
|
81
|
+
[Drive list](https://developers.google.com/workspace/drive/api/reference/rest/v3/files/list).
|
|
82
|
+
|
|
83
|
+
## Automation and application setup
|
|
84
|
+
|
|
85
|
+
Classification: **assisted**, as detailed in the common Google guide. An
|
|
86
|
+
operator-authorized AI can check/create the Cloud project and enable
|
|
87
|
+
`docs.googleapis.com` with Service Usage or gcloud. It can prepare this connector's
|
|
88
|
+
JSON and callback/scope values. Web-client creation, branding, audience,
|
|
89
|
+
provider review and account consent remain the documented console/operator
|
|
90
|
+
steps; this adapter does not invent an API for them.
|
|
91
|
+
|
|
92
|
+
The application owns the Cloud project selection, registration, callback and
|
|
93
|
+
private secret bindings. It uses the same setup from a CLI or either editor.
|
|
94
|
+
Follow the common guide for rotation, revocation, domain changes and recovery.
|
|
95
|
+
Provider quotas belong to the selected Cloud project and resources; editor
|
|
96
|
+
subscription level does not allocate a shared registration.
|
|
97
|
+
|
|
98
|
+
## AI/CLI wiring
|
|
99
|
+
|
|
100
|
+
Use the file-store composition from the [connection pattern](../patterns/api-key-connection/PATTERN.md),
|
|
101
|
+
replace the API-key authentication with `oauth2` plus a registrationRef, and
|
|
102
|
+
register this provider. Use beginAuthorization / completeAuthorization instead
|
|
103
|
+
of connectApiKey, with an optional verification input as described above. The existing application
|
|
104
|
+
owns authenticated callback routes and its permission policy. Configuration,
|
|
105
|
+
OAuth, refresh, provider requests and storage remain library imports.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Google Drive setup and runtime
|
|
2
|
+
|
|
3
|
+
Documentation checked: 13 September 2026. Automated tests use simulated provider
|
|
4
|
+
responses and real private JSON state; live provider use is outside this delivery.
|
|
5
|
+
|
|
6
|
+
## Registration and manual setup
|
|
7
|
+
|
|
8
|
+
Follow all numbered steps in [Google registration setup](google-oauth.md).
|
|
9
|
+
For this connector, choose **Google Drive API** in APIs & Services → Library and enable
|
|
10
|
+
`drive.googleapis.com` in the selected Cloud project. Create a Web application client
|
|
11
|
+
with the exact backend callback URI. Set the client ID, secret reference and
|
|
12
|
+
callback URL reference in the same registration fields used by the CLI.
|
|
13
|
+
|
|
14
|
+
In Google Auth Platform → Data Access, select
|
|
15
|
+
`https://www.googleapis.com/auth/drive.file` (required by this connector). The
|
|
16
|
+
captured defaults also select `drive.appdata`, `drive.appfolder` and
|
|
17
|
+
`drive.readonly`; remove optional permissions your application does not need.
|
|
18
|
+
The UI exposes additional documented scopes for applications that need them;
|
|
19
|
+
selecting a scope does not implement every API it permits. Use External plus explicit
|
|
20
|
+
test users while testing outside an eligible internal Workspace audience.
|
|
21
|
+
|
|
22
|
+
## Fields and useful fragment
|
|
23
|
+
|
|
24
|
+
Provider ID: `google-drive`. Import its provider from
|
|
25
|
+
`@jskit-ai/connectors-catalog/server/google-drive`. Display name, scopes, account mode,
|
|
26
|
+
Client ID/secret and callback references follow the shared field mapping.
|
|
27
|
+
Membership and project access are enforced by the host/application policy,
|
|
28
|
+
not by storing untrusted people IDs in application source.
|
|
29
|
+
|
|
30
|
+
Verification input: `{}`. Connection checks list metadata without modifying files.
|
|
31
|
+
|
|
32
|
+
| Operation | Inputs and result |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `files.list` | pageSize (1–1000), pageToken, q, optional driveId; returns files and nextPageToken. driveId sets shared-drive corpus/flags. |
|
|
35
|
+
| `files.get` | fileId; returns metadata including parents, capabilities, exportLinks and webViewLink where Google supplies them. |
|
|
36
|
+
| `files.download` | fileId for a stored binary/text file; returns bodyBase64, size and contentType, up to 8 MiB. |
|
|
37
|
+
| `files.export` | fileId of a Workspace document and supported mimeType, e.g. application/pdf; same bounded binary result. Google enforces format and its own export limits. |
|
|
38
|
+
| `files.create` | name, optional parentId, folder=true for a folder; creates metadata, not uploaded content. |
|
|
39
|
+
| `files.upload` | name, contentType, standard padded bodyBase64, optional parentId for a new file or fileId to replace one; one native multipart request, max 5 MB input. Returns file metadata. |
|
|
40
|
+
| `files.update` | fileId and at least one of name, description or trashed; explicit true moves to trash, false restores where permitted. |
|
|
41
|
+
|
|
42
|
+
`drive.file` permits app-created or explicitly selected files. A copied ID alone
|
|
43
|
+
is not a Google Picker grant. Broad `drive.readonly` can read accessible content;
|
|
44
|
+
metadata-only scopes cannot download it. Writers need drive.file/drive or the
|
|
45
|
+
relevant metadata scope **and** actual file sharing permissions. Reconnect after
|
|
46
|
+
adding scopes. File capabilities and Google errors remain authoritative.
|
|
47
|
+
|
|
48
|
+
The app resolves the authenticated user's connection and allowed file IDs before
|
|
49
|
+
invoking operations. Never expose all file contents through an unauthenticated
|
|
50
|
+
proxy. Decode bodyBase64 in the framework, preserve its MIME type, and choose safe
|
|
51
|
+
download/content-disposition behavior; do not render arbitrary returned HTML.
|
|
52
|
+
Treat transfer failures as failures. A timed-out upload may have succeeded: inspect
|
|
53
|
+
Drive before retrying to avoid duplicate files or overwritten content. Replacing
|
|
54
|
+
an existing file explicitly replaces its name and data. Moving an existing file
|
|
55
|
+
between folders uses native addParents/removeParents, not upload parentId.
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
const file = await connections.invoke({ context, integrationId: "drive",
|
|
59
|
+
operation: "files.upload", input: { name: "report.txt", contentType: "text/plain",
|
|
60
|
+
bodyBase64: Buffer.from("Appointment notes").toString("base64") } });
|
|
61
|
+
const downloaded = await connections.invoke({ context, integrationId: "drive",
|
|
62
|
+
operation: "files.download", input: { fileId: file.id } });
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Other frameworks use native Drive clients/HTTP with the same project config and
|
|
66
|
+
private Env. For larger transfers use native resumable upload/streaming, not a
|
|
67
|
+
larger JSON/base64 payload. No Vibe64 gateway receives or stores the content.
|
|
68
|
+
|
|
69
|
+
**Limitations:** no sync/watch service, embedded Picker, large/resumable transfer,
|
|
70
|
+
sharing administration, permanent deletion, revision history or Workspace-format
|
|
71
|
+
conversion on upload. Activity and app-data scopes do not implement those APIs.
|
|
72
|
+
For example, a generated app can upload a booking report and offer a PDF export,
|
|
73
|
+
but it cannot mirror a whole shared drive automatically. Editor assistant access
|
|
74
|
+
is deferred. Controlled fixtures do not prove live Google sharing or file export.
|
|
75
|
+
|
|
76
|
+
References: [uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads),
|
|
77
|
+
[downloads and exports](https://developers.google.com/workspace/drive/api/guides/manage-downloads).
|
|
78
|
+
|
|
79
|
+
The first read must succeed before Connected is returned. Invalid resource
|
|
80
|
+
identifiers fail before opening consent. Denied scopes, wrong account context,
|
|
81
|
+
replayed callbacks and provider rate limits are covered by the automated tests.
|
|
82
|
+
See the [official operation reference](https://developers.google.com/workspace/drive/api/reference/rest/v3/files/list) for the response and resource
|
|
83
|
+
permission requirements; the implementation also checks Google's public API
|
|
84
|
+
discovery document for request paths and supported scope strings.
|
|
85
|
+
|
|
86
|
+
## Automation and application setup
|
|
87
|
+
|
|
88
|
+
Classification: **assisted**, as detailed in the common Google guide. An
|
|
89
|
+
operator-authorized AI can check/create the Cloud project and enable
|
|
90
|
+
`drive.googleapis.com` with Service Usage or gcloud. It can prepare this connector's
|
|
91
|
+
JSON and callback/scope values. Web-client creation, branding, audience,
|
|
92
|
+
provider review and account consent remain the documented console/operator
|
|
93
|
+
steps; this adapter does not invent an API for them.
|
|
94
|
+
|
|
95
|
+
The application owns the Cloud project selection, registration, callback and
|
|
96
|
+
private secret bindings. It uses the same setup from a CLI or either editor.
|
|
97
|
+
Follow the common guide for rotation, revocation, domain changes and recovery.
|
|
98
|
+
Provider quotas belong to the selected Cloud project and resources; editor
|
|
99
|
+
subscription level does not allocate a shared registration.
|
|
100
|
+
|
|
101
|
+
## AI/CLI wiring
|
|
102
|
+
|
|
103
|
+
Use the file-store composition from the [connection pattern](../patterns/api-key-connection/PATTERN.md),
|
|
104
|
+
replace the API-key authentication with `oauth2` plus a registrationRef, and
|
|
105
|
+
register this provider. Use beginAuthorization / completeAuthorization instead
|
|
106
|
+
of connectApiKey, with the verification input above. The existing application
|
|
107
|
+
owns authenticated callback routes and its permission policy. Configuration,
|
|
108
|
+
OAuth, refresh, provider requests and storage remain library imports.
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Google Maps Platform
|
|
2
|
+
|
|
3
|
+
Import `googleMapsPlatformProvider` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/server/google-maps-platform`. The runtime uses Geocoding v3, Places API (New) and Routes API. An optional
|
|
5
|
+
browser composition helper uses the Google Maps JavaScript SDK loaded by the app.
|
|
6
|
+
|
|
7
|
+
## Manual provider setup
|
|
8
|
+
|
|
9
|
+
1. Sign into Google Cloud Console and select or create the project that will
|
|
10
|
+
own this application's usage. Link billing for Maps usage.
|
|
11
|
+
2. Open **APIs & Services → Library**, find **Geocoding API**, and choose
|
|
12
|
+
**Enable**. Enable browser APIs separately if the app will render maps.
|
|
13
|
+
[API setup](https://developers.google.com/maps/documentation/geocoding/guides-v3/get-api-key),
|
|
14
|
+
[enabling services](https://docs.cloud.google.com/service-usage/docs/enable-disable).
|
|
15
|
+
3. Open **APIs & Services → Credentials → Create credentials → API key**.
|
|
16
|
+
Name the key for server geocoding. Edit it, restrict allowed APIs to
|
|
17
|
+
**Geocoding API**, and configure suitable server IP restrictions. For the
|
|
18
|
+
additional operations, enable **Places API (New)** and **Routes API** in Library
|
|
19
|
+
and allow those APIs on this server key as well. Save.
|
|
20
|
+
4. Store that key as `GOOGLE_MAPS_SERVER_KEY`. In Vibe64, add Google Maps
|
|
21
|
+
Platform and enter `env:GOOGLE_MAPS_SERVER_KEY` in **Server API key reference**.
|
|
22
|
+
5. For browser maps, create a different key, enable only the browser APIs the
|
|
23
|
+
app uses, and apply **Websites** restrictions for the deployed and preview
|
|
24
|
+
origins. Store it as `GOOGLE_MAPS_BROWSER_KEY`; enter its optional reference.
|
|
25
|
+
Server keys must not use browser-referrer restrictions or be published in
|
|
26
|
+
client code. [Key restrictions](https://developers.google.com/maps/api-security-best-practices).
|
|
27
|
+
6. For advanced map markers enable **Maps JavaScript API**, open **Google Maps
|
|
28
|
+
Platform → Map management → Create map ID**, select **JavaScript**, create it
|
|
29
|
+
and copy its public ID into **Map ID**. `DEMO_MAP_ID` is for development only.
|
|
30
|
+
7. Open **Google Maps Platform → Quotas**, select the API and set suitable
|
|
31
|
+
limits. Save source configuration; actual connection verification is a
|
|
32
|
+
separate geocoding request and can incur usage charges. After saving, use
|
|
33
|
+
**Set credential in Env** for `GOOGLE_MAPS_SERVER_KEY`. Save the optional
|
|
34
|
+
browser key separately in Env. Return, enter **Verification address** and
|
|
35
|
+
choose **Connect account**.
|
|
36
|
+
[Quotas and billing](https://developers.google.com/maps/documentation/geocoding/usage-and-billing).
|
|
37
|
+
|
|
38
|
+
## Portable configuration and runtime
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"schemaVersion": 1,
|
|
43
|
+
"registrations": {},
|
|
44
|
+
"integrations": {
|
|
45
|
+
"maps": {
|
|
46
|
+
"provider": "google-maps-platform",
|
|
47
|
+
"accountMode": "shared",
|
|
48
|
+
"scopes": [],
|
|
49
|
+
"authentication": {
|
|
50
|
+
"method": "api-key",
|
|
51
|
+
"secretRef": "env:GOOGLE_MAPS_SERVER_KEY"
|
|
52
|
+
},
|
|
53
|
+
"settings": { "browserKeyRef": "env:GOOGLE_MAPS_BROWSER_KEY" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Use the [API-key source pattern](../patterns/api-key-connection/PATTERN.md)
|
|
60
|
+
with this provider, the application's authorization policy and its reference
|
|
61
|
+
resolver. File-backed state remains outside source. No database or editor
|
|
62
|
+
process is required for CLI use.
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
await connections.connectApiKey({
|
|
66
|
+
context, integrationId: "maps",
|
|
67
|
+
verificationInput: { address: "Perth WA, Australia" }
|
|
68
|
+
});
|
|
69
|
+
const locations = await connections.invoke({
|
|
70
|
+
context, integrationId: "maps", operation: "geocoding.forward",
|
|
71
|
+
input: { address: "Perth WA, Australia", language: "en", region: "au" }
|
|
72
|
+
});
|
|
73
|
+
const addresses = await connections.invoke({
|
|
74
|
+
context, integrationId: "maps", operation: "geocoding.reverse",
|
|
75
|
+
input: { latitude: -31.95, longitude: 115.86 }
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Supply the verification address deliberately. There is no hidden default query;
|
|
80
|
+
an omitted address fails before HTTP transport. Verification checks server
|
|
81
|
+
geocoding only. It never resolves or verifies the optional browser key. An app
|
|
82
|
+
that renders browser maps resolves and publishes that separate key explicitly.
|
|
83
|
+
Clearing the optional reference removes it from saved source.
|
|
84
|
+
|
|
85
|
+
Forward input accepts an address or plus code, optional language and region
|
|
86
|
+
bias. Reverse input accepts latitude/longitude and optional language. The
|
|
87
|
+
adapter preserves the provider result, including components, geometry and
|
|
88
|
+
partial-match indicators. It accepts `ZERO_RESULTS` with an empty list as a
|
|
89
|
+
successful lookup, without claiming an address exists.
|
|
90
|
+
[Forward response](https://developers.google.com/maps/documentation/geocoding/guides-v3/requests-geocoding),
|
|
91
|
+
[reverse response](https://developers.google.com/maps/documentation/geocoding/guides-v3/requests-reverse-geocoding).
|
|
92
|
+
|
|
93
|
+
Local input limits are 1,000 address characters, latitude ±90 and longitude ±180.
|
|
94
|
+
Language codes and two-letter region codes receive syntax checks; the provider
|
|
95
|
+
decides availability. Advanced filters, extra computations and v4 operations
|
|
96
|
+
are outside this initial adapter.
|
|
97
|
+
|
|
98
|
+
HTTP-200 `OVER_QUERY_LIMIT`, `REQUEST_DENIED`, `INVALID_REQUEST` and
|
|
99
|
+
`UNKNOWN_ERROR` responses become safe failures. `OVER_DAILY_LIMIT` can mean
|
|
100
|
+
invalid key, missing billing or a usage cap, so its error asks the operator to
|
|
101
|
+
check all three. Provider diagnostic text is not echoed. Ordinary non-2xx errors
|
|
102
|
+
use the common transport handling. An HTTP 401 marks an existing connection
|
|
103
|
+
as requiring reconnection.
|
|
104
|
+
[Status definitions](https://developers.google.com/maps/documentation/geocoding/guides-v3/requests-geocoding).
|
|
105
|
+
|
|
106
|
+
## API provisioning and application ownership
|
|
107
|
+
|
|
108
|
+
An authorized AI can prepare Cloud project creation and API enablement with
|
|
109
|
+
Resource Manager/Service Usage or `gcloud`. Account access, billing authority
|
|
110
|
+
and provider terms remain operator decisions.
|
|
111
|
+
[Project and service preparation](https://docs.cloud.google.com/service-usage/docs/enable-disable).
|
|
112
|
+
|
|
113
|
+
The API Keys API can create a key at
|
|
114
|
+
`POST /v2/projects/{projectNumber}/locations/global/keys`, configure restrictions,
|
|
115
|
+
and retrieve its key string. Poll the returned operation to completion before
|
|
116
|
+
using the result. This requires authorized Cloud credentials; a Maps API key
|
|
117
|
+
cannot create sibling keys. Save resulting values in secret bindings, not
|
|
118
|
+
configuration files or command output logs. This package does not execute
|
|
119
|
+
provisioning. [API key management](https://docs.cloud.google.com/api-keys/docs/create-manage-api-keys).
|
|
120
|
+
|
|
121
|
+
The application owner provisions its Cloud project and supplies the appropriate
|
|
122
|
+
keys. Two differently named keys in one project still share its project quota.
|
|
123
|
+
Billing and usage limits remain the application owner's responsibilities.
|
|
124
|
+
[Project quotas](https://developers.google.com/maps/documentation/geocoding/usage-and-billing).
|
|
125
|
+
|
|
126
|
+
Google additionally recommends separating client and server usage into projects
|
|
127
|
+
when their quota needs differ. Choose the application's projects according to
|
|
128
|
+
its browser/server usage. Website restrictions use
|
|
129
|
+
the application domain, such as its hosting subdomain or custom domain. Server
|
|
130
|
+
restrictions use actual outbound IPs, including any configured proxy egress. A per-user
|
|
131
|
+
editor VM URL does not substitute for either. These API keys are unrelated to
|
|
132
|
+
Google login or OAuth callback registration.
|
|
133
|
+
[Client/server restrictions](https://developers.google.com/maps/api-security-best-practices).
|
|
134
|
+
|
|
135
|
+
## Focused evidence
|
|
136
|
+
|
|
137
|
+
Six fixture tests cover explicit verification input, file restart, rotation,
|
|
138
|
+
owner isolation, separate browser references, input bounds, empty responses,
|
|
139
|
+
HTTP-200 errors and transport failures. Editor browser tests cover both
|
|
140
|
+
reference fields, invalid values, reload and optional-field removal. The runtime
|
|
141
|
+
does not automatically retain geocoding results; applications own display and
|
|
142
|
+
retention behavior under the provider's requirements. No live provider use or
|
|
143
|
+
sample-app generation is part of this evidence.
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
## Places, routes and browser composition
|
|
147
|
+
|
|
148
|
+
- `places.search`: textQuery, optional pageSize (1–20, default 10), pageToken and
|
|
149
|
+
languageCode. Keep the query the same for subsequent pages. Returns places and
|
|
150
|
+
nextPageToken; an absent places array is a legitimate empty result.
|
|
151
|
+
- `places.get`: placeId. Both operations request fixed ID, display name, formatted
|
|
152
|
+
address, location, attribution and Google Maps URI fields. These are **billable
|
|
153
|
+
fields** (including Pro-tier fields for Text Search); no free-usage assumption
|
|
154
|
+
or wildcard mask is made. Review current pricing and show required attribution.
|
|
155
|
+
- `routes.compute`: originLatitude/originLongitude and destinationLatitude/
|
|
156
|
+
destinationLongitude, with DRIVE (default), WALK or BICYCLE. Returns distance,
|
|
157
|
+
duration and GeoJSON line coordinates. An absent routes array means no route;
|
|
158
|
+
don't display zero minutes as a successful trip. No traffic, waypoint ordering
|
|
159
|
+
or turn-by-turn navigation system is supplied.
|
|
160
|
+
|
|
161
|
+
The app authorizes/rate-limits requests and resolves only its server key for
|
|
162
|
+
backend calls. Places/Routes use a header key; the optional browser key is never
|
|
163
|
+
resolved by these operations. Restrict each key and enabled APIs separately.
|
|
164
|
+
Geocoding verification does not establish that Places, Routes or browser maps work.
|
|
165
|
+
|
|
166
|
+
For JavaScript frontends import `mountGoogleMap` from
|
|
167
|
+
`@jskit-ai/connectors-catalog/client/google-maps-platform`. First use the
|
|
168
|
+
framework's normal [Google SDK loader](https://developers.google.com/maps/documentation/javascript/load-maps-js-api)
|
|
169
|
+
with the separately resolved **public browser key**. Wait for SDK readiness and
|
|
170
|
+
surface loading/key/billing errors. Give the map container a nonzero height.
|
|
171
|
+
Resolve `settings.mapId` as public text. Never pass the server key to this helper.
|
|
172
|
+
|
|
173
|
+
```js
|
|
174
|
+
// After the app's loader resolves Google Maps SDK readiness:
|
|
175
|
+
const mounted = await mountGoogleMap({
|
|
176
|
+
element: document.querySelector("#map"), maps: google.maps,
|
|
177
|
+
center: { lat: -31.95, lng: 115.86 }, zoom: 12,
|
|
178
|
+
mapId: configuredMapId,
|
|
179
|
+
markers: [{ position: { lat: -31.95, lng: 115.86 }, title: "DogAndGroom" }],
|
|
180
|
+
path: routeCoordinates.map(([lng, lat]) => ({ lat, lng })),
|
|
181
|
+
signal: componentAbortController.signal
|
|
182
|
+
});
|
|
183
|
+
// On component removal:
|
|
184
|
+
mounted.dispose();
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
`routeCoordinates` is `routes[0].polyline.geoJsonLinestring.coordinates` when a
|
|
188
|
+
route exists; pass [] otherwise. The helper creates a native interactive map,
|
|
189
|
+
AdvancedMarkerElement markers and an optional route polyline. Marker titles are
|
|
190
|
+
text, not HTML. Limits are 100 markers/10,000 route points. It validates inputs,
|
|
191
|
+
waits for map/marker libraries and removes overlays/listeners on disposal or
|
|
192
|
+
abort. The application owns the container and must dispose before remounting;
|
|
193
|
+
it also owns place selection, viewport/route updates and readable error/empty UI.
|
|
194
|
+
No SDK or API request is made before the app explicitly loads and invokes it.
|
|
195
|
+
|
|
196
|
+
Other frameworks use their own browser/native Google Maps tools and the same
|
|
197
|
+
config/Env split; they do not need this JavaScript helper or a Vibe64 service.
|
|
198
|
+
Keep Google attribution and data-retention/display requirements intact.
|
|
199
|
+
|
|
200
|
+
**Limitations:** no embedded map designer, SDK loader, autocomplete/session-token
|
|
201
|
+
widget, Places photos/reviews, route optimization, transit or navigation product.
|
|
202
|
+
For example, a generated app can find a groomer and display its location and a
|
|
203
|
+
route, but cannot provide live voice navigation. Editor assistant attachment is
|
|
204
|
+
deferred. Controlled HTTP/SDK fixtures do not prove live tiles, routes or billing.
|
|
205
|
+
|
|
206
|
+
Sources: [Places Text Search](https://developers.google.com/maps/documentation/places/web-service/text-search),
|
|
207
|
+
[Routes reference](https://developers.google.com/maps/documentation/routes/reference/rest/v2/TopLevel/computeRoutes),
|
|
208
|
+
[advanced markers](https://developers.google.com/maps/documentation/javascript/advanced-markers/start).
|