@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.
Files changed (334) hide show
  1. package/README.md +509 -0
  2. package/dist/agent-browser-CERTMCDL.js +117 -0
  3. package/dist/agent-browser-CIRZRIY4.js +118 -0
  4. package/dist/agent-pack-LF3O5TR4.js +1236 -0
  5. package/dist/agent-pack-RQT27V7R.js +1235 -0
  6. package/dist/airtable-BG2Q75G2.js +82 -0
  7. package/dist/airtable-JCQXFM5D.js +83 -0
  8. package/dist/alipay-MZX2XCDB.js +52 -0
  9. package/dist/alipay-TZQI34RB.js +51 -0
  10. package/dist/amap-5RQB3VGC.js +45 -0
  11. package/dist/amap-KPCLZYYL.js +44 -0
  12. package/dist/atlassian-LGOEWYC7.js +54 -0
  13. package/dist/atlassian-TVS2A4IU.js +55 -0
  14. package/dist/baidu-appbuilder-6UMESXHW.js +41 -0
  15. package/dist/baidu-appbuilder-QRRL3ETM.js +42 -0
  16. package/dist/baidu-maps-HEPMVP5D.js +44 -0
  17. package/dist/baidu-maps-HXC4FBVP.js +45 -0
  18. package/dist/baidu-netdisk-G5Q6B5NH.js +45 -0
  19. package/dist/baidu-netdisk-RS2K5W2M.js +44 -0
  20. package/dist/baidu-smartprogram-EWTK5WKK.js +41 -0
  21. package/dist/baidu-smartprogram-JHD3XWF6.js +40 -0
  22. package/dist/browserbase-IUIYVYI7.js +67 -0
  23. package/dist/browserbase-JFO2PCIA.js +68 -0
  24. package/dist/canva-3YOFL7JS.js +62 -0
  25. package/dist/canva-FMYN65SM.js +61 -0
  26. package/dist/chunk-6P2K6QZR.js +529 -0
  27. package/dist/chunk-7VMRQ7MG.js +90 -0
  28. package/dist/chunk-AD3JTIU3.js +17 -0
  29. package/dist/chunk-BF6CV2Y4.js +64 -0
  30. package/dist/chunk-CTNUKOQE.js +439 -0
  31. package/dist/chunk-EEFMJYKB.js +97 -0
  32. package/dist/chunk-EJKFQ35I.js +739 -0
  33. package/dist/chunk-HUICDC56.js +62 -0
  34. package/dist/chunk-JUPAE5IA.js +527 -0
  35. package/dist/chunk-JY2HTT7Q.js +437 -0
  36. package/dist/chunk-KEPTCLUO.js +121 -0
  37. package/dist/chunk-KKK5H7YX.js +3622 -0
  38. package/dist/chunk-POSVEKIY.js +210 -0
  39. package/dist/chunk-QET4LT4J.js +5769 -0
  40. package/dist/chunk-QV4XWO3P.js +30 -0
  41. package/dist/chunk-R52J3PH2.js +120 -0
  42. package/dist/chunk-R5U7XKVJ.js +16 -0
  43. package/dist/chunk-RECNVWMT.js +212 -0
  44. package/dist/chunk-RTPBU5HF.js +92 -0
  45. package/dist/chunk-SUZ2ATT6.js +5774 -0
  46. package/dist/chunk-SVMXSIMG.js +98 -0
  47. package/dist/chunk-TV3CBM7R.js +28 -0
  48. package/dist/chunk-V2LU736V.js +3495 -0
  49. package/dist/chunk-ZUYL3W53.js +741 -0
  50. package/dist/claude-plugin-577TAQVS.js +1463 -0
  51. package/dist/claude-plugin-L3MXJJ6J.js +1464 -0
  52. package/dist/cli.js +7021 -0
  53. package/dist/cloudflare-HBBABPK6.js +114 -0
  54. package/dist/cloudflare-RDFPKMM5.js +115 -0
  55. package/dist/cnb-FLP3QX46.js +44 -0
  56. package/dist/cnb-YAVVEYFB.js +45 -0
  57. package/dist/console/index.html +12 -0
  58. package/dist/console/logo.png +0 -0
  59. package/dist/console/static/css/5079.f9e0918d.css +1 -0
  60. package/dist/console/static/css/index.7f91f806.css +1 -0
  61. package/dist/console/static/font/codicon.5b7d6fac.ttf +0 -0
  62. package/dist/console/static/js/5079.72a51ca2.js +699 -0
  63. package/dist/console/static/js/5079.72a51ca2.js.LICENSE.txt +35 -0
  64. package/dist/console/static/js/7426.f8d483ea.js +1 -0
  65. package/dist/console/static/js/async/1008.4df521b7.js +1 -0
  66. package/dist/console/static/js/async/102.1d473ec7.js +1 -0
  67. package/dist/console/static/js/async/1134.3f9fd9e7.js +1 -0
  68. package/dist/console/static/js/async/1318.4b8e48e7.js +1 -0
  69. package/dist/console/static/js/async/1360.5606da88.js +7 -0
  70. package/dist/console/static/js/async/1546.045f484f.js +1 -0
  71. package/dist/console/static/js/async/1562.187de2a8.js +1 -0
  72. package/dist/console/static/js/async/168.456d4813.js +1 -0
  73. package/dist/console/static/js/async/1750.e6dc2664.js +1 -0
  74. package/dist/console/static/js/async/1994.3fc86066.js +1 -0
  75. package/dist/console/static/js/async/2348.613ae3d9.js +1 -0
  76. package/dist/console/static/js/async/2390.1b890b9d.js +1 -0
  77. package/dist/console/static/js/async/2414.9d040212.js +1 -0
  78. package/dist/console/static/js/async/2454.4c1784ab.js +1 -0
  79. package/dist/console/static/js/async/2498.f5f92030.js +1 -0
  80. package/dist/console/static/js/async/2924.b823cd1a.js +1 -0
  81. package/dist/console/static/js/async/3062.63fddea6.js +1 -0
  82. package/dist/console/static/js/async/3078.dd712008.js +1 -0
  83. package/dist/console/static/js/async/3198.1f307065.js +1 -0
  84. package/dist/console/static/js/async/3246.3d5a899f.js +1 -0
  85. package/dist/console/static/js/async/3286.871676eb.js +1 -0
  86. package/dist/console/static/js/async/342.10bf3b90.js +1 -0
  87. package/dist/console/static/js/async/3446.9681a4d7.js +1 -0
  88. package/dist/console/static/js/async/3698.ccfaabec.js +1 -0
  89. package/dist/console/static/js/async/3790.2a1106a6.js +1 -0
  90. package/dist/console/static/js/async/4231.b29784d4.js +1 -0
  91. package/dist/console/static/js/async/4551.515bd41d.js +1 -0
  92. package/dist/console/static/js/async/4596.40f6e71b.js +1 -0
  93. package/dist/console/static/js/async/4600.4aaebe6d.js +1 -0
  94. package/dist/console/static/js/async/4718.1aae022f.js +1 -0
  95. package/dist/console/static/js/async/4846.a347c020.js +1 -0
  96. package/dist/console/static/js/async/4860.83dadf89.js +1 -0
  97. package/dist/console/static/js/async/500.fcfa37cb.js +1 -0
  98. package/dist/console/static/js/async/5096.b360203d.js +1 -0
  99. package/dist/console/static/js/async/5222.043274fe.js +1 -0
  100. package/dist/console/static/js/async/5362.f498001c.js +1 -0
  101. package/dist/console/static/js/async/54.c94f0755.js +1 -0
  102. package/dist/console/static/js/async/5478.50dd9ef0.js +2 -0
  103. package/dist/console/static/js/async/5478.50dd9ef0.js.LICENSE.txt +3 -0
  104. package/dist/console/static/js/async/5507.a6a1f793.js +1 -0
  105. package/dist/console/static/js/async/5638.bc6b102d.js +1 -0
  106. package/dist/console/static/js/async/5722.e0029049.js +1 -0
  107. package/dist/console/static/js/async/5942.74635c6b.js +1 -0
  108. package/dist/console/static/js/async/5994.1c5629c1.js +1 -0
  109. package/dist/console/static/js/async/6054.6bddf720.js +1 -0
  110. package/dist/console/static/js/async/6118.45e754e5.js +1 -0
  111. package/dist/console/static/js/async/6127.adcbcbb6.js +1 -0
  112. package/dist/console/static/js/async/614.3f434c20.js +1 -0
  113. package/dist/console/static/js/async/6234.ba3b002d.js +1 -0
  114. package/dist/console/static/js/async/6310.6546a9ba.js +1 -0
  115. package/dist/console/static/js/async/6378.9f805419.js +1 -0
  116. package/dist/console/static/js/async/6380.e4433c49.js +1 -0
  117. package/dist/console/static/js/async/6418.f23bcfda.js +1 -0
  118. package/dist/console/static/js/async/6428.77c86114.js +1 -0
  119. package/dist/console/static/js/async/6443.83318a6c.js +1 -0
  120. package/dist/console/static/js/async/6508.2b445d62.js +3 -0
  121. package/dist/console/static/js/async/6542.e82a26c8.js +1 -0
  122. package/dist/console/static/js/async/6544.62111ecb.js +1 -0
  123. package/dist/console/static/js/async/6612.a0c9fcf4.js +1 -0
  124. package/dist/console/static/js/async/6740.695aebf0.js +1 -0
  125. package/dist/console/static/js/async/6822.dbbb32bc.js +1 -0
  126. package/dist/console/static/js/async/6824.ad3540ab.js +1 -0
  127. package/dist/console/static/js/async/6930.585dab94.js +1 -0
  128. package/dist/console/static/js/async/6982.c81b95e6.js +1 -0
  129. package/dist/console/static/js/async/7046.ab2378c1.js +1 -0
  130. package/dist/console/static/js/async/7110.a603277f.js +1 -0
  131. package/dist/console/static/js/async/7142.4a21366f.js +1 -0
  132. package/dist/console/static/js/async/7348.15cc6148.js +1373 -0
  133. package/dist/console/static/js/async/7348.15cc6148.js.LICENSE.txt +14 -0
  134. package/dist/console/static/js/async/7374.b1ac5c44.js +1 -0
  135. package/dist/console/static/js/async/742.847f17ca.js +1 -0
  136. package/dist/console/static/js/async/7446.743954d8.js +1 -0
  137. package/dist/console/static/js/async/7673.59bbbaac.js +1 -0
  138. package/dist/console/static/js/async/7684.c5760c8c.js +1 -0
  139. package/dist/console/static/js/async/7714.c30d0f94.js +1 -0
  140. package/dist/console/static/js/async/8118.36d5a3bf.js +298 -0
  141. package/dist/console/static/js/async/8145.4bcf043a.js +1 -0
  142. package/dist/console/static/js/async/8246.408de938.js +1 -0
  143. package/dist/console/static/js/async/8390.bdae1f7d.js +1 -0
  144. package/dist/console/static/js/async/8422.fd94dbe1.js +1 -0
  145. package/dist/console/static/js/async/8434.94a0e2ae.js +1 -0
  146. package/dist/console/static/js/async/8518.3158de13.js +1 -0
  147. package/dist/console/static/js/async/8564.fc2eb841.js +1 -0
  148. package/dist/console/static/js/async/8678.73af4c9b.js +1 -0
  149. package/dist/console/static/js/async/8694.79747168.js +1 -0
  150. package/dist/console/static/js/async/8756.1de37b83.js +1 -0
  151. package/dist/console/static/js/async/8804.7fe6bdf9.js +3 -0
  152. package/dist/console/static/js/async/8883.e717ee94.js +1 -0
  153. package/dist/console/static/js/async/8886.fe6e876c.js +1 -0
  154. package/dist/console/static/js/async/9030.fc1ae402.js +1 -0
  155. package/dist/console/static/js/async/9094.5598d084.js +1 -0
  156. package/dist/console/static/js/async/9218.ee7b84b7.js +1 -0
  157. package/dist/console/static/js/async/94.9b80bc35.js +1 -0
  158. package/dist/console/static/js/async/9526.92aba34c.js +1 -0
  159. package/dist/console/static/js/async/9762.f83bc4f3.js +1 -0
  160. package/dist/console/static/js/async/984.e11c113a.js +1 -0
  161. package/dist/console/static/js/async/9846.246653cd.js +1 -0
  162. package/dist/console/static/js/index.4487e1ff.js +1 -0
  163. package/dist/console/static/js/lib-react.15d7ca9a.js +2 -0
  164. package/dist/console/static/js/lib-react.15d7ca9a.js.LICENSE.txt +49 -0
  165. package/dist/coze-C6PMDPBI.js +49 -0
  166. package/dist/coze-E6VGRNLV.js +48 -0
  167. package/dist/dashboard.command-J7XOZNXU.js +8 -0
  168. package/dist/dashboard.command-RV2NHDKW.js +7 -0
  169. package/dist/dingtalk-JNRNRN7E.js +77 -0
  170. package/dist/dingtalk-WZGGIAHJ.js +76 -0
  171. package/dist/douyin-miniprogram-AIJPPIZH.js +41 -0
  172. package/dist/douyin-miniprogram-HCYZ5NBW.js +42 -0
  173. package/dist/figma-2YYNSCDX.js +103 -0
  174. package/dist/figma-RYOBMENP.js +102 -0
  175. package/dist/firebase-2IJDDBXX.js +112 -0
  176. package/dist/firebase-OYSY6HPT.js +111 -0
  177. package/dist/firecrawl-2T3SBUW7.js +66 -0
  178. package/dist/firecrawl-IYYXLAZM.js +65 -0
  179. package/dist/flyai-7FJ4TRAG.js +81 -0
  180. package/dist/flyai-QS5Q6FJR.js +82 -0
  181. package/dist/gitagent-MWI75OIX.js +725 -0
  182. package/dist/gitagent-YBMWY7NZ.js +726 -0
  183. package/dist/gitee-3N7OFOM7.js +53 -0
  184. package/dist/gitee-KVNK6KLZ.js +54 -0
  185. package/dist/github-LUEC2LID.js +143 -0
  186. package/dist/github-XRO5Z3GC.js +142 -0
  187. package/dist/google-ads-A3QAJI4D.js +88 -0
  188. package/dist/google-ads-VPKWTX67.js +89 -0
  189. package/dist/google-analytics-C4UR5ZR2.js +50 -0
  190. package/dist/google-analytics-XDYZA2B7.js +49 -0
  191. package/dist/google-workspace-LL3EWVHH.js +320 -0
  192. package/dist/google-workspace-YX35SHHX.js +321 -0
  193. package/dist/huawei-xiaoyi-6BSMGJHR.js +40 -0
  194. package/dist/huawei-xiaoyi-KPWLTSHB.js +41 -0
  195. package/dist/hubspot-DIUHGEDI.js +45 -0
  196. package/dist/hubspot-FTIEMNZO.js +44 -0
  197. package/dist/huggingface-MJCOXA7E.js +116 -0
  198. package/dist/huggingface-UUXK2RHK.js +117 -0
  199. package/dist/index.d.ts +3013 -0
  200. package/dist/index.js +15649 -0
  201. package/dist/inference-ai-image-generation-CMI6R5T3.js +106 -0
  202. package/dist/inference-ai-image-generation-PXV6IG4U.js +107 -0
  203. package/dist/inference-sh-7AZOLEFI.js +94 -0
  204. package/dist/inference-sh-ABQOD3YF.js +95 -0
  205. package/dist/init.command-6E24K4H3.js +9 -0
  206. package/dist/init.command-O4HG4HKR.js +10 -0
  207. package/dist/klaviyo-6K5YEFNH.js +45 -0
  208. package/dist/klaviyo-LDPBWBSS.js +44 -0
  209. package/dist/kuaidi100-HGFM5VK2.js +42 -0
  210. package/dist/kuaidi100-UHPFCVXP.js +41 -0
  211. package/dist/lark-6LNA3LUQ.js +103 -0
  212. package/dist/lark-URVBZNS4.js +102 -0
  213. package/dist/linear-7QFSFPOD.js +57 -0
  214. package/dist/linear-T4ORUP7N.js +56 -0
  215. package/dist/lovart-PDUXRUHJ.js +99 -0
  216. package/dist/lovart-QO3SK55T.js +100 -0
  217. package/dist/meta-ads-SCNFI45S.js +42 -0
  218. package/dist/meta-ads-V6XPZWX3.js +41 -0
  219. package/dist/miclaw-5CNTW7VV.js +36 -0
  220. package/dist/miclaw-TPPPS2WN.js +35 -0
  221. package/dist/model-provider-AVSFJSZP.js +393 -0
  222. package/dist/model-provider-KFB76XV5.js +392 -0
  223. package/dist/notion-FZK76MN2.js +69 -0
  224. package/dist/notion-WFA7KGZZ.js +70 -0
  225. package/dist/oceanengine-3JZUS3PP.js +43 -0
  226. package/dist/oceanengine-5BRIJVJE.js +42 -0
  227. package/dist/opencli-PFXHGCS2.js +81 -0
  228. package/dist/opencli-VIGRJTGH.js +80 -0
  229. package/dist/paypal-33UADIPR.js +54 -0
  230. package/dist/paypal-Z5JYHIWD.js +55 -0
  231. package/dist/playwright-MG5WHK47.js +58 -0
  232. package/dist/playwright-SQAQ3DZG.js +59 -0
  233. package/dist/plugins-HZBWK3WQ.js +120 -0
  234. package/dist/plugins-I4GD5SZX.js +121 -0
  235. package/dist/posthog-MU5MAJOQ.js +79 -0
  236. package/dist/posthog-RJRRKDWB.js +80 -0
  237. package/dist/salesforce-34FVIJTG.js +82 -0
  238. package/dist/salesforce-3QZ6OFVO.js +83 -0
  239. package/dist/sentry-MCIRMACU.js +111 -0
  240. package/dist/sentry-PIWW46VA.js +110 -0
  241. package/dist/seo-suite-4SQ3I67Q.js +54 -0
  242. package/dist/seo-suite-WJXMA3S4.js +55 -0
  243. package/dist/serve.command-5FMIPQRY.js +10 -0
  244. package/dist/serve.command-DNE6GPMK.js +9 -0
  245. package/dist/shadowob-JELOWHWX.js +1068 -0
  246. package/dist/shadowob-PRSMI5MW.js +1069 -0
  247. package/dist/sherlock-2PKY2E2Y.js +66 -0
  248. package/dist/sherlock-C5ZWPPVT.js +67 -0
  249. package/dist/shopify-GL3NFVGE.js +94 -0
  250. package/dist/shopify-R4G3UXM6.js +93 -0
  251. package/dist/skill-discovery-7INAUP4D.js +77 -0
  252. package/dist/skill-discovery-YPXXV622.js +78 -0
  253. package/dist/state-7MCZBTR5.js +17 -0
  254. package/dist/state-FGOFLFBE.js +18 -0
  255. package/dist/stripe-C22RR4ZS.js +83 -0
  256. package/dist/stripe-LJNPQ3CQ.js +82 -0
  257. package/dist/supabase-IRNQ54FJ.js +98 -0
  258. package/dist/supabase-N4ONFJNQ.js +97 -0
  259. package/dist/taobao-aipaas-LRR4GMO3.js +45 -0
  260. package/dist/taobao-aipaas-RVKORSF4.js +46 -0
  261. package/dist/tapd-3JPVJ7XH.js +46 -0
  262. package/dist/tapd-TMQRSMFG.js +47 -0
  263. package/dist/tencent-ads-IGD33LO7.js +42 -0
  264. package/dist/tencent-ads-UHC6OPBV.js +43 -0
  265. package/dist/tencent-docs-C3A4J3CJ.js +47 -0
  266. package/dist/tencent-docs-O2SC4FHL.js +48 -0
  267. package/dist/tencent-maps-HMMWMNF4.js +37 -0
  268. package/dist/tencent-maps-OQOKHVW2.js +36 -0
  269. package/dist/vercel-KOXDDTHX.js +73 -0
  270. package/dist/vercel-OLNVDWMG.js +74 -0
  271. package/dist/webflow-FULU5Q2I.js +114 -0
  272. package/dist/webflow-OMJKZM54.js +115 -0
  273. package/dist/wechat-miniprogram-skyline-KYCDMQNW.js +74 -0
  274. package/dist/wechat-miniprogram-skyline-VR4FVIQL.js +75 -0
  275. package/dist/wechat-pay-BCMAJ6UW.js +50 -0
  276. package/dist/wechat-pay-YQQKXVUI.js +51 -0
  277. package/dist/wonda-NGWIORYN.js +81 -0
  278. package/dist/wonda-RBABXFNM.js +82 -0
  279. package/dist/wordpress-woocommerce-RDIUTHYT.js +57 -0
  280. package/dist/wordpress-woocommerce-RNA5HB3N.js +58 -0
  281. package/dist/wps-DAEFQHDE.js +47 -0
  282. package/dist/wps-LUWHMZQQ.js +48 -0
  283. package/dist/yuque-HCHTJWNI.js +72 -0
  284. package/dist/yuque-KRH5O74J.js +71 -0
  285. package/images/RUNNERS.md +270 -0
  286. package/images/cc-connect-runner/entrypoint.mjs +311 -0
  287. package/images/claude-runner/Dockerfile +88 -0
  288. package/images/claude-runner/RUNNER.md +222 -0
  289. package/images/claude-runner/entrypoint.mjs +2 -0
  290. package/images/codex-runner/Dockerfile +87 -0
  291. package/images/codex-runner/RUNNER.md +226 -0
  292. package/images/codex-runner/entrypoint.mjs +2 -0
  293. package/images/gemini-runner/Dockerfile +87 -0
  294. package/images/gemini-runner/RUNNER.md +218 -0
  295. package/images/gemini-runner/entrypoint.mjs +2 -0
  296. package/images/hermes-runner/Dockerfile +74 -0
  297. package/images/hermes-runner/RUNNER.md +243 -0
  298. package/images/hermes-runner/entrypoint.mjs +283 -0
  299. package/images/openclaw-runner/Dockerfile +212 -0
  300. package/images/openclaw-runner/RUNNER.md +170 -0
  301. package/images/openclaw-runner/entrypoint.mjs +1113 -0
  302. package/images/openclaw-runner/warm-runtime-deps.mjs +95 -0
  303. package/images/opencode-runner/Dockerfile +87 -0
  304. package/images/opencode-runner/RUNNER.md +202 -0
  305. package/images/opencode-runner/entrypoint.mjs +2 -0
  306. package/package.json +121 -0
  307. package/templates/agent-marketplace-buddy.template.json +131 -0
  308. package/templates/ai-werewolf.template.json +92 -0
  309. package/templates/bmad-method-buddy.template.json +123 -0
  310. package/templates/brain-fix.template.json +92 -0
  311. package/templates/claude-ads-buddy.template.json +123 -0
  312. package/templates/claude-financial-services-buddy.template.json +111 -0
  313. package/templates/claude-seo-buddy.template.json +123 -0
  314. package/templates/code-arena.template.json +92 -0
  315. package/templates/daily-brief.template.json +92 -0
  316. package/templates/e-wife.template.json +92 -0
  317. package/templates/everything-claude-code-buddy.template.json +125 -0
  318. package/templates/financial-freedom.template.json +92 -0
  319. package/templates/gitstory.template.json +92 -0
  320. package/templates/google-workspace-buddy.template.json +88 -0
  321. package/templates/gsd-buddy.template.json +119 -0
  322. package/templates/gstack-buddy.template.json +143 -0
  323. package/templates/gstack.template.json +92 -0
  324. package/templates/little-match-girl.template.json +114 -0
  325. package/templates/lovart-buddy.template.json +110 -0
  326. package/templates/marketingskills-buddy.template.json +102 -0
  327. package/templates/retire-buddy.template.json +92 -0
  328. package/templates/scientific-skills-buddy.template.json +119 -0
  329. package/templates/seomachine-buddy.template.json +113 -0
  330. package/templates/shadow-server-app-demo.template.json +105 -0
  331. package/templates/slavingia-skills-buddy.template.json +102 -0
  332. package/templates/superclaude-buddy.template.json +146 -0
  333. package/templates/superpowers-buddy.template.json +108 -0
  334. package/templates/world-pulse.template.json +92 -0
