@jini-ai/agent-plugins 0.6.16 → 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.
Files changed (335) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/NOTICE +14 -0
  3. package/README.md +35 -14
  4. package/charts-echarts/plugin.json +39 -0
  5. package/charts-echarts/skills/charts-echarts/SKILL.md +110 -0
  6. package/charts-recharts/plugin.json +32 -0
  7. package/charts-recharts/skills/charts-recharts/SKILL.md +108 -0
  8. package/cloudflare/NOTES.md +16 -0
  9. package/cloudflare/form-destinations/cloudflare-d1.mjs +9 -0
  10. package/cloudflare/lib/api.mjs +96 -0
  11. package/cloudflare/lib/assets.mjs +65 -0
  12. package/cloudflare/lib/dns.mjs +32 -0
  13. package/cloudflare/lib/domain-inventory.mjs +61 -0
  14. package/cloudflare/lib/domain-status.mjs +48 -0
  15. package/cloudflare/lib/domains.mjs +95 -0
  16. package/cloudflare/lib/forms.mjs +254 -0
  17. package/cloudflare/lib/pages-upload.mjs +51 -0
  18. package/cloudflare/lib/target.mjs +165 -0
  19. package/cloudflare/lib/workers-upload.mjs +48 -0
  20. package/cloudflare/lib/zones.mjs +25 -0
  21. package/cloudflare/mcp.json +4 -0
  22. package/cloudflare/plugin.json +96 -0
  23. package/cloudflare/skills/cloudflare/SKILL.md +57 -0
  24. package/cloudflare/skills/cloudflare/references/domains.md +31 -0
  25. package/cloudflare/skills/cloudflare/references/pages.md +18 -0
  26. package/cloudflare/skills/cloudflare/references/permissions.md +29 -0
  27. package/cloudflare/skills/cloudflare/references/troubleshooting.md +20 -0
  28. package/cloudflare/skills/cloudflare/references/workers.md +42 -0
  29. package/cloudflare/targets/cloudflare-pages.mjs +12 -0
  30. package/cloudflare/targets/cloudflare-workers.mjs +17 -0
  31. package/cloudflare/tovu-consent.json +6 -0
  32. package/cloudflare/tovu-deploy-targets.json +630 -0
  33. package/cloudflare/tovu-form-destinations.json +12 -0
  34. package/cloudflare/worker/forms-receiver.mjs +249 -0
  35. package/composio/mcp.json +10 -0
  36. package/composio/plugin.json +68 -0
  37. package/composio/skills/composio/SKILL.md +85 -0
  38. package/dist/core/identity-namespace.d.ts +12 -0
  39. package/dist/core/identity-namespace.js +20 -0
  40. package/dist/folder-zip-node.js +29 -7
  41. package/dist/lifecycle/bundled-digests.js +4 -3
  42. package/dist/lifecycle/install.d.ts +7 -0
  43. package/dist/lifecycle/install.js +45 -3
  44. package/dist/lifecycle/manifest.d.ts +2 -2
  45. package/dist/lifecycle/manifest.js +5 -3
  46. package/dist/lifecycle/node.js +2 -0
  47. package/dist/lifecycle/persistent-state.js +1 -1
  48. package/dist/lifecycle/ports.d.ts +8 -0
  49. package/dist/lifecycle/seed-bundled.js +4 -1
  50. package/dist/manifest.d.ts +1 -1
  51. package/dist/manifest.js +3 -2
  52. package/fly/deploy-configs/fly.mjs +115 -0
  53. package/fly/deploy-ops/fly.mjs +102 -0
  54. package/fly/mcp.json +4 -0
  55. package/fly/plugin.json +81 -0
  56. package/fly/scripts/render-deploy-workflow.mjs +150 -0
  57. package/fly/skills/fly/SKILL.md +43 -0
  58. package/fly/skills/fly/references/fly-deploy.template.yml +117 -0
  59. package/fly/skills/fly/references/fly.template.toml +81 -0
  60. package/fly/tovu-credential-schemes.json +11 -0
  61. package/fly/tovu-deploy-configs.json +21 -0
  62. package/fly/tovu-deploy-ops.json +14 -0
  63. package/github/deploy-ops/github-actions.mjs +164 -0
  64. package/github/deployments/github.mjs +415 -0
  65. package/github/mcp.json +4 -0
  66. package/github/plugin.json +105 -0
  67. package/github/skills/github/SKILL.md +249 -0
  68. package/github/skills/github/references/actions.md +224 -0
  69. package/github/skills/github/references/auth-and-tokens.md +140 -0
  70. package/github/skills/github/references/repo-files.md +135 -0
  71. package/github/skills/github/references/site-backup.md +159 -0
  72. package/github/skills/github/references/source-control.md +123 -0
  73. package/github/source-control/backup-push.mjs +242 -0
  74. package/github/source-control/commit-site.mjs +459 -0
  75. package/github/source-control/github.mjs +93 -0
  76. package/github/source-control/write-files.mjs +468 -0
  77. package/github/tovu-deploy-ops.json +13 -0
  78. package/github/tovu-source-control.json +117 -0
  79. package/github-pages/NOTES.md +19 -0
  80. package/github-pages/mcp.json +4 -0
  81. package/github-pages/plugin.json +48 -0
  82. package/github-pages/skills/github-pages/SKILL.md +44 -0
  83. package/github-pages/targets/github-pages.mjs +543 -0
  84. package/github-pages/tovu-deploy-targets.json +327 -0
  85. package/google-login/exports/google-g.svg +1 -0
  86. package/google-login/exports/sign-in-button.css +68 -0
  87. package/google-login/exports/sign-in-button.html +4 -0
  88. package/google-login/mcp.json +4 -0
  89. package/google-login/plugin.json +59 -0
  90. package/google-login/skills/google-login/SKILL.md +96 -0
  91. package/google-login/tovu-login-providers.json +21 -0
  92. package/google-workspace/README.md +132 -0
  93. package/google-workspace/form-destinations/README.md +87 -0
  94. package/google-workspace/form-destinations/dedupe.mjs +43 -0
  95. package/google-workspace/form-destinations/delivery-result.mjs +69 -0
  96. package/google-workspace/form-destinations/mapping.mjs +152 -0
  97. package/google-workspace/form-destinations/sheets.mjs +202 -0
  98. package/google-workspace/lib/auth.mjs +81 -0
  99. package/google-workspace/lib/drive-files.mjs +54 -0
  100. package/google-workspace/lib/form-destination-settings.mjs +72 -0
  101. package/google-workspace/lib/http.mjs +168 -0
  102. package/google-workspace/lib/picker-flow.mjs +171 -0
  103. package/google-workspace/lib/picker-selection.mjs +107 -0
  104. package/google-workspace/lib/product-state.mjs +93 -0
  105. package/google-workspace/lib/request-policy.mjs +163 -0
  106. package/google-workspace/lib/sheets-a1.mjs +79 -0
  107. package/google-workspace/lib/sheets-admin-csv.mjs +82 -0
  108. package/google-workspace/lib/sheets-admin-request-kinds.mjs +183 -0
  109. package/google-workspace/lib/sheets-client.mjs +286 -0
  110. package/google-workspace/lib/surface-actions.mjs +107 -0
  111. package/google-workspace/mcp.json +4 -0
  112. package/google-workspace/plugin.json +77 -0
  113. package/google-workspace/products.json +12 -0
  114. package/google-workspace/skills/google-workspace/SKILL.md +82 -0
  115. package/google-workspace/skills/google-workspace/references/connection.md +102 -0
  116. package/google-workspace/skills/google-workspace/references/form-delivery.md +50 -0
  117. package/google-workspace/skills/google-workspace/references/sheets.md +149 -0
  118. package/google-workspace/skills/google-workspace/references/troubleshooting.md +31 -0
  119. package/google-workspace/tools/account-info.mjs +18 -0
  120. package/google-workspace/tools/sheets/README.md +54 -0
  121. package/google-workspace/tools/sheets/copy-tab.mjs +23 -0
  122. package/google-workspace/tools/sheets/copy.mjs +23 -0
  123. package/google-workspace/tools/sheets/create.mjs +35 -0
  124. package/google-workspace/tools/sheets/find-replace.mjs +38 -0
  125. package/google-workspace/tools/sheets/find.mjs +52 -0
  126. package/google-workspace/tools/sheets/get-by-data-filter.mjs +23 -0
  127. package/google-workspace/tools/sheets/get.mjs +22 -0
  128. package/google-workspace/tools/sheets/values-append.mjs +27 -0
  129. package/google-workspace/tools/sheets/values-batch-clear.mjs +20 -0
  130. package/google-workspace/tools/sheets/values-batch-get.mjs +20 -0
  131. package/google-workspace/tools/sheets/values-batch-update.mjs +29 -0
  132. package/google-workspace/tools/sheets/values-by-data-filter.mjs +62 -0
  133. package/google-workspace/tools/sheets/values-clear.mjs +20 -0
  134. package/google-workspace/tools/sheets/values-get.mjs +21 -0
  135. package/google-workspace/tools/sheets/values-update.mjs +26 -0
  136. package/google-workspace/tools/sheets-admin/README.md +45 -0
  137. package/google-workspace/tools/sheets-admin/basic-filter.mjs +32 -0
  138. package/google-workspace/tools/sheets-admin/batch-update.mjs +25 -0
  139. package/google-workspace/tools/sheets-admin/developer-metadata.mjs +28 -0
  140. package/google-workspace/tools/sheets-admin/export-csv.mjs +67 -0
  141. package/google-workspace/tools/sheets-admin/filter-views.mjs +38 -0
  142. package/google-workspace/tools/sheets-admin/format.mjs +70 -0
  143. package/google-workspace/tools/sheets-admin/named-ranges.mjs +42 -0
  144. package/google-workspace/tools/sheets-admin/open-existing.mjs +34 -0
  145. package/google-workspace/tools/sheets-admin/protected-ranges-get.mjs +18 -0
  146. package/google-workspace/tools/sheets-admin/sort.mjs +18 -0
  147. package/google-workspace/tools/sheets-admin/tab-modify.mjs +36 -0
  148. package/google-workspace/tovu-admin-surfaces.json +63 -0
  149. package/google-workspace/tovu-agent-tools.json +1178 -0
  150. package/google-workspace/tovu-connections.json +35 -0
  151. package/google-workspace/tovu-form-destinations.json +10 -0
  152. package/google-workspace/ui/README.md +73 -0
  153. package/google-workspace/ui/connection-panel.handler.mjs +167 -0
  154. package/google-workspace/ui/connection-panel.html +17 -0
  155. package/google-workspace/ui/connection-panel.mjs +189 -0
  156. package/google-workspace/ui/connection-view.mjs +120 -0
  157. package/google-workspace/ui/destination-panel.handler.mjs +106 -0
  158. package/google-workspace/ui/destination-panel.html +17 -0
  159. package/google-workspace/ui/destination-panel.mjs +150 -0
  160. package/google-workspace/ui/dom.mjs +140 -0
  161. package/google-workspace/ui/panel.css +170 -0
  162. package/google-workspace/ui/picker-flow.mjs +87 -0
  163. package/google-workspace/ui/picker-view.mjs +44 -0
  164. package/google-workspace/ui/picker.handler.mjs +56 -0
  165. package/google-workspace/ui/picker.html +17 -0
  166. package/google-workspace/ui/picker.mjs +88 -0
  167. package/google-workspace/ui/surface-client.mjs +227 -0
  168. package/higgsfield-media/mcp.json +9 -0
  169. package/higgsfield-media/plugin.json +109 -0
  170. package/higgsfield-media/skills/higgsfield-media/SKILL.md +325 -0
  171. package/higgsfield-media/skills/higgsfield-media/references/failure-modes.md +116 -0
  172. package/higgsfield-media/skills/higgsfield-media/references/models-and-plan-gates.md +142 -0
  173. package/jev/mcp.json +4 -0
  174. package/jev/plugin.json +44 -0
  175. package/jev/skills/jev/SKILL.md +308 -0
  176. package/jev/skills/jev/references/cookbooks.md +197 -0
  177. package/jev/skills/jev/references/jaggedness.md +135 -0
  178. package/jev/skills/jev/references/javascript-sdk.md +146 -0
  179. package/jev/skills/jev/references/patterns.md +123 -0
  180. package/jev/skills/jev/references/primitives-reference.md +187 -0
  181. package/langfuse/plugin.json +22 -0
  182. package/meilisearch/mcp.json +4 -0
  183. package/meilisearch/plugin.json +54 -0
  184. package/meilisearch/providers/meilisearch.mjs +651 -0
  185. package/meilisearch/skills/meilisearch/SKILL.md +43 -0
  186. package/meilisearch/tovu-search-providers.json +10 -0
  187. package/netlify/NOTES.md +13 -0
  188. package/netlify/mcp.json +4 -0
  189. package/netlify/plugin.json +47 -0
  190. package/netlify/skills/netlify/SKILL.md +39 -0
  191. package/netlify/targets/netlify.mjs +384 -0
  192. package/netlify/tovu-consent.json +6 -0
  193. package/netlify/tovu-deploy-targets.json +163 -0
  194. package/opentelemetry/mcp.json +4 -0
  195. package/opentelemetry/plugin.json +52 -0
  196. package/opentelemetry/skills/opentelemetry/SKILL.md +39 -0
  197. package/package.json +161 -6
  198. package/posthog/mcp.json +4 -0
  199. package/posthog/plugin.json +46 -0
  200. package/posthog/skills/posthog/SKILL.md +36 -0
  201. package/railway/deploy-configs/railway.mjs +135 -0
  202. package/railway/deploy-ops/railway.mjs +167 -0
  203. package/railway/mcp.json +4 -0
  204. package/railway/plugin.json +45 -0
  205. package/railway/skills/railway/SKILL.md +66 -0
  206. package/railway/tovu-deploy-configs.json +16 -0
  207. package/railway/tovu-deploy-ops.json +11 -0
  208. package/render/deploy-configs/render.mjs +141 -0
  209. package/render/deploy-ops/render.mjs +152 -0
  210. package/render/mcp.json +4 -0
  211. package/render/plugin.json +47 -0
  212. package/render/skills/render/SKILL.md +63 -0
  213. package/render/tovu-deploy-configs.json +16 -0
  214. package/render/tovu-deploy-ops.json +11 -0
  215. package/resend/NOTES.md +52 -0
  216. package/resend/adapters/resend.mjs +161 -0
  217. package/resend/lib/domains.mjs +137 -0
  218. package/resend/lib/errors.mjs +25 -0
  219. package/resend/lib/feedback.mjs +118 -0
  220. package/resend/mcp.json +13 -0
  221. package/resend/plugin.json +192 -0
  222. package/resend/skills/resend/SKILL.md +107 -0
  223. package/resend/tovu-mail-adapters.json +22 -0
  224. package/s3-compatible/NOTES.md +11 -0
  225. package/s3-compatible/mcp.json +4 -0
  226. package/s3-compatible/object-stores/s3-compatible.mjs +287 -0
  227. package/s3-compatible/plugin.json +56 -0
  228. package/s3-compatible/skills/s3-compatible/SKILL.md +39 -0
  229. package/s3-compatible/targets/s3-compatible.mjs +1054 -0
  230. package/s3-compatible/tovu-deploy-targets.json +432 -0
  231. package/s3-compatible/tovu-object-stores.json +29 -0
  232. package/sentry/mcp.json +4 -0
  233. package/sentry/plugin.json +49 -0
  234. package/sentry/skills/sentry/SKILL.md +34 -0
  235. package/shopify/mcp.json +4 -0
  236. package/shopify/plugin.json +22 -0
  237. package/shopify/skills/shopify/SKILL.md +103 -0
  238. package/shopify/skills/shopify/references/catalog-sync.md +74 -0
  239. package/shopify/skills/shopify/references/domains.md +26 -0
  240. package/shopify/skills/shopify/references/live-storefront.md +34 -0
  241. package/shopify/skills/shopify/references/storefront-snippets.md +21 -0
  242. package/site-compliance/mcp.json +4 -0
  243. package/site-compliance/plugin.json +34 -0
  244. package/site-compliance/skills/site-compliance/SKILL.md +220 -0
  245. package/site-compliance/skills/site-compliance/references/ccpa-cpra.md +115 -0
  246. package/site-compliance/skills/site-compliance/references/gdpr-eu-uk.md +143 -0
  247. package/site-compliance/skills/site-compliance/references/wcag-2-2.md +129 -0
  248. package/site-import/mcp.json +4 -0
  249. package/site-import/plugin.json +41 -0
  250. package/site-import/skills/site-import/SKILL.md +232 -0
  251. package/site-import/skills/site-import/references/content-mapping.md +166 -0
  252. package/site-import/skills/site-import/references/discovery-and-classification.md +117 -0
  253. package/site-import/skills/site-import/references/theme-extraction.md +34 -0
  254. package/slide-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
  255. package/slide-design/mcp.json +4 -0
  256. package/slide-design/plugin.json +26 -0
  257. package/slide-design/skills/slide-design/SKILL.md +103 -0
  258. package/slide-design/skills/slide-design/references/charts-and-exhibits.md +100 -0
  259. package/slide-design/skills/slide-design/references/html-deck.md +175 -0
  260. package/slide-design/skills/slide-design/references/layout-and-style.md +131 -0
  261. package/slide-design/skills/slide-design/references/review.md +93 -0
  262. package/slide-design/skills/slide-design/references/storyline.md +118 -0
  263. package/stripe/plugin.json +22 -0
  264. package/supabase/mcp.json +26 -0
  265. package/supabase/plugin.json +78 -0
  266. package/supabase/skills/supabase/SKILL.md +169 -0
  267. package/supabase/skills/supabase/references/failure-modes.md +101 -0
  268. package/ui-ux-design/CHANGELOG.md +28 -0
  269. package/ui-ux-design/LICENSE +201 -0
  270. package/ui-ux-design/NOTICE +14 -0
  271. package/ui-ux-design/README.md +62 -0
  272. package/ui-ux-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
  273. package/ui-ux-design/mcp.json +4 -0
  274. package/ui-ux-design/plugin.json +26 -0
  275. package/ui-ux-design/skills/frontend-accessibility/SKILL.md +60 -0
  276. package/ui-ux-design/skills/gstack-design/SKILL.md +53 -0
  277. package/ui-ux-design/skills/gstack-design/references/consultation.md +30 -0
  278. package/ui-ux-design/skills/gstack-design/references/html.md +29 -0
  279. package/ui-ux-design/skills/gstack-design/references/review.md +28 -0
  280. package/ui-ux-design/skills/gstack-design/references/shotgun.md +33 -0
  281. package/ui-ux-design/skills/gstack-design/references/upstream-notes.md +23 -0
  282. package/ui-ux-design/skills/interface-design/ORIGINAL.md +16 -0
  283. package/ui-ux-design/skills/interface-design/SKILL.md +41 -0
  284. package/ui-ux-design/skills/interface-design/references/commands/audit.md +40 -0
  285. package/ui-ux-design/skills/interface-design/references/commands/critique.md +21 -0
  286. package/ui-ux-design/skills/interface-design/references/commands/extract.md +34 -0
  287. package/ui-ux-design/skills/interface-design/references/commands/init.md +31 -0
  288. package/ui-ux-design/skills/interface-design/references/commands/status.md +22 -0
  289. package/ui-ux-design/skills/interface-design/references/examples/system-precision.md +29 -0
  290. package/ui-ux-design/skills/interface-design/references/examples/system-warmth.md +29 -0
  291. package/ui-ux-design/skills/interface-design/references/system-template.md +57 -0
  292. package/ui-ux-design/skills/shadcn-ui/README.md +244 -0
  293. package/ui-ux-design/skills/shadcn-ui/SKILL.md +333 -0
  294. package/ui-ux-design/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  295. package/ui-ux-design/skills/shadcn-ui/examples/data-table.tsx +313 -0
  296. package/ui-ux-design/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  297. package/ui-ux-design/skills/shadcn-ui/resources/component-catalog.md +481 -0
  298. package/ui-ux-design/skills/shadcn-ui/resources/customization-guide.md +516 -0
  299. package/ui-ux-design/skills/shadcn-ui/resources/migration-guide.md +463 -0
  300. package/ui-ux-design/skills/shadcn-ui/resources/setup-guide.md +412 -0
  301. package/ui-ux-design/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  302. package/ui-ux-design/skills/ui-ux-design/SKILL.md +171 -0
  303. package/ui-ux-design/skills/ui-ux-design/references/brand-and-voice.md +78 -0
  304. package/ui-ux-design/skills/ui-ux-design/references/chrome-mobile-test-matrix.md +137 -0
  305. package/ui-ux-design/skills/ui-ux-design/references/components-and-states.md +112 -0
  306. package/ui-ux-design/skills/ui-ux-design/references/delight-and-motion.md +54 -0
  307. package/ui-ux-design/skills/ui-ux-design/references/foundations.md +145 -0
  308. package/ui-ux-design/skills/ui-ux-design/references/inclusive-ai-imagery.md +57 -0
  309. package/ui-ux-design/skills/ui-ux-design/references/kole-jain-uiux-concepts.md +104 -0
  310. package/ui-ux-design/skills/ui-ux-design/references/kuinetic-reference.md +184 -0
  311. package/ui-ux-design/skills/ui-ux-design/references/openai-frontend-skill.md +139 -0
  312. package/ui-ux-design/skills/ui-ux-design/references/premium-ui.md +55 -0
  313. package/ui-ux-design/skills/ui-ux-design/references/research-and-validation.md +88 -0
  314. package/ui-ux-design/skills/ui-ux-design/references/sam-crawford-premium-websites.md +103 -0
  315. package/ui-ux-design/skills/ui-ux-design/references/self-made-web-designer-core-skills.md +119 -0
  316. package/ui-ux-design/skills/ui-ux-design/references/ui-animation.md +173 -0
  317. package/ui-ux-design/skills/ui-ux-design/references/ui-loop.md +234 -0
  318. package/ui-ux-design/skills/ui-ux-design/references/visual-storytelling.md +54 -0
  319. package/ui-ux-design/skills/vercel-web-design-guidelines/SKILL.md +39 -0
  320. package/ui-ux-design/skills/web-compliance/SKILL.md +134 -0
  321. package/ui-ux-design/skills/web-compliance/references/audit-evidence.md +59 -0
  322. package/vercel/NOTES.md +23 -0
  323. package/vercel/mcp.json +4 -0
  324. package/vercel/object-stores/vercel-blob.mjs +147 -0
  325. package/vercel/plugin.json +47 -0
  326. package/vercel/skills/vercel/SKILL.md +48 -0
  327. package/vercel/targets/vercel.mjs +586 -0
  328. package/vercel/tovu-consent.json +6 -0
  329. package/vercel/tovu-deploy-targets.json +219 -0
  330. package/vercel/tovu-object-stores.json +10 -0
  331. package/wordpress/NOTES.md +33 -0
  332. package/wordpress/plugin.json +30 -0
  333. package/wordpress/skills/wordpress/SKILL.md +43 -0
  334. package/wordpress/skills/wordpress/references/free-site-redirect.md +46 -0
  335. package/wordpress/skills/wordpress/references/subdomain.md +66 -0
@@ -0,0 +1,4 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
3
+ "mcpServers": {}
4
+ }
@@ -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
+ };