@shadowob/cloud 1.1.7 → 1.1.8
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 +159 -11
- package/dist/{agent-browser-CERTMCDL.js → agent-browser-EI7FIK3X.js} +3 -3
- package/dist/{agent-browser-CIRZRIY4.js → agent-browser-YXE4ES6Q.js} +3 -3
- package/dist/{agent-pack-LF3O5TR4.js → agent-pack-35TFCZKP.js} +1 -1
- package/dist/{agent-pack-RQT27V7R.js → agent-pack-UOG6ZAUL.js} +1 -1
- package/dist/agentmemory-KP5O7GHB.js +101 -0
- package/dist/agentmemory-UV74POU5.js +100 -0
- package/dist/{airtable-BG2Q75G2.js → airtable-CXXS3YUN.js} +3 -3
- package/dist/{airtable-JCQXFM5D.js → airtable-YZ5JR5JC.js} +3 -3
- package/dist/{alipay-TZQI34RB.js → alipay-WED5P3XC.js} +3 -3
- package/dist/{alipay-MZX2XCDB.js → alipay-WJTVREMG.js} +3 -3
- package/dist/{amap-KPCLZYYL.js → amap-AIN23TQ7.js} +3 -3
- package/dist/{amap-5RQB3VGC.js → amap-F6GF7QKB.js} +3 -3
- package/dist/{atlassian-LGOEWYC7.js → atlassian-G6PM6UVM.js} +3 -3
- package/dist/{atlassian-TVS2A4IU.js → atlassian-IDR2NPJC.js} +3 -3
- package/dist/{baidu-appbuilder-QRRL3ETM.js → baidu-appbuilder-JKQIA5TG.js} +3 -3
- package/dist/{baidu-appbuilder-6UMESXHW.js → baidu-appbuilder-KVMCIFYH.js} +3 -3
- package/dist/{baidu-maps-HEPMVP5D.js → baidu-maps-GWMXV6YT.js} +3 -3
- package/dist/{baidu-maps-HXC4FBVP.js → baidu-maps-ZXGT6QZM.js} +3 -3
- package/dist/{baidu-netdisk-G5Q6B5NH.js → baidu-netdisk-J5SLQVWW.js} +3 -3
- package/dist/{baidu-netdisk-RS2K5W2M.js → baidu-netdisk-PONM3DY6.js} +3 -3
- package/dist/{baidu-smartprogram-JHD3XWF6.js → baidu-smartprogram-WJ5JMO6V.js} +3 -3
- package/dist/{baidu-smartprogram-EWTK5WKK.js → baidu-smartprogram-Y5WBR7RX.js} +3 -3
- package/dist/{browserbase-IUIYVYI7.js → browserbase-CGVQHRC4.js} +3 -3
- package/dist/{browserbase-JFO2PCIA.js → browserbase-PVWYTEZC.js} +3 -3
- package/dist/{canva-3YOFL7JS.js → canva-COCBQAT2.js} +3 -3
- package/dist/{canva-FMYN65SM.js → canva-RSTJSEX5.js} +3 -3
- package/dist/{chunk-35LJYCQF.js → chunk-3CT6RQNM.js} +745 -482
- package/dist/{chunk-KODMGZUC.js → chunk-4YO3NA26.js} +1 -1
- package/dist/{chunk-RECNVWMT.js → chunk-6V7MW4HU.js} +17 -3
- package/dist/{chunk-C6OI4ZNO.js → chunk-EVV774KS.js} +1 -1
- package/dist/{chunk-SVMXSIMG.js → chunk-F6CQ6GAG.js} +2 -1
- package/dist/{chunk-JUPAE5IA.js → chunk-OL5VH6RN.js} +72 -69
- package/dist/{chunk-POSVEKIY.js → chunk-OYY64ZSX.js} +17 -3
- package/dist/{chunk-ZHVYNIHA.js → chunk-P5Y6F2NH.js} +745 -482
- package/dist/{chunk-EEFMJYKB.js → chunk-PSK2SYZ3.js} +2 -1
- package/dist/{chunk-6YAYCWGK.js → chunk-PYJRFKPN.js} +1 -1
- package/dist/{chunk-JY2HTT7Q.js → chunk-RMDY3W4V.js} +6 -0
- package/dist/{chunk-EWB7L7IW.js → chunk-X2SREECR.js} +6 -6
- package/dist/{chunk-LXJBQBGL.js → chunk-X5VOIA72.js} +6 -6
- package/dist/{chunk-CTNUKOQE.js → chunk-Y5BJ3EW2.js} +6 -0
- package/dist/{chunk-SAP2DBHO.js → chunk-Y6BKVDG7.js} +1 -1
- package/dist/{chunk-6P2K6QZR.js → chunk-ZGMWSSCC.js} +72 -69
- package/dist/{claude-plugin-577TAQVS.js → claude-plugin-FPN32WMT.js} +1 -1
- package/dist/{claude-plugin-L3MXJJ6J.js → claude-plugin-IYHOVTVL.js} +1 -1
- package/dist/cli.js +930 -149
- package/dist/{cloudflare-RDFPKMM5.js → cloudflare-U3RHJJKK.js} +3 -3
- package/dist/{cloudflare-HBBABPK6.js → cloudflare-ZHN7UGPX.js} +3 -3
- package/dist/{cnb-FLP3QX46.js → cnb-AMXC5I7D.js} +3 -3
- package/dist/{cnb-YAVVEYFB.js → cnb-P3IZ4JTD.js} +3 -3
- package/dist/console/index.html +1 -1
- package/dist/console/static/css/index.f4563d95.css +1 -0
- package/dist/console/static/js/index.020abc71.js +1 -0
- package/dist/{coze-E6VGRNLV.js → coze-66RYMKVB.js} +3 -3
- package/dist/{coze-C6PMDPBI.js → coze-YE3BINXP.js} +3 -3
- package/dist/{dashboard.command-ZMQFKLNQ.js → dashboard.command-BRPZCZER.js} +1 -1
- package/dist/{dashboard.command-2AM45SIT.js → dashboard.command-GUHSJ2CN.js} +1 -1
- package/dist/{dingtalk-JNRNRN7E.js → dingtalk-4RFQG7N2.js} +3 -3
- package/dist/{dingtalk-WZGGIAHJ.js → dingtalk-VNFKXD2P.js} +3 -3
- package/dist/{douyin-miniprogram-AIJPPIZH.js → douyin-miniprogram-UEALAGOS.js} +3 -3
- package/dist/{douyin-miniprogram-HCYZ5NBW.js → douyin-miniprogram-UNB6UO2I.js} +3 -3
- package/dist/{figma-2YYNSCDX.js → figma-A264OWU5.js} +3 -3
- package/dist/{figma-RYOBMENP.js → figma-Y4TGSDZP.js} +3 -3
- package/dist/{firebase-OYSY6HPT.js → firebase-AI3MAGYG.js} +3 -3
- package/dist/{firebase-2IJDDBXX.js → firebase-ZGQARUIH.js} +3 -3
- package/dist/{firecrawl-2T3SBUW7.js → firecrawl-2JW7DMTH.js} +3 -3
- package/dist/{firecrawl-IYYXLAZM.js → firecrawl-UURQ5P5N.js} +3 -3
- package/dist/{flyai-QS5Q6FJR.js → flyai-EJGDMYFA.js} +3 -3
- package/dist/{flyai-7FJ4TRAG.js → flyai-ZFMZBBHJ.js} +3 -3
- package/dist/{gitagent-MWI75OIX.js → gitagent-5SDBYFNA.js} +1 -1
- package/dist/{gitagent-YBMWY7NZ.js → gitagent-ODXPCR4X.js} +1 -1
- package/dist/{gitee-3N7OFOM7.js → gitee-5UMJ4BC7.js} +3 -3
- package/dist/{gitee-KVNK6KLZ.js → gitee-D6NAZTCO.js} +3 -3
- package/dist/{github-LUEC2LID.js → github-JBLDKIA3.js} +3 -3
- package/dist/{github-XRO5Z3GC.js → github-PZQAVEZP.js} +3 -3
- package/dist/{google-ads-VPKWTX67.js → google-ads-BIFQOJ5M.js} +3 -3
- package/dist/{google-ads-A3QAJI4D.js → google-ads-QU3LJE4O.js} +3 -3
- package/dist/{google-analytics-C4UR5ZR2.js → google-analytics-7VZ6YZVA.js} +3 -3
- package/dist/{google-analytics-XDYZA2B7.js → google-analytics-HXMPCL5V.js} +3 -3
- package/dist/{google-workspace-YX35SHHX.js → google-workspace-6SEBJ4VA.js} +2 -2
- package/dist/{google-workspace-LL3EWVHH.js → google-workspace-L3AMJLCF.js} +2 -2
- package/dist/{huawei-xiaoyi-KPWLTSHB.js → huawei-xiaoyi-C6QIJMPM.js} +3 -3
- package/dist/{huawei-xiaoyi-6BSMGJHR.js → huawei-xiaoyi-JGLXWU5P.js} +3 -3
- package/dist/{hubspot-FTIEMNZO.js → hubspot-LACJGE6D.js} +3 -3
- package/dist/{hubspot-DIUHGEDI.js → hubspot-XWPRO4KZ.js} +3 -3
- package/dist/{huggingface-UUXK2RHK.js → huggingface-26QQZK4C.js} +3 -3
- package/dist/{huggingface-MJCOXA7E.js → huggingface-CQICNA2R.js} +3 -3
- package/dist/index.d.ts +1338 -1
- package/dist/index.js +1364 -226
- package/dist/{inference-ai-image-generation-PXV6IG4U.js → inference-ai-image-generation-5KYIUWT6.js} +3 -3
- package/dist/{inference-ai-image-generation-CMI6R5T3.js → inference-ai-image-generation-J2NYDCLZ.js} +3 -3
- package/dist/{inference-sh-7AZOLEFI.js → inference-sh-5SWQTK73.js} +3 -3
- package/dist/{inference-sh-ABQOD3YF.js → inference-sh-PTQF6T3R.js} +3 -3
- package/dist/{init.command-YVG4X6II.js → init.command-C7UKPK2Y.js} +3 -3
- package/dist/{init.command-JKE3SXAS.js → init.command-UNL66BMR.js} +3 -3
- package/dist/{klaviyo-LDPBWBSS.js → klaviyo-4UNPMBFT.js} +3 -3
- package/dist/{klaviyo-6K5YEFNH.js → klaviyo-SLYNEULT.js} +3 -3
- package/dist/{kuaidi100-HGFM5VK2.js → kuaidi100-HZKV5AIS.js} +3 -3
- package/dist/{kuaidi100-UHPFCVXP.js → kuaidi100-ZQUW7GHH.js} +3 -3
- package/dist/lark-HQUZNHDI.js +382 -0
- package/dist/lark-PAV7XWJS.js +381 -0
- package/dist/{linear-T4ORUP7N.js → linear-PYGQ5SLK.js} +3 -3
- package/dist/{linear-7QFSFPOD.js → linear-VJLYNTUF.js} +3 -3
- package/dist/{lovart-PDUXRUHJ.js → lovart-KC6SVNAJ.js} +3 -3
- package/dist/{lovart-QO3SK55T.js → lovart-WVKY4RR4.js} +3 -3
- package/dist/{meta-ads-SCNFI45S.js → meta-ads-E6XT33GI.js} +3 -3
- package/dist/{meta-ads-V6XPZWX3.js → meta-ads-RJ6DWRYN.js} +3 -3
- package/dist/{miclaw-TPPPS2WN.js → miclaw-4BA3A2YN.js} +3 -3
- package/dist/{miclaw-5CNTW7VV.js → miclaw-LUV6DCHX.js} +3 -3
- package/dist/{model-provider-KFB76XV5.js → model-provider-SYXJZ3JD.js} +1 -1
- package/dist/{model-provider-AVSFJSZP.js → model-provider-U7NEYA3Y.js} +1 -1
- package/dist/nature-skills-G76ABIWZ.js +143 -0
- package/dist/nature-skills-SQHMFXKT.js +142 -0
- package/dist/{notion-WFA7KGZZ.js → notion-2JZAKOFP.js} +1 -1
- package/dist/{notion-FZK76MN2.js → notion-O3NO5TJH.js} +1 -1
- package/dist/{oceanengine-3JZUS3PP.js → oceanengine-D23UZGVB.js} +3 -3
- package/dist/{oceanengine-5BRIJVJE.js → oceanengine-WDK2OXX5.js} +3 -3
- package/dist/{opencli-PFXHGCS2.js → opencli-36P63YNU.js} +3 -3
- package/dist/{opencli-VIGRJTGH.js → opencli-SUHDFR33.js} +3 -3
- package/dist/{paypal-Z5JYHIWD.js → paypal-K27SUW3B.js} +3 -3
- package/dist/{paypal-33UADIPR.js → paypal-OPZ3KOV5.js} +3 -3
- package/dist/{playwright-SQAQ3DZG.js → playwright-2ULT3NIC.js} +3 -3
- package/dist/{playwright-MG5WHK47.js → playwright-3Q7LBILG.js} +3 -3
- package/dist/{plugins-HZBWK3WQ.js → plugins-2MITZ4ZD.js} +2 -2
- package/dist/{plugins-I4GD5SZX.js → plugins-UK2QWD6G.js} +2 -2
- package/dist/{posthog-MU5MAJOQ.js → posthog-E3EHXLAN.js} +3 -3
- package/dist/{posthog-RJRRKDWB.js → posthog-KPJVLGX6.js} +3 -3
- package/dist/{salesforce-34FVIJTG.js → salesforce-FGPNG7FB.js} +3 -3
- package/dist/{salesforce-3QZ6OFVO.js → salesforce-TVHISKBC.js} +3 -3
- package/dist/{sentry-PIWW46VA.js → sentry-BZ3J3MZM.js} +3 -3
- package/dist/{sentry-MCIRMACU.js → sentry-XC57YRAJ.js} +3 -3
- package/dist/{seo-suite-WJXMA3S4.js → seo-suite-2MDEDLAB.js} +3 -3
- package/dist/{seo-suite-4SQ3I67Q.js → seo-suite-U75O3QP6.js} +3 -3
- package/dist/{serve.command-XLBJUOV6.js → serve.command-G5RVQFUD.js} +3 -3
- package/dist/{serve.command-RD6I6MFD.js → serve.command-PYGDG7K3.js} +3 -3
- package/dist/{shadowob-PRSMI5MW.js → shadowob-3QZ7DLDW.js} +158 -31
- package/dist/{shadowob-JELOWHWX.js → shadowob-CJLOEKFP.js} +158 -31
- package/dist/{sherlock-2PKY2E2Y.js → sherlock-CQFUHKDH.js} +3 -3
- package/dist/{sherlock-C5ZWPPVT.js → sherlock-DONK2I6E.js} +3 -3
- package/dist/{shopify-GL3NFVGE.js → shopify-NO5GI3WD.js} +3 -3
- package/dist/{shopify-R4G3UXM6.js → shopify-VW2KLKH5.js} +3 -3
- package/dist/{skill-discovery-YPXXV622.js → skill-discovery-6JEPPKKM.js} +3 -3
- package/dist/{skill-discovery-7INAUP4D.js → skill-discovery-PWRAVGIS.js} +3 -3
- package/dist/skills/shadowob-cli/SKILL.md +7 -0
- package/dist/{stripe-LJNPQ3CQ.js → stripe-HCNCKG4C.js} +1 -1
- package/dist/{stripe-C22RR4ZS.js → stripe-IU3KTJ4H.js} +1 -1
- package/dist/{supabase-IRNQ54FJ.js → supabase-KRL7JW2D.js} +3 -3
- package/dist/{supabase-N4ONFJNQ.js → supabase-TYEBTZNO.js} +3 -3
- package/dist/{taobao-aipaas-LRR4GMO3.js → taobao-aipaas-PEUIDOYP.js} +3 -3
- package/dist/{taobao-aipaas-RVKORSF4.js → taobao-aipaas-SA5E4MZA.js} +3 -3
- package/dist/{tapd-TMQRSMFG.js → tapd-6DDIUPVQ.js} +3 -3
- package/dist/{tapd-3JPVJ7XH.js → tapd-OTYLSZGY.js} +3 -3
- package/dist/{tencent-ads-UHC6OPBV.js → tencent-ads-OW2TAMH5.js} +3 -3
- package/dist/{tencent-ads-IGD33LO7.js → tencent-ads-XTQZ27YT.js} +3 -3
- package/dist/{tencent-docs-C3A4J3CJ.js → tencent-docs-6D6A2VCO.js} +3 -3
- package/dist/{tencent-docs-O2SC4FHL.js → tencent-docs-K3TMUIWD.js} +3 -3
- package/dist/{tencent-maps-OQOKHVW2.js → tencent-maps-IZYWITJZ.js} +3 -3
- package/dist/{tencent-maps-HMMWMNF4.js → tencent-maps-SWI7CLQY.js} +3 -3
- package/dist/text-to-cad-B2UP6PKA.js +192 -0
- package/dist/text-to-cad-I4B6VBFV.js +193 -0
- package/dist/{vercel-KOXDDTHX.js → vercel-CCKRC76D.js} +3 -3
- package/dist/{vercel-OLNVDWMG.js → vercel-SBGEMIJJ.js} +3 -3
- package/dist/{webflow-OMJKZM54.js → webflow-C3EHNNSN.js} +3 -3
- package/dist/{webflow-FULU5Q2I.js → webflow-ZFBJH4CR.js} +3 -3
- package/dist/{wechat-miniprogram-skyline-KYCDMQNW.js → wechat-miniprogram-skyline-VNCRERHX.js} +3 -3
- package/dist/{wechat-miniprogram-skyline-VR4FVIQL.js → wechat-miniprogram-skyline-Z5JQUV5Q.js} +3 -3
- package/dist/{wechat-pay-BCMAJ6UW.js → wechat-pay-RPDKPUEB.js} +3 -3
- package/dist/{wechat-pay-YQQKXVUI.js → wechat-pay-XVDGJRF2.js} +3 -3
- package/dist/{wonda-NGWIORYN.js → wonda-EL2P44S7.js} +3 -3
- package/dist/{wonda-RBABXFNM.js → wonda-XK5JK4X3.js} +3 -3
- package/dist/{wordpress-woocommerce-RNA5HB3N.js → wordpress-woocommerce-4MEE5A2M.js} +3 -3
- package/dist/{wordpress-woocommerce-RDIUTHYT.js → wordpress-woocommerce-6ECNM2QU.js} +3 -3
- package/dist/{wps-LUWHMZQQ.js → wps-E4OZEMOF.js} +3 -3
- package/dist/{wps-DAEFQHDE.js → wps-JNQUC4JS.js} +3 -3
- package/dist/{yuque-HCHTJWNI.js → yuque-GLAAOS7X.js} +3 -3
- package/dist/{yuque-KRH5O74J.js → yuque-MEF6VFLJ.js} +3 -3
- package/images/RUNNERS.md +15 -0
- package/images/cc-connect-runner/entrypoint.mjs +228 -0
- package/images/claude-runner/RUNNER.md +5 -3
- package/images/codex-runner/RUNNER.md +5 -3
- package/images/gemini-runner/RUNNER.md +5 -2
- package/images/hermes-runner/RUNNER.md +4 -2
- package/images/hermes-runner/entrypoint.mjs +269 -1
- package/images/openclaw-runner/Dockerfile +1 -0
- package/images/openclaw-runner/RUNNER.md +3 -0
- package/images/openclaw-runner/entrypoint.mjs +249 -1
- package/images/openclaw-runner/warm-runtime-deps.mjs +1 -3
- package/images/opencode-runner/RUNNER.md +5 -3
- package/package.json +3 -3
- package/templates/agent-marketplace-buddy.template.json +4 -1
- package/templates/bmad-method-buddy.template.json +4 -1
- package/templates/code-trainer.template.json +331 -0
- package/templates/gstack-buddy.template.json +4 -1
- package/templates/little-match-girl.template.json +10 -3
- package/dist/console/static/css/index.7f91f806.css +0 -1
- package/dist/console/static/js/index.4487e1ff.js +0 -1
- package/dist/lark-6LNA3LUQ.js +0 -103
- package/dist/lark-URVBZNS4.js +0 -102
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
connectorManifest,
|
|
6
6
|
installedCheck,
|
|
7
7
|
npmGlobalDependency
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
9
|
+
import "./chunk-6V7MW4HU.js";
|
|
10
10
|
import {
|
|
11
11
|
defineConnectorPlugin
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
13
13
|
import "./chunk-AD3JTIU3.js";
|
|
14
14
|
|
|
15
15
|
// src/plugins/webflow/index.ts
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
connectorManifest,
|
|
5
5
|
installedCheck,
|
|
6
6
|
npmGlobalDependency
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
8
|
+
import "./chunk-OYY64ZSX.js";
|
|
9
9
|
import {
|
|
10
10
|
defineConnectorPlugin
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RMDY3W4V.js";
|
|
12
12
|
import "./chunk-R5U7XKVJ.js";
|
|
13
13
|
|
|
14
14
|
// src/plugins/webflow/index.ts
|
package/dist/{wechat-miniprogram-skyline-KYCDMQNW.js → wechat-miniprogram-skyline-VNCRERHX.js}
RENAMED
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
attachConnectorRuntimeAssets,
|
|
3
3
|
connectorField,
|
|
4
4
|
connectorManifest
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
6
|
+
import "./chunk-OYY64ZSX.js";
|
|
7
7
|
import {
|
|
8
8
|
defineConnectorPlugin
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RMDY3W4V.js";
|
|
10
10
|
import "./chunk-R5U7XKVJ.js";
|
|
11
11
|
|
|
12
12
|
// src/plugins/wechat-miniprogram-skyline/index.ts
|
package/dist/{wechat-miniprogram-skyline-VR4FVIQL.js → wechat-miniprogram-skyline-Z5JQUV5Q.js}
RENAMED
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
attachConnectorRuntimeAssets,
|
|
4
4
|
connectorField,
|
|
5
5
|
connectorManifest
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
7
|
+
import "./chunk-6V7MW4HU.js";
|
|
8
8
|
import {
|
|
9
9
|
defineConnectorPlugin
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
11
11
|
import "./chunk-AD3JTIU3.js";
|
|
12
12
|
|
|
13
13
|
// src/plugins/wechat-miniprogram-skyline/index.ts
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
connectorField,
|
|
3
3
|
connectorManifest
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
5
|
+
import "./chunk-OYY64ZSX.js";
|
|
6
6
|
import {
|
|
7
7
|
defineConnectorPlugin
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RMDY3W4V.js";
|
|
9
9
|
import "./chunk-R5U7XKVJ.js";
|
|
10
10
|
|
|
11
11
|
// src/plugins/wechat-pay/index.ts
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
connectorField,
|
|
4
4
|
connectorManifest
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
6
|
+
import "./chunk-6V7MW4HU.js";
|
|
7
7
|
import {
|
|
8
8
|
defineConnectorPlugin
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
10
10
|
import "./chunk-AD3JTIU3.js";
|
|
11
11
|
|
|
12
12
|
// src/plugins/wechat-pay/index.ts
|
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
connectorManifest,
|
|
5
5
|
installedCheck,
|
|
6
6
|
npmGlobalDependency
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
8
|
+
import "./chunk-OYY64ZSX.js";
|
|
9
9
|
import {
|
|
10
10
|
defineConnectorPlugin
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-RMDY3W4V.js";
|
|
12
12
|
import "./chunk-R5U7XKVJ.js";
|
|
13
13
|
|
|
14
14
|
// src/plugins/wonda/index.ts
|
|
@@ -5,11 +5,11 @@ import {
|
|
|
5
5
|
connectorManifest,
|
|
6
6
|
installedCheck,
|
|
7
7
|
npmGlobalDependency
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
9
|
+
import "./chunk-6V7MW4HU.js";
|
|
10
10
|
import {
|
|
11
11
|
defineConnectorPlugin
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
13
13
|
import "./chunk-AD3JTIU3.js";
|
|
14
14
|
|
|
15
15
|
// src/plugins/wonda/index.ts
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
connectorField,
|
|
4
4
|
connectorManifest
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
6
|
+
import "./chunk-6V7MW4HU.js";
|
|
7
7
|
import {
|
|
8
8
|
defineConnectorPlugin
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
10
10
|
import "./chunk-AD3JTIU3.js";
|
|
11
11
|
|
|
12
12
|
// src/plugins/wordpress-woocommerce/index.ts
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
connectorField,
|
|
3
3
|
connectorManifest
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
5
|
+
import "./chunk-OYY64ZSX.js";
|
|
6
6
|
import {
|
|
7
7
|
defineConnectorPlugin
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RMDY3W4V.js";
|
|
9
9
|
import "./chunk-R5U7XKVJ.js";
|
|
10
10
|
|
|
11
11
|
// src/plugins/wordpress-woocommerce/index.ts
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
connectorField,
|
|
4
4
|
connectorManifest
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
6
|
+
import "./chunk-6V7MW4HU.js";
|
|
7
7
|
import {
|
|
8
8
|
defineConnectorPlugin
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
10
10
|
import "./chunk-AD3JTIU3.js";
|
|
11
11
|
|
|
12
12
|
// src/plugins/wps/index.ts
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
connectorField,
|
|
3
3
|
connectorManifest
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
5
|
+
import "./chunk-OYY64ZSX.js";
|
|
6
6
|
import {
|
|
7
7
|
defineConnectorPlugin
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RMDY3W4V.js";
|
|
9
9
|
import "./chunk-R5U7XKVJ.js";
|
|
10
10
|
|
|
11
11
|
// src/plugins/wps/index.ts
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
attachConnectorRuntimeAssets,
|
|
4
4
|
connectorField,
|
|
5
5
|
connectorManifest
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-F6CQ6GAG.js";
|
|
7
|
+
import "./chunk-6V7MW4HU.js";
|
|
8
8
|
import {
|
|
9
9
|
defineConnectorPlugin
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-Y5BJ3EW2.js";
|
|
11
11
|
import "./chunk-AD3JTIU3.js";
|
|
12
12
|
|
|
13
13
|
// src/plugins/yuque/index.ts
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
attachConnectorRuntimeAssets,
|
|
3
3
|
connectorField,
|
|
4
4
|
connectorManifest
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-PSK2SYZ3.js";
|
|
6
|
+
import "./chunk-OYY64ZSX.js";
|
|
7
7
|
import {
|
|
8
8
|
defineConnectorPlugin
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RMDY3W4V.js";
|
|
10
10
|
import "./chunk-R5U7XKVJ.js";
|
|
11
11
|
|
|
12
12
|
// src/plugins/yuque/index.ts
|
package/images/RUNNERS.md
CHANGED
|
@@ -68,6 +68,21 @@ ShadowOB assets are installed in two explicit places:
|
|
|
68
68
|
loaded afterward in runtime-extension order, and duplicate command names use
|
|
69
69
|
first-wins semantics rather than overwriting an earlier command.
|
|
70
70
|
|
|
71
|
+
Cloud template routines are installed as runner-neutral seed data at
|
|
72
|
+
`/etc/shadowob/template-routines.json`. Each runner imports that seed into its
|
|
73
|
+
native schedule store at container startup:
|
|
74
|
+
|
|
75
|
+
| Runtime family | Native routine store | ShadowOB delivery target |
|
|
76
|
+
| --- | --- | --- |
|
|
77
|
+
| OpenClaw | `/home/shadow/.openclaw/cron/jobs.json` | `shadowob:channel:<channel_id>` |
|
|
78
|
+
| cc-connect based | `/home/shadow/.cc-connect/crons/jobs.json` | `session_key = "shadowob:channel:<channel_id>"` |
|
|
79
|
+
| Hermes | `/home/shadow/.hermes/cron/jobs.json` | `deliver = "shadowob:<channel_id>"` or native `origin` |
|
|
80
|
+
|
|
81
|
+
Routine import uses deterministic managed job ids and a spec hash. If a user
|
|
82
|
+
edits a managed routine in the runtime store after deployment, the next
|
|
83
|
+
container start preserves the runtime edit instead of overwriting it from the
|
|
84
|
+
template seed.
|
|
85
|
+
|
|
71
86
|
## Slash command catalogs
|
|
72
87
|
|
|
73
88
|
Slash commands are runner-specific. Do not put runtime command lists in shared
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { spawn, spawnSync } from 'node:child_process'
|
|
12
|
+
import { createHash } from 'node:crypto'
|
|
12
13
|
import {
|
|
13
14
|
chmodSync,
|
|
14
15
|
cpSync,
|
|
@@ -27,8 +28,13 @@ const CONFIG_MOUNT = process.env.SHADOW_RUNNER_CONFIG_MOUNT ?? '/etc/openclaw'
|
|
|
27
28
|
const RUNTIME_FILES_PATH = join(CONFIG_MOUNT, 'runtime-files.json')
|
|
28
29
|
const RUNTIME_EXTENSIONS_PATH = join(CONFIG_MOUNT, 'runtime-extensions.json')
|
|
29
30
|
const RUNNER_HOME = process.env.HOME ?? '/home/shadow'
|
|
31
|
+
const TEMPLATE_ROUTINES_PATH =
|
|
32
|
+
process.env.SHADOW_TEMPLATE_ROUTINES_PATH ?? '/etc/shadowob/template-routines.json'
|
|
30
33
|
const CC_CONNECT_CONFIG_PATH =
|
|
31
34
|
process.env.CC_CONNECT_CONFIG_PATH ?? join(RUNNER_HOME, '.cc-connect/config.toml')
|
|
35
|
+
const CC_CONNECT_DATA_DIR = process.env.CC_CONNECT_DATA_DIR ?? join(RUNNER_HOME, '.cc-connect')
|
|
36
|
+
const CC_CONNECT_CRON_STORE_PATH =
|
|
37
|
+
process.env.CC_CONNECT_CRON_STORE_PATH ?? join(CC_CONNECT_DATA_DIR, 'crons', 'jobs.json')
|
|
32
38
|
const HEALTH_PORT = Number.parseInt(
|
|
33
39
|
process.env.SHADOW_RUNNER_HEALTH_PORT ??
|
|
34
40
|
process.env.OPENCLAW_GATEWAY_PORT ??
|
|
@@ -85,6 +91,227 @@ function modeForPath(path) {
|
|
|
85
91
|
return 0o644
|
|
86
92
|
}
|
|
87
93
|
|
|
94
|
+
function isPlainObject(value) {
|
|
95
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function stableValue(value) {
|
|
99
|
+
if (Array.isArray(value)) return value.map(stableValue)
|
|
100
|
+
if (!isPlainObject(value)) return value
|
|
101
|
+
return Object.fromEntries(
|
|
102
|
+
Object.entries(value)
|
|
103
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
104
|
+
.map(([key, item]) => [key, stableValue(item)]),
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function stableHash(value) {
|
|
109
|
+
return createHash('sha256')
|
|
110
|
+
.update(JSON.stringify(stableValue(value)))
|
|
111
|
+
.digest('hex')
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function readJsonFile(path, fallback) {
|
|
115
|
+
if (!existsSync(path)) return fallback
|
|
116
|
+
try {
|
|
117
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'))
|
|
118
|
+
return parsed && typeof parsed === 'object' ? parsed : fallback
|
|
119
|
+
} catch (err) {
|
|
120
|
+
console.warn(`[entrypoint] Failed to parse ${path}: ${err.message}`)
|
|
121
|
+
return fallback
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function parseRoutineEveryCron(interval) {
|
|
126
|
+
if (typeof interval !== 'string') return null
|
|
127
|
+
const match = interval.trim().match(/^(\d+)\s*(m|h|d)$/i)
|
|
128
|
+
if (!match) return null
|
|
129
|
+
const amount = Number.parseInt(match[1], 10)
|
|
130
|
+
if (!Number.isFinite(amount) || amount <= 0) return null
|
|
131
|
+
const unit = match[2].toLowerCase()
|
|
132
|
+
if (unit === 'm') return amount < 60 ? `*/${amount} * * * *` : null
|
|
133
|
+
if (unit === 'h') return amount < 24 ? `0 */${amount} * * *` : null
|
|
134
|
+
return `0 0 */${amount} * *`
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function buildCcConnectRoutineCronExpr(routine) {
|
|
138
|
+
const schedule = isPlainObject(routine.schedule) ? routine.schedule : {}
|
|
139
|
+
let expr = null
|
|
140
|
+
if (typeof schedule.cron === 'string' && schedule.cron.trim()) {
|
|
141
|
+
expr = schedule.cron.trim()
|
|
142
|
+
} else {
|
|
143
|
+
expr = parseRoutineEveryCron(schedule.interval)
|
|
144
|
+
}
|
|
145
|
+
if (!expr) return null
|
|
146
|
+
if (typeof schedule.timezone === 'string' && schedule.timezone.trim()) {
|
|
147
|
+
return `CRON_TZ=${schedule.timezone.trim()} ${expr}`
|
|
148
|
+
}
|
|
149
|
+
return expr
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function resolveShadowobRoutineDelivery(routine) {
|
|
153
|
+
const deliveries = Array.isArray(routine.deliveries) ? routine.deliveries : []
|
|
154
|
+
for (const delivery of deliveries) {
|
|
155
|
+
if (
|
|
156
|
+
!isPlainObject(delivery) ||
|
|
157
|
+
delivery.pluginId !== 'shadowob' ||
|
|
158
|
+
delivery.kind !== 'channel'
|
|
159
|
+
) {
|
|
160
|
+
continue
|
|
161
|
+
}
|
|
162
|
+
const target = isPlainObject(delivery.target) ? delivery.target : {}
|
|
163
|
+
const channelEnvKey =
|
|
164
|
+
typeof target.channelEnvKey === 'string' && target.channelEnvKey.trim()
|
|
165
|
+
? target.channelEnvKey.trim()
|
|
166
|
+
: null
|
|
167
|
+
const channelId =
|
|
168
|
+
(channelEnvKey ? process.env[channelEnvKey] : undefined) ??
|
|
169
|
+
(typeof target.channelId === 'string' ? target.channelId : undefined)
|
|
170
|
+
if (!channelId) continue
|
|
171
|
+
return {
|
|
172
|
+
channelId,
|
|
173
|
+
threadId:
|
|
174
|
+
typeof target.threadId === 'string' && target.threadId.trim()
|
|
175
|
+
? target.threadId.trim()
|
|
176
|
+
: null,
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return null
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function managedRoutineJobId(routine) {
|
|
183
|
+
const raw = `shadow-template-${routine.agentId ?? 'agent'}-${routine.id ?? 'routine'}`
|
|
184
|
+
.toLowerCase()
|
|
185
|
+
.replace(/[^a-z0-9._:-]+/g, '-')
|
|
186
|
+
.replace(/^-+|-+$/g, '')
|
|
187
|
+
if (raw.length >= 8 && raw.length <= 64) return raw
|
|
188
|
+
return `shadow-template-${stableHash({ agentId: routine.agentId, id: routine.id }).slice(0, 20)}`
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function ccConnectRoutineSessionKey(delivery) {
|
|
192
|
+
if (delivery.threadId) return `shadowob:channel:${delivery.channelId}:thread:${delivery.threadId}`
|
|
193
|
+
return `shadowob:channel:${delivery.channelId}`
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function ccConnectManagedJobShape(job) {
|
|
197
|
+
return {
|
|
198
|
+
id: job.id,
|
|
199
|
+
project: job.project,
|
|
200
|
+
session_key: job.session_key,
|
|
201
|
+
cron_expr: job.cron_expr,
|
|
202
|
+
prompt: job.prompt,
|
|
203
|
+
exec: job.exec,
|
|
204
|
+
work_dir: job.work_dir,
|
|
205
|
+
description: job.description,
|
|
206
|
+
enabled: job.enabled,
|
|
207
|
+
silent: job.silent,
|
|
208
|
+
mute: job.mute,
|
|
209
|
+
session_mode: job.session_mode,
|
|
210
|
+
mode: job.mode,
|
|
211
|
+
timeout_mins: job.timeout_mins,
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function buildCcConnectRoutineJob(routine, now) {
|
|
216
|
+
if (
|
|
217
|
+
!isPlainObject(routine) ||
|
|
218
|
+
typeof routine.id !== 'string' ||
|
|
219
|
+
typeof routine.agentId !== 'string'
|
|
220
|
+
) {
|
|
221
|
+
return null
|
|
222
|
+
}
|
|
223
|
+
const cronExpr = buildCcConnectRoutineCronExpr(routine)
|
|
224
|
+
const delivery = resolveShadowobRoutineDelivery(routine)
|
|
225
|
+
if (!cronExpr || !delivery) return null
|
|
226
|
+
const job = {
|
|
227
|
+
id: managedRoutineJobId(routine),
|
|
228
|
+
project: routine.agentId,
|
|
229
|
+
session_key: ccConnectRoutineSessionKey(delivery),
|
|
230
|
+
cron_expr: cronExpr,
|
|
231
|
+
prompt: String(routine.prompt ?? ''),
|
|
232
|
+
description:
|
|
233
|
+
typeof routine.title === 'string' && routine.title.trim() ? routine.title.trim() : routine.id,
|
|
234
|
+
enabled: routine.enabled !== false,
|
|
235
|
+
session_mode: 'new_per_run',
|
|
236
|
+
created_at: now,
|
|
237
|
+
last_run: '0001-01-01T00:00:00Z',
|
|
238
|
+
}
|
|
239
|
+
const managedSpecHash = stableHash(ccConnectManagedJobShape(job))
|
|
240
|
+
return {
|
|
241
|
+
...job,
|
|
242
|
+
shadowTemplateRoutine: {
|
|
243
|
+
version: 1,
|
|
244
|
+
routineId: routine.id,
|
|
245
|
+
agentId: routine.agentId,
|
|
246
|
+
sourceHash: typeof routine.sourceHash === 'string' ? routine.sourceHash : null,
|
|
247
|
+
managedSpecHash,
|
|
248
|
+
},
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function syncTemplateRoutinesToCcConnectCron() {
|
|
253
|
+
if (!existsSync(TEMPLATE_ROUTINES_PATH)) return
|
|
254
|
+
const seed = readJsonFile(TEMPLATE_ROUTINES_PATH, null)
|
|
255
|
+
const routines = Array.isArray(seed?.routines) ? seed.routines : []
|
|
256
|
+
if (routines.length === 0) return
|
|
257
|
+
|
|
258
|
+
const now = new Date().toISOString()
|
|
259
|
+
const existing = readJsonFile(CC_CONNECT_CRON_STORE_PATH, [])
|
|
260
|
+
const jobs = Array.isArray(existing) ? existing.filter(Boolean) : []
|
|
261
|
+
let changed = false
|
|
262
|
+
|
|
263
|
+
for (const routine of routines) {
|
|
264
|
+
const desired = buildCcConnectRoutineJob(routine, now)
|
|
265
|
+
if (!desired) {
|
|
266
|
+
console.warn(
|
|
267
|
+
`[entrypoint] Skipping invalid template routine: ${JSON.stringify(routine?.id ?? null)}`,
|
|
268
|
+
)
|
|
269
|
+
continue
|
|
270
|
+
}
|
|
271
|
+
const existingIndex = jobs.findIndex((job) => {
|
|
272
|
+
const marker = isPlainObject(job?.shadowTemplateRoutine) ? job.shadowTemplateRoutine : null
|
|
273
|
+
return marker?.routineId === desired.shadowTemplateRoutine.routineId || job?.id === desired.id
|
|
274
|
+
})
|
|
275
|
+
if (existingIndex < 0) {
|
|
276
|
+
jobs.push(desired)
|
|
277
|
+
changed = true
|
|
278
|
+
console.log(`[entrypoint] Seeded cc-connect cron routine: ${desired.id}`)
|
|
279
|
+
continue
|
|
280
|
+
}
|
|
281
|
+
const current = jobs[existingIndex]
|
|
282
|
+
const marker = isPlainObject(current.shadowTemplateRoutine)
|
|
283
|
+
? current.shadowTemplateRoutine
|
|
284
|
+
: null
|
|
285
|
+
const currentManagedSpecHash = stableHash(ccConnectManagedJobShape(current))
|
|
286
|
+
if (!marker || marker.managedSpecHash !== currentManagedSpecHash) {
|
|
287
|
+
console.log(
|
|
288
|
+
`[entrypoint] Preserved user-edited cc-connect cron routine: ${current.id ?? desired.id}`,
|
|
289
|
+
)
|
|
290
|
+
continue
|
|
291
|
+
}
|
|
292
|
+
if (marker.managedSpecHash === desired.shadowTemplateRoutine.managedSpecHash) continue
|
|
293
|
+
jobs[existingIndex] = {
|
|
294
|
+
...desired,
|
|
295
|
+
id: current.id ?? desired.id,
|
|
296
|
+
created_at: current.created_at ?? desired.created_at,
|
|
297
|
+
last_run: current.last_run ?? desired.last_run,
|
|
298
|
+
last_error: current.last_error,
|
|
299
|
+
}
|
|
300
|
+
changed = true
|
|
301
|
+
console.log(
|
|
302
|
+
`[entrypoint] Updated cc-connect cron routine from template: ${jobs[existingIndex].id}`,
|
|
303
|
+
)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!changed) return
|
|
307
|
+
mkdirSync(dirname(CC_CONNECT_CRON_STORE_PATH), { recursive: true })
|
|
308
|
+
writeFileSync(CC_CONNECT_CRON_STORE_PATH, `${JSON.stringify(jobs, null, 2)}\n`, {
|
|
309
|
+
encoding: 'utf-8',
|
|
310
|
+
mode: 0o600,
|
|
311
|
+
})
|
|
312
|
+
chmodSync(CC_CONNECT_CRON_STORE_PATH, 0o600)
|
|
313
|
+
}
|
|
314
|
+
|
|
88
315
|
function materializeRuntimeFiles() {
|
|
89
316
|
const files = loadJson(RUNTIME_FILES_PATH, {})
|
|
90
317
|
for (const [path, content] of Object.entries(files)) {
|
|
@@ -290,6 +517,7 @@ async function main() {
|
|
|
290
517
|
materializeRuntimeFiles()
|
|
291
518
|
materializeCredentialFiles()
|
|
292
519
|
materializePluginRuntimeAssets()
|
|
520
|
+
syncTemplateRoutinesToCcConnectCron()
|
|
293
521
|
|
|
294
522
|
if (process.env.SHADOW_RUNNER_VALIDATE_ONLY === '1') {
|
|
295
523
|
verifyBinary('cc-connect', ['--help'])
|
|
@@ -167,9 +167,11 @@ not through OpenClaw `models.providers`.
|
|
|
167
167
|
`.claude/commands` only for compatibility.
|
|
168
168
|
- MCP: write `.mcp.json` for project-scoped MCP and avoid relying on
|
|
169
169
|
`~/.claude.json` in immutable images.
|
|
170
|
-
- Cron/routine:
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
- Cron/routine: Cloud template routines are materialized by the shared
|
|
171
|
+
cc-connect runner from `/etc/shadowob/template-routines.json` into
|
|
172
|
+
`~/.cc-connect/crons/jobs.json`. Managed jobs use deterministic ids and a
|
|
173
|
+
spec hash so user-edited schedules are preserved. ShadowOB delivery uses
|
|
174
|
+
`session_key = "shadowob:channel:<channel_id>"` or a thread-qualified variant.
|
|
173
175
|
- Hooks: write Claude settings `hooks`, not OpenClaw `hooks`.
|
|
174
176
|
- Subagents: materialize `.claude/agents` and any preloaded skill references.
|
|
175
177
|
- Logs: collect both cc-connect daemon logs and Claude Code native telemetry or
|
|
@@ -165,9 +165,11 @@ type = "shadowob"
|
|
|
165
165
|
- Skills: materialize `.agents/skills` for repo-scoped workflows and
|
|
166
166
|
`$CODEX_HOME/skills` only if the runner owns the whole home directory.
|
|
167
167
|
- MCP: generate `[mcp_servers.*]` TOML tables.
|
|
168
|
-
- Cron/routine:
|
|
169
|
-
|
|
170
|
-
|
|
168
|
+
- Cron/routine: Cloud template routines are materialized by the shared
|
|
169
|
+
cc-connect runner from `/etc/shadowob/template-routines.json` into
|
|
170
|
+
`~/.cc-connect/crons/jobs.json`. Managed jobs use deterministic ids and a
|
|
171
|
+
spec hash so user-edited schedules are preserved. ShadowOB delivery uses
|
|
172
|
+
`session_key = "shadowob:channel:<channel_id>"` or a thread-qualified variant.
|
|
171
173
|
- Hooks: write Codex hook config in trusted project or user config.
|
|
172
174
|
- Subagents: generate Codex agent roles and instruction files under `.codex`
|
|
173
175
|
only when `features.multi_agent` or equivalent config is enabled.
|
|
@@ -165,8 +165,11 @@ type = "shadowob"
|
|
|
165
165
|
- Skills: no native `SKILL.md` surface was found; use `GEMINI.md`, custom
|
|
166
166
|
commands, and extensions for phase 1.
|
|
167
167
|
- MCP: write `mcpServers` in `.gemini/settings.json`.
|
|
168
|
-
- Cron/routine:
|
|
169
|
-
|
|
168
|
+
- Cron/routine: Cloud template routines are materialized by the shared
|
|
169
|
+
cc-connect runner from `/etc/shadowob/template-routines.json` into
|
|
170
|
+
`~/.cc-connect/crons/jobs.json`. Managed jobs use deterministic ids and a
|
|
171
|
+
spec hash so user-edited schedules are preserved. ShadowOB delivery uses
|
|
172
|
+
`session_key = "shadowob:channel:<channel_id>"` or a thread-qualified variant.
|
|
170
173
|
- Hooks: write `hooksConfig` and `hooks.*` in Gemini settings.
|
|
171
174
|
- Subagents: Gemini settings expose agent override and hook points around agent
|
|
172
175
|
execution, but cc-connect currently drives the main Gemini CLI agent only.
|
|
@@ -176,8 +176,10 @@ SHADOW_TOKEN=...
|
|
|
176
176
|
runner profile.
|
|
177
177
|
- MCP: write Hermes MCP config rather than OpenClaw or Codex MCP formats.
|
|
178
178
|
- Cron/routine: Hermes has the strongest native cron surface among the target
|
|
179
|
-
runners
|
|
180
|
-
|
|
179
|
+
runners. Cloud template routines are seeded from
|
|
180
|
+
`/etc/shadowob/template-routines.json` into `~/.hermes/cron/jobs.json`, using
|
|
181
|
+
Hermes native `deliver`/`origin` ShadowOB delivery. Managed jobs use
|
|
182
|
+
deterministic ids and a spec hash so user-edited schedules are preserved.
|
|
181
183
|
- Hooks: expose plugin hooks through `plugins.enabled` and plugin files, not a
|
|
182
184
|
central OpenClaw hook adapter.
|
|
183
185
|
- Subagents: support Hermes delegation later as native Hermes multi-agent
|