@@ -0,0 +1,222 @@
1
+ # Claude Code Runner Research
2
+
3
+ Research date: 2026-05-14.
4
+
5
+ ## Target role
6
+
7
+ `claude-code` should run through the ShadowOB `cc-connect` fork, not through
8
+ OpenClaw gateway or ACPX. The runner process should be:
9
+
10
+ ```text
11
+ cc-connect fork -> agent type "claudecode" -> claude CLI
12
+ ```
13
+
14
+ Shadow messaging, DMs, slash commands, attachments, and typing/progress should
15
+ come from the cc-connect ShadowOB platform.
16
+
17
+ ## Current repository state
18
+
19
+ The previous `apps/cloud` adapter declared:
20
+
21
+ ```text
22
+ openclaw gateway -> ACPX plugin -> claude CLI process
23
+ ```
24
+
25
+ The current adapter and Dockerfile now use the cc-connect fork path. The runner
26
+ package emits `cc-connect-config.toml`, Claude settings, MCP config, and
27
+ ShadowOB skill files through `runtime-files.json`.
28
+
29
+ ## Native Claude Code configuration
30
+
31
+ Claude Code has its own hierarchy and should not be flattened into OpenClaw
32
+ agent defaults:
33
+
34
+ | Concern | Native Claude Code surface |
35
+ | --- | --- |
36
+ | Settings | `~/.claude/settings.json`, project `.claude/settings.json`, local `.claude/settings.local.json`, managed settings. |
37
+ | Models | `model`, `availableModels`, `modelOverrides`, `effortLevel`, `ANTHROPIC_MODEL`, provider envs. |
38
+ | Permissions | `permissions.allow`, `permissions.ask`, `permissions.deny`, permission modes, managed restrictions. |
39
+ | Memory/context | `CLAUDE.md`, `.claude/CLAUDE.md`, `CLAUDE.local.md`, managed `claudeMd`. |
40
+ | MCP | User/local state in `~/.claude.json`; project MCP servers in `.mcp.json`; managed MCP policy. |
41
+ | Skills and slash commands | `.claude/skills/<name>/SKILL.md`; legacy `.claude/commands/*.md` still works and is treated like skills. |
42
+ | Hooks | `hooks` in settings, plus hooks from skills, subagents, and plugins. |
43
+ | Subagents | `~/.claude/agents/` and `.claude/agents/`; settings can run the main thread as a named subagent. |
44
+ | Logs and telemetry | Claude Code monitoring/usage and OpenTelemetry settings; session retention via `cleanupPeriodDays`, `CLAUDE_CODE_SKIP_PROMPT_HISTORY`, and non-interactive session persistence flags. |
45
+
46
+ ## Shadow slash command bridge
47
+
48
+ The runner package always materializes `/etc/shadowob/slash-commands.json` so
49
+ Shadow can load a stable command index. The Claude Code runner owns its catalog
50
+ in `apps/cloud/src/runtimes/slash-commands/claude-code.ts`; this is
51
+ intentionally not a common runtime artifact.
52
+
53
+ Official Claude Code commands researched from the Claude Code command reference
54
+ include `/add-dir`, `/agents`, `/clear`, `/compact`, `/config`, `/cost`,
55
+ `/doctor`, `/hooks`, `/init`, `/login`, `/logout`, `/mcp`, `/memory`,
56
+ `/model`, `/permissions`, `/pr_comments`, `/review`, `/security-review`,
57
+ `/setup-bedrock`, `/setup-vertex`, `/simplify`, `/skills`, `/status`,
58
+ `/statusline`, `/tasks`, `/terminal-setup`, `/theme`, `/tui`, `/ultraplan`,
59
+ `/ultrareview`, `/usage`, `/voice`, and `/web-setup`.
60
+
61
+ Current Cloud injection registers only names that do not collide with
62
+ cc-connect's universal bot commands. For example, `/review`, `/permissions`,
63
+ `/hooks`, `/mcp`, `/login`, `/logout`, `/security-review`, `/setup-bedrock`,
64
+ `/setup-vertex`, and `/terminal-setup` are injected; `/model`, `/status`,
65
+ `/usage`, `/skills`, `/config`, `/doctor`, `/stop`, `/help`, and `/compact`
66
+ remain cc-connect management commands.
67
+
68
+ cc-connect local commands are prompt-backed. True Claude Code TUI passthrough
69
+ requires a cc-connect agent enhancement so colliding command names do not break
70
+ session, provider, and permission management.
71
+
72
+ ## Schema and type anchors
73
+
74
+ - Settings schema URL:
75
+ `https://json.schemastore.org/claude-code-settings.json`.
76
+ - Claude Code docs call this the official JSON schema, but warn that it can lag
77
+ the newest CLI settings. Treat docs and CLI behavior as authoritative when the
78
+ schema is behind.
79
+ - Global config `~/.claude.json` is not the same schema as
80
+ `settings.json`; docs say adding those keys to `settings.json` is invalid.
81
+ - MCP project config uses `.mcp.json`; subagents use Markdown files under
82
+ `.claude/agents/` with YAML frontmatter.
83
+ - cc-connect type anchor: `../cc-connect/agent/claudecode/claudecode.go`.
84
+
85
+ ## Provider and authentication notes
86
+
87
+ - Headless Cloud runners should prefer API/provider secrets over subscription
88
+ login. `ANTHROPIC_API_KEY` forces API-key usage in non-interactive mode and
89
+ overrides Claude subscription auth when present.
90
+ - Claude subscription login can be useful locally, but a clean Kubernetes
91
+ container should not depend on a browser-backed Claude Pro/Max/Team session.
92
+ - Custom gateway routing is not the same as model selection:
93
+ `ANTHROPIC_BASE_URL` changes the request destination, while `model`,
94
+ `ANTHROPIC_DEFAULT_*_MODEL`, `CLAUDE_CODE_SUBAGENT_MODEL`, or
95
+ `ANTHROPIC_CUSTOM_MODEL_OPTION` determine model IDs.
96
+ - For LLM gateways, enable model discovery with
97
+ `CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY=1` when the gateway exposes
98
+ `/v1/models`; otherwise emit `ANTHROPIC_CUSTOM_MODEL_OPTION` and companion
99
+ display metadata for the selected Cloud model.
100
+ - Bedrock, Vertex AI, Foundry, and Claude Platform on AWS have provider-specific
101
+ envs and model identifiers. The adapter must keep those as Claude-native env
102
+ or settings values, never as OpenClaw `models.providers`.
103
+
104
+ ## Security, audit, cost, network, and tools
105
+
106
+ - Permissions: `permissions.allow`, `permissions.ask`, `permissions.deny`,
107
+ `permissions.defaultMode`, and managed `allowManagedPermissionRulesOnly`.
108
+ Deny rules are evaluated before ask/allow.
109
+ - Bypass control: `disableBypassPermissionsMode = "disable"` should be the
110
+ default for managed Cloud runners unless the deployment explicitly enables
111
+ bypass.
112
+ - Sandbox: `sandbox.enabled`, `failIfUnavailable`, filesystem allow/deny read
113
+ and write lists, and network allow/deny domains.
114
+ - Hooks: `allowManagedHooksOnly`, `allowedHttpHookUrls`, and
115
+ `httpHookAllowedEnvVars` are required when HTTP hooks are generated.
116
+ - MCP: managed allow/deny MCP settings must be represented separately from
117
+ `.mcp.json`.
118
+ - Tool surface: Claude permission rules cover tool names such as `Bash`,
119
+ `Read`, `Edit`, `WebFetch`, MCP tools, and Agent rules.
120
+ - Cost/audit: model, `maxContextTokens`, skill listing budgets, cleanup period,
121
+ and OpenTelemetry env/settings should be generated when Cloud audit is
122
+ enabled.
123
+ - Logs: collect cc-connect daemon logs plus Claude Code monitoring/usage output
124
+ and transcript retention state.
125
+
126
+ ## cc-connect mapping
127
+
128
+ The local fork exposes `core.RegisterAgent("claudecode", New)`. Important
129
+ options from `../cc-connect/agent/claudecode/claudecode.go`:
130
+
131
+ - `work_dir`
132
+ - `cli_path`
133
+ - `model`
134
+ - `reasoning_effort`
135
+ - `mode`: `default`, `acceptEdits`, `plan`, `auto`, `bypassPermissions`
136
+ - `allowed_tools` and `disallowed_tools`
137
+ - `max_context_tokens`
138
+ - `router_url` and `router_api_key`
139
+ - `system_prompt`
140
+ - `env`
141
+ - `run_as_user` and `run_as_env`
142
+
143
+ The Cloud runner package should generate a `cc-connect` project like:
144
+
145
+ ```toml
146
+ [[projects]]
147
+ name = "agent-id"
148
+
149
+ [projects.agent]
150
+ type = "claudecode"
151
+
152
+ [projects.agent.options]
153
+ work_dir = "/workspace"
154
+
155
+ [[projects.platforms]]
156
+ type = "shadowob"
157
+ ```
158
+
159
+ Provider secrets should be passed through provider refs or environment files,
160
+ not through OpenClaw `models.providers`.
161
+
162
+ ## Capability notes
163
+
164
+ - Models: map Cloud model preferences to Claude `model` and optional
165
+ `availableModels`/provider envs.
166
+ - Skills/slash commands: materialize `.claude/skills` and optionally legacy
167
+ `.claude/commands` only for compatibility.
168
+ - MCP: write `.mcp.json` for project-scoped MCP and avoid relying on
169
+ `~/.claude.json` in immutable images.
170
+ - Cron/routine: Claude Code has scheduled prompt support in its automation
171
+ docs, but Cloud phase 1 should treat scheduling as a Cloud/Shadow concern
172
+ unless explicitly mounting a Claude-native schedule store.
173
+ - Hooks: write Claude settings `hooks`, not OpenClaw `hooks`.
174
+ - Subagents: materialize `.claude/agents` and any preloaded skill references.
175
+ - Logs: collect both cc-connect daemon logs and Claude Code native telemetry or
176
+ transcript artifacts when enabled.
177
+
178
+ ## Migration implications
179
+
180
+ - OpenClaw and ACPX have been removed from the Claude runner image path.
181
+ - The image builds the cc-connect fork binary and installs the Claude CLI.
182
+ - Generate Claude config files in the workspace/home directory before starting
183
+ cc-connect.
184
+ - Keep `run_as_user` available for OS-user isolation; the fork currently
185
+ supports it for Claude Code.
186
+
187
+ ## Adapter and smoke tests
188
+
189
+ Unit tests:
190
+
191
+ - `settings.json` validates against the schema URL when only schema-known fields
192
+ are emitted.
193
+ - Managed-only settings are not written into project settings.
194
+ - Permission deny/ask/allow, sandbox filesystem, sandbox network, HTTP hook URL
195
+ allowlists, MCP restrictions, and `disableBypassPermissionsMode` are mapped.
196
+ - cc-connect TOML contains `type = "claudecode"` and no OpenClaw artifacts.
197
+ - Secret env vars are kept in secret data or per-runtime secret files.
198
+
199
+ Container smoke:
200
+
201
+ - `cc-connect --version` and `claude --version` work.
202
+ - Generated `.claude/settings.json` and `.mcp.json` exist in the expected
203
+ workspace/home paths.
204
+ - Container starts cc-connect with the ShadowOB platform block.
205
+ - A denied read target such as `.env` remains denied in generated config.
206
+ - Logs include cc-connect startup but no raw Shadow token or provider key.
207
+
208
+ ## Sources
209
+
210
+ - Settings: https://code.claude.com/docs/en/settings
211
+ - Model configuration: https://code.claude.com/docs/en/model-config
212
+ - Environment variables: https://code.claude.com/docs/en/env-vars
213
+ - Permissions: https://code.claude.com/docs/en/permissions
214
+ - Sandboxing: https://code.claude.com/docs/en/sandboxing
215
+ - Skills and custom commands:
216
+ https://code.claude.com/docs/en/skills
217
+ - Slash commands: https://code.claude.com/docs/en/commands
218
+ - MCP: https://code.claude.com/docs/en/mcp
219
+ - Hooks: https://code.claude.com/docs/en/hooks
220
+ - Subagents: https://code.claude.com/docs/en/sub-agents
221
+ - Monitoring: https://code.claude.com/docs/en/monitoring-usage
222
+ - cc-connect fork source: https://github.com/buggyblues/cc-connect
@@ -0,0 +1,2 @@
1
+ process.env.SHADOW_RUNNER_NAME ??= 'claude-runner'
2
+ await import('../cc-connect-runner/entrypoint.mjs')
@@ -0,0 +1,87 @@
1
+ # syntax=docker/dockerfile:1.7
2
+
3
+ # ─── Codex Runner ─────────────────────────────────────────────────────────
4
+ # Native cc-connect runner for OpenAI Codex.
5
+ #
6
+ # Build from the repository root:
7
+ # docker build -t ghcr.io/buggyblues/codex-runner:latest \
8
+ # -f apps/cloud/images/codex-runner/Dockerfile .
9
+ # ──────────────────────────────────────────────────────────────────────────
10
+
11
+ FROM golang:1.25-bookworm AS cc-builder
12
+
13
+ ARG CC_CONNECT_REF=63b5d59127b3004bc7002f2d51892b1f2a91ea83
14
+ ARG CC_CONNECT_REPO=https://github.com/buggyblues/cc-connect.git
15
+
16
+ WORKDIR /build
17
+
18
+ RUN apt-get update && \
19
+ apt-get install -y --no-install-recommends ca-certificates git && \
20
+ rm -rf /var/lib/apt/lists/*
21
+
22
+ RUN git clone --depth 1 "${CC_CONNECT_REPO}" /tmp/cc-connect && \
23
+ cd /tmp/cc-connect && \
24
+ git fetch --depth 1 origin "${CC_CONNECT_REF}" && \
25
+ git checkout "${CC_CONNECT_REF}" && \
26
+ CGO_ENABLED=0 go build \
27
+ -tags "no_web no_acp no_cursor no_devin no_iflow no_kimi no_qoder no_feishu no_telegram no_discord no_slack no_dingtalk no_wecom no_weixin no_qq no_qqbot no_line no_weibo" \
28
+ -ldflags "-s -w" \
29
+ -o /build/cc-connect ./cmd/cc-connect
30
+
31
+ FROM node:22-bookworm-slim AS node-deps
32
+
33
+ WORKDIR /build
34
+
35
+ RUN npm init -y && \
36
+ npm install --no-audit --fund=false \
37
+ @openai/codex@latest \
38
+ @shadowob/cli@latest \
39
+ @shadowob/connector@latest
40
+
41
+ FROM node:22-bookworm-slim AS runner
42
+
43
+ LABEL org.opencontainers.image.source="https://github.com/nicepkg/shadow"
44
+ LABEL org.opencontainers.image.description="Shadow Cloud Codex Runner (cc-connect + Codex)"
45
+
46
+ RUN apt-get update && \
47
+ apt-get install -y --no-install-recommends ca-certificates curl git tini && \
48
+ rm -rf /var/lib/apt/lists/*
49
+
50
+ RUN userdel -r node 2>/dev/null || true; \
51
+ groupdel node 2>/dev/null || true; \
52
+ groupadd -g 1000 shadow; \
53
+ useradd -u 1000 -g shadow -m -d /home/shadow -s /usr/sbin/nologin shadow
54
+
55
+ WORKDIR /app
56
+ RUN mkdir -p /home/shadow/.cc-connect /home/shadow/.codex /etc/openclaw /etc/shadowob \
57
+ /var/log/shadowob /workspace /tmp/npm-cache && \
58
+ ln -s /home/shadow /home/openclaw && \
59
+ chown -R shadow:shadow /home/shadow /etc/shadowob /var/log/shadowob \
60
+ /workspace /tmp/npm-cache /app
61
+
62
+ COPY --from=node-deps --chown=shadow:shadow /build/node_modules ./node_modules
63
+ COPY --from=node-deps --chown=shadow:shadow /build/package.json ./package.json
64
+ COPY --from=cc-builder /build/cc-connect /usr/local/bin/cc-connect
65
+
66
+ RUN ln -s /app/node_modules/.bin/codex /usr/local/bin/codex && \
67
+ ln -s /app/node_modules/.bin/shadowob /usr/local/bin/shadowob && \
68
+ ln -s /app/node_modules/.bin/shadowob-connector /usr/local/bin/shadowob-connector
69
+
70
+ COPY --chown=shadow:shadow apps/cloud/images/cc-connect-runner/entrypoint.mjs /app/entrypoint.mjs
71
+
72
+ HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \
73
+ CMD curl -f http://localhost:3100/health || exit 1
74
+
75
+ EXPOSE 3100
76
+
77
+ ENV NODE_ENV=production
78
+ ENV HOME=/home/shadow
79
+ ENV SHADOW_RUNNER_HEALTH_PORT=3100
80
+ ENV OPENCLAW_NO_RESPAWN=1
81
+ ENV SHADOW_RUNNER_NAME=codex-runner
82
+ ENV npm_config_cache=/tmp/npm-cache
83
+
84
+ USER shadow
85
+
86
+ ENTRYPOINT ["tini", "--"]
87
+ CMD ["node", "/app/entrypoint.mjs"]
@@ -0,0 +1,226 @@
1
+ # Codex Runner Research
2
+
3
+ Research date: 2026-05-14.
4
+
5
+ ## Target role
6
+
7
+ `codex` should run through the ShadowOB `cc-connect` fork, not through OpenClaw
8
+ gateway or ACPX. The runner process should be:
9
+
10
+ ```text
11
+ cc-connect fork -> agent type "codex" -> codex CLI
12
+ ```
13
+
14
+ Shadow messaging should come from the cc-connect ShadowOB platform. Codex should
15
+ use its own config, skills, MCP, hooks, subagents, sessions, and logs.
16
+
17
+ ## Current repository state
18
+
19
+ The Codex adapter and image now use the cc-connect fork path. The runtime
20
+ package emits `cc-connect-config.toml`, `$CODEX_HOME/config.toml`, project
21
+ `.codex/config.toml`, workspace bootstrap files, and ShadowOB skill files
22
+ through `runtime-files.json`.
23
+
24
+ ## Native Codex configuration
25
+
26
+ Codex reads layered TOML configuration:
27
+
28
+ | Concern | Native Codex surface |
29
+ | --- | --- |
30
+ | User config | `$CODEX_HOME/config.toml`, defaulting to `~/.codex/config.toml`. |
31
+ | Project config | `.codex/config.toml` in trusted projects. |
32
+ | System config | `/etc/codex/config.toml` on Unix. |
33
+ | Model | `model`, profiles, `model_provider`, model catalogs. |
34
+ | Reasoning | `model_reasoning_effort`, model-specific settings. |
35
+ | Approvals and sandbox | `approval_policy`, `sandbox_mode`, permission profiles. |
36
+ | MCP | `[mcp_servers.<name>]` with stdio or HTTP settings, enabled/disabled tools, timeouts. |
37
+ | Skills | `.agents/skills` in repo/user/admin/system locations. |
38
+ | Instructions | `AGENTS.md` hierarchy and optional config instructions. |
39
+ | Hooks | Codex hooks config, loaded from trusted config layers. |
40
+ | Subagents | Codex subagent roles in config with agent instruction files. |
41
+ | Slash commands | Built-in CLI slash commands such as `/model`, `/mcp`, `/permissions`, `/agent`, `/review`, and `/status`. |
42
+ | Automation | Codex app automations exist, but they are app-level background jobs rather than a simple CLI runner cron store. |
43
+ | Logs and sessions | `$CODEX_HOME/sessions/YYYY/MM/DD/rollout-*.jsonl`, `history.jsonl`, `auth.json`, local state/cache files. |
44
+
45
+ ## Shadow slash command bridge
46
+
47
+ The runner package always materializes `/etc/shadowob/slash-commands.json` so
48
+ Shadow can load a stable command index. The Codex runner owns its catalog in
49
+ `apps/cloud/src/runtimes/slash-commands/codex.ts`; this is intentionally not a
50
+ common runtime artifact.
51
+
52
+ Official Codex CLI commands researched from the Codex docs include
53
+ `/permissions`, `/sandbox-add-read-dir`, `/agent`, `/apps`, `/plugins`,
54
+ `/clear`, `/compact`, `/copy`, `/diff`, `/exit`, `/experimental`, `/feedback`,
55
+ `/init`, `/logout`, `/mcp`, `/mention`, `/model`, `/fast`, `/plan`, `/goal`,
56
+ `/personality`, `/ps`, `/stop`, `/fork`, `/side`, `/resume`, `/new`, `/quit`,
57
+ `/review`, `/status`, `/debug-config`, `/statusline`, `/title`, and `/keymap`.
58
+
59
+ Current Cloud injection registers only names that do not collide with
60
+ cc-connect's own universal control commands:
61
+
62
+ - Injected local Codex catalog: `/permissions`, `/sandbox-add-read-dir`,
63
+ `/agent`, `/apps`, `/plugins`, `/clear`, `/copy`, `/exit`, `/experimental`,
64
+ `/feedback`, `/init`, `/logout`, `/mcp`, `/mention`, `/fast`, `/plan`,
65
+ `/goal`, `/personality`, `/fork`, `/side`, `/resume`, `/review`,
66
+ `/debug-config`, `/statusline`, `/title`, and `/keymap`.
67
+ - Left to cc-connect control flow: `/new`, `/compact`, `/status`, `/diff`,
68
+ `/model`, `/ps`, `/stop`, and overlapping management/help commands.
69
+
70
+ cc-connect local commands are prompt-backed, not full Codex TUI passthrough.
71
+ Adding true native passthrough/discovery belongs in the cc-connect Codex agent,
72
+ where it can distinguish cc-connect management commands from Codex CLI commands.
73
+
74
+ ## Schema and type anchors
75
+
76
+ - Generated JSON Schema source:
77
+ `https://raw.githubusercontent.com/openai/codex/main/codex-rs/core/config.schema.json`.
78
+ Codex config is TOML on disk, but this schema is the official repo-generated
79
+ shape for config keys.
80
+ - Official type source: Codex Config Reference key/type table at
81
+ `https://developers.openai.com/codex/config-reference`.
82
+ - Config layers: `$CODEX_HOME/config.toml`, trusted project `.codex/config.toml`,
83
+ and `/etc/codex/config.toml`.
84
+ - Test rule: generated TOML must parse as TOML and must be accepted by the Codex
85
+ CLI in a container smoke test; do not use a handwritten JSON schema as source
86
+ of truth.
87
+ - cc-connect type anchor: `../cc-connect/agent/codex/codex.go`.
88
+
89
+ ## Provider and authentication notes
90
+
91
+ - Codex CLI supports first-run authentication with either a ChatGPT account or
92
+ an API key. In Cloud, the reliable headless path is API-key or custom-provider
93
+ auth, not an interactive ChatGPT subscription login.
94
+ - For OpenAI API-key mode, set `OPENAI_API_KEY` through Secret data and use
95
+ `preferred_auth_method = "apikey"` when the runner profile could otherwise
96
+ prefer stored ChatGPT auth.
97
+ - Custom providers belong in `[model_providers.<id>]`. The official config
98
+ reference defines `base_url`, `env_key`, `query_params`, static/env headers,
99
+ command-backed bearer-token auth, `requires_openai_auth`, retry/timeouts, and
100
+ `wire_api`.
101
+ - Current Codex config reference lists `responses` as the supported
102
+ `wire_api`, so custom OpenAI-compatible gateways must support the Responses
103
+ API or be fronted by a gateway that translates correctly.
104
+ - Built-in local providers such as `ollama`/`lmstudio` are provider IDs, but
105
+ remote Cloud runners must not silently point them at localhost unless the
106
+ container actually runs that model service.
107
+
108
+ ## Security, audit, cost, network, and tools
109
+
110
+ - Permissions: `approval_policy`, granular approval policy, `sandbox_mode`,
111
+ `default_permissions`, and named `[permissions.<name>]` tables.
112
+ - Filesystem: named permission profiles can grant `read`, `write`, or `none` to
113
+ special roots such as `:project_roots` and explicit paths/globs.
114
+ - Network: `sandbox_workspace_write.network_access`, permission profile network
115
+ tables, web search mode (`cached`, `live`, `disabled`), and MCP remote servers.
116
+ - Secrets: `shell_environment_policy` must default to a restrictive inheritance
117
+ mode and keep KEY/SECRET/TOKEN filtering unless intentionally overridden.
118
+ - Tools: `features.shell_tool`, MCP server tool include/deny config, skills
119
+ config, subagent config, and rules should be emitted as native Codex config.
120
+ - Cost/audit: `model`, `model_reasoning_effort`, `service_tier`, web search
121
+ mode, and tool-output/token-related telemetry must be tracked.
122
+ - Observability: `[otel]` supports logs, metrics, traces, redacted prompts by
123
+ default, and event metadata for API requests, SSE events, tool decisions, and
124
+ tool results.
125
+
126
+ ## cc-connect mapping
127
+
128
+ The local fork exposes `core.RegisterAgent("codex", New)`. Important options
129
+ from `../cc-connect/agent/codex/codex.go`:
130
+
131
+ - `work_dir`
132
+ - `model`
133
+ - `reasoning_effort`: `low`, `medium`, `high`, `xhigh`
134
+ - `mode`: `suggest`, `auto-edit`, `full-auto`, `yolo`
135
+ - `backend`: `exec` or `app_server`
136
+ - `app_server_url`
137
+ - `codex_home`
138
+ - `cli_path`
139
+
140
+ The default path drives `codex exec --json`. The app-server backend can be kept
141
+ as an advanced option, but the phase-1 runner should start with the simpler
142
+ `exec` path unless a deployment explicitly requests app-server mode.
143
+
144
+ Example generated project shape:
145
+
146
+ ```toml
147
+ [[projects]]
148
+ name = "agent-id"
149
+
150
+ [projects.agent]
151
+ type = "codex"
152
+
153
+ [projects.agent.options]
154
+ work_dir = "/workspace"
155
+ codex_home = "/home/shadow/.codex"
156
+
157
+ [[projects.platforms]]
158
+ type = "shadowob"
159
+ ```
160
+
161
+ ## Capability notes
162
+
163
+ - Models: map Cloud model preferences to Codex `model`, profile, and optional
164
+ provider config. Avoid writing OpenClaw `agents.defaults.model`.
165
+ - Skills: materialize `.agents/skills` for repo-scoped workflows and
166
+ `$CODEX_HOME/skills` only if the runner owns the whole home directory.
167
+ - MCP: generate `[mcp_servers.*]` TOML tables.
168
+ - Cron/routine: Codex app automations are not the same as CLI-local cron; Cloud
169
+ should own phase-1 schedules unless later integrating the Codex app
170
+ automation APIs.
171
+ - Hooks: write Codex hook config in trusted project or user config.
172
+ - Subagents: generate Codex agent roles and instruction files under `.codex`
173
+ only when `features.multi_agent` or equivalent config is enabled.
174
+ - Logs: preserve Codex rollout JSONL paths and collect cc-connect daemon logs
175
+ separately.
176
+
177
+ ## Migration implications
178
+
179
+ - OpenClaw, ACPX, and `@shadowob/openclaw-shadowob` have been removed from the
180
+ Codex runner image path.
181
+ - The image builds the cc-connect fork binary and installs the Codex CLI.
182
+ - Generate `$CODEX_HOME/config.toml`, project `.codex/config.toml`,
183
+ `AGENTS.md`, `.agents/skills`, and MCP config as native artifacts.
184
+ - Keep current redaction patterns for container logs, but do not assume
185
+ `/var/log/openclaw` for the Codex runner.
186
+
187
+ ## Adapter and smoke tests
188
+
189
+ Unit tests:
190
+
191
+ - Generated TOML parses and contains expected scalar/table types for
192
+ `approval_policy`, `sandbox_mode`, `default_permissions`, `[permissions.*]`,
193
+ `[mcp_servers.*]`, `[features]`, and `[otel]`.
194
+ - cc-connect TOML contains `type = "codex"` and no OpenClaw artifacts.
195
+ - Permission mapping keeps network disabled by default in workspace-write mode.
196
+ - `shell_environment_policy` excludes secrets unless Cloud explicitly opts in.
197
+ - OTel config never exports raw prompts unless audit policy asks for it.
198
+
199
+ Container smoke:
200
+
201
+ - `cc-connect --version` and `codex --version` work.
202
+ - `$CODEX_HOME/config.toml`, project `.codex/config.toml`, `AGENTS.md`, and
203
+ `.agents/skills` are materialized.
204
+ - Start cc-connect with `type = "codex"` and inspect logs/session paths.
205
+ - Assert no `/etc/openclaw/config.json` exists for this runner.
206
+ - Run a no-network or read-only parse/start mode to confirm config loads before
207
+ any provider call.
208
+
209
+ ## Sources
210
+
211
+ - CLI auth/setup: https://developers.openai.com/codex/cli
212
+ - Config basics: https://developers.openai.com/codex/config-basic
213
+ - Advanced config: https://developers.openai.com/codex/config-advanced
214
+ - Config reference: https://developers.openai.com/codex/config-reference
215
+ - Generated config schema:
216
+ https://raw.githubusercontent.com/openai/codex/main/codex-rs/core/config.schema.json
217
+ - Agent approvals and security:
218
+ https://developers.openai.com/codex/agent-approvals-security
219
+ - MCP: https://developers.openai.com/codex/mcp
220
+ - Skills: https://developers.openai.com/codex/skills
221
+ - Hooks: https://developers.openai.com/codex/hooks
222
+ - Subagents: https://developers.openai.com/codex/subagents
223
+ - CLI slash commands: https://developers.openai.com/codex/cli/slash-commands
224
+ - App automations: https://developers.openai.com/codex/app/automations
225
+ - Codex CLI repository: https://github.com/openai/codex
226
+ - cc-connect fork source: https://github.com/buggyblues/cc-connect
@@ -0,0 +1,2 @@
1
+ process.env.SHADOW_RUNNER_NAME ??= 'codex-runner'
2
+ await import('../cc-connect-runner/entrypoint.mjs')
@@ -0,0 +1,87 @@
1
+ # syntax=docker/dockerfile:1.7
2
+
3
+ # ─── Gemini Runner ────────────────────────────────────────────────────────
4
+ # Native cc-connect runner for Gemini CLI.
5
+ #
6
+ # Build from the repository root:
7
+ # docker build -t ghcr.io/buggyblues/gemini-runner:latest \
8
+ # -f apps/cloud/images/gemini-runner/Dockerfile .
9
+ # ──────────────────────────────────────────────────────────────────────────
10
+
11
+ FROM golang:1.25-bookworm AS cc-builder
12
+
13
+ ARG CC_CONNECT_REF=63b5d59127b3004bc7002f2d51892b1f2a91ea83
14
+ ARG CC_CONNECT_REPO=https://github.com/buggyblues/cc-connect.git
15
+
16
+ WORKDIR /build
17
+
18
+ RUN apt-get update && \
19
+ apt-get install -y --no-install-recommends ca-certificates git && \
20
+ rm -rf /var/lib/apt/lists/*
21
+
22
+ RUN git clone --depth 1 "${CC_CONNECT_REPO}" /tmp/cc-connect && \
23
+ cd /tmp/cc-connect && \
24
+ git fetch --depth 1 origin "${CC_CONNECT_REF}" && \
25
+ git checkout "${CC_CONNECT_REF}" && \
26
+ CGO_ENABLED=0 go build \
27
+ -tags "no_web no_acp no_cursor no_devin no_iflow no_kimi no_qoder no_feishu no_telegram no_discord no_slack no_dingtalk no_wecom no_weixin no_qq no_qqbot no_line no_weibo" \
28
+ -ldflags "-s -w" \
29
+ -o /build/cc-connect ./cmd/cc-connect
30
+
31
+ FROM node:22-bookworm-slim AS node-deps
32
+
33
+ WORKDIR /build
34
+
35
+ RUN npm init -y && \
36
+ npm install --no-audit --fund=false \
37
+ @google/gemini-cli@latest \
38
+ @shadowob/cli@latest \
39
+ @shadowob/connector@latest
40
+
41
+ FROM node:22-bookworm-slim AS runner
42
+
43
+ LABEL org.opencontainers.image.source="https://github.com/nicepkg/shadow"
44
+ LABEL org.opencontainers.image.description="Shadow Cloud Gemini Runner (cc-connect + Gemini CLI)"
45
+
46
+ RUN apt-get update && \
47
+ apt-get install -y --no-install-recommends ca-certificates curl git tini && \
48
+ rm -rf /var/lib/apt/lists/*
49
+
50
+ RUN userdel -r node 2>/dev/null || true; \
51
+ groupdel node 2>/dev/null || true; \
52
+ groupadd -g 1000 shadow; \
53
+ useradd -u 1000 -g shadow -m -d /home/shadow -s /usr/sbin/nologin shadow
54
+
55
+ WORKDIR /app
56
+ RUN mkdir -p /home/shadow/.cc-connect /home/shadow/.gemini /etc/openclaw /etc/shadowob \
57
+ /var/log/shadowob /workspace /tmp/npm-cache && \
58
+ ln -s /home/shadow /home/openclaw && \
59
+ chown -R shadow:shadow /home/shadow /etc/shadowob /var/log/shadowob \
60
+ /workspace /tmp/npm-cache /app
61
+
62
+ COPY --from=node-deps --chown=shadow:shadow /build/node_modules ./node_modules
63
+ COPY --from=node-deps --chown=shadow:shadow /build/package.json ./package.json
64
+ COPY --from=cc-builder /build/cc-connect /usr/local/bin/cc-connect
65
+
66
+ RUN ln -s /app/node_modules/.bin/gemini /usr/local/bin/gemini && \
67
+ ln -s /app/node_modules/.bin/shadowob /usr/local/bin/shadowob && \
68
+ ln -s /app/node_modules/.bin/shadowob-connector /usr/local/bin/shadowob-connector
69
+
70
+ COPY --chown=shadow:shadow apps/cloud/images/cc-connect-runner/entrypoint.mjs /app/entrypoint.mjs
71
+
72
+ HEALTHCHECK --interval=15s --timeout=5s --start-period=30s --retries=3 \
73
+ CMD curl -f http://localhost:3100/health || exit 1
74
+
75
+ EXPOSE 3100
76
+
77
+ ENV NODE_ENV=production
78
+ ENV HOME=/home/shadow
79
+ ENV SHADOW_RUNNER_HEALTH_PORT=3100
80
+ ENV OPENCLAW_NO_RESPAWN=1
81
+ ENV SHADOW_RUNNER_NAME=gemini-runner
82
+ ENV npm_config_cache=/tmp/npm-cache
83
+
84
+ USER shadow
85
+
86
+ ENTRYPOINT ["tini", "--"]
87
+ CMD ["node", "/app/entrypoint.mjs"]