@shadowob/cloud 1.1.6-dev.311
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +509 -0
- package/dist/agent-browser-CERTMCDL.js +117 -0
- package/dist/agent-browser-CIRZRIY4.js +118 -0
- package/dist/agent-pack-LF3O5TR4.js +1236 -0
- package/dist/agent-pack-RQT27V7R.js +1235 -0
- package/dist/airtable-BG2Q75G2.js +82 -0
- package/dist/airtable-JCQXFM5D.js +83 -0
- package/dist/alipay-MZX2XCDB.js +52 -0
- package/dist/alipay-TZQI34RB.js +51 -0
- package/dist/amap-5RQB3VGC.js +45 -0
- package/dist/amap-KPCLZYYL.js +44 -0
- package/dist/atlassian-LGOEWYC7.js +54 -0
- package/dist/atlassian-TVS2A4IU.js +55 -0
- package/dist/baidu-appbuilder-6UMESXHW.js +41 -0
- package/dist/baidu-appbuilder-QRRL3ETM.js +42 -0
- package/dist/baidu-maps-HEPMVP5D.js +44 -0
- package/dist/baidu-maps-HXC4FBVP.js +45 -0
- package/dist/baidu-netdisk-G5Q6B5NH.js +45 -0
- package/dist/baidu-netdisk-RS2K5W2M.js +44 -0
- package/dist/baidu-smartprogram-EWTK5WKK.js +41 -0
- package/dist/baidu-smartprogram-JHD3XWF6.js +40 -0
- package/dist/browserbase-IUIYVYI7.js +67 -0
- package/dist/browserbase-JFO2PCIA.js +68 -0
- package/dist/canva-3YOFL7JS.js +62 -0
- package/dist/canva-FMYN65SM.js +61 -0
- package/dist/chunk-6P2K6QZR.js +529 -0
- package/dist/chunk-7VMRQ7MG.js +90 -0
- package/dist/chunk-AD3JTIU3.js +17 -0
- package/dist/chunk-BF6CV2Y4.js +64 -0
- package/dist/chunk-CTNUKOQE.js +439 -0
- package/dist/chunk-EEFMJYKB.js +97 -0
- package/dist/chunk-EJKFQ35I.js +739 -0
- package/dist/chunk-HUICDC56.js +62 -0
- package/dist/chunk-JUPAE5IA.js +527 -0
- package/dist/chunk-JY2HTT7Q.js +437 -0
- package/dist/chunk-KEPTCLUO.js +121 -0
- package/dist/chunk-KKK5H7YX.js +3622 -0
- package/dist/chunk-POSVEKIY.js +210 -0
- package/dist/chunk-QET4LT4J.js +5769 -0
- package/dist/chunk-QV4XWO3P.js +30 -0
- package/dist/chunk-R52J3PH2.js +120 -0
- package/dist/chunk-R5U7XKVJ.js +16 -0
- package/dist/chunk-RECNVWMT.js +212 -0
- package/dist/chunk-RTPBU5HF.js +92 -0
- package/dist/chunk-SUZ2ATT6.js +5774 -0
- package/dist/chunk-SVMXSIMG.js +98 -0
- package/dist/chunk-TV3CBM7R.js +28 -0
- package/dist/chunk-V2LU736V.js +3495 -0
- package/dist/chunk-ZUYL3W53.js +741 -0
- package/dist/claude-plugin-577TAQVS.js +1463 -0
- package/dist/claude-plugin-L3MXJJ6J.js +1464 -0
- package/dist/cli.js +7021 -0
- package/dist/cloudflare-HBBABPK6.js +114 -0
- package/dist/cloudflare-RDFPKMM5.js +115 -0
- package/dist/cnb-FLP3QX46.js +44 -0
- package/dist/cnb-YAVVEYFB.js +45 -0
- package/dist/console/index.html +12 -0
- package/dist/console/logo.png +0 -0
- package/dist/console/static/css/5079.f9e0918d.css +1 -0
- package/dist/console/static/css/index.7f91f806.css +1 -0
- package/dist/console/static/font/codicon.5b7d6fac.ttf +0 -0
- package/dist/console/static/js/5079.72a51ca2.js +699 -0
- package/dist/console/static/js/5079.72a51ca2.js.LICENSE.txt +35 -0
- package/dist/console/static/js/7426.f8d483ea.js +1 -0
- package/dist/console/static/js/async/1008.4df521b7.js +1 -0
- package/dist/console/static/js/async/102.1d473ec7.js +1 -0
- package/dist/console/static/js/async/1134.3f9fd9e7.js +1 -0
- package/dist/console/static/js/async/1318.4b8e48e7.js +1 -0
- package/dist/console/static/js/async/1360.5606da88.js +7 -0
- package/dist/console/static/js/async/1546.045f484f.js +1 -0
- package/dist/console/static/js/async/1562.187de2a8.js +1 -0
- package/dist/console/static/js/async/168.456d4813.js +1 -0
- package/dist/console/static/js/async/1750.e6dc2664.js +1 -0
- package/dist/console/static/js/async/1994.3fc86066.js +1 -0
- package/dist/console/static/js/async/2348.613ae3d9.js +1 -0
- package/dist/console/static/js/async/2390.1b890b9d.js +1 -0
- package/dist/console/static/js/async/2414.9d040212.js +1 -0
- package/dist/console/static/js/async/2454.4c1784ab.js +1 -0
- package/dist/console/static/js/async/2498.f5f92030.js +1 -0
- package/dist/console/static/js/async/2924.b823cd1a.js +1 -0
- package/dist/console/static/js/async/3062.63fddea6.js +1 -0
- package/dist/console/static/js/async/3078.dd712008.js +1 -0
- package/dist/console/static/js/async/3198.1f307065.js +1 -0
- package/dist/console/static/js/async/3246.3d5a899f.js +1 -0
- package/dist/console/static/js/async/3286.871676eb.js +1 -0
- package/dist/console/static/js/async/342.10bf3b90.js +1 -0
- package/dist/console/static/js/async/3446.9681a4d7.js +1 -0
- package/dist/console/static/js/async/3698.ccfaabec.js +1 -0
- package/dist/console/static/js/async/3790.2a1106a6.js +1 -0
- package/dist/console/static/js/async/4231.b29784d4.js +1 -0
- package/dist/console/static/js/async/4551.515bd41d.js +1 -0
- package/dist/console/static/js/async/4596.40f6e71b.js +1 -0
- package/dist/console/static/js/async/4600.4aaebe6d.js +1 -0
- package/dist/console/static/js/async/4718.1aae022f.js +1 -0
- package/dist/console/static/js/async/4846.a347c020.js +1 -0
- package/dist/console/static/js/async/4860.83dadf89.js +1 -0
- package/dist/console/static/js/async/500.fcfa37cb.js +1 -0
- package/dist/console/static/js/async/5096.b360203d.js +1 -0
- package/dist/console/static/js/async/5222.043274fe.js +1 -0
- package/dist/console/static/js/async/5362.f498001c.js +1 -0
- package/dist/console/static/js/async/54.c94f0755.js +1 -0
- package/dist/console/static/js/async/5478.50dd9ef0.js +2 -0
- package/dist/console/static/js/async/5478.50dd9ef0.js.LICENSE.txt +3 -0
- package/dist/console/static/js/async/5507.a6a1f793.js +1 -0
- package/dist/console/static/js/async/5638.bc6b102d.js +1 -0
- package/dist/console/static/js/async/5722.e0029049.js +1 -0
- package/dist/console/static/js/async/5942.74635c6b.js +1 -0
- package/dist/console/static/js/async/5994.1c5629c1.js +1 -0
- package/dist/console/static/js/async/6054.6bddf720.js +1 -0
- package/dist/console/static/js/async/6118.45e754e5.js +1 -0
- package/dist/console/static/js/async/6127.adcbcbb6.js +1 -0
- package/dist/console/static/js/async/614.3f434c20.js +1 -0
- package/dist/console/static/js/async/6234.ba3b002d.js +1 -0
- package/dist/console/static/js/async/6310.6546a9ba.js +1 -0
- package/dist/console/static/js/async/6378.9f805419.js +1 -0
- package/dist/console/static/js/async/6380.e4433c49.js +1 -0
- package/dist/console/static/js/async/6418.f23bcfda.js +1 -0
- package/dist/console/static/js/async/6428.77c86114.js +1 -0
- package/dist/console/static/js/async/6443.83318a6c.js +1 -0
- package/dist/console/static/js/async/6508.2b445d62.js +3 -0
- package/dist/console/static/js/async/6542.e82a26c8.js +1 -0
- package/dist/console/static/js/async/6544.62111ecb.js +1 -0
- package/dist/console/static/js/async/6612.a0c9fcf4.js +1 -0
- package/dist/console/static/js/async/6740.695aebf0.js +1 -0
- package/dist/console/static/js/async/6822.dbbb32bc.js +1 -0
- package/dist/console/static/js/async/6824.ad3540ab.js +1 -0
- package/dist/console/static/js/async/6930.585dab94.js +1 -0
- package/dist/console/static/js/async/6982.c81b95e6.js +1 -0
- package/dist/console/static/js/async/7046.ab2378c1.js +1 -0
- package/dist/console/static/js/async/7110.a603277f.js +1 -0
- package/dist/console/static/js/async/7142.4a21366f.js +1 -0
- package/dist/console/static/js/async/7348.15cc6148.js +1373 -0
- package/dist/console/static/js/async/7348.15cc6148.js.LICENSE.txt +14 -0
- package/dist/console/static/js/async/7374.b1ac5c44.js +1 -0
- package/dist/console/static/js/async/742.847f17ca.js +1 -0
- package/dist/console/static/js/async/7446.743954d8.js +1 -0
- package/dist/console/static/js/async/7673.59bbbaac.js +1 -0
- package/dist/console/static/js/async/7684.c5760c8c.js +1 -0
- package/dist/console/static/js/async/7714.c30d0f94.js +1 -0
- package/dist/console/static/js/async/8118.36d5a3bf.js +298 -0
- package/dist/console/static/js/async/8145.4bcf043a.js +1 -0
- package/dist/console/static/js/async/8246.408de938.js +1 -0
- package/dist/console/static/js/async/8390.bdae1f7d.js +1 -0
- package/dist/console/static/js/async/8422.fd94dbe1.js +1 -0
- package/dist/console/static/js/async/8434.94a0e2ae.js +1 -0
- package/dist/console/static/js/async/8518.3158de13.js +1 -0
- package/dist/console/static/js/async/8564.fc2eb841.js +1 -0
- package/dist/console/static/js/async/8678.73af4c9b.js +1 -0
- package/dist/console/static/js/async/8694.79747168.js +1 -0
- package/dist/console/static/js/async/8756.1de37b83.js +1 -0
- package/dist/console/static/js/async/8804.7fe6bdf9.js +3 -0
- package/dist/console/static/js/async/8883.e717ee94.js +1 -0
- package/dist/console/static/js/async/8886.fe6e876c.js +1 -0
- package/dist/console/static/js/async/9030.fc1ae402.js +1 -0
- package/dist/console/static/js/async/9094.5598d084.js +1 -0
- package/dist/console/static/js/async/9218.ee7b84b7.js +1 -0
- package/dist/console/static/js/async/94.9b80bc35.js +1 -0
- package/dist/console/static/js/async/9526.92aba34c.js +1 -0
- package/dist/console/static/js/async/9762.f83bc4f3.js +1 -0
- package/dist/console/static/js/async/984.e11c113a.js +1 -0
- package/dist/console/static/js/async/9846.246653cd.js +1 -0
- package/dist/console/static/js/index.4487e1ff.js +1 -0
- package/dist/console/static/js/lib-react.15d7ca9a.js +2 -0
- package/dist/console/static/js/lib-react.15d7ca9a.js.LICENSE.txt +49 -0
- package/dist/coze-C6PMDPBI.js +49 -0
- package/dist/coze-E6VGRNLV.js +48 -0
- package/dist/dashboard.command-J7XOZNXU.js +8 -0
- package/dist/dashboard.command-RV2NHDKW.js +7 -0
- package/dist/dingtalk-JNRNRN7E.js +77 -0
- package/dist/dingtalk-WZGGIAHJ.js +76 -0
- package/dist/douyin-miniprogram-AIJPPIZH.js +41 -0
- package/dist/douyin-miniprogram-HCYZ5NBW.js +42 -0
- package/dist/figma-2YYNSCDX.js +103 -0
- package/dist/figma-RYOBMENP.js +102 -0
- package/dist/firebase-2IJDDBXX.js +112 -0
- package/dist/firebase-OYSY6HPT.js +111 -0
- package/dist/firecrawl-2T3SBUW7.js +66 -0
- package/dist/firecrawl-IYYXLAZM.js +65 -0
- package/dist/flyai-7FJ4TRAG.js +81 -0
- package/dist/flyai-QS5Q6FJR.js +82 -0
- package/dist/gitagent-MWI75OIX.js +725 -0
- package/dist/gitagent-YBMWY7NZ.js +726 -0
- package/dist/gitee-3N7OFOM7.js +53 -0
- package/dist/gitee-KVNK6KLZ.js +54 -0
- package/dist/github-LUEC2LID.js +143 -0
- package/dist/github-XRO5Z3GC.js +142 -0
- package/dist/google-ads-A3QAJI4D.js +88 -0
- package/dist/google-ads-VPKWTX67.js +89 -0
- package/dist/google-analytics-C4UR5ZR2.js +50 -0
- package/dist/google-analytics-XDYZA2B7.js +49 -0
- package/dist/google-workspace-LL3EWVHH.js +320 -0
- package/dist/google-workspace-YX35SHHX.js +321 -0
- package/dist/huawei-xiaoyi-6BSMGJHR.js +40 -0
- package/dist/huawei-xiaoyi-KPWLTSHB.js +41 -0
- package/dist/hubspot-DIUHGEDI.js +45 -0
- package/dist/hubspot-FTIEMNZO.js +44 -0
- package/dist/huggingface-MJCOXA7E.js +116 -0
- package/dist/huggingface-UUXK2RHK.js +117 -0
- package/dist/index.d.ts +3013 -0
- package/dist/index.js +15649 -0
- package/dist/inference-ai-image-generation-CMI6R5T3.js +106 -0
- package/dist/inference-ai-image-generation-PXV6IG4U.js +107 -0
- package/dist/inference-sh-7AZOLEFI.js +94 -0
- package/dist/inference-sh-ABQOD3YF.js +95 -0
- package/dist/init.command-6E24K4H3.js +9 -0
- package/dist/init.command-O4HG4HKR.js +10 -0
- package/dist/klaviyo-6K5YEFNH.js +45 -0
- package/dist/klaviyo-LDPBWBSS.js +44 -0
- package/dist/kuaidi100-HGFM5VK2.js +42 -0
- package/dist/kuaidi100-UHPFCVXP.js +41 -0
- package/dist/lark-6LNA3LUQ.js +103 -0
- package/dist/lark-URVBZNS4.js +102 -0
- package/dist/linear-7QFSFPOD.js +57 -0
- package/dist/linear-T4ORUP7N.js +56 -0
- package/dist/lovart-PDUXRUHJ.js +99 -0
- package/dist/lovart-QO3SK55T.js +100 -0
- package/dist/meta-ads-SCNFI45S.js +42 -0
- package/dist/meta-ads-V6XPZWX3.js +41 -0
- package/dist/miclaw-5CNTW7VV.js +36 -0
- package/dist/miclaw-TPPPS2WN.js +35 -0
- package/dist/model-provider-AVSFJSZP.js +393 -0
- package/dist/model-provider-KFB76XV5.js +392 -0
- package/dist/notion-FZK76MN2.js +69 -0
- package/dist/notion-WFA7KGZZ.js +70 -0
- package/dist/oceanengine-3JZUS3PP.js +43 -0
- package/dist/oceanengine-5BRIJVJE.js +42 -0
- package/dist/opencli-PFXHGCS2.js +81 -0
- package/dist/opencli-VIGRJTGH.js +80 -0
- package/dist/paypal-33UADIPR.js +54 -0
- package/dist/paypal-Z5JYHIWD.js +55 -0
- package/dist/playwright-MG5WHK47.js +58 -0
- package/dist/playwright-SQAQ3DZG.js +59 -0
- package/dist/plugins-HZBWK3WQ.js +120 -0
- package/dist/plugins-I4GD5SZX.js +121 -0
- package/dist/posthog-MU5MAJOQ.js +79 -0
- package/dist/posthog-RJRRKDWB.js +80 -0
- package/dist/salesforce-34FVIJTG.js +82 -0
- package/dist/salesforce-3QZ6OFVO.js +83 -0
- package/dist/sentry-MCIRMACU.js +111 -0
- package/dist/sentry-PIWW46VA.js +110 -0
- package/dist/seo-suite-4SQ3I67Q.js +54 -0
- package/dist/seo-suite-WJXMA3S4.js +55 -0
- package/dist/serve.command-5FMIPQRY.js +10 -0
- package/dist/serve.command-DNE6GPMK.js +9 -0
- package/dist/shadowob-JELOWHWX.js +1068 -0
- package/dist/shadowob-PRSMI5MW.js +1069 -0
- package/dist/sherlock-2PKY2E2Y.js +66 -0
- package/dist/sherlock-C5ZWPPVT.js +67 -0
- package/dist/shopify-GL3NFVGE.js +94 -0
- package/dist/shopify-R4G3UXM6.js +93 -0
- package/dist/skill-discovery-7INAUP4D.js +77 -0
- package/dist/skill-discovery-YPXXV622.js +78 -0
- package/dist/state-7MCZBTR5.js +17 -0
- package/dist/state-FGOFLFBE.js +18 -0
- package/dist/stripe-C22RR4ZS.js +83 -0
- package/dist/stripe-LJNPQ3CQ.js +82 -0
- package/dist/supabase-IRNQ54FJ.js +98 -0
- package/dist/supabase-N4ONFJNQ.js +97 -0
- package/dist/taobao-aipaas-LRR4GMO3.js +45 -0
- package/dist/taobao-aipaas-RVKORSF4.js +46 -0
- package/dist/tapd-3JPVJ7XH.js +46 -0
- package/dist/tapd-TMQRSMFG.js +47 -0
- package/dist/tencent-ads-IGD33LO7.js +42 -0
- package/dist/tencent-ads-UHC6OPBV.js +43 -0
- package/dist/tencent-docs-C3A4J3CJ.js +47 -0
- package/dist/tencent-docs-O2SC4FHL.js +48 -0
- package/dist/tencent-maps-HMMWMNF4.js +37 -0
- package/dist/tencent-maps-OQOKHVW2.js +36 -0
- package/dist/vercel-KOXDDTHX.js +73 -0
- package/dist/vercel-OLNVDWMG.js +74 -0
- package/dist/webflow-FULU5Q2I.js +114 -0
- package/dist/webflow-OMJKZM54.js +115 -0
- package/dist/wechat-miniprogram-skyline-KYCDMQNW.js +74 -0
- package/dist/wechat-miniprogram-skyline-VR4FVIQL.js +75 -0
- package/dist/wechat-pay-BCMAJ6UW.js +50 -0
- package/dist/wechat-pay-YQQKXVUI.js +51 -0
- package/dist/wonda-NGWIORYN.js +81 -0
- package/dist/wonda-RBABXFNM.js +82 -0
- package/dist/wordpress-woocommerce-RDIUTHYT.js +57 -0
- package/dist/wordpress-woocommerce-RNA5HB3N.js +58 -0
- package/dist/wps-DAEFQHDE.js +47 -0
- package/dist/wps-LUWHMZQQ.js +48 -0
- package/dist/yuque-HCHTJWNI.js +72 -0
- package/dist/yuque-KRH5O74J.js +71 -0
- package/images/RUNNERS.md +270 -0
- package/images/cc-connect-runner/entrypoint.mjs +311 -0
- package/images/claude-runner/Dockerfile +88 -0
- package/images/claude-runner/RUNNER.md +222 -0
- package/images/claude-runner/entrypoint.mjs +2 -0
- package/images/codex-runner/Dockerfile +87 -0
- package/images/codex-runner/RUNNER.md +226 -0
- package/images/codex-runner/entrypoint.mjs +2 -0
- package/images/gemini-runner/Dockerfile +87 -0
- package/images/gemini-runner/RUNNER.md +218 -0
- package/images/gemini-runner/entrypoint.mjs +2 -0
- package/images/hermes-runner/Dockerfile +74 -0
- package/images/hermes-runner/RUNNER.md +243 -0
- package/images/hermes-runner/entrypoint.mjs +283 -0
- package/images/openclaw-runner/Dockerfile +212 -0
- package/images/openclaw-runner/RUNNER.md +170 -0
- package/images/openclaw-runner/entrypoint.mjs +1113 -0
- package/images/openclaw-runner/warm-runtime-deps.mjs +95 -0
- package/images/opencode-runner/Dockerfile +87 -0
- package/images/opencode-runner/RUNNER.md +202 -0
- package/images/opencode-runner/entrypoint.mjs +2 -0
- package/package.json +121 -0
- package/templates/agent-marketplace-buddy.template.json +131 -0
- package/templates/ai-werewolf.template.json +92 -0
- package/templates/bmad-method-buddy.template.json +123 -0
- package/templates/brain-fix.template.json +92 -0
- package/templates/claude-ads-buddy.template.json +123 -0
- package/templates/claude-financial-services-buddy.template.json +111 -0
- package/templates/claude-seo-buddy.template.json +123 -0
- package/templates/code-arena.template.json +92 -0
- package/templates/daily-brief.template.json +92 -0
- package/templates/e-wife.template.json +92 -0
- package/templates/everything-claude-code-buddy.template.json +125 -0
- package/templates/financial-freedom.template.json +92 -0
- package/templates/gitstory.template.json +92 -0
- package/templates/google-workspace-buddy.template.json +88 -0
- package/templates/gsd-buddy.template.json +119 -0
- package/templates/gstack-buddy.template.json +143 -0
- package/templates/gstack.template.json +92 -0
- package/templates/little-match-girl.template.json +114 -0
- package/templates/lovart-buddy.template.json +110 -0
- package/templates/marketingskills-buddy.template.json +102 -0
- package/templates/retire-buddy.template.json +92 -0
- package/templates/scientific-skills-buddy.template.json +119 -0
- package/templates/seomachine-buddy.template.json +113 -0
- package/templates/shadow-server-app-demo.template.json +105 -0
- package/templates/slavingia-skills-buddy.template.json +102 -0
- package/templates/superclaude-buddy.template.json +146 -0
- package/templates/superpowers-buddy.template.json +108 -0
- package/templates/world-pulse.template.json +92 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildRuntimeAssetK8sProvider
|
|
3
|
+
} from "./chunk-POSVEKIY.js";
|
|
4
|
+
import {
|
|
5
|
+
definePlugin
|
|
6
|
+
} from "./chunk-JY2HTT7Q.js";
|
|
7
|
+
import "./chunk-R5U7XKVJ.js";
|
|
8
|
+
|
|
9
|
+
// src/plugins/google-workspace/manifest.json
|
|
10
|
+
var manifest_default = {
|
|
11
|
+
id: "google-workspace",
|
|
12
|
+
name: "Google Workspace",
|
|
13
|
+
description: "Connect agents to Gmail, Calendar, Drive, Docs, Sheets, Chat, Admin, and other Workspace APIs through the gws CLI and its agent skills",
|
|
14
|
+
version: "1.0.0",
|
|
15
|
+
category: "productivity",
|
|
16
|
+
icon: "google",
|
|
17
|
+
website: "https://github.com/googleworkspace/cli",
|
|
18
|
+
docs: "https://github.com/googleworkspace/cli#authentication",
|
|
19
|
+
auth: {
|
|
20
|
+
type: "oauth2",
|
|
21
|
+
fields: [
|
|
22
|
+
{
|
|
23
|
+
key: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON",
|
|
24
|
+
label: "Google Workspace credentials.json",
|
|
25
|
+
description: "Paste credentials.json from `gws auth export --unmasked`, or a service-account JSON.",
|
|
26
|
+
required: false,
|
|
27
|
+
sensitive: true,
|
|
28
|
+
placeholder: '{"installed":{"client_id":"..."}}'
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
oauth: {
|
|
32
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
33
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
34
|
+
pkce: true,
|
|
35
|
+
scopes: [
|
|
36
|
+
"openid",
|
|
37
|
+
"email",
|
|
38
|
+
"https://www.googleapis.com/auth/drive",
|
|
39
|
+
"https://www.googleapis.com/auth/gmail.modify",
|
|
40
|
+
"https://www.googleapis.com/auth/calendar",
|
|
41
|
+
"https://www.googleapis.com/auth/documents",
|
|
42
|
+
"https://www.googleapis.com/auth/spreadsheets"
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
config: {
|
|
47
|
+
type: "object",
|
|
48
|
+
properties: {
|
|
49
|
+
services: {
|
|
50
|
+
type: "array",
|
|
51
|
+
description: "Workspace services this Buddy should prefer, such as gmail, calendar, drive, docs, sheets, chat, or admin.",
|
|
52
|
+
items: { type: "string" },
|
|
53
|
+
default: ["gmail", "calendar", "drive", "docs", "sheets"]
|
|
54
|
+
},
|
|
55
|
+
readOnlyByDefault: {
|
|
56
|
+
type: "boolean",
|
|
57
|
+
description: "Require explicit user approval before create, update, send, or delete actions.",
|
|
58
|
+
default: true
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
capabilities: ["tool", "data-source", "action", "skill", "cli"],
|
|
63
|
+
tags: [
|
|
64
|
+
"google",
|
|
65
|
+
"workspace",
|
|
66
|
+
"gmail",
|
|
67
|
+
"calendar",
|
|
68
|
+
"drive",
|
|
69
|
+
"docs",
|
|
70
|
+
"sheets",
|
|
71
|
+
"chat",
|
|
72
|
+
"admin",
|
|
73
|
+
"cli"
|
|
74
|
+
],
|
|
75
|
+
popularity: 94
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// src/plugins/google-workspace/index.ts
|
|
79
|
+
var PLUGIN_ID = "google-workspace";
|
|
80
|
+
var GWS_PACKAGE = "@googleworkspace/cli";
|
|
81
|
+
var GWS_REPO = "https://github.com/googleworkspace/cli.git";
|
|
82
|
+
var RUNTIME_MOUNT = "/opt/shadow-plugin-deps/google-workspace";
|
|
83
|
+
var SKILLS_MOUNT = "/workspace/.agents/plugin-skills/google-workspace";
|
|
84
|
+
var CREDENTIALS_FILE = "/home/shadow/.config/gws/credentials.json";
|
|
85
|
+
var ADC_FILE = "/home/shadow/.config/gws/application-default-credentials.json";
|
|
86
|
+
var AUTH_ENV_KEYS = ["GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON"];
|
|
87
|
+
var SECRET_FIELD_KEYS = {
|
|
88
|
+
credentialsJson: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON"
|
|
89
|
+
};
|
|
90
|
+
var LEGACY_SECRET_FIELD_KEYS = {
|
|
91
|
+
credentialsJson: "GOOGLE_WORKSPACE_CREDENTIALS_JSON",
|
|
92
|
+
adcJson: "GOOGLE_WORKSPACE_ADC_JSON",
|
|
93
|
+
applicationCredentialsJson: "GOOGLE_APPLICATION_CREDENTIALS_JSON",
|
|
94
|
+
cliToken: "GOOGLE_WORKSPACE_CLI_TOKEN",
|
|
95
|
+
accessToken: "GOOGLE_WORKSPACE_ACCESS_TOKEN"
|
|
96
|
+
};
|
|
97
|
+
var RUNTIME_DEPENDENCIES = [
|
|
98
|
+
{
|
|
99
|
+
id: "gws-cli",
|
|
100
|
+
kind: "npm-global",
|
|
101
|
+
packages: [GWS_PACKAGE],
|
|
102
|
+
targetPath: "/runtime-deps",
|
|
103
|
+
binPath: "/runtime-deps/bin/gws",
|
|
104
|
+
description: "Google Workspace CLI binary"
|
|
105
|
+
}
|
|
106
|
+
];
|
|
107
|
+
var SKILL_SOURCES = [
|
|
108
|
+
{
|
|
109
|
+
id: "google-workspace-cli-skills",
|
|
110
|
+
kind: "git",
|
|
111
|
+
url: GWS_REPO,
|
|
112
|
+
ref: "main",
|
|
113
|
+
from: "skills",
|
|
114
|
+
targetPath: SKILLS_MOUNT,
|
|
115
|
+
includePattern: "gws-*",
|
|
116
|
+
description: "Google Workspace CLI agent skills"
|
|
117
|
+
}
|
|
118
|
+
];
|
|
119
|
+
function isEnabledForAgent(agent, configUse) {
|
|
120
|
+
const agentEnabled = agent.use?.some((entry) => entry.plugin === PLUGIN_ID);
|
|
121
|
+
const globalEnabled = Array.isArray(configUse) && configUse.some((entry) => entry && typeof entry === "object" && entry.plugin === PLUGIN_ID);
|
|
122
|
+
return Boolean(agentEnabled || globalEnabled);
|
|
123
|
+
}
|
|
124
|
+
function stringArray(value, fallback) {
|
|
125
|
+
if (!Array.isArray(value)) return fallback;
|
|
126
|
+
const items = value.filter(
|
|
127
|
+
(item) => typeof item === "string" && item.trim().length > 0
|
|
128
|
+
);
|
|
129
|
+
return items.length > 0 ? items : fallback;
|
|
130
|
+
}
|
|
131
|
+
function firstSecret(context, keys) {
|
|
132
|
+
for (const key of keys) {
|
|
133
|
+
const value = context.secrets[key];
|
|
134
|
+
if (value) return value;
|
|
135
|
+
}
|
|
136
|
+
return void 0;
|
|
137
|
+
}
|
|
138
|
+
function hasWorkspaceCredential(context) {
|
|
139
|
+
return Boolean(
|
|
140
|
+
firstSecret(context, [
|
|
141
|
+
SECRET_FIELD_KEYS.credentialsJson,
|
|
142
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
143
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
144
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
145
|
+
])
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
var googleWorkspaceK8sProvider = buildRuntimeAssetK8sProvider({
|
|
149
|
+
pluginId: PLUGIN_ID,
|
|
150
|
+
isEnabled: (agent, config) => isEnabledForAgent(agent, config.use),
|
|
151
|
+
runtimeMountPath: RUNTIME_MOUNT,
|
|
152
|
+
skillsMountPath: SKILLS_MOUNT,
|
|
153
|
+
runtimeVolumeName: "google-workspace-runtime",
|
|
154
|
+
skillsVolumeName: "google-workspace-skills",
|
|
155
|
+
runtimeDependencies: RUNTIME_DEPENDENCIES,
|
|
156
|
+
skillSources: SKILL_SOURCES,
|
|
157
|
+
envVars: [{ name: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE", value: CREDENTIALS_FILE }],
|
|
158
|
+
sanityCommands: ["/runtime-deps/bin/gws --version", "test -f /plugin-skills/gws-shared/SKILL.md"]
|
|
159
|
+
});
|
|
160
|
+
var plugin = definePlugin(manifest_default, (api) => {
|
|
161
|
+
api.addSecretFields([
|
|
162
|
+
{
|
|
163
|
+
key: SECRET_FIELD_KEYS.credentialsJson,
|
|
164
|
+
label: "Google Workspace credentials.json",
|
|
165
|
+
description: "Paste credentials.json from `gws auth export --unmasked`, or a service-account JSON.",
|
|
166
|
+
sensitive: true,
|
|
167
|
+
placeholder: '{"installed":{"client_id":"..."}}',
|
|
168
|
+
aliases: [
|
|
169
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
170
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
171
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
]);
|
|
175
|
+
api.ignoreEnvRefs([LEGACY_SECRET_FIELD_KEYS.cliToken, LEGACY_SECRET_FIELD_KEYS.accessToken]);
|
|
176
|
+
api.addCLI([
|
|
177
|
+
{
|
|
178
|
+
name: "gws",
|
|
179
|
+
command: "gws",
|
|
180
|
+
description: "Google Workspace CLI for Gmail, Calendar, Drive, Docs, Sheets, Chat, Admin",
|
|
181
|
+
env: {
|
|
182
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
]);
|
|
186
|
+
api.addRuntimeDependencies(RUNTIME_DEPENDENCIES);
|
|
187
|
+
api.addSkillSources(SKILL_SOURCES);
|
|
188
|
+
api.addCredentialFiles([
|
|
189
|
+
{
|
|
190
|
+
envKey: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON",
|
|
191
|
+
path: CREDENTIALS_FILE,
|
|
192
|
+
mode: "0600"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
envKey: "GOOGLE_APPLICATION_CREDENTIALS_JSON",
|
|
196
|
+
path: ADC_FILE,
|
|
197
|
+
mode: "0600"
|
|
198
|
+
}
|
|
199
|
+
]);
|
|
200
|
+
api.addVerificationChecks([
|
|
201
|
+
{
|
|
202
|
+
id: "google-workspace-cli-installed",
|
|
203
|
+
label: "Google Workspace CLI installed",
|
|
204
|
+
kind: "command",
|
|
205
|
+
command: ["gws", "--version"],
|
|
206
|
+
timeoutMs: 1e4,
|
|
207
|
+
risk: "safe"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
id: "google-workspace-auth",
|
|
211
|
+
label: "Google Workspace auth status",
|
|
212
|
+
kind: "command",
|
|
213
|
+
command: ["gws", "auth", "status"],
|
|
214
|
+
timeoutMs: 15e3,
|
|
215
|
+
risk: "safe",
|
|
216
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: "google-workspace-drive-read",
|
|
220
|
+
label: "Google Drive read smoke test",
|
|
221
|
+
kind: "command",
|
|
222
|
+
command: ["gws", "drive", "files", "list", "--params", '{"pageSize": 1}'],
|
|
223
|
+
timeoutMs: 2e4,
|
|
224
|
+
risk: "read",
|
|
225
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: "google-workspace-calendar-agenda",
|
|
229
|
+
label: "Google Calendar agenda smoke test",
|
|
230
|
+
kind: "command",
|
|
231
|
+
command: ["gws", "calendar", "+agenda"],
|
|
232
|
+
timeoutMs: 2e4,
|
|
233
|
+
risk: "read",
|
|
234
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
235
|
+
}
|
|
236
|
+
]);
|
|
237
|
+
api.onBuildConfig((context) => {
|
|
238
|
+
const services = stringArray(context.agentConfig.services, [
|
|
239
|
+
"gmail",
|
|
240
|
+
"calendar",
|
|
241
|
+
"drive",
|
|
242
|
+
"docs",
|
|
243
|
+
"sheets"
|
|
244
|
+
]);
|
|
245
|
+
return {
|
|
246
|
+
skills: {
|
|
247
|
+
load: { extraDirs: [SKILLS_MOUNT] },
|
|
248
|
+
entries: {
|
|
249
|
+
[PLUGIN_ID]: {
|
|
250
|
+
enabled: true,
|
|
251
|
+
config: {
|
|
252
|
+
services,
|
|
253
|
+
skillSources: [SKILLS_MOUNT]
|
|
254
|
+
},
|
|
255
|
+
env: {
|
|
256
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE,
|
|
257
|
+
GOOGLE_WORKSPACE_SERVICES: services.join(",")
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
api.onBuildEnv((context) => {
|
|
265
|
+
const env = {
|
|
266
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE,
|
|
267
|
+
GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: "file"
|
|
268
|
+
};
|
|
269
|
+
const credentialsJson = firstSecret(context, [
|
|
270
|
+
SECRET_FIELD_KEYS.credentialsJson,
|
|
271
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
272
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
273
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
274
|
+
]);
|
|
275
|
+
const adcJson = firstSecret(context, [
|
|
276
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
277
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
278
|
+
]);
|
|
279
|
+
if (credentialsJson) env.GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON = credentialsJson;
|
|
280
|
+
if (adcJson) env.GOOGLE_APPLICATION_CREDENTIALS_JSON = adcJson;
|
|
281
|
+
for (const key of ["GOOGLE_WORKSPACE_CLI_SANITIZE_TEMPLATE", "GOOGLE_WORKSPACE_PROJECT_ID"]) {
|
|
282
|
+
const value = context.secrets[key] ?? context.agentConfig[key];
|
|
283
|
+
if (typeof value === "string" && value) env[key] = value;
|
|
284
|
+
}
|
|
285
|
+
if (env.GOOGLE_APPLICATION_CREDENTIALS_JSON) {
|
|
286
|
+
env.GOOGLE_APPLICATION_CREDENTIALS = ADC_FILE;
|
|
287
|
+
}
|
|
288
|
+
return env;
|
|
289
|
+
});
|
|
290
|
+
api.onBuildPrompt((context) => {
|
|
291
|
+
const readOnlyByDefault = context.agentConfig.readOnlyByDefault !== false;
|
|
292
|
+
return [
|
|
293
|
+
"Google Workspace is available through the `gws` CLI and the mounted gws agent skills.",
|
|
294
|
+
"Prefer structured JSON output and cite the exact Gmail, Calendar, Drive, Docs, Sheets, or Chat command used.",
|
|
295
|
+
readOnlyByDefault ? "Read-only commands are safe by default. Ask for explicit approval before sending email, creating calendar events, editing docs or sheets, uploading files, deleting, or sharing." : "Write actions are enabled by configuration, but still summarize the exact action before executing it.",
|
|
296
|
+
"Use `--dry-run` when gws supports it for drafts, sends, uploads, shares, or destructive changes."
|
|
297
|
+
].join("\n");
|
|
298
|
+
});
|
|
299
|
+
api.onValidate((context) => {
|
|
300
|
+
if (hasWorkspaceCredential(context)) return { valid: true, errors: [] };
|
|
301
|
+
return {
|
|
302
|
+
valid: true,
|
|
303
|
+
errors: [
|
|
304
|
+
{
|
|
305
|
+
path: `secrets.${SECRET_FIELD_KEYS.credentialsJson}`,
|
|
306
|
+
message: "Google Workspace works best with credentials.json from gws auth export or a service-account JSON.",
|
|
307
|
+
severity: "warning"
|
|
308
|
+
}
|
|
309
|
+
]
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
api.onHealthCheck(async (context) => {
|
|
313
|
+
return hasWorkspaceCredential(context) ? { healthy: true, message: "Google Workspace credentials are configured" } : { healthy: false, message: "Missing Google Workspace credentials" };
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
plugin.k8s = googleWorkspaceK8sProvider;
|
|
317
|
+
var google_workspace_default = plugin;
|
|
318
|
+
export {
|
|
319
|
+
google_workspace_default as default
|
|
320
|
+
};
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
buildRuntimeAssetK8sProvider
|
|
4
|
+
} from "./chunk-RECNVWMT.js";
|
|
5
|
+
import {
|
|
6
|
+
definePlugin
|
|
7
|
+
} from "./chunk-CTNUKOQE.js";
|
|
8
|
+
import "./chunk-AD3JTIU3.js";
|
|
9
|
+
|
|
10
|
+
// src/plugins/google-workspace/manifest.json
|
|
11
|
+
var manifest_default = {
|
|
12
|
+
id: "google-workspace",
|
|
13
|
+
name: "Google Workspace",
|
|
14
|
+
description: "Connect agents to Gmail, Calendar, Drive, Docs, Sheets, Chat, Admin, and other Workspace APIs through the gws CLI and its agent skills",
|
|
15
|
+
version: "1.0.0",
|
|
16
|
+
category: "productivity",
|
|
17
|
+
icon: "google",
|
|
18
|
+
website: "https://github.com/googleworkspace/cli",
|
|
19
|
+
docs: "https://github.com/googleworkspace/cli#authentication",
|
|
20
|
+
auth: {
|
|
21
|
+
type: "oauth2",
|
|
22
|
+
fields: [
|
|
23
|
+
{
|
|
24
|
+
key: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON",
|
|
25
|
+
label: "Google Workspace credentials.json",
|
|
26
|
+
description: "Paste credentials.json from `gws auth export --unmasked`, or a service-account JSON.",
|
|
27
|
+
required: false,
|
|
28
|
+
sensitive: true,
|
|
29
|
+
placeholder: '{"installed":{"client_id":"..."}}'
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
oauth: {
|
|
33
|
+
authorizationUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
34
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
35
|
+
pkce: true,
|
|
36
|
+
scopes: [
|
|
37
|
+
"openid",
|
|
38
|
+
"email",
|
|
39
|
+
"https://www.googleapis.com/auth/drive",
|
|
40
|
+
"https://www.googleapis.com/auth/gmail.modify",
|
|
41
|
+
"https://www.googleapis.com/auth/calendar",
|
|
42
|
+
"https://www.googleapis.com/auth/documents",
|
|
43
|
+
"https://www.googleapis.com/auth/spreadsheets"
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
config: {
|
|
48
|
+
type: "object",
|
|
49
|
+
properties: {
|
|
50
|
+
services: {
|
|
51
|
+
type: "array",
|
|
52
|
+
description: "Workspace services this Buddy should prefer, such as gmail, calendar, drive, docs, sheets, chat, or admin.",
|
|
53
|
+
items: { type: "string" },
|
|
54
|
+
default: ["gmail", "calendar", "drive", "docs", "sheets"]
|
|
55
|
+
},
|
|
56
|
+
readOnlyByDefault: {
|
|
57
|
+
type: "boolean",
|
|
58
|
+
description: "Require explicit user approval before create, update, send, or delete actions.",
|
|
59
|
+
default: true
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
capabilities: ["tool", "data-source", "action", "skill", "cli"],
|
|
64
|
+
tags: [
|
|
65
|
+
"google",
|
|
66
|
+
"workspace",
|
|
67
|
+
"gmail",
|
|
68
|
+
"calendar",
|
|
69
|
+
"drive",
|
|
70
|
+
"docs",
|
|
71
|
+
"sheets",
|
|
72
|
+
"chat",
|
|
73
|
+
"admin",
|
|
74
|
+
"cli"
|
|
75
|
+
],
|
|
76
|
+
popularity: 94
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// src/plugins/google-workspace/index.ts
|
|
80
|
+
var PLUGIN_ID = "google-workspace";
|
|
81
|
+
var GWS_PACKAGE = "@googleworkspace/cli";
|
|
82
|
+
var GWS_REPO = "https://github.com/googleworkspace/cli.git";
|
|
83
|
+
var RUNTIME_MOUNT = "/opt/shadow-plugin-deps/google-workspace";
|
|
84
|
+
var SKILLS_MOUNT = "/workspace/.agents/plugin-skills/google-workspace";
|
|
85
|
+
var CREDENTIALS_FILE = "/home/shadow/.config/gws/credentials.json";
|
|
86
|
+
var ADC_FILE = "/home/shadow/.config/gws/application-default-credentials.json";
|
|
87
|
+
var AUTH_ENV_KEYS = ["GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON"];
|
|
88
|
+
var SECRET_FIELD_KEYS = {
|
|
89
|
+
credentialsJson: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON"
|
|
90
|
+
};
|
|
91
|
+
var LEGACY_SECRET_FIELD_KEYS = {
|
|
92
|
+
credentialsJson: "GOOGLE_WORKSPACE_CREDENTIALS_JSON",
|
|
93
|
+
adcJson: "GOOGLE_WORKSPACE_ADC_JSON",
|
|
94
|
+
applicationCredentialsJson: "GOOGLE_APPLICATION_CREDENTIALS_JSON",
|
|
95
|
+
cliToken: "GOOGLE_WORKSPACE_CLI_TOKEN",
|
|
96
|
+
accessToken: "GOOGLE_WORKSPACE_ACCESS_TOKEN"
|
|
97
|
+
};
|
|
98
|
+
var RUNTIME_DEPENDENCIES = [
|
|
99
|
+
{
|
|
100
|
+
id: "gws-cli",
|
|
101
|
+
kind: "npm-global",
|
|
102
|
+
packages: [GWS_PACKAGE],
|
|
103
|
+
targetPath: "/runtime-deps",
|
|
104
|
+
binPath: "/runtime-deps/bin/gws",
|
|
105
|
+
description: "Google Workspace CLI binary"
|
|
106
|
+
}
|
|
107
|
+
];
|
|
108
|
+
var SKILL_SOURCES = [
|
|
109
|
+
{
|
|
110
|
+
id: "google-workspace-cli-skills",
|
|
111
|
+
kind: "git",
|
|
112
|
+
url: GWS_REPO,
|
|
113
|
+
ref: "main",
|
|
114
|
+
from: "skills",
|
|
115
|
+
targetPath: SKILLS_MOUNT,
|
|
116
|
+
includePattern: "gws-*",
|
|
117
|
+
description: "Google Workspace CLI agent skills"
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
function isEnabledForAgent(agent, configUse) {
|
|
121
|
+
const agentEnabled = agent.use?.some((entry) => entry.plugin === PLUGIN_ID);
|
|
122
|
+
const globalEnabled = Array.isArray(configUse) && configUse.some((entry) => entry && typeof entry === "object" && entry.plugin === PLUGIN_ID);
|
|
123
|
+
return Boolean(agentEnabled || globalEnabled);
|
|
124
|
+
}
|
|
125
|
+
function stringArray(value, fallback) {
|
|
126
|
+
if (!Array.isArray(value)) return fallback;
|
|
127
|
+
const items = value.filter(
|
|
128
|
+
(item) => typeof item === "string" && item.trim().length > 0
|
|
129
|
+
);
|
|
130
|
+
return items.length > 0 ? items : fallback;
|
|
131
|
+
}
|
|
132
|
+
function firstSecret(context, keys) {
|
|
133
|
+
for (const key of keys) {
|
|
134
|
+
const value = context.secrets[key];
|
|
135
|
+
if (value) return value;
|
|
136
|
+
}
|
|
137
|
+
return void 0;
|
|
138
|
+
}
|
|
139
|
+
function hasWorkspaceCredential(context) {
|
|
140
|
+
return Boolean(
|
|
141
|
+
firstSecret(context, [
|
|
142
|
+
SECRET_FIELD_KEYS.credentialsJson,
|
|
143
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
144
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
145
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
146
|
+
])
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
var googleWorkspaceK8sProvider = buildRuntimeAssetK8sProvider({
|
|
150
|
+
pluginId: PLUGIN_ID,
|
|
151
|
+
isEnabled: (agent, config) => isEnabledForAgent(agent, config.use),
|
|
152
|
+
runtimeMountPath: RUNTIME_MOUNT,
|
|
153
|
+
skillsMountPath: SKILLS_MOUNT,
|
|
154
|
+
runtimeVolumeName: "google-workspace-runtime",
|
|
155
|
+
skillsVolumeName: "google-workspace-skills",
|
|
156
|
+
runtimeDependencies: RUNTIME_DEPENDENCIES,
|
|
157
|
+
skillSources: SKILL_SOURCES,
|
|
158
|
+
envVars: [{ name: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE", value: CREDENTIALS_FILE }],
|
|
159
|
+
sanityCommands: ["/runtime-deps/bin/gws --version", "test -f /plugin-skills/gws-shared/SKILL.md"]
|
|
160
|
+
});
|
|
161
|
+
var plugin = definePlugin(manifest_default, (api) => {
|
|
162
|
+
api.addSecretFields([
|
|
163
|
+
{
|
|
164
|
+
key: SECRET_FIELD_KEYS.credentialsJson,
|
|
165
|
+
label: "Google Workspace credentials.json",
|
|
166
|
+
description: "Paste credentials.json from `gws auth export --unmasked`, or a service-account JSON.",
|
|
167
|
+
sensitive: true,
|
|
168
|
+
placeholder: '{"installed":{"client_id":"..."}}',
|
|
169
|
+
aliases: [
|
|
170
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
171
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
172
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
]);
|
|
176
|
+
api.ignoreEnvRefs([LEGACY_SECRET_FIELD_KEYS.cliToken, LEGACY_SECRET_FIELD_KEYS.accessToken]);
|
|
177
|
+
api.addCLI([
|
|
178
|
+
{
|
|
179
|
+
name: "gws",
|
|
180
|
+
command: "gws",
|
|
181
|
+
description: "Google Workspace CLI for Gmail, Calendar, Drive, Docs, Sheets, Chat, Admin",
|
|
182
|
+
env: {
|
|
183
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
]);
|
|
187
|
+
api.addRuntimeDependencies(RUNTIME_DEPENDENCIES);
|
|
188
|
+
api.addSkillSources(SKILL_SOURCES);
|
|
189
|
+
api.addCredentialFiles([
|
|
190
|
+
{
|
|
191
|
+
envKey: "GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON",
|
|
192
|
+
path: CREDENTIALS_FILE,
|
|
193
|
+
mode: "0600"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
envKey: "GOOGLE_APPLICATION_CREDENTIALS_JSON",
|
|
197
|
+
path: ADC_FILE,
|
|
198
|
+
mode: "0600"
|
|
199
|
+
}
|
|
200
|
+
]);
|
|
201
|
+
api.addVerificationChecks([
|
|
202
|
+
{
|
|
203
|
+
id: "google-workspace-cli-installed",
|
|
204
|
+
label: "Google Workspace CLI installed",
|
|
205
|
+
kind: "command",
|
|
206
|
+
command: ["gws", "--version"],
|
|
207
|
+
timeoutMs: 1e4,
|
|
208
|
+
risk: "safe"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "google-workspace-auth",
|
|
212
|
+
label: "Google Workspace auth status",
|
|
213
|
+
kind: "command",
|
|
214
|
+
command: ["gws", "auth", "status"],
|
|
215
|
+
timeoutMs: 15e3,
|
|
216
|
+
risk: "safe",
|
|
217
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
id: "google-workspace-drive-read",
|
|
221
|
+
label: "Google Drive read smoke test",
|
|
222
|
+
kind: "command",
|
|
223
|
+
command: ["gws", "drive", "files", "list", "--params", '{"pageSize": 1}'],
|
|
224
|
+
timeoutMs: 2e4,
|
|
225
|
+
risk: "read",
|
|
226
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: "google-workspace-calendar-agenda",
|
|
230
|
+
label: "Google Calendar agenda smoke test",
|
|
231
|
+
kind: "command",
|
|
232
|
+
command: ["gws", "calendar", "+agenda"],
|
|
233
|
+
timeoutMs: 2e4,
|
|
234
|
+
risk: "read",
|
|
235
|
+
requiredEnvAny: AUTH_ENV_KEYS
|
|
236
|
+
}
|
|
237
|
+
]);
|
|
238
|
+
api.onBuildConfig((context) => {
|
|
239
|
+
const services = stringArray(context.agentConfig.services, [
|
|
240
|
+
"gmail",
|
|
241
|
+
"calendar",
|
|
242
|
+
"drive",
|
|
243
|
+
"docs",
|
|
244
|
+
"sheets"
|
|
245
|
+
]);
|
|
246
|
+
return {
|
|
247
|
+
skills: {
|
|
248
|
+
load: { extraDirs: [SKILLS_MOUNT] },
|
|
249
|
+
entries: {
|
|
250
|
+
[PLUGIN_ID]: {
|
|
251
|
+
enabled: true,
|
|
252
|
+
config: {
|
|
253
|
+
services,
|
|
254
|
+
skillSources: [SKILLS_MOUNT]
|
|
255
|
+
},
|
|
256
|
+
env: {
|
|
257
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE,
|
|
258
|
+
GOOGLE_WORKSPACE_SERVICES: services.join(",")
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
});
|
|
265
|
+
api.onBuildEnv((context) => {
|
|
266
|
+
const env = {
|
|
267
|
+
GOOGLE_WORKSPACE_CLI_CREDENTIALS_FILE: CREDENTIALS_FILE,
|
|
268
|
+
GOOGLE_WORKSPACE_CLI_KEYRING_BACKEND: "file"
|
|
269
|
+
};
|
|
270
|
+
const credentialsJson = firstSecret(context, [
|
|
271
|
+
SECRET_FIELD_KEYS.credentialsJson,
|
|
272
|
+
LEGACY_SECRET_FIELD_KEYS.credentialsJson,
|
|
273
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
274
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
275
|
+
]);
|
|
276
|
+
const adcJson = firstSecret(context, [
|
|
277
|
+
LEGACY_SECRET_FIELD_KEYS.adcJson,
|
|
278
|
+
LEGACY_SECRET_FIELD_KEYS.applicationCredentialsJson
|
|
279
|
+
]);
|
|
280
|
+
if (credentialsJson) env.GOOGLE_WORKSPACE_CLI_CREDENTIALS_JSON = credentialsJson;
|
|
281
|
+
if (adcJson) env.GOOGLE_APPLICATION_CREDENTIALS_JSON = adcJson;
|
|
282
|
+
for (const key of ["GOOGLE_WORKSPACE_CLI_SANITIZE_TEMPLATE", "GOOGLE_WORKSPACE_PROJECT_ID"]) {
|
|
283
|
+
const value = context.secrets[key] ?? context.agentConfig[key];
|
|
284
|
+
if (typeof value === "string" && value) env[key] = value;
|
|
285
|
+
}
|
|
286
|
+
if (env.GOOGLE_APPLICATION_CREDENTIALS_JSON) {
|
|
287
|
+
env.GOOGLE_APPLICATION_CREDENTIALS = ADC_FILE;
|
|
288
|
+
}
|
|
289
|
+
return env;
|
|
290
|
+
});
|
|
291
|
+
api.onBuildPrompt((context) => {
|
|
292
|
+
const readOnlyByDefault = context.agentConfig.readOnlyByDefault !== false;
|
|
293
|
+
return [
|
|
294
|
+
"Google Workspace is available through the `gws` CLI and the mounted gws agent skills.",
|
|
295
|
+
"Prefer structured JSON output and cite the exact Gmail, Calendar, Drive, Docs, Sheets, or Chat command used.",
|
|
296
|
+
readOnlyByDefault ? "Read-only commands are safe by default. Ask for explicit approval before sending email, creating calendar events, editing docs or sheets, uploading files, deleting, or sharing." : "Write actions are enabled by configuration, but still summarize the exact action before executing it.",
|
|
297
|
+
"Use `--dry-run` when gws supports it for drafts, sends, uploads, shares, or destructive changes."
|
|
298
|
+
].join("\n");
|
|
299
|
+
});
|
|
300
|
+
api.onValidate((context) => {
|
|
301
|
+
if (hasWorkspaceCredential(context)) return { valid: true, errors: [] };
|
|
302
|
+
return {
|
|
303
|
+
valid: true,
|
|
304
|
+
errors: [
|
|
305
|
+
{
|
|
306
|
+
path: `secrets.${SECRET_FIELD_KEYS.credentialsJson}`,
|
|
307
|
+
message: "Google Workspace works best with credentials.json from gws auth export or a service-account JSON.",
|
|
308
|
+
severity: "warning"
|
|
309
|
+
}
|
|
310
|
+
]
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
api.onHealthCheck(async (context) => {
|
|
314
|
+
return hasWorkspaceCredential(context) ? { healthy: true, message: "Google Workspace credentials are configured" } : { healthy: false, message: "Missing Google Workspace credentials" };
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
plugin.k8s = googleWorkspaceK8sProvider;
|
|
318
|
+
var google_workspace_default = plugin;
|
|
319
|
+
export {
|
|
320
|
+
google_workspace_default as default
|
|
321
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
connectorField,
|
|
3
|
+
connectorManifest
|
|
4
|
+
} from "./chunk-EEFMJYKB.js";
|
|
5
|
+
import "./chunk-POSVEKIY.js";
|
|
6
|
+
import {
|
|
7
|
+
defineConnectorPlugin
|
|
8
|
+
} from "./chunk-JY2HTT7Q.js";
|
|
9
|
+
import "./chunk-R5U7XKVJ.js";
|
|
10
|
+
|
|
11
|
+
// src/plugins/huawei-xiaoyi/index.ts
|
|
12
|
+
var manifest = connectorManifest({
|
|
13
|
+
id: "huawei-xiaoyi",
|
|
14
|
+
name: "Huawei Xiaoyi",
|
|
15
|
+
description: "Huawei Xiaoyi agent workflows for HarmonyOS MCP plugins, service lookup, tool integration, mobile-agent actions, and scenario publishing.",
|
|
16
|
+
category: "automation",
|
|
17
|
+
icon: "sparkles",
|
|
18
|
+
website: "https://developer.huawei.com/consumer/cn",
|
|
19
|
+
docs: "https://developer.huawei.com/consumer/cn/doc/service/mcp-plugin-0000002437785774",
|
|
20
|
+
fields: [
|
|
21
|
+
connectorField("HUAWEI_XIAOYI_CLIENT_ID", "Client ID", {
|
|
22
|
+
description: "Huawei Xiaoyi platform client ID.",
|
|
23
|
+
sensitive: false,
|
|
24
|
+
placeholder: "Client ID"
|
|
25
|
+
}),
|
|
26
|
+
connectorField("HUAWEI_XIAOYI_CLIENT_SECRET", "Client secret", {
|
|
27
|
+
description: "Huawei Xiaoyi platform client secret.",
|
|
28
|
+
placeholder: "Client secret"
|
|
29
|
+
})
|
|
30
|
+
],
|
|
31
|
+
capabilities: ["tool", "data-source", "action", "mcp"],
|
|
32
|
+
tags: ["huawei", "xiaoyi", "harmonyos", "mcp", "mobile-agent", "plugins"],
|
|
33
|
+
popularity: 81
|
|
34
|
+
});
|
|
35
|
+
var huawei_xiaoyi_default = defineConnectorPlugin(manifest, {
|
|
36
|
+
prompt: "Use Huawei Xiaoyi for HarmonyOS MCP plugin workflows, service lookup, tool integration, mobile-agent tasks, and scenario publishing. Confirm publishing or configuration changes before applying them."
|
|
37
|
+
});
|
|
38
|
+
export {
|
|
39
|
+
huawei_xiaoyi_default as default
|
|
40
|
+
};
|