@jini-ai/agent-plugins 0.6.17 → 0.6.19
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 +29 -1
- package/NOTICE +14 -0
- package/README.md +35 -14
- package/charts-echarts/plugin.json +39 -0
- package/charts-echarts/skills/charts-echarts/SKILL.md +110 -0
- package/charts-recharts/plugin.json +32 -0
- package/charts-recharts/skills/charts-recharts/SKILL.md +108 -0
- package/cloudflare/NOTES.md +16 -0
- package/cloudflare/form-destinations/cloudflare-d1.mjs +9 -0
- package/cloudflare/lib/api.mjs +96 -0
- package/cloudflare/lib/assets.mjs +65 -0
- package/cloudflare/lib/dns.mjs +32 -0
- package/cloudflare/lib/domain-inventory.mjs +61 -0
- package/cloudflare/lib/domain-status.mjs +48 -0
- package/cloudflare/lib/domains.mjs +95 -0
- package/cloudflare/lib/forms.mjs +254 -0
- package/cloudflare/lib/pages-upload.mjs +51 -0
- package/cloudflare/lib/target.mjs +165 -0
- package/cloudflare/lib/workers-upload.mjs +48 -0
- package/cloudflare/lib/zones.mjs +25 -0
- package/cloudflare/mcp.json +4 -0
- package/cloudflare/plugin.json +96 -0
- package/cloudflare/skills/cloudflare/SKILL.md +57 -0
- package/cloudflare/skills/cloudflare/references/domains.md +31 -0
- package/cloudflare/skills/cloudflare/references/pages.md +18 -0
- package/cloudflare/skills/cloudflare/references/permissions.md +29 -0
- package/cloudflare/skills/cloudflare/references/troubleshooting.md +20 -0
- package/cloudflare/skills/cloudflare/references/workers.md +42 -0
- package/cloudflare/targets/cloudflare-pages.mjs +12 -0
- package/cloudflare/targets/cloudflare-workers.mjs +17 -0
- package/cloudflare/tovu-consent.json +6 -0
- package/cloudflare/tovu-deploy-targets.json +630 -0
- package/cloudflare/tovu-form-destinations.json +12 -0
- package/cloudflare/worker/forms-receiver.mjs +249 -0
- package/composio/mcp.json +10 -0
- package/composio/plugin.json +68 -0
- package/composio/skills/composio/SKILL.md +85 -0
- package/dist/core/identity-namespace.d.ts +12 -0
- package/dist/core/identity-namespace.js +20 -0
- package/dist/folder-zip-node.js +29 -7
- package/dist/lifecycle/bundled-digests.js +4 -3
- package/dist/lifecycle/install.d.ts +7 -0
- package/dist/lifecycle/install.js +45 -3
- package/dist/lifecycle/manifest.d.ts +2 -2
- package/dist/lifecycle/manifest.js +5 -3
- package/dist/lifecycle/node.js +2 -0
- package/dist/lifecycle/persistent-state.js +1 -1
- package/dist/lifecycle/ports.d.ts +8 -0
- package/dist/lifecycle/seed-bundled.js +4 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/manifest.js +3 -2
- package/fly/deploy-configs/fly.mjs +115 -0
- package/fly/deploy-ops/fly.mjs +102 -0
- package/fly/mcp.json +4 -0
- package/fly/plugin.json +81 -0
- package/fly/scripts/render-deploy-workflow.mjs +150 -0
- package/fly/skills/fly/SKILL.md +43 -0
- package/fly/skills/fly/references/fly-deploy.template.yml +117 -0
- package/fly/skills/fly/references/fly.template.toml +81 -0
- package/fly/tovu-credential-schemes.json +11 -0
- package/fly/tovu-deploy-configs.json +21 -0
- package/fly/tovu-deploy-ops.json +14 -0
- package/github/deploy-ops/github-actions.mjs +164 -0
- package/github/deployments/github.mjs +415 -0
- package/github/mcp.json +4 -0
- package/github/plugin.json +105 -0
- package/github/skills/github/SKILL.md +249 -0
- package/github/skills/github/references/actions.md +224 -0
- package/github/skills/github/references/auth-and-tokens.md +140 -0
- package/github/skills/github/references/repo-files.md +135 -0
- package/github/skills/github/references/site-backup.md +159 -0
- package/github/skills/github/references/source-control.md +123 -0
- package/github/source-control/backup-push.mjs +242 -0
- package/github/source-control/commit-site.mjs +459 -0
- package/github/source-control/github.mjs +93 -0
- package/github/source-control/write-files.mjs +468 -0
- package/github/tovu-deploy-ops.json +13 -0
- package/github/tovu-source-control.json +117 -0
- package/github-pages/NOTES.md +19 -0
- package/github-pages/mcp.json +4 -0
- package/github-pages/plugin.json +48 -0
- package/github-pages/skills/github-pages/SKILL.md +44 -0
- package/github-pages/targets/github-pages.mjs +543 -0
- package/github-pages/tovu-deploy-targets.json +327 -0
- package/google-login/exports/google-g.svg +1 -0
- package/google-login/exports/sign-in-button.css +68 -0
- package/google-login/exports/sign-in-button.html +4 -0
- package/google-login/mcp.json +4 -0
- package/google-login/plugin.json +59 -0
- package/google-login/skills/google-login/SKILL.md +96 -0
- package/google-login/tovu-login-providers.json +21 -0
- package/google-workspace/README.md +132 -0
- package/google-workspace/form-destinations/README.md +87 -0
- package/google-workspace/form-destinations/dedupe.mjs +43 -0
- package/google-workspace/form-destinations/delivery-result.mjs +69 -0
- package/google-workspace/form-destinations/mapping.mjs +152 -0
- package/google-workspace/form-destinations/sheets.mjs +202 -0
- package/google-workspace/lib/auth.mjs +81 -0
- package/google-workspace/lib/drive-files.mjs +54 -0
- package/google-workspace/lib/form-destination-settings.mjs +72 -0
- package/google-workspace/lib/http.mjs +168 -0
- package/google-workspace/lib/picker-flow.mjs +171 -0
- package/google-workspace/lib/picker-selection.mjs +107 -0
- package/google-workspace/lib/product-state.mjs +93 -0
- package/google-workspace/lib/request-policy.mjs +163 -0
- package/google-workspace/lib/sheets-a1.mjs +79 -0
- package/google-workspace/lib/sheets-admin-csv.mjs +82 -0
- package/google-workspace/lib/sheets-admin-request-kinds.mjs +183 -0
- package/google-workspace/lib/sheets-client.mjs +286 -0
- package/google-workspace/lib/surface-actions.mjs +107 -0
- package/google-workspace/mcp.json +4 -0
- package/google-workspace/plugin.json +77 -0
- package/google-workspace/products.json +12 -0
- package/google-workspace/skills/google-workspace/SKILL.md +82 -0
- package/google-workspace/skills/google-workspace/references/connection.md +102 -0
- package/google-workspace/skills/google-workspace/references/form-delivery.md +50 -0
- package/google-workspace/skills/google-workspace/references/sheets.md +149 -0
- package/google-workspace/skills/google-workspace/references/troubleshooting.md +31 -0
- package/google-workspace/tools/account-info.mjs +18 -0
- package/google-workspace/tools/sheets/README.md +54 -0
- package/google-workspace/tools/sheets/copy-tab.mjs +23 -0
- package/google-workspace/tools/sheets/copy.mjs +23 -0
- package/google-workspace/tools/sheets/create.mjs +35 -0
- package/google-workspace/tools/sheets/find-replace.mjs +38 -0
- package/google-workspace/tools/sheets/find.mjs +52 -0
- package/google-workspace/tools/sheets/get-by-data-filter.mjs +23 -0
- package/google-workspace/tools/sheets/get.mjs +22 -0
- package/google-workspace/tools/sheets/values-append.mjs +27 -0
- package/google-workspace/tools/sheets/values-batch-clear.mjs +20 -0
- package/google-workspace/tools/sheets/values-batch-get.mjs +20 -0
- package/google-workspace/tools/sheets/values-batch-update.mjs +29 -0
- package/google-workspace/tools/sheets/values-by-data-filter.mjs +62 -0
- package/google-workspace/tools/sheets/values-clear.mjs +20 -0
- package/google-workspace/tools/sheets/values-get.mjs +21 -0
- package/google-workspace/tools/sheets/values-update.mjs +26 -0
- package/google-workspace/tools/sheets-admin/README.md +45 -0
- package/google-workspace/tools/sheets-admin/basic-filter.mjs +32 -0
- package/google-workspace/tools/sheets-admin/batch-update.mjs +25 -0
- package/google-workspace/tools/sheets-admin/developer-metadata.mjs +28 -0
- package/google-workspace/tools/sheets-admin/export-csv.mjs +67 -0
- package/google-workspace/tools/sheets-admin/filter-views.mjs +38 -0
- package/google-workspace/tools/sheets-admin/format.mjs +70 -0
- package/google-workspace/tools/sheets-admin/named-ranges.mjs +42 -0
- package/google-workspace/tools/sheets-admin/open-existing.mjs +34 -0
- package/google-workspace/tools/sheets-admin/protected-ranges-get.mjs +18 -0
- package/google-workspace/tools/sheets-admin/sort.mjs +18 -0
- package/google-workspace/tools/sheets-admin/tab-modify.mjs +36 -0
- package/google-workspace/tovu-admin-surfaces.json +63 -0
- package/google-workspace/tovu-agent-tools.json +1178 -0
- package/google-workspace/tovu-connections.json +35 -0
- package/google-workspace/tovu-form-destinations.json +10 -0
- package/google-workspace/ui/README.md +73 -0
- package/google-workspace/ui/connection-panel.handler.mjs +167 -0
- package/google-workspace/ui/connection-panel.html +17 -0
- package/google-workspace/ui/connection-panel.mjs +189 -0
- package/google-workspace/ui/connection-view.mjs +120 -0
- package/google-workspace/ui/destination-panel.handler.mjs +106 -0
- package/google-workspace/ui/destination-panel.html +17 -0
- package/google-workspace/ui/destination-panel.mjs +150 -0
- package/google-workspace/ui/dom.mjs +140 -0
- package/google-workspace/ui/panel.css +170 -0
- package/google-workspace/ui/picker-flow.mjs +87 -0
- package/google-workspace/ui/picker-view.mjs +44 -0
- package/google-workspace/ui/picker.handler.mjs +56 -0
- package/google-workspace/ui/picker.html +17 -0
- package/google-workspace/ui/picker.mjs +88 -0
- package/google-workspace/ui/surface-client.mjs +227 -0
- package/higgsfield-media/mcp.json +9 -0
- package/higgsfield-media/plugin.json +109 -0
- package/higgsfield-media/skills/higgsfield-media/SKILL.md +325 -0
- package/higgsfield-media/skills/higgsfield-media/references/failure-modes.md +116 -0
- package/higgsfield-media/skills/higgsfield-media/references/models-and-plan-gates.md +142 -0
- package/jev/mcp.json +4 -0
- package/jev/plugin.json +44 -0
- package/jev/skills/jev/SKILL.md +308 -0
- package/jev/skills/jev/references/cookbooks.md +197 -0
- package/jev/skills/jev/references/jaggedness.md +135 -0
- package/jev/skills/jev/references/javascript-sdk.md +146 -0
- package/jev/skills/jev/references/patterns.md +123 -0
- package/jev/skills/jev/references/primitives-reference.md +187 -0
- package/langfuse/plugin.json +22 -0
- package/meilisearch/mcp.json +4 -0
- package/meilisearch/plugin.json +54 -0
- package/meilisearch/providers/meilisearch.mjs +651 -0
- package/meilisearch/skills/meilisearch/SKILL.md +43 -0
- package/meilisearch/tovu-search-providers.json +10 -0
- package/netlify/NOTES.md +13 -0
- package/netlify/mcp.json +4 -0
- package/netlify/plugin.json +47 -0
- package/netlify/skills/netlify/SKILL.md +39 -0
- package/netlify/targets/netlify.mjs +384 -0
- package/netlify/tovu-consent.json +6 -0
- package/netlify/tovu-deploy-targets.json +163 -0
- package/opentelemetry/mcp.json +4 -0
- package/opentelemetry/plugin.json +52 -0
- package/opentelemetry/skills/opentelemetry/SKILL.md +39 -0
- package/package.json +161 -6
- package/posthog/mcp.json +4 -0
- package/posthog/plugin.json +46 -0
- package/posthog/skills/posthog/SKILL.md +36 -0
- package/railway/deploy-configs/railway.mjs +135 -0
- package/railway/deploy-ops/railway.mjs +167 -0
- package/railway/mcp.json +4 -0
- package/railway/plugin.json +45 -0
- package/railway/skills/railway/SKILL.md +66 -0
- package/railway/tovu-deploy-configs.json +16 -0
- package/railway/tovu-deploy-ops.json +11 -0
- package/render/deploy-configs/render.mjs +141 -0
- package/render/deploy-ops/render.mjs +152 -0
- package/render/mcp.json +4 -0
- package/render/plugin.json +47 -0
- package/render/skills/render/SKILL.md +63 -0
- package/render/tovu-deploy-configs.json +16 -0
- package/render/tovu-deploy-ops.json +11 -0
- package/resend/NOTES.md +52 -0
- package/resend/adapters/resend.mjs +161 -0
- package/resend/lib/domains.mjs +137 -0
- package/resend/lib/errors.mjs +25 -0
- package/resend/lib/feedback.mjs +118 -0
- package/resend/mcp.json +13 -0
- package/resend/plugin.json +192 -0
- package/resend/skills/resend/SKILL.md +107 -0
- package/resend/tovu-mail-adapters.json +22 -0
- package/s3-compatible/NOTES.md +11 -0
- package/s3-compatible/mcp.json +4 -0
- package/s3-compatible/object-stores/s3-compatible.mjs +287 -0
- package/s3-compatible/plugin.json +56 -0
- package/s3-compatible/skills/s3-compatible/SKILL.md +39 -0
- package/s3-compatible/targets/s3-compatible.mjs +1054 -0
- package/s3-compatible/tovu-deploy-targets.json +432 -0
- package/s3-compatible/tovu-object-stores.json +29 -0
- package/sentry/mcp.json +4 -0
- package/sentry/plugin.json +49 -0
- package/sentry/skills/sentry/SKILL.md +34 -0
- package/shopify/mcp.json +4 -0
- package/shopify/plugin.json +22 -0
- package/shopify/skills/shopify/SKILL.md +103 -0
- package/shopify/skills/shopify/references/catalog-sync.md +74 -0
- package/shopify/skills/shopify/references/domains.md +26 -0
- package/shopify/skills/shopify/references/live-storefront.md +34 -0
- package/shopify/skills/shopify/references/storefront-snippets.md +21 -0
- package/site-compliance/mcp.json +4 -0
- package/site-compliance/plugin.json +34 -0
- package/site-compliance/skills/site-compliance/SKILL.md +220 -0
- package/site-compliance/skills/site-compliance/references/ccpa-cpra.md +115 -0
- package/site-compliance/skills/site-compliance/references/gdpr-eu-uk.md +143 -0
- package/site-compliance/skills/site-compliance/references/wcag-2-2.md +129 -0
- package/site-import/mcp.json +4 -0
- package/site-import/plugin.json +41 -0
- package/site-import/skills/site-import/SKILL.md +232 -0
- package/site-import/skills/site-import/references/content-mapping.md +166 -0
- package/site-import/skills/site-import/references/discovery-and-classification.md +117 -0
- package/site-import/skills/site-import/references/theme-extraction.md +34 -0
- package/slide-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
- package/slide-design/mcp.json +4 -0
- package/slide-design/plugin.json +26 -0
- package/slide-design/skills/slide-design/SKILL.md +103 -0
- package/slide-design/skills/slide-design/references/charts-and-exhibits.md +100 -0
- package/slide-design/skills/slide-design/references/html-deck.md +175 -0
- package/slide-design/skills/slide-design/references/layout-and-style.md +131 -0
- package/slide-design/skills/slide-design/references/review.md +93 -0
- package/slide-design/skills/slide-design/references/storyline.md +118 -0
- package/stripe/plugin.json +22 -0
- package/supabase/mcp.json +26 -0
- package/supabase/plugin.json +78 -0
- package/supabase/skills/supabase/SKILL.md +169 -0
- package/supabase/skills/supabase/references/failure-modes.md +101 -0
- package/ui-ux-design/CHANGELOG.md +28 -0
- package/ui-ux-design/LICENSE +201 -0
- package/ui-ux-design/NOTICE +14 -0
- package/ui-ux-design/README.md +62 -0
- package/ui-ux-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
- package/ui-ux-design/mcp.json +4 -0
- package/ui-ux-design/plugin.json +26 -0
- package/ui-ux-design/skills/frontend-accessibility/SKILL.md +60 -0
- package/ui-ux-design/skills/gstack-design/SKILL.md +53 -0
- package/ui-ux-design/skills/gstack-design/references/consultation.md +30 -0
- package/ui-ux-design/skills/gstack-design/references/html.md +29 -0
- package/ui-ux-design/skills/gstack-design/references/review.md +28 -0
- package/ui-ux-design/skills/gstack-design/references/shotgun.md +33 -0
- package/ui-ux-design/skills/gstack-design/references/upstream-notes.md +23 -0
- package/ui-ux-design/skills/interface-design/ORIGINAL.md +16 -0
- package/ui-ux-design/skills/interface-design/SKILL.md +41 -0
- package/ui-ux-design/skills/interface-design/references/commands/audit.md +40 -0
- package/ui-ux-design/skills/interface-design/references/commands/critique.md +21 -0
- package/ui-ux-design/skills/interface-design/references/commands/extract.md +34 -0
- package/ui-ux-design/skills/interface-design/references/commands/init.md +31 -0
- package/ui-ux-design/skills/interface-design/references/commands/status.md +22 -0
- package/ui-ux-design/skills/interface-design/references/examples/system-precision.md +29 -0
- package/ui-ux-design/skills/interface-design/references/examples/system-warmth.md +29 -0
- package/ui-ux-design/skills/interface-design/references/system-template.md +57 -0
- package/ui-ux-design/skills/shadcn-ui/README.md +244 -0
- package/ui-ux-design/skills/shadcn-ui/SKILL.md +333 -0
- package/ui-ux-design/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/ui-ux-design/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/ui-ux-design/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/ui-ux-design/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/ui-ux-design/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/ui-ux-design/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/ui-ux-design/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/ui-ux-design/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/ui-ux-design/skills/ui-ux-design/SKILL.md +171 -0
- package/ui-ux-design/skills/ui-ux-design/references/brand-and-voice.md +78 -0
- package/ui-ux-design/skills/ui-ux-design/references/chrome-mobile-test-matrix.md +137 -0
- package/ui-ux-design/skills/ui-ux-design/references/components-and-states.md +112 -0
- package/ui-ux-design/skills/ui-ux-design/references/delight-and-motion.md +54 -0
- package/ui-ux-design/skills/ui-ux-design/references/foundations.md +145 -0
- package/ui-ux-design/skills/ui-ux-design/references/inclusive-ai-imagery.md +57 -0
- package/ui-ux-design/skills/ui-ux-design/references/kole-jain-uiux-concepts.md +104 -0
- package/ui-ux-design/skills/ui-ux-design/references/kuinetic-reference.md +184 -0
- package/ui-ux-design/skills/ui-ux-design/references/openai-frontend-skill.md +139 -0
- package/ui-ux-design/skills/ui-ux-design/references/premium-ui.md +55 -0
- package/ui-ux-design/skills/ui-ux-design/references/research-and-validation.md +88 -0
- package/ui-ux-design/skills/ui-ux-design/references/sam-crawford-premium-websites.md +103 -0
- package/ui-ux-design/skills/ui-ux-design/references/self-made-web-designer-core-skills.md +119 -0
- package/ui-ux-design/skills/ui-ux-design/references/ui-animation.md +173 -0
- package/ui-ux-design/skills/ui-ux-design/references/ui-loop.md +234 -0
- package/ui-ux-design/skills/ui-ux-design/references/visual-storytelling.md +54 -0
- package/ui-ux-design/skills/vercel-web-design-guidelines/SKILL.md +39 -0
- package/ui-ux-design/skills/web-compliance/SKILL.md +134 -0
- package/ui-ux-design/skills/web-compliance/references/audit-evidence.md +59 -0
- package/vercel/NOTES.md +23 -0
- package/vercel/mcp.json +4 -0
- package/vercel/object-stores/vercel-blob.mjs +147 -0
- package/vercel/plugin.json +47 -0
- package/vercel/skills/vercel/SKILL.md +48 -0
- package/vercel/targets/vercel.mjs +586 -0
- package/vercel/tovu-consent.json +6 -0
- package/vercel/tovu-deploy-targets.json +219 -0
- package/vercel/tovu-object-stores.json +10 -0
- package/wordpress/NOTES.md +33 -0
- package/wordpress/plugin.json +30 -0
- package/wordpress/skills/wordpress/SKILL.md +43 -0
- package/wordpress/skills/wordpress/references/free-site-redirect.md +46 -0
- package/wordpress/skills/wordpress/references/subdomain.md +66 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "google-workspace",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Connects one Google account to this site with Google's own sign-in, then works with the Google files the person picks or this site creates (the drive.file permission, never the whole Drive). v1 ships Google Sheets: chat tools for spreadsheets and a form destination that appends submissions as rows. Products are turned on separately; turning one off stops its tools and deliveries without revoking the sign-in.",
|
|
6
|
+
"author": "Tovu",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"extensions": {
|
|
9
|
+
"tovu": {
|
|
10
|
+
"maturity": "soon",
|
|
11
|
+
"vendorAliases": ["google-sheets", "docs.google.com", "sheets.googleapis.com", "drive.googleapis.com", "gmail"],
|
|
12
|
+
"displayName": "Google Workspace",
|
|
13
|
+
"summary": "Sign in with Google once, then work with the spreadsheets you choose or create here.",
|
|
14
|
+
"id": "tovu/google-workspace",
|
|
15
|
+
"provides": [
|
|
16
|
+
"api-connection:google-workspace",
|
|
17
|
+
"form-destination:google-sheets"
|
|
18
|
+
],
|
|
19
|
+
"credentialCards": [
|
|
20
|
+
{
|
|
21
|
+
"target": "google-workspace-sign-in",
|
|
22
|
+
"title": "Connect Google Workspace",
|
|
23
|
+
"label": "Google Workspace",
|
|
24
|
+
"category": "general",
|
|
25
|
+
"intro": "Sign in with Google to read and update the spreadsheets you choose, create spreadsheets, or send form submissions to a sheet. No API key is needed.",
|
|
26
|
+
"usedFor": [
|
|
27
|
+
"Reads and updates spreadsheets you choose, and creates new ones",
|
|
28
|
+
"Saves your site's form submissions to a spreadsheet"
|
|
29
|
+
],
|
|
30
|
+
"keyHint": "Continue to Google's sign-in page and allow access to the files you use with this app (drive.file). Choose existing spreadsheets in Tovu's Google file picker after signing in.",
|
|
31
|
+
"saveKind": "oauth",
|
|
32
|
+
"saveTarget": "google-workspace",
|
|
33
|
+
"permissions": "Requests https://www.googleapis.com/auth/drive.file: access only to files you choose or Tovu creates. It does not grant access to your whole Drive, Gmail or Calendar. Google Sheets must also be turned on in the plugin panel.",
|
|
34
|
+
"helpUrl": "https://developers.google.com/workspace/drive/api/guides/api-specific-auth#drive_api_scopes",
|
|
35
|
+
"helpLabel": "What Google file access allows",
|
|
36
|
+
"baseUrl": "https://accounts.google.com"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"target": "google-workspace-oauth-client",
|
|
40
|
+
"title": "Use your own Google sign-in app",
|
|
41
|
+
"label": "google-workspace/account OAuth client",
|
|
42
|
+
"ownedApiLabel": "google-workspace/account OAuth client",
|
|
43
|
+
"category": "general",
|
|
44
|
+
"intro": "For a self-hosted site that cannot use Tovu's Google sign-in app, or an organisation using its own Google Cloud project. Save the app's client ID and client secret here, then sign in with Google. This does not replace your account sign-in.",
|
|
45
|
+
"usedFor": [
|
|
46
|
+
"Uses your own Google sign-in app to connect this site to Google Workspace"
|
|
47
|
+
],
|
|
48
|
+
"keyHint": "In Google Cloud, open Google Auth platform → Clients → Create client. Choose Web application for a hosted site, with this site's address plus /api/agent-plugins/connections/oauth/callback as the redirect URI, or Desktop app for Tovu desktop. Turn on the Sheets, Drive and Picker APIs. Paste the client secret here. Not a service-account key.",
|
|
49
|
+
"saveKind": "api",
|
|
50
|
+
"helpUrl": "https://console.cloud.google.com/auth/clients",
|
|
51
|
+
"helpLabel": "Create your Google sign-in app",
|
|
52
|
+
"baseUrl": "https://oauth2.googleapis.com/token",
|
|
53
|
+
"fields": [
|
|
54
|
+
{
|
|
55
|
+
"name": "username",
|
|
56
|
+
"label": "Google client ID",
|
|
57
|
+
"hint": "Required. Copy the client ID for the same Google sign-in app as the client secret.",
|
|
58
|
+
"required": true
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"keywords": [
|
|
66
|
+
"google-workspace",
|
|
67
|
+
"google",
|
|
68
|
+
"google-sheets",
|
|
69
|
+
"sheets",
|
|
70
|
+
"spreadsheet",
|
|
71
|
+
"google-drive",
|
|
72
|
+
"oauth",
|
|
73
|
+
"sign-in",
|
|
74
|
+
"form-destination:google-sheets",
|
|
75
|
+
"form-submissions"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"baseScopes": ["https://www.googleapis.com/auth/drive.file"],
|
|
4
|
+
"products": [
|
|
5
|
+
{
|
|
6
|
+
"id": "sheets",
|
|
7
|
+
"label": "Google Sheets",
|
|
8
|
+
"toolPrefix": "sheets_",
|
|
9
|
+
"requiredScopes": ["https://www.googleapis.com/auth/drive.file"]
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: google-workspace
|
|
3
|
+
description: Connect one Google account to this site with Google's own sign-in, then work with the Google Sheets the person picks or this site creates (the drive.file permission, never the whole Drive), and send form submissions to a spreadsheet. Explains connecting, products, the account actions (reconnect, switch, disconnect) and what each error means.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Google Workspace
|
|
7
|
+
|
|
8
|
+
One sign-in covers every Google product this plugin ships. Version 1 ships **Google Sheets**.
|
|
9
|
+
Docs, Slides, Drive, Gmail and Calendar come later on the same sign-in.
|
|
10
|
+
|
|
11
|
+
Say it simply: "Connect Google Workspace, then choose or create a spreadsheet."
|
|
12
|
+
|
|
13
|
+
**Follow the host guidance first.** It names the host's exact tools for turning the plugin on,
|
|
14
|
+
connecting, and opening the own-client card. Where it is more specific than this skill, it wins.
|
|
15
|
+
|
|
16
|
+
## Choose the connection for the task
|
|
17
|
+
|
|
18
|
+
For the tasks on its `usedFor` list, use **Connect Google Workspace**: start the host's connect
|
|
19
|
+
action for the plugin `google-workspace`. It reuses a working sign-in. Choose it yourself; never ask
|
|
20
|
+
the person to pick between sign-in and a key. There is no API-key route.
|
|
21
|
+
|
|
22
|
+
Only if sign-in fails from a self-hosted site's address, or the person asks to use their own
|
|
23
|
+
Google Cloud project, open the plugin's **Use your own Google sign-in app** card (target
|
|
24
|
+
`google-workspace-oauth-client`). It saves the client ID and secret; then the person signs in as
|
|
25
|
+
usual. See [connection](references/connection.md).
|
|
26
|
+
|
|
27
|
+
Never ask for a secret in chat. Never offer to replace a working sign-in or saved app unless asked.
|
|
28
|
+
|
|
29
|
+
## What this site can and cannot see
|
|
30
|
+
|
|
31
|
+
- This site asks only for **`drive.file`**: the files the person picks with Google's file picker or
|
|
32
|
+
that this site creates. It cannot browse or read the rest of their Drive.
|
|
33
|
+
- **A pasted spreadsheet link grants nothing.** If the person pastes a link, explain that they need
|
|
34
|
+
to choose the file with the picker (or let this site create a new spreadsheet).
|
|
35
|
+
- Never ask for a password, a token, a client secret or an API key in chat, and never accept one.
|
|
36
|
+
Sign-in always happens on Google's own page. A site that cannot use the host's own Google client
|
|
37
|
+
can use its own OAuth client, saved only through the host's secure credential form: see
|
|
38
|
+
[connection](references/connection.md), "Advanced: your own Google OAuth client".
|
|
39
|
+
|
|
40
|
+
## Before working on a spreadsheet
|
|
41
|
+
|
|
42
|
+
1. The plugin ships **switched off**. Offer to turn it on, or the person turns it on in the host's
|
|
43
|
+
plugin settings.
|
|
44
|
+
2. Connect with the host's connect action. If sign-in is needed and starts successfully, it shows a
|
|
45
|
+
card; Google's consent page opens in the system browser. Its result carries `connectionRef`: keep
|
|
46
|
+
it and pass it unchanged as `connectionRef` to every tool below. See
|
|
47
|
+
[connection](references/connection.md).
|
|
48
|
+
3. Check who is signed in with this plugin's `account_info { connectionRef }` tool and name that
|
|
49
|
+
account before you change anything.
|
|
50
|
+
4. Sheets itself starts **off**: until the person turns Sheets on in the Google Workspace panel,
|
|
51
|
+
every Sheets tool answers `product-disabled`. Ask them to turn it on there; chat cannot.
|
|
52
|
+
5. To use an existing spreadsheet, the person chooses it in the plugin's **Choose spreadsheet** tab
|
|
53
|
+
(Google's file picker); then `sheets_open_existing` with its id works. Or create a new one.
|
|
54
|
+
|
|
55
|
+
Load [connection](references/connection.md) for sign-in, products and account actions,
|
|
56
|
+
[sheets](references/sheets.md) before any spreadsheet work, [form delivery](references/form-delivery.md)
|
|
57
|
+
when the person wants form submissions in a sheet, and [troubleshooting](references/troubleshooting.md)
|
|
58
|
+
when a call fails.
|
|
59
|
+
|
|
60
|
+
## Errors
|
|
61
|
+
|
|
62
|
+
Every failure has a `code`, a plain `message`, `retryable`, `outcome` and a `nextAction`. Follow the
|
|
63
|
+
next action; do not retry on your own when `retryable` is false. When `outcome` is `"unknown"` (for
|
|
64
|
+
example `uncertain-outcome`), the change may already be in the spreadsheet: ask the person to look
|
|
65
|
+
before trying again. Never repeat an append, create or copy just because the answer was lost.
|
|
66
|
+
|
|
67
|
+
## Sheets tools (spreadsheets, values, search)
|
|
68
|
+
|
|
69
|
+
Read [sheets](references/sheets.md) first. In short: read with `sheets_get`, `sheets_values_get`,
|
|
70
|
+
`sheets_values_batch_get` or `sheets_find`; create or copy with `sheets_create`, `sheets_copy` or
|
|
71
|
+
`sheets_copy_tab`; add rows with `sheets_values_append`; overwrite or clear with the
|
|
72
|
+
`sheets_values_*update` / `*clear` tools or `sheets_find_replace`. Every change shows a
|
|
73
|
+
confirmation card; only the person's click approves it.
|
|
74
|
+
|
|
75
|
+
## Tabs, filters, formatting and raw batch updates
|
|
76
|
+
|
|
77
|
+
The Sheets reference also covers tab changes, sorting, filters and filter views, formatting, named
|
|
78
|
+
and protected ranges, developer metadata, raw batch updates (and which request kinds are allowed),
|
|
79
|
+
CSV export and opening a picked spreadsheet (`sheets_open_existing`). Errors `limit-exceeded`
|
|
80
|
+
(narrow the request), `unsupported-request` (use a listed request kind), `invalid-input` (fix the id,
|
|
81
|
+
range or option) are raised by the plugin before anything is sent to Google; `not-a-spreadsheet`
|
|
82
|
+
means the chosen file is not a spreadsheet (pick one).
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Connecting Google Workspace
|
|
2
|
+
|
|
3
|
+
## Signing in
|
|
4
|
+
|
|
5
|
+
- **Desktop app:** the consent page opens in the system browser (never inside the admin page). Google sends
|
|
6
|
+
the person back to a one-time address on this computer (`127.0.0.1`), which closes right after.
|
|
7
|
+
- **Hosted site:** the consent page opens in a new tab and returns to this site.
|
|
8
|
+
- The consent screen shows the name of the Google sign-in app in use (the host's own app, or the
|
|
9
|
+
site's own one). The person should allow every permission listed; if they untick one, the
|
|
10
|
+
connection is not saved and this site says which permission is missing.
|
|
11
|
+
- If the person cancels on Google's page, nothing is saved. Offer to try again only if they want to.
|
|
12
|
+
- The host's connect action answers `{ status, connectionRef }`. `connectionRef` is an opaque reference
|
|
13
|
+
to this connection (not a password or token). Every tool takes it as `connectionRef`; it does not
|
|
14
|
+
change on reconnect or account switch. If you lost it, run the connect action again: when
|
|
15
|
+
already connected it answers at once without a new sign-in.
|
|
16
|
+
|
|
17
|
+
## Products
|
|
18
|
+
|
|
19
|
+
Each product (v1: Sheets) is turned on separately, and turning it on is a separate step from
|
|
20
|
+
granting its permissions. Sheets needs only `drive.file`, which the first sign-in already grants.
|
|
21
|
+
|
|
22
|
+
- Every product starts **off**. Until the person turns Sheets on in the Google Workspace panel,
|
|
23
|
+
every Sheets tool answers `product-disabled` ("turn it on in the Google Workspace panel") and
|
|
24
|
+
sends nothing to Google. Tell the person to enable Sheets there; you cannot turn it on from chat.
|
|
25
|
+
Checking which account is connected (`account_info`) works while every product is off.
|
|
26
|
+
- Turning a product **off** stops its tools at once (even a call that is part way through stops
|
|
27
|
+
before its next request to Google). Its form deliveries are retried for about a day (about 8
|
|
28
|
+
attempts) and then marked failed; submissions stay saved in this site, but a delivery that already
|
|
29
|
+
failed is not sent again when the product is turned back on. It does **not** sign the account
|
|
30
|
+
out or revoke anything at Google.
|
|
31
|
+
- On the **desktop app**, adding a product that needs a new permission means signing in again and
|
|
32
|
+
approving the full list (installed apps cannot add permissions one at a time).
|
|
33
|
+
- On a **hosted site**, Google adds the new permission to the existing ones.
|
|
34
|
+
|
|
35
|
+
## Where the person does it
|
|
36
|
+
|
|
37
|
+
The plugin's admin page in the host (its Google Workspace plugin page) has three tabs:
|
|
38
|
+
|
|
39
|
+
- **Google Workspace** - connect, reconnect, switch account, disconnect, and turn each product on or
|
|
40
|
+
off ("Grant permission" appears when a product is on but Google has not granted it yet).
|
|
41
|
+
- **Choose spreadsheet** - Google's file picker. Choosing a spreadsheet there is what lets this site open
|
|
42
|
+
it; the chosen spreadsheets are listed with their ids, which you can use in chat.
|
|
43
|
+
- **Form destinations** - which form sends its submissions to which spreadsheet tab.
|
|
44
|
+
|
|
45
|
+
The panels cannot open links themselves: when a sign-in starts, the admin page shows a
|
|
46
|
+
**Continue to sign-in** button above the panel (on the desktop app it opens the system browser).
|
|
47
|
+
|
|
48
|
+
## Account actions
|
|
49
|
+
|
|
50
|
+
- **Reconnect** - sign in again with the same account. The connection, its spreadsheets and its
|
|
51
|
+
form bindings stay as they are. Use it when this site says "Reconnect required".
|
|
52
|
+
- **Switch account** - sign in with a different Google account. The panel shows the new account and
|
|
53
|
+
nothing changes until the person confirms it (or keeps the current one). While the switch waits,
|
|
54
|
+
the panel lists the plugin's form destinations, each with an unticked box. Only the ones the
|
|
55
|
+
person ticks move to the new account, and each moves only after this site checked that the new account
|
|
56
|
+
can open its spreadsheet; the panel then lists what moved and what did not (and why).
|
|
57
|
+
- A destination left unticked, or one the new account could not open, keeps the old account. Its
|
|
58
|
+
deliveries fail with `authorization-required` ("Reconnect required") until the person chooses
|
|
59
|
+
its spreadsheet again in the **Form destinations** tab with the new account.
|
|
60
|
+
- Deliveries that were already queued keep the account they were created with, so after a switch
|
|
61
|
+
they fail; they are not sent again automatically.
|
|
62
|
+
- The Google Workspace tools act as the new account at once.
|
|
63
|
+
- **Disconnect** - the panel first asks "Disconnect and revoke?" (it cannot be undone at Google);
|
|
64
|
+
after the person confirms, this site stops using the account at once, then asks Google to revoke its access.
|
|
65
|
+
- If Google confirms, the saved sign-in is deleted.
|
|
66
|
+
- If Google does not answer or refuses, this site shows **"Disconnected locally; Google revocation
|
|
67
|
+
pending"**. This site no longer uses the account, keeps the switched-off sign-in only so it can
|
|
68
|
+
retry, and the person can remove this site's access at https://myaccount.google.com/connections (the panel's **Open
|
|
69
|
+
Google Account page** button opens it). Never tell the person
|
|
70
|
+
revocation succeeded unless this site said "confirmed".
|
|
71
|
+
|
|
72
|
+
## Advanced: your own Google OAuth client
|
|
73
|
+
|
|
74
|
+
A self-hosted site whose address the host's Google sign-in app does not list (this site then says it
|
|
75
|
+
"cannot sign in from this site's address"), or an organisation that wants its own Google Cloud
|
|
76
|
+
project, can use its own OAuth client instead of the host's. The client secret is typed only into
|
|
77
|
+
the host's secure credential form, never into chat. Never ask for it in chat and never accept one pasted there.
|
|
78
|
+
|
|
79
|
+
1. In their own Google Cloud project, under **Google Auth platform → Clients → Create client**, the
|
|
80
|
+
person creates an OAuth client: **Web application** for a
|
|
81
|
+
hosted site, with the authorized redirect URI the card names (this site's address plus the
|
|
82
|
+
host's OAuth callback path); **Desktop app** for the desktop app. They enable the Google Sheets API, Google Drive API and Google Picker API there and
|
|
83
|
+
set the consent screen up.
|
|
84
|
+
2. Open the plugin's **Use your own Google sign-in app** card (its credential card with
|
|
85
|
+
`target: "google-workspace-oauth-client"`; the host guidance names the tool). It fixes the label and address; the person enters only the client ID and client secret:
|
|
86
|
+
- **Label:** exactly `google-workspace/account OAuth client`
|
|
87
|
+
- **Base URL:** `https://oauth2.googleapis.com/token`
|
|
88
|
+
- **Username:** the OAuth client ID
|
|
89
|
+
- **Token:** the client secret
|
|
90
|
+
Use the host's generic custom-credential form only if the plugin card is unavailable.
|
|
91
|
+
3. The person reconnects in the Google Workspace panel. Until then it shows **Reconnect required**:
|
|
92
|
+
a sign-in made with one client cannot be used with another. Spreadsheets chosen before must be
|
|
93
|
+
chosen again with the picker, because Google ties each picked file to the Cloud project whose client picked it.
|
|
94
|
+
|
|
95
|
+
If this site says it **"cannot use your own OAuth client"**, the message names the saved credential and
|
|
96
|
+
what is wrong (base URL or missing client ID): fix it in the host's saved credentials, then retry. After
|
|
97
|
+
the client changes (saved, replaced or removed), `reconnect-required` means "reconnect once".
|
|
98
|
+
|
|
99
|
+
To go back to the host's own client, delete that saved credential and reconnect. On a hosted site the file
|
|
100
|
+
picker uses the site's Picker settings (`TOVU_GOOGLE_PICKER_BROWSER_KEY`, `TOVU_GOOGLE_PICKER_APP_ID`):
|
|
101
|
+
with your own client the operator sets them to that project's browser key and project number, or the
|
|
102
|
+
picker cannot open the chosen files.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Sending form submissions to Google Sheets
|
|
2
|
+
|
|
3
|
+
The **Google Sheets** form destination adds each accepted submission as a new row.
|
|
4
|
+
|
|
5
|
+
The person picks where each form goes in the plugin's **Form destinations** tab: the form's short
|
|
6
|
+
name, a spreadsheet (one already chosen, or Google's file picker), and a tab. This site checks with Google
|
|
7
|
+
that the account can open that spreadsheet and that the tab exists before saving; a pasted id that
|
|
8
|
+
was never chosen is refused. Saving asks them to confirm that rows stay in the spreadsheet. Saving
|
|
9
|
+
turns delivery on for that form straight away: there is nothing to copy into this site's settings, and
|
|
10
|
+
removing the destination there stops new rows (rows already written stay in the spreadsheet).
|
|
11
|
+
|
|
12
|
+
- Each form goes to its own tab. This site remembers the tab by its id, so renaming the tab is safe.
|
|
13
|
+
- The first row holds the headers: `_tovu_submission_id`, `_tovu_submitted_at`, then the field
|
|
14
|
+
labels. The visitor's IP address is never sent.
|
|
15
|
+
- Checkbox groups are joined with ", ". Values are written as plain text, never as formulas.
|
|
16
|
+
- A new form field becomes a new column at the end. This site tags each column it writes with the
|
|
17
|
+
field's id (hidden spreadsheet metadata, not visible in cells), so existing columns never change
|
|
18
|
+
meaning: editing a field's label, renaming a header, or inserting or moving columns keeps each
|
|
19
|
+
field's answers in its own column. Deleting a column removes its tag; the field then gets a new
|
|
20
|
+
column.
|
|
21
|
+
- Every submission stays saved in this site, whatever happens to the spreadsheet. A delivery that cannot
|
|
22
|
+
go through yet (Google slow or asking this site to slow down, Google unavailable, Sheets turned off) is
|
|
23
|
+
retried about 8 times over about a day; after that it is marked failed and is not sent again.
|
|
24
|
+
A sign-in problem (`authorization-required`) fails the delivery at once.
|
|
25
|
+
- Delivery is **at least once with best-effort dedupe**: before every append this site looks for the
|
|
26
|
+
submission id in the `_tovu_submission_id` column (and looks again if Google's answer was lost),
|
|
27
|
+
so a retry normally does not add a duplicate. A duplicate is still possible in rare cases (for
|
|
28
|
+
example another person or tool writing to the same tab at the same moment). When this site finds the
|
|
29
|
+
same submission id on two or more rows it does not add another, and the delivery counts as done.
|
|
30
|
+
This site does not show such duplicates anywhere yet: if the person suspects one, sort or filter the
|
|
31
|
+
sheet by `_tovu_submission_id` and delete the extra row.
|
|
32
|
+
- Deleting a submission in this site does **not** delete its row in the spreadsheet. When the person
|
|
33
|
+
turns this destination on, tell them: "Rows already sent to Google Sheets stay in the spreadsheet
|
|
34
|
+
if you delete the submission in this site."
|
|
35
|
+
- Turning Sheets off does not pause deliveries indefinitely: they are retried for about a day, then
|
|
36
|
+
marked failed. Turn Sheets back on within that window.
|
|
37
|
+
|
|
38
|
+
## When a delivery fails
|
|
39
|
+
|
|
40
|
+
| code | what it means | what to do |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `authorization-required` | Google no longer accepts the sign-in (reconnect required), a permission is missing, or the destination still belongs to the account used before a switch. | Same account: reconnect Google Workspace. After a switch: choose the spreadsheet again in Form destinations (or tick it when confirming the switch). The failed delivery stays listed in this site as failed; it is not sent again. |
|
|
43
|
+
| `resource-not-granted` | The connected account cannot open this spreadsheet. | Choose the spreadsheet again with the file picker. |
|
|
44
|
+
| `configuration-invalid` | The destination does not name a tab for this form, or the tab was deleted. | Choose the tab again in the destination settings. |
|
|
45
|
+
| `mapping-invalid` | The columns cannot be matched: `_tovu_submission_id` or `_tovu_submitted_at` is missing from row 1, a header appears twice, two fields share a label, or one field's hidden column tag appears on two columns (another tool copied it). | Repair the headers in row 1 (or give the fields distinct labels); for a doubled tag, delete the extra column. |
|
|
46
|
+
| `destination-limit` | The tab has more than 50,000 rows, too many to check for duplicates. | Point the form at a new tab or spreadsheet. |
|
|
47
|
+
| `rate-limited` | Google asked this site to slow down. | Usually nothing; it retries after the wait, for about a day at most. |
|
|
48
|
+
| `outcome-unknown` | Google did not confirm the append and the row was not found. | Nothing; the next try checks again before appending. |
|
|
49
|
+
| `adapter-unavailable` | Sheets is turned off for the plugin. | Turn Sheets on. Deliveries still being retried (about a day) then go through; older ones stay failed. |
|
|
50
|
+
| `delivery-failed` | Google was unavailable or answered unexpectedly. | Usually nothing; it retries for about a day, then the delivery stays failed. |
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Google Sheets
|
|
2
|
+
|
|
3
|
+
The names below are this plugin's tool names; the host may show them with its own plugin prefix
|
|
4
|
+
(the host guidance says which). Every spreadsheet tool takes the `connectionRef` of the
|
|
5
|
+
connection; tools on an existing file also take its `spreadsheetId`.
|
|
6
|
+
|
|
7
|
+
## Choosing a spreadsheet
|
|
8
|
+
|
|
9
|
+
- **Existing spreadsheet:** the person picks it with Google's file picker. That pick is what lets
|
|
10
|
+
this site open the file. A pasted link is not enough.
|
|
11
|
+
- **New spreadsheet:** This site can create one; this site then has access to it automatically.
|
|
12
|
+
- If the person cancels the picker, keep the current settings.
|
|
13
|
+
|
|
14
|
+
## Reading and changing data
|
|
15
|
+
|
|
16
|
+
- Reads are bounded (about 500 rows or 5,000 cells at a time). For more, read the next range.
|
|
17
|
+
- Values a visitor or the person typed are written **as text exactly as given** (`RAW`); this site never
|
|
18
|
+
turns them into formulas.
|
|
19
|
+
- Changing, clearing or deleting data shows the person a confirmation card first. Only their click
|
|
20
|
+
approves it. Remote changes cannot be undone from this site.
|
|
21
|
+
- If a change comes back with `outcome: "unknown"`, ask the person to check the spreadsheet before
|
|
22
|
+
trying again.
|
|
23
|
+
|
|
24
|
+
## Limits
|
|
25
|
+
|
|
26
|
+
Google allows each account about 60 requests a minute; this site keeps under that (about 45 per account
|
|
27
|
+
and 240 per site). When Google asks this site to wait, this site waits; nothing is lost.
|
|
28
|
+
|
|
29
|
+
## Spreadsheet, values and search tools
|
|
30
|
+
|
|
31
|
+
Names below are the plugin's tool names, without the host's prefix. Every call needs `connectionRef`; calls on an
|
|
32
|
+
existing file also need `spreadsheetId` (the id from the picker or from `sheets_create`).
|
|
33
|
+
|
|
34
|
+
| To… | Use | Asks the person first? |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| See the title, URL and tabs (tab ids for other tools) | `sheets_get` | no |
|
|
37
|
+
| Read one range | `sheets_values_get` with `range`, for example `'Leads'!A1:D50` | no |
|
|
38
|
+
| Read several ranges at once (up to 20) | `sheets_values_batch_get` | no |
|
|
39
|
+
| Find cells containing a text (up to 20 ranges) | `sheets_find` | no |
|
|
40
|
+
| Read by data filter (A1, grid range or developer metadata) | `sheets_get_by_data_filter` (metadata) or `sheets_values_by_data_filter` with `action: "get"` (values) | the second one does |
|
|
41
|
+
| Make a new spreadsheet | `sheets_create` | yes |
|
|
42
|
+
| Copy a whole spreadsheet | `sheets_copy` | yes |
|
|
43
|
+
| Copy one tab into another spreadsheet | `sheets_copy_tab` with the numeric `sheetId` | yes |
|
|
44
|
+
| Add rows after the existing table | `sheets_values_append` | yes |
|
|
45
|
+
| Overwrite cells | `sheets_values_update` (one range) or `sheets_values_batch_update` (up to 100) | yes, as a destructive change |
|
|
46
|
+
| Clear cells | `sheets_values_clear` or `sheets_values_batch_clear` | yes, as a destructive change |
|
|
47
|
+
| Replace a text everywhere on a tab or in every tab | `sheets_find_replace` (`sheetId` or `allSheets: true`) | yes, as a destructive change |
|
|
48
|
+
|
|
49
|
+
### Reading a lot of data
|
|
50
|
+
|
|
51
|
+
A read returns at most 500 rows, 5,000 cells or 64 KiB. When there is more, the result has
|
|
52
|
+
`continuation`: call `sheets_values_get` with exactly that range to read the next part. Do not guess
|
|
53
|
+
the next range yourself. `sheets_get` and `sheets_get_by_data_filter` have no continuation: when
|
|
54
|
+
their answer would be too large they fail with `limit-exceeded`; ask for fewer ranges or leave out
|
|
55
|
+
grid data. A `fields` mask containing `*` or `data` reads cell data too, so it is refused
|
|
56
|
+
(`invalid-input`) unless `includeGridData: true` is given (with `ranges` for `sheets_get`).
|
|
57
|
+
`sheets_find` searches at most 50,000 cells and returns at most 100 matches
|
|
58
|
+
(`truncated: true` means there were more); narrow the ranges when it says `limit-exceeded`.
|
|
59
|
+
|
|
60
|
+
### Writing values
|
|
61
|
+
|
|
62
|
+
- Values are stored **as text exactly as given** (`RAW`). Only pass
|
|
63
|
+
`valueInputOption: "USER_ENTERED"` when the person explicitly wants Sheets to interpret the values
|
|
64
|
+
(formulas, dates); never for text a visitor typed.
|
|
65
|
+
- One write body is at most 1 MiB; split bigger writes into several calls.
|
|
66
|
+
- `sheets_values_append` inserts new rows below the table, so nothing under it is written over.
|
|
67
|
+
|
|
68
|
+
### When the answer is lost
|
|
69
|
+
|
|
70
|
+
`sheets_values_append`, `sheets_create`, `sheets_copy`, `sheets_copy_tab` and `sheets_find_replace`
|
|
71
|
+
are never repeated automatically. If one fails with `uncertain-outcome` (`outcome: "unknown"`), ask
|
|
72
|
+
the person to look at the spreadsheet (or their Drive) first; repeating it could add the rows, the
|
|
73
|
+
file or the replacement twice.
|
|
74
|
+
|
|
75
|
+
### Errors these tools add
|
|
76
|
+
|
|
77
|
+
- `invalid-input`: the request was refused before anything was sent (for example a malformed id or
|
|
78
|
+
range). Fix it and try again.
|
|
79
|
+
- `limit-exceeded`: the request or its answer is bigger than the tool allows. Ask for less.
|
|
80
|
+
|
|
81
|
+
## Tabs, sorting, filters, formatting and structure
|
|
82
|
+
|
|
83
|
+
Each of these tools takes `connectionRef` and `spreadsheetId`. Tabs are named by their numeric
|
|
84
|
+
`sheetId` (it survives renames); ranges are grid ranges with zero-based, end-exclusive indices, for
|
|
85
|
+
example `{ "sheetId": 0, "startRowIndex": 1, "endRowIndex": 10, "startColumnIndex": 0, "endColumnIndex": 4 }`
|
|
86
|
+
is rows 2-10, columns A-D.
|
|
87
|
+
|
|
88
|
+
| Tool | What it does | Confirmation |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `sheets_tab_modify` | add, rename, delete, duplicate or move a tab | danger card (delete removes the tab's data) |
|
|
91
|
+
| `sheets_sort` | reorder rows of a range by up to 10 columns | danger card (the old order is gone) |
|
|
92
|
+
| `sheets_basic_filter` | set or clear a tab's filter (hides rows; no sorting: use `sheets_sort`). To read a filter, use `sheets_get` with `fields: "sheets(properties(sheetId),basicFilter)"` (no card) | card |
|
|
93
|
+
| `sheets_filter_views` | list, add, update, duplicate or delete saved filter views | danger card |
|
|
94
|
+
| `sheets_format` | number formats, fonts, colours, alignment, wrapping, borders, frozen rows/columns, column widths | card; never changes values |
|
|
95
|
+
| `sheets_named_ranges` | list, add, update or delete named ranges | danger card (formulas follow the name) |
|
|
96
|
+
| `sheets_protected_ranges_get` | protected ranges, editors, and whether this account may edit | none (read) |
|
|
97
|
+
| `sheets_developer_metadata` | get metadata by id or search with data filters | none (read) |
|
|
98
|
+
| `sheets_batch_update` | up to 100 raw Sheets requests in one atomic call | danger card listing every request kind |
|
|
99
|
+
| `sheets_export_csv` | one tab (or `A1:F500` of it) as a downloadable CSV file | none (read) |
|
|
100
|
+
| `sheets_open_existing` | check a picked spreadsheet, or point the person to the picker | none (read) |
|
|
101
|
+
|
|
102
|
+
- `sheets_format`: give `cellFormat` together with `fields`, the exact format properties to set
|
|
103
|
+
(for example `["textFormat.bold", "numberFormat"]`). Properties not listed stay as they are.
|
|
104
|
+
- `sheets_open_existing` without `spreadsheetId` answers `waiting`: ask the person to choose the file
|
|
105
|
+
with Google's picker in the Google Workspace plugin, or offer to create a new spreadsheet.
|
|
106
|
+
`file-not-granted` means the file was never picked (or was trashed); `not-a-spreadsheet` means it is
|
|
107
|
+
not a spreadsheet.
|
|
108
|
+
- `sheets_export_csv` reads at most 20,000 rows and 100,000 cells and writes at most 4 MiB. A bigger
|
|
109
|
+
tab is refused (`limit-exceeded`), never cut short: export a range instead. It returns a file
|
|
110
|
+
reference, not the data. On a site that cannot save files it refuses with `export-unavailable`
|
|
111
|
+
before reading anything; read the values in chat instead.
|
|
112
|
+
Text that starts with `=`, `+`, `-`, `@` (or a tab or line break) is written with a leading `'`,
|
|
113
|
+
so a spreadsheet app opening the file shows it as text instead of running it as a formula (a
|
|
114
|
+
visitor could have typed one into a form). The trade-off: with the default formatted values, a
|
|
115
|
+
number shown as `-5` or a phone number like `+1 555` also gets the `'`. Ask for
|
|
116
|
+
`valueRenderOption: "UNFORMATTED_VALUE"` when exact numbers matter: real numbers are never prefixed.
|
|
117
|
+
- Answers over 64 KiB are refused with `limit-exceeded`: narrow to one tab or fewer items.
|
|
118
|
+
|
|
119
|
+
## Raw batch updates (`sheets_batch_update`)
|
|
120
|
+
|
|
121
|
+
Each request object names exactly one request kind, for example
|
|
122
|
+
`{ "insertDimension": { "range": { "sheetId": 0, "dimension": "ROWS", "startIndex": 5, "endIndex": 7 } } }`.
|
|
123
|
+
Field masks (`fields`) must name the properties to change; `*` is refused because it resets
|
|
124
|
+
everything else. A batch is all-or-nothing at Google.
|
|
125
|
+
|
|
126
|
+
Supported request kinds. Changes data or protection (shown as destructive on the card):
|
|
127
|
+
`updateSheetProperties`, `repeatCell`, `deleteNamedRange`, `deleteSheet`, `autoFill`, `cutPaste`,
|
|
128
|
+
`copyPaste`, `mergeCells`, `updateCells`, `deleteDimension`, `deleteEmbeddedObject`,
|
|
129
|
+
`deleteFilterView`, `findReplace`, `pasteData`, `textToColumns`, `deleteRange`,
|
|
130
|
+
`deleteConditionalFormatRule`, `sortRange`, `addProtectedRange`, `updateProtectedRange`,
|
|
131
|
+
`deleteProtectedRange`, `deleteBanding`, `deleteDeveloperMetadata`, `randomizeRange`,
|
|
132
|
+
`deleteDimensionGroup`, `trimWhitespace`, `deleteDuplicates`, `deleteTable`, `setBasicFilter` (its
|
|
133
|
+
`sortSpecs` reorder rows).
|
|
134
|
+
|
|
135
|
+
Other changes: `updateSpreadsheetProperties`, `updateDimensionProperties`, `updateNamedRange`,
|
|
136
|
+
`addNamedRange`, `addSheet`, `unmergeCells`, `updateBorders`, `addFilterView`, `appendCells`,
|
|
137
|
+
`clearBasicFilter`, `duplicateFilterView`, `duplicateSheet`, `insertDimension`, `insertRange`,
|
|
138
|
+
`moveDimension`, `updateEmbeddedObjectPosition`, `updateFilterView`, `appendDimension`,
|
|
139
|
+
`addConditionalFormatRule`, `updateConditionalFormatRule`, `setDataValidation`,
|
|
140
|
+
`autoResizeDimensions`, `addChart`, `updateChartSpec`, `updateBanding`, `addBanding`,
|
|
141
|
+
`createDeveloperMetadata`, `updateDeveloperMetadata`, `addDimensionGroup`, `updateDimensionGroup`,
|
|
142
|
+
`updateEmbeddedObjectBorder`, `addSlicer`, `updateSlicerSpec`, `addTable`, `updateTable`.
|
|
143
|
+
|
|
144
|
+
Not supported: the Connected Sheets data-source kinds (`addDataSource`, `updateDataSource`,
|
|
145
|
+
`deleteDataSource`, `refreshDataSource`, `cancelDataSourceRefresh`) need a BigQuery permission this site
|
|
146
|
+
does not ask for. Any kind not listed is refused with `unsupported-request` before anything is sent.
|
|
147
|
+
|
|
148
|
+
If a batch that adds, inserts, appends, moves or deletes by position comes back with
|
|
149
|
+
`outcome: "unknown"`, it may already be applied: ask the person to check before sending it again.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Troubleshooting Google Workspace
|
|
2
|
+
|
|
3
|
+
| Code | What happened | What to do |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| `not-connected` | No Google account is connected. | Connect Google Workspace. |
|
|
6
|
+
| `reconnect-required` | Google no longer accepts the saved sign-in (expired, revoked or the password changed). Form deliveries fail at once and stay listed as failed; they are not re-sent after reconnecting. | Reconnect with the same account, then retry once. |
|
|
7
|
+
| `account-changed` | The connection now uses another account than the one shown when the change was confirmed. | Review the account and confirm again. |
|
|
8
|
+
| `missing-permission` | The person did not allow a permission this needs. | Reconnect and allow every listed permission. |
|
|
9
|
+
| `file-not-granted` | This site was never given this file (often a pasted link), or it was removed or trashed. Google answered "not found". | Choose the file again with the picker, or create a new spreadsheet. |
|
|
10
|
+
| `access-denied` | This site was given the file, but this account may not do this to it (for example view-only sharing). Google answered "forbidden". | Check sharing in Google Sheets, then pick it again. |
|
|
11
|
+
| `admin-policy` | A Google Workspace administrator blocks this site. | Ask the administrator to allow this site. |
|
|
12
|
+
| `quota-delay` | Google asked this site to slow down. | Wait (`retryAfterMs` says how long); nothing is lost. |
|
|
13
|
+
| `service-unavailable` / `network-error` | Google could not be reached. | Retry later. |
|
|
14
|
+
| `uncertain-outcome` | Google did not say whether a change was applied. | Ask the person to check the spreadsheet before retrying. Never repeat it automatically. |
|
|
15
|
+
| `invalid-request` | Google received the request and rejected it (bad range, tab or values). Nothing changed. | Fix the request. |
|
|
16
|
+
| `invalid-input` | This site refused the request before sending it: a spreadsheet id, range, field mask or option is not valid for the tool. Nothing was sent to Google. | Fix the id, range or option. |
|
|
17
|
+
| `limit-exceeded` | The request or its answer is larger than the tool allows. Nothing was cut short. | Ask for a smaller range, fewer rows or fewer entries. |
|
|
18
|
+
| `export-unavailable` | This site cannot save files from plugin tools, so a CSV export cannot be offered. Nothing was read. | Read the values in chat (`sheets_values_get`) instead. |
|
|
19
|
+
| `unsupported-request` | A raw batch holds a request kind this site does not allow. Nothing was sent. | Remove it, or use a listed kind (see the Sheets reference). |
|
|
20
|
+
| `picker-not-configured` | This site's operator has not set up Google's file picker, so an existing spreadsheet cannot be chosen here. | Ask the site operator, or create a new spreadsheet. |
|
|
21
|
+
| `not-a-spreadsheet` / `invalid-selection` | The chosen file is not a Google Sheets spreadsheet, or the picker returned something unusable. | Choose a spreadsheet again with the picker. |
|
|
22
|
+
| `unexpected-response` | Google answered in a way this site does not understand. | Report it; do not retry in a loop. |
|
|
23
|
+
| `product-disabled` | The product (Sheets) is turned off; products start off. | Ask the person to turn Sheets on in the Google Workspace panel, then retry. The sign-in is kept. |
|
|
24
|
+
|
|
25
|
+
**"The file picker session ended"** (`picker-expired`) can also mean the same Choose spreadsheet or
|
|
26
|
+
Form destinations panel was opened again in another tab or by another admin: only the most recently
|
|
27
|
+
opened panel can save a pick. Close the other tabs, reopen the panel, and choose the spreadsheet again.
|
|
28
|
+
|
|
29
|
+
**"Disconnected locally; Google revocation pending"** means this site stopped using the account but Google
|
|
30
|
+
did not confirm removing access. Retry disconnect later, or remove this site's access at
|
|
31
|
+
https://myaccount.google.com/connections.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Tool `account_info` (`p_google_workspace__account_info`): which Google account a
|
|
3
|
+
* Google Workspace connection is signed in as. The smallest read the plugin's tools file ships with
|
|
4
|
+
* until the Sheets tools land, and the first thing chat checks before it works on a spreadsheet.
|
|
5
|
+
*
|
|
6
|
+
* Exists so chat can name the account it will act as without ever seeing a token: the token is
|
|
7
|
+
* read from the host inside the shared client and only the account label is returned.
|
|
8
|
+
*/
|
|
9
|
+
import { readAccount } from '../lib/drive-files.mjs';
|
|
10
|
+
import { createGoogleClient } from '../lib/http.mjs';
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
/** @param {{ input: { connectionRef: string }, capabilities: { connections: object, http: object }, signal?: AbortSignal }} required */
|
|
14
|
+
async invoke({ input, capabilities, signal }) {
|
|
15
|
+
const client = createGoogleClient({ http: capabilities.http, connections: capabilities.connections });
|
|
16
|
+
return readAccount({ client, connectionRef: input.connectionRef }, signal ? { signal } : {});
|
|
17
|
+
},
|
|
18
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Sheets tools A (`tools/sheets/`)
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
The Google Sheets chat tools for spreadsheets, values, data filters and search (design §D). Each
|
|
6
|
+
`.mjs` file is one tool module declared in `../../tovu-agent-tools.json`; the assistant sees it under
|
|
7
|
+
its `name` with the host's plugin prefix (in Tovu, `p_google_workspace__<name>`). Every tool takes the `connectionRef` of the Google Workspace
|
|
8
|
+
connection; tools on an existing file also take its `spreadsheetId`. Tab, sort, filter, format,
|
|
9
|
+
named-range, protection, metadata, raw batch-update, CSV export and Picker tools live in
|
|
10
|
+
`../sheets-admin/` (a separate lot).
|
|
11
|
+
|
|
12
|
+
## Tools
|
|
13
|
+
|
|
14
|
+
| Tool | Effect (card) | Google call | Request kind |
|
|
15
|
+
|---|---|---|---|
|
|
16
|
+
| `sheets_get` | read | `GET spreadsheets/{id}` (field mask; grid data only with ranges) | read |
|
|
17
|
+
| `sheets_get_by_data_filter` | read | `POST spreadsheets/{id}:getByDataFilter` | read |
|
|
18
|
+
| `sheets_create` | write | `POST spreadsheets` | write (never replayed) |
|
|
19
|
+
| `sheets_copy` | write | Drive `POST files/{id}/copy` (`lib/drive-files.mjs`) | write (never replayed) |
|
|
20
|
+
| `sheets_copy_tab` | write | `POST spreadsheets/{id}/sheets/{sheetId}:copyTo` | write (never replayed) |
|
|
21
|
+
| `sheets_values_get` | read | `GET …/values/{range}` | read |
|
|
22
|
+
| `sheets_values_batch_get` | read | `GET …/values:batchGet` (≤ 20 ranges) | read |
|
|
23
|
+
| `sheets_values_append` | write | `POST …/values/{range}:append` (`INSERT_ROWS`) | write (never replayed) |
|
|
24
|
+
| `sheets_values_update` | destructive | `PUT …/values/{range}` | idempotent write |
|
|
25
|
+
| `sheets_values_batch_update` | destructive | `POST …/values:batchUpdate` (≤ 100 ranges) | idempotent write |
|
|
26
|
+
| `sheets_values_clear` | destructive | `POST …/values/{range}:clear` | idempotent write |
|
|
27
|
+
| `sheets_values_batch_clear` | destructive | `POST …/values:batchClear` (≤ 100 ranges) | idempotent write |
|
|
28
|
+
| `sheets_values_by_data_filter` | destructive (all actions) | `POST …/values:batch{Get,Update,Clear}ByDataFilter` | read / idempotent write |
|
|
29
|
+
| `sheets_find` | read | `GET …/values:batchGet`, matched locally (plain text) | read |
|
|
30
|
+
| `sheets_find_replace` | destructive | `POST spreadsheets/{id}:batchUpdate` (`findReplace`) | write (never replayed) |
|
|
31
|
+
|
|
32
|
+
`write` and `destructive` tools export `describeAffectedResources`, which names the spreadsheet,
|
|
33
|
+
ranges and counts on the host's confirmation card (never cell values beyond what the caller typed).
|
|
34
|
+
|
|
35
|
+
## How it fits
|
|
36
|
+
|
|
37
|
+
Every module calls `lib/sheets-client.mjs`, which builds the endpoint (each id or range is ONE
|
|
38
|
+
encoded path segment; `.`/`..` refused), defaults values to `RAW`, enforces the bounds and sends
|
|
39
|
+
through `lib/http.mjs` (token right before each request, where the host charges its budgets; retries, safe errors).
|
|
40
|
+
|
|
41
|
+
| Bound | Value | At the bound |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| Values reads (shared across a batch) | 500 rows, 5,000 cells, 64 KiB | cut, with `continuation` = the exact range to read next |
|
|
44
|
+
| Metadata / data-filter metadata reads | 64 KiB | `limit-exceeded` (no partial) |
|
|
45
|
+
| Ranges per batch read / find | 20 | schema refusal |
|
|
46
|
+
| Entries per batch write / clear | 100 | schema refusal |
|
|
47
|
+
| Mutation body | 1 MiB | `limit-exceeded` before sending |
|
|
48
|
+
| `sheets_find` scan / matches | 50,000 cells / 100 matches | `limit-exceeded` / `truncated: true` |
|
|
49
|
+
|
|
50
|
+
## Extension points
|
|
51
|
+
|
|
52
|
+
A new Sheets tool adds one module here (or under `../sheets-admin/`) and one entry in
|
|
53
|
+
`tovu-agent-tools.json`; it reuses `sendSheetsRequest`, `sheetsUrl` and the bound helpers. A
|
|
54
|
+
second product uses `lib/http.mjs` directly with its own URL helper.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Tool `sheets_copy_tab` (`p_google_workspace__sheets_copy_tab`): copies one tab into another
|
|
3
|
+
* spreadsheet the connection can open (`sheets.copyTo`), returning the new tab's properties.
|
|
4
|
+
*
|
|
5
|
+
* Each call adds a new tab, so a lost answer is `uncertain-outcome` and is never replayed.
|
|
6
|
+
*/
|
|
7
|
+
import { resourceLines, sendSheetsRequest, sheetsUrl } from '../../lib/sheets-client.mjs';
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
/** @param {{ input: { connectionRef: string, spreadsheetId: string, sheetId: number, destinationSpreadsheetId: string }, capabilities: object, signal?: AbortSignal }} call */
|
|
11
|
+
async invoke(call) {
|
|
12
|
+
const { input } = call;
|
|
13
|
+
const body = await sendSheetsRequest({ call, request: {
|
|
14
|
+
kind: 'write', method: 'POST',
|
|
15
|
+
url: sheetsUrl({ spreadsheetId: input.spreadsheetId }, { segments: ['sheets', String(input.sheetId)], method: ':copyTo' }),
|
|
16
|
+
body: { destinationSpreadsheetId: input.destinationSpreadsheetId },
|
|
17
|
+
} });
|
|
18
|
+
return { destinationSpreadsheetId: input.destinationSpreadsheetId, sheetId: body?.sheetId, title: body?.title, index: body?.index };
|
|
19
|
+
},
|
|
20
|
+
describeAffectedResources({ input }) {
|
|
21
|
+
return resourceLines({ lines: [`New tab in spreadsheet ${input.destinationSpreadsheetId}, copied from tab ${input.sheetId} of spreadsheet ${input.spreadsheetId}`] });
|
|
22
|
+
},
|
|
23
|
+
};
|