clawdi 0.13.13 → 0.13.14
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/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -524,7 +524,7 @@ ${H.baseUrl}`,q=z.get(w);if(!q){if(q=Y({baseUrl:H.baseUrl,home:X,egressSystemCaF
|
|
|
524
524
|
`}function pN($,J){return[...$].filter((X)=>!J.has(X)).sort((X,Q)=>X.localeCompare(Q))}function fs($){let J=hv$($),X=process.env[Cg$]?.trim(),Q=$.projection?.sourceBundleVersion==="clawdi.hosted-runtime.bundle.v2",W=Q?$.openclawGatewayAuth:void 0;if(Q&&W?.activation.enabled!==!0)throw Error("OpenClaw native auth capability is unavailable");if($.openclawGatewayAuth&&!X)throw Error("OpenClaw native gateway token is unavailable");if(J.length===0&&!X&&!$.locale)return null;return{...$.locale?{agents:{defaults:{userTimezone:$.locale.timezone}}}:{},...X||J.length>0?{gateway:{...W?{port:18789,bind:"lan"}:{},...X?{auth:{mode:"token",...W?{token:null}:{token:X}}}:{},...J.length>0?{controlUi:{allowedOrigins:J,...W?{basePath:uv$($),allowInsecureAuth:!1,dangerouslyAllowHostHeaderOriginFallback:!1,dangerouslyDisableDeviceAuth:!0}:{dangerouslyDisableDeviceAuth:!0}}}:{}}}:{}}}function uv$($){let J=$.projection?.system;if(!P1(J))return"/";let X=J.openclawControlUiBasePath;if(typeof X!=="string"||!X.startsWith("/"))return"/";return X==="/"?"/":X.replace(/\/$/,"")}function Us($,J,X,Q){let W=fs(J);if(!W)return;I9($,["config","patch","--stdin"],`${JSON.stringify(W,null,2)}
|
|
525
525
|
`,X,Q)}function hv$($){let J=$.projection?.system;if(!P1(J))return[];let X=J.openclawControlUiAllowedOrigins;if(!Array.isArray(X))return[];let Q=new Set,W=[];for(let Y of X){if(typeof Y!=="string")continue;let G=Y.trim();if(!G||Q.has(G))continue;Q.add(G),W.push(G)}return W}function fT($){if(!$.projection||!Object.hasOwn($.projection,"channels"))return null;let J=$.projection.channels;if(!P1(J))return null;return J}function mv$($,J,X,Q){if($!=="openclaw"&&$!=="hermes")return null;if(!J.enabled||J.status==="install_failed"||!J.commandPath)return null;let W=fT(X);if(!W)return null;let Y=OJ(X)??process.env.HOME??"";if($==="hermes"){let G=m(Y,".hermes","config.yaml");return ro(G,ys(W,X.controlPlane.apiUrl,X.projection?.channelCredentials)),A0(G),G}return I9(J.commandPath,["config","patch","--stdin"],`${JSON.stringify(us(W),null,2)}
|
|
526
526
|
`,Y,Q),J.commandPath}function cv$($,J,X,Q,W,Y){if($!=="openclaw")return;if(!J.enabled||J.status==="install_failed"||!J.commandPath)return;let G=fT(X);if(!G)return;let z=OJ(X)??process.env.HOME??"";ov$({commandPath:J.commandPath,channels:G,home:z,workspaceRoot:Q,previousReceipts:W,receiptTargets:Y})}function ys($,J,X){let Q=nv$(J),W=lv$($,X,Q);return{telegram:rN($.telegram)?{enabled:!0,dm_policy:"open",group_policy:"open",allow_from:["*"],group_allow_from:["*"],group_allowed_chats:["*"],require_mention:!1,extra:{base_url:"https://api.telegram.org/bot",base_file_url:"https://api.telegram.org/file/bot"}}:{enabled:!1},discord:rN($.discord)?{enabled:!0,dm_policy:"open",group_policy:"open",allow_from:["*"],group_allow_from:["*"],require_mention:!1,thread_require_mention:!1,bots_require_inline_mention:!1}:{enabled:!1},whatsapp:W?{enabled:!0,dm_policy:"open",group_policy:"open",allow_from:["*"],group_allow_from:["*"],require_mention:!1}:{enabled:!1},platforms:{whatsapp:W?{enabled:!0,extra:{session_path:W.sessionDir,ws_url:W.wsUrl}}:{enabled:!1}}}}function lv$($,J,X){if(!Y6)return null;if(!rN($.whatsapp))return null;if(!Array.isArray(J))return null;for(let Q of J){let W=U$(Q);if(W?.provider!=="whatsapp"||W.kind!=="whatsapp_baileys_auth_state")continue;let Y=B$(W.accountId),G=U$(W.targets),z=G?U$(G.hermes):null,U=z?B$(z.sessionDir)??B$(z.authDir):null;if(!Y||!U)continue;return{sessionDir:U,wsUrl:`${pv$(X)}/v1/channels/whatsapp/${Y}/baileys`}}return null}function rN($){if(!P1($))return!1;let J=$.accounts;return P1(J)&&Object.keys(J).length>0}function dv$($){return["telegram","discord","whatsapp"].some((J)=>rN($[J]))}function nv$($){return $.replace(/\/+$/,"")}function pv$($){if($.startsWith("https://"))return`wss://${$.slice(8)}`;if($.startsWith("http://"))return`ws://${$.slice(7)}`;return $}function us($){let J=iv$(),X=rv$($),Q=dv$(X);return{channels:{...J,...X},plugins:{entries:{...J,...ev$(X)}},secrets:Q?{providers:{default:{source:"env"}},defaults:{env:"default"}}:void 0}}function rv$($){if(Y6||!Object.hasOwn($,"whatsapp"))return $;let J={...$};return delete J.whatsapp,J}function iv$(){return Object.fromEntries(Sg$.map(($)=>[$,null]))}function ov$($){for(let J of Object.keys($.channels).sort()){if(J==="whatsapp"&&!Y6)continue;let X=Tg$[J];if(!X)continue;let Q=`openclaw:${J}`,W=Lg$({channel:J,specs:X}),Y=()=>Kg$({channel:J,commandPath:$.commandPath,home:$.home,workspaceRoot:$.workspaceRoot}),G=is($.previousReceipts?.channelPlugins[Q],W,Y),z={desiredRevision:W,currentRevision:Y,expectedCurrentRevision:G};if($.receiptTargets.channelPlugins.set(Q,z),G!==null)continue;av$($.commandPath,X,$.home,$.workspaceRoot),z.expectedCurrentRevision=Y()}}function av$($,J,X,Q){let W=null;for(let Y of J)try{I9($,["plugins","install",Y],"",X,Q);return}catch(G){if(tv$(G))return;W=G}if(W instanceof Error)throw W;throw Error(`OpenClaw plugin install failed for ${J.join(" or ")}`)}function tv$($){return sv$($).toLowerCase().includes("plugin already exists:")}function sv$($){if(typeof $!=="object"||$===null)return String($);let J=[],X=$;for(let Q of[X.message,X.stdout,X.stderr])if(typeof Q==="string")J.push(Q);else if(Buffer.isBuffer(Q))J.push(Q.toString("utf8"));return J.join(`
|
|
527
|
-
`)}function ev$($){let J={};for(let X of Object.keys($).sort())J[X]={enabled:!0};return J}function $g$($){return $.projection?.mcp!==void 0}function Xg$($){let J=$.projection?.mcp;if(J===void 0)return{servers:{}};return{servers:p9.parse(J).servers}}function yT($){return m($.projectionRoot,Jg$)}function Qg$($){let J=yT($);if(!u$(J))return{schemaVersion:DU,runtimes:{}};let X;try{X=JSON.parse(T6(J,"utf-8"))}catch(Y){throw Error(`hosted MCP last-applied ledger is invalid: ${Y instanceof Error?Y.message:String(Y)}`)}if(!P1(X)||X.schemaVersion!==DU)throw Error("hosted MCP last-applied ledger has an unsupported schema");let Q=U$(X.runtimes);if(!Q||Object.keys(Q).some((Y)=>!r7.includes(Y)))throw Error("hosted MCP last-applied ledger has invalid runtimes");let W={};for(let Y of r7){let G=Q[Y];if(G===void 0)continue;if(!P1(G))throw Error(`hosted MCP last-applied ledger has invalid ${Y} servers`);let z={};for(let[U,H]of Object.entries(G).sort(([w],[q])=>w.localeCompare(q))){if(!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(U))throw Error(`hosted MCP last-applied ledger has invalid ${Y} server name`);let w=c_.safeParse(H);if(!w.success)throw Error(`hosted MCP last-applied ledger has invalid ${Y} server ${U}`);z[U]=w.data}if(Object.keys(z).length>0)W[Y]=z}return{schemaVersion:DU,runtimes:W}}function Wg$($,J){LJ(yT($),{schemaVersion:DU,runtimes:Object.fromEntries(r7.flatMap((X)=>{let Q=J.runtimes[X];return Q&&Object.keys(Q).length>0?[[X,Object.fromEntries(Object.entries(Q).sort(([W],[Y])=>W.localeCompare(Y)))]]:[]}))})}function hs(){return k0()==="hosted"}function ms($){let J=SX(yG(),"skills",$);if(!u$(m(J,"SKILL.md")))throw Error(`bundled hosted skill asset ${$} is unavailable`);return J}function cs($,J,X){if($!=="openclaw"&&$!=="hermes")return null;let Q=$==="openclaw"?m(X,".openclaw"):m(X,".hermes");return sO($,J,Q)}function Yg$($,J,X){if(!hs())return;for(let[Q,W]of Object.entries(J.projection?.skills?.entries??{})){let Y=FY(Q,W.version),G=cs($,Q,X),z=J.runtimes[$]?.enabled===!0;if(!G||!z||W.enabled!==!0)continue;let U=ms(Y.assetDirectory);dO(Y,U);let H=LY(G,Q);if(u$(G)&&H!=="hosted-manifest"&&!nw(G,Q))throw Error(`refusing to replace unmanaged ${Q} skill at ${G}`)}}function Gg$($,J,X,Q){let W=hs(),Y=[];for(let G of ag()){let z=cs($,G,Q);if(!z)continue;Y.push(z);let U=X.projection?.skills?.entries[G],H=X.runtimes[$]?.enabled===!0;if(!W||!H||U?.enabled!==!0){let N=LY(z,G),K=nw(z,G);if(N==="local-setup")continue;if(!W&&N==="unreserved"&&!K)continue;if(K&&N==="unreserved")Ag({targetDir:z,id:G,manager:"hosted-manifest",version:K.version,digest:K.digest});hw({targetDir:z,id:G,manager:"hosted-manifest",removeTarget:()=>i$(z,{recursive:!0,force:!0})});continue}if(!J?.enabled||J.status==="install_failed")continue;let w=FY(G,U.version),q=LY(z,G);if(u$(z)&&q!=="hosted-manifest"&&!nw(z,G))throw Error(`refusing to replace unmanaged ${G} skill at ${z}`);let V=w;if(uw({targetDir:z,id:G,manager:"hosted-manifest",version:U.version,digest:V.digest},()=>tg({skillId:G,version:U.version,sourceDir:ms(V.assetDirectory),targetDir:z,reserved:!0}))==="unchanged")continue;bs(z),A0(z);for(let N of R4(z))A0(m(z,N))}return Y}function zg$($,J,X,Q){let W=ls($,J,X),Y=yT(J),G=new Set;for(let z of[...W.runtimes].sort((U,H)=>U.name===H.name?0:U.name==="hermes"?-1:1)){if(z.mutations.length===0)continue;if(z.name==="hermes"){if(z.nextHermesContent===null)throw Error("Hermes MCP reconciliation did not produce staged config");o(z.native.path,z.nextHermesContent),A0(z.native.path),G.add(z.native.path);continue}if(!z.commandPath)throw Error("OpenClaw MCP reconciliation command is unavailable");for(let U of z.mutations){let H=U.kind==="remove"?["mcp","unset",U.serverName]:["mcp","set",U.serverName,JSON.stringify(U.server)];I9(z.commandPath,H,"",W.home,Q)}G.add(z.commandPath)}if(Object.keys(W.nextLedger.runtimes).length>0||u$(Y))Wg$(J,W.nextLedger);return[...G]}function ls($,J,X){let Q=Xg$($),W=OJ($)??J.userHome,Y=Qg$(J),G={schemaVersion:DU,runtimes:{}},z=r7.map((U)=>{let H=$.runtimes[U]?.enabled===!0?Q.servers:{},w=Y.runtimes[U]??{},q=Ug$(U,W);for(let D of Object.keys(H).sort()){if(Object.hasOwn(w,D))continue;if(Object.hasOwn(q.servers,D))throw Error(`refusing to replace unmanaged ${U} MCP server ${D}`)}let V=[];for(let D of Object.keys(w).sort())if(!Object.hasOwn(H,D)&&Object.hasOwn(q.servers,D))V.push({kind:"remove",serverName:D});for(let[D,j]of Object.entries(H).sort(([b],[M])=>b.localeCompare(M))){let b=wg$(D,j);if(!Hg$(q.servers[D],b))V.push({kind:"set",serverName:D,server:b})}if(Object.keys(H).length>0)G.runtimes[U]=Object.fromEntries(Object.entries(H).sort(([D],[j])=>D.localeCompare(j)));let Z=X.get(U);if(V.some((D)=>D.kind==="set")&&(!Z?.enabled||Z.status==="install_failed"))throw Error(`could not apply managed ${U} MCP servers: runtime is unavailable`);let K=U==="openclaw"?Z?.commandPath??sN(U,W):null;if(U==="openclaw"&&V.length>0&&(!K||!U8(K)))throw Error("could not mutate managed OpenClaw MCP servers: runtime is unavailable");let O=null;if(U==="hermes"&&V.length>0){O=q.content??"";for(let D of V)O=D.kind==="remove"?ao(O,D.serverName):po(O,D.serverName,D.server)}return{name:U,native:q,mutations:V,commandPath:K,nextHermesContent:O}});return{home:W,runtimes:z,nextLedger:G}}function Ug$($,J){let X=$==="openclaw"?m(J,".openclaw","openclaw.json"):m(J,".hermes","config.yaml");if(!u$(X))return{path:X,content:null,servers:{}};let Q=T6(X,"utf-8"),W;try{W=$==="openclaw"?JSON.parse(Q):R1(Q)}catch(U){throw Error(`${$} config is invalid: ${U instanceof Error?U.message:String(U)}`)}if(W===null&&$==="hermes")return{path:X,content:Q,servers:{}};if(!P1(W))throw Error(`${$} config must be an object`);if($==="openclaw"&&W.mcpServers!==void 0)throw Error("openclaw config uses unsupported legacy field mcpServers; canonical MCP state is mcp.servers");let Y=$==="openclaw"?W.mcp:W;if($==="openclaw"&&Y!==void 0&&!P1(Y))throw Error("openclaw config field mcp must be an object");let G=$==="openclaw"?"servers":"mcp_servers",z=P1(Y)?Y[G]:void 0;if(z===void 0)return{path:X,content:Q,servers:{}};if(!P1(z))throw Error(`${$} config field ${$==="openclaw"?"mcp.servers":G} must be an object`);return{path:X,content:Q,servers:z}}function Hg$($,J){return JSON.stringify(iN($))===JSON.stringify(iN(J))}function iN($){if(Array.isArray($))return $.map(iN);if(!P1($))return $;return Object.fromEntries(Object.entries($).sort(([J],[X])=>J.localeCompare(X)).map(([J,X])=>[J,iN(X)]))}function wg$($,J){if("command"in J)return{command:J.command,args:[...J.args]};return{url:J.url,transport:J.transport,headers:Object.fromEntries(Object.entries(J.headers).map(([X,Q])=>[X,typeof Q==="string"?Q:`${Q.prefix}${n_($,X)}`]))}}function qg$($,J,X){ls($,J,X)}function OJ($){let J=$.projection?.system;if(typeof J!=="object"||J===null||Array.isArray(J))return null;let X=J.home;return typeof X==="string"&&X.trim()?X.trim():null}function P1($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function ds($,J={}){let X=process.env.CLAWDI_RUNTIME_USER?.trim(),Q=X&&X!=="root"&&DJ()?String(WL(X)):null,W=Q?`/run/user/${Q}`:null,Y={...process.env,HOME:$,PATH:[m($,".local","bin"),m($,".openclaw","bin"),process.env.PATH].filter(Boolean).join(":"),...W?{XDG_RUNTIME_DIR:W,DBUS_SESSION_BUS_ADDRESS:`unix:path=${W}/bus`}:{}};if(J.egressSystemCaFile)g5(Y,{caFile:J.egressSystemCaFile});return Y}function ns($){let J=Number.parseInt(process.env.CLAWDI_RUNTIME_GID?.trim()??"",10);if(Number.isInteger(J)&&J>=0&&J<=4294967295)return J;let X=E1("id",["-g",$],{encoding:"utf8"});if(X.status===0){let Q=Number.parseInt(X.stdout.trim(),10);if(Number.isInteger(Q)&&Q>=0&&Q<=4294967295)return Q}if($==="clawdi")return 10001;throw Error(`could not resolve runtime gid for ${$}`)}function DT($){return u$(m($,"bus"))||u$(m($,"systemd","private"))}function Vg$($){let J=Date.now()+120000,X=new SharedArrayBuffer(4),Q=new Int32Array(X);while(Date.now()<J){if(DT($))return!0;Atomics.wait(Q,0,0,200)}return DT($)}function Zg$($){if(!DJ()||$==="root"||!H8("systemctl"))return;let J=WL($),X=ns($),Q=`/run/user/${J}`;if(OU("install",["-d","-m","0755","-o","root","-g","root","/run/user"]),OU("install",["-d","-m","0700","-o",String(J),"-g",String(X),Q]),DT(Q))return;let W=`user@${J}.service`,Y=E1("systemctl",["restart",W],{stdio:"ignore"});if(Y.status!==0)Y=E1("systemctl",["start",W],{stdio:"ignore"});if(Y.status!==0||!Vg$(Q))throw Error(`runtime user systemd manager did not publish a control socket under ${Q}`)}function uT(){let $=process.env.CLAWDI_RUNTIME_USER?.trim();if($)Zg$($)}function hT($,J,X,Q,W={}){let Y=ds(X,W),G=process.env.CLAWDI_RUNTIME_USER?.trim();if(DJ()&&G&&G!=="root"){if(H8("gosu"))return E1("gosu",[G,$,...J],{env:{...Y,USER:G,LOGNAME:G},cwd:Q,encoding:"utf8"});if(H8("runuser"))return E1("runuser",["-u",G,"--","env",`HOME=${X}`,`PATH=${Y.PATH}`,$,...J],{env:Y,cwd:Q,encoding:"utf8"});throw Error(`runtime init is running as root but cannot drop to CLAWDI_RUNTIME_USER=${G}; install gosu or runuser`)}return E1($,J,{env:Y,cwd:Q,encoding:"utf8"})}function I9($,J,X,Q,W,Y={}){let G=ds(Q,Y),z=process.env.CLAWDI_RUNTIME_USER?.trim();if(DJ()&&z&&z!=="root"){if(H8("gosu")){OU("gosu",[z,$,...J],{input:X,env:{...G,USER:z,LOGNAME:z},cwd:W,stdio:"pipe"});return}if(H8("runuser")){OU("runuser",["-u",z,"--","env",`HOME=${Q}`,`PATH=${G.PATH}`,$,...J],{input:X,env:G,cwd:W,stdio:"pipe"});return}throw Error(`runtime init is running as root but cannot drop to CLAWDI_RUNTIME_USER=${z}; install gosu or runuser`)}OU($,J,{input:X,env:G,cwd:W,stdio:"pipe"})}function ps($){if(!tN($))return null;try{let J=j9($);if(!J.isFile()&&!J.isSymbolicLink())return null;let X=J.isSymbolicLink()?bx$($):J;if(!X.isFile())return null;let Q=T6($);return p6({path:$,contentsSha256:IU("sha256").update(Q).digest("hex"),kind:J.isSymbolicLink()?"symlink":"file",linkTarget:J.isSymbolicLink()?Bs($):null,linkUid:J.uid,linkGid:J.gid,fileMode:X.mode&4095,fileUid:X.uid,fileGid:X.gid})}catch{return null}}function rs($,J,X){let Q=ps($);if(!Q)return null;try{let W=hT($,["--version"],J,X);if(W.status!==0)return null;let Y=Buffer.isBuffer(W.stdout)?W.stdout.toString("utf8"):W.stdout,G=Buffer.isBuffer(W.stderr)?W.stderr.toString("utf8"):W.stderr,z=[Y,G].filter(Boolean).join(`
|
|
527
|
+
`)}function ev$($){let J={};for(let X of Object.keys($).sort())J[X]={enabled:!0};return J}function $g$($){return $.projection?.mcp!==void 0}function Xg$($){let J=$.projection?.mcp;if(J===void 0)return{servers:{}};return{servers:p9.parse(J).servers}}function yT($){return m($.projectionRoot,Jg$)}function Qg$($){let J=yT($);if(!u$(J))return{schemaVersion:DU,runtimes:{}};let X;try{X=JSON.parse(T6(J,"utf-8"))}catch(Y){throw Error(`hosted MCP last-applied ledger is invalid: ${Y instanceof Error?Y.message:String(Y)}`)}if(!P1(X)||X.schemaVersion!==DU)throw Error("hosted MCP last-applied ledger has an unsupported schema");let Q=U$(X.runtimes);if(!Q||Object.keys(Q).some((Y)=>!r7.includes(Y)))throw Error("hosted MCP last-applied ledger has invalid runtimes");let W={};for(let Y of r7){let G=Q[Y];if(G===void 0)continue;if(!P1(G))throw Error(`hosted MCP last-applied ledger has invalid ${Y} servers`);let z={};for(let[U,H]of Object.entries(G).sort(([w],[q])=>w.localeCompare(q))){if(!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(U))throw Error(`hosted MCP last-applied ledger has invalid ${Y} server name`);let w=c_.safeParse(H);if(!w.success)throw Error(`hosted MCP last-applied ledger has invalid ${Y} server ${U}`);z[U]=w.data}if(Object.keys(z).length>0)W[Y]=z}return{schemaVersion:DU,runtimes:W}}function Wg$($,J){LJ(yT($),{schemaVersion:DU,runtimes:Object.fromEntries(r7.flatMap((X)=>{let Q=J.runtimes[X];return Q&&Object.keys(Q).length>0?[[X,Object.fromEntries(Object.entries(Q).sort(([W],[Y])=>W.localeCompare(Y)))]]:[]}))})}function hs(){return k0()==="hosted"}function ms($){let J=SX(yG(),"skills",$);if(!u$(m(J,"SKILL.md")))throw Error(`bundled hosted skill asset ${$} is unavailable`);return J}function cs($,J,X){if($!=="openclaw"&&$!=="hermes")return null;let Q=$==="openclaw"?m(X,".openclaw"):m(X,".hermes");return sO($,J,Q)}function Yg$($,J,X){if(!hs())return;for(let[Q,W]of Object.entries(J.projection?.skills?.entries??{})){let Y=FY(Q,W.version),G=cs($,Q,X),z=J.runtimes[$]?.enabled===!0;if(!G||!z||W.enabled!==!0)continue;let U=ms(Y.assetDirectory);dO(Y,U);let H=LY(G,Q);if(u$(G)&&H!=="hosted-manifest"&&!nw(G,Q))throw Error(`refusing to replace unmanaged ${Q} skill at ${G}`)}}function Gg$($,J,X,Q){let W=hs(),Y=[];for(let G of ag()){let z=cs($,G,Q);if(!z)continue;Y.push(z);let U=X.projection?.skills?.entries[G],H=X.runtimes[$]?.enabled===!0;if(!W||!H||U?.enabled!==!0){let N=LY(z,G),K=nw(z,G);if(N==="local-setup")continue;if(!W&&N==="unreserved"&&!K)continue;if(K&&N==="unreserved")Ag({targetDir:z,id:G,manager:"hosted-manifest",version:K.version,digest:K.digest});hw({targetDir:z,id:G,manager:"hosted-manifest",removeTarget:()=>i$(z,{recursive:!0,force:!0})});continue}if(!J?.enabled||J.status==="install_failed")continue;let w=FY(G,U.version),q=LY(z,G);if(u$(z)&&q!=="hosted-manifest"&&!nw(z,G))throw Error(`refusing to replace unmanaged ${G} skill at ${z}`);let V=w;if(uw({targetDir:z,id:G,manager:"hosted-manifest",version:U.version,digest:V.digest},()=>tg({skillId:G,version:U.version,sourceDir:ms(V.assetDirectory),targetDir:z,reserved:!0}))==="unchanged")continue;bs(z),A0(z);for(let N of R4(z))A0(m(z,N))}return Y}function zg$($,J,X,Q){let W=ls($,J,X),Y=yT(J),G=new Set;for(let z of[...W.runtimes].sort((U,H)=>U.name===H.name?0:U.name==="hermes"?-1:1)){if(z.mutations.length===0)continue;if(z.name==="hermes"){if(z.nextHermesContent===null)throw Error("Hermes MCP reconciliation did not produce staged config");o(z.native.path,z.nextHermesContent),A0(z.native.path),G.add(z.native.path);continue}if(!z.commandPath||!U8(z.commandPath))throw Error("could not mutate managed OpenClaw MCP servers: runtime is unavailable");for(let U of z.mutations){let H=U.kind==="remove"?["mcp","unset",U.serverName]:["mcp","set",U.serverName,JSON.stringify(U.server)];I9(z.commandPath,H,"",W.home,Q)}G.add(z.commandPath)}if(Object.keys(W.nextLedger.runtimes).length>0||u$(Y))Wg$(J,W.nextLedger);return[...G]}function ls($,J,X){let Q=Xg$($),W=OJ($)??J.userHome,Y=Qg$(J),G={schemaVersion:DU,runtimes:{}},z=r7.map((U)=>{let H=$.runtimes[U]?.enabled===!0?Q.servers:{},w=Y.runtimes[U]??{},q=Ug$(U,W);for(let D of Object.keys(H).sort()){if(Object.hasOwn(w,D))continue;if(Object.hasOwn(q.servers,D))throw Error(`refusing to replace unmanaged ${U} MCP server ${D}`)}let V=[];for(let D of Object.keys(w).sort())if(!Object.hasOwn(H,D)&&Object.hasOwn(q.servers,D))V.push({kind:"remove",serverName:D});for(let[D,j]of Object.entries(H).sort(([b],[M])=>b.localeCompare(M))){let b=wg$(D,j);if(!Hg$(q.servers[D],b))V.push({kind:"set",serverName:D,server:b})}if(Object.keys(H).length>0)G.runtimes[U]=Object.fromEntries(Object.entries(H).sort(([D],[j])=>D.localeCompare(j)));let Z=X.get(U);if(V.some((D)=>D.kind==="set")&&(!Z?.enabled||Z.status==="install_failed"))throw Error(`could not apply managed ${U} MCP servers: runtime is unavailable`);let K=U==="openclaw"?Z?.commandPath??sN(U,W):null,O=null;if(U==="hermes"&&V.length>0){O=q.content??"";for(let D of V)O=D.kind==="remove"?ao(O,D.serverName):po(O,D.serverName,D.server)}return{name:U,native:q,mutations:V,commandPath:K,nextHermesContent:O}});return{home:W,runtimes:z,nextLedger:G}}function Ug$($,J){let X=$==="openclaw"?m(J,".openclaw","openclaw.json"):m(J,".hermes","config.yaml");if(!u$(X))return{path:X,content:null,servers:{}};let Q=T6(X,"utf-8"),W;try{W=$==="openclaw"?JSON.parse(Q):R1(Q)}catch(U){throw Error(`${$} config is invalid: ${U instanceof Error?U.message:String(U)}`)}if(W===null&&$==="hermes")return{path:X,content:Q,servers:{}};if(!P1(W))throw Error(`${$} config must be an object`);if($==="openclaw"&&W.mcpServers!==void 0)throw Error("openclaw config uses unsupported legacy field mcpServers; canonical MCP state is mcp.servers");let Y=$==="openclaw"?W.mcp:W;if($==="openclaw"&&Y!==void 0&&!P1(Y))throw Error("openclaw config field mcp must be an object");let G=$==="openclaw"?"servers":"mcp_servers",z=P1(Y)?Y[G]:void 0;if(z===void 0)return{path:X,content:Q,servers:{}};if(!P1(z))throw Error(`${$} config field ${$==="openclaw"?"mcp.servers":G} must be an object`);return{path:X,content:Q,servers:z}}function Hg$($,J){return JSON.stringify(iN($))===JSON.stringify(iN(J))}function iN($){if(Array.isArray($))return $.map(iN);if(!P1($))return $;return Object.fromEntries(Object.entries($).sort(([J],[X])=>J.localeCompare(X)).map(([J,X])=>[J,iN(X)]))}function wg$($,J){if("command"in J)return{command:J.command,args:[...J.args]};return{url:J.url,transport:J.transport,headers:Object.fromEntries(Object.entries(J.headers).map(([X,Q])=>[X,typeof Q==="string"?Q:`${Q.prefix}${n_($,X)}`]))}}function qg$($,J,X){ls($,J,X)}function OJ($){let J=$.projection?.system;if(typeof J!=="object"||J===null||Array.isArray(J))return null;let X=J.home;return typeof X==="string"&&X.trim()?X.trim():null}function P1($){return typeof $==="object"&&$!==null&&!Array.isArray($)}function ds($,J={}){let X=process.env.CLAWDI_RUNTIME_USER?.trim(),Q=X&&X!=="root"&&DJ()?String(WL(X)):null,W=Q?`/run/user/${Q}`:null,Y={...process.env,HOME:$,PATH:[m($,".local","bin"),m($,".openclaw","bin"),process.env.PATH].filter(Boolean).join(":"),...W?{XDG_RUNTIME_DIR:W,DBUS_SESSION_BUS_ADDRESS:`unix:path=${W}/bus`}:{}};if(J.egressSystemCaFile)g5(Y,{caFile:J.egressSystemCaFile});return Y}function ns($){let J=Number.parseInt(process.env.CLAWDI_RUNTIME_GID?.trim()??"",10);if(Number.isInteger(J)&&J>=0&&J<=4294967295)return J;let X=E1("id",["-g",$],{encoding:"utf8"});if(X.status===0){let Q=Number.parseInt(X.stdout.trim(),10);if(Number.isInteger(Q)&&Q>=0&&Q<=4294967295)return Q}if($==="clawdi")return 10001;throw Error(`could not resolve runtime gid for ${$}`)}function DT($){return u$(m($,"bus"))||u$(m($,"systemd","private"))}function Vg$($){let J=Date.now()+120000,X=new SharedArrayBuffer(4),Q=new Int32Array(X);while(Date.now()<J){if(DT($))return!0;Atomics.wait(Q,0,0,200)}return DT($)}function Zg$($){if(!DJ()||$==="root"||!H8("systemctl"))return;let J=WL($),X=ns($),Q=`/run/user/${J}`;if(OU("install",["-d","-m","0755","-o","root","-g","root","/run/user"]),OU("install",["-d","-m","0700","-o",String(J),"-g",String(X),Q]),DT(Q))return;let W=`user@${J}.service`,Y=E1("systemctl",["restart",W],{stdio:"ignore"});if(Y.status!==0)Y=E1("systemctl",["start",W],{stdio:"ignore"});if(Y.status!==0||!Vg$(Q))throw Error(`runtime user systemd manager did not publish a control socket under ${Q}`)}function uT(){let $=process.env.CLAWDI_RUNTIME_USER?.trim();if($)Zg$($)}function hT($,J,X,Q,W={}){let Y=ds(X,W),G=process.env.CLAWDI_RUNTIME_USER?.trim();if(DJ()&&G&&G!=="root"){if(H8("gosu"))return E1("gosu",[G,$,...J],{env:{...Y,USER:G,LOGNAME:G},cwd:Q,encoding:"utf8"});if(H8("runuser"))return E1("runuser",["-u",G,"--","env",`HOME=${X}`,`PATH=${Y.PATH}`,$,...J],{env:Y,cwd:Q,encoding:"utf8"});throw Error(`runtime init is running as root but cannot drop to CLAWDI_RUNTIME_USER=${G}; install gosu or runuser`)}return E1($,J,{env:Y,cwd:Q,encoding:"utf8"})}function I9($,J,X,Q,W,Y={}){let G=ds(Q,Y),z=process.env.CLAWDI_RUNTIME_USER?.trim();if(DJ()&&z&&z!=="root"){if(H8("gosu")){OU("gosu",[z,$,...J],{input:X,env:{...G,USER:z,LOGNAME:z},cwd:W,stdio:"pipe"});return}if(H8("runuser")){OU("runuser",["-u",z,"--","env",`HOME=${Q}`,`PATH=${G.PATH}`,$,...J],{input:X,env:G,cwd:W,stdio:"pipe"});return}throw Error(`runtime init is running as root but cannot drop to CLAWDI_RUNTIME_USER=${z}; install gosu or runuser`)}OU($,J,{input:X,env:G,cwd:W,stdio:"pipe"})}function ps($){if(!tN($))return null;try{let J=j9($);if(!J.isFile()&&!J.isSymbolicLink())return null;let X=J.isSymbolicLink()?bx$($):J;if(!X.isFile())return null;let Q=T6($);return p6({path:$,contentsSha256:IU("sha256").update(Q).digest("hex"),kind:J.isSymbolicLink()?"symlink":"file",linkTarget:J.isSymbolicLink()?Bs($):null,linkUid:J.uid,linkGid:J.gid,fileMode:X.mode&4095,fileUid:X.uid,fileGid:X.gid})}catch{return null}}function rs($,J,X){let Q=ps($);if(!Q)return null;try{let W=hT($,["--version"],J,X);if(W.status!==0)return null;let Y=Buffer.isBuffer(W.stdout)?W.stdout.toString("utf8"):W.stdout,G=Buffer.isBuffer(W.stderr)?W.stderr.toString("utf8"):W.stderr,z=[Y,G].filter(Boolean).join(`
|
|
528
528
|
`).trim();if(!z)return null;return p6({executableRevision:Q,version:z})}catch{return null}}function Bg$($,J){let X=o7($);if(!X)return null;let Q=T1(X.programName),W=m(J.systemdUserRoot,Q);try{let Y=T6(W);if(UX(Y.toString("utf8")))return null;let G=j9(W);if(!G.isFile())return null;let z=Xe(X,J),U=rs(z,J.userHome,J.userHome);if(!U)return null;return p6({commandRevision:U,programName:X.programName,unitName:Q,unitSha256:IU("sha256").update(Y).digest("hex"),unitMode:G.mode&4095,unitUid:G.uid,unitGid:G.gid})}catch{return null}}function Ng$($){let J=o7($.program);if(!J)throw Error("official service receipt requires an official service program");return p6({runtime:J.runtime,programName:J.programName,serviceIdentity:J.service,installerCommand:J.command,installArgs:J.installArgs})}function Lg$($){return p6({runtime:"openclaw",pluginIdentity:$.channel,installerCommand:["plugins","install"],specs:$.specs})}function Kg$($){let J=rs($.commandPath,$.home,$.workspaceRoot);if(!J)return null;let X=hT($.commandPath,["plugins","inspect",$.channel,"--json"],$.home,$.workspaceRoot);if(X.status!==0)return null;try{let Q=Buffer.isBuffer(X.stdout)?X.stdout.toString("utf8"):X.stdout,W=Tx$.safeParse(JSON.parse(Q));if(!W.success)return null;let{plugin:Y,install:G}=W.data,z=Y.version??G.resolvedVersion??G.version,U=ps(Y.source);if(Y.id!==$.channel||Y.status!=="loaded"||!Y.enabled||!z||!U)return null;return p6({commandRevision:J,plugin:{id:Y.id,source:Y.source,sourceRevision:U,origin:Y.origin,status:Y.status,version:z,enabled:Y.enabled===!0},install:{source:G.source,spec:G.spec,sourcePath:G.sourcePath,installPath:G.installPath,version:G.version,resolvedName:G.resolvedName,resolvedVersion:G.resolvedVersion,resolvedSpec:G.resolvedSpec,integrity:G.integrity,shasum:G.shasum,npmIntegrity:G.npmIntegrity,npmShasum:G.npmShasum,clawpackSha256:G.clawpackSha256,gitUrl:G.gitUrl,gitRef:G.gitRef,gitCommit:G.gitCommit}})}catch{return null}}function is($,J,X){if(!$||$.desiredRevision!==J)return null;let Q=X();return Q===$.currentRevision?Q:null}function Og$($,J){let X=qt();Hs(X.officialServices,$.officialServices),Hs(X.channelPlugins,$.channelPlugins);try{Bt(X,J)}catch{}}function Hs($,J){for(let[X,Q]of[...J].sort(([W],[Y])=>W.localeCompare(Y))){if(!Q.expectedCurrentRevision)continue;let W=Q.currentRevision();if(W!==Q.expectedCurrentRevision)continue;$[X]={desiredRevision:Q.desiredRevision,currentRevision:W}}}function Dg$($){return i$($.egressProfileBundle,{force:!0}),null}function Fg$($,J){if(!$)return i$(J.egressEngineStatus,{force:!0}),null;return LJ(J.egressEngineStatus,$),U4(f0(J.egressEngineStatus)),U4(J.egressEngineStatus),$}function jg$($){let J=bg$(),X=T6(J,"utf-8");return o($.egressAddon,X,{mode:420,dirMode:493}),U4(f0($.egressAddon)),U4($.egressAddon),{path:$.egressAddon,sha256:_g$(X)}}function Ig$($){return i$($.egressAddon,{force:!0}),null}function bg$(){let $=SX(yG(),"egress-addon","clawdi_egress_addon.py");if(u$($))return $;throw Error("packaged egress addon is missing")}function Mg$($){if(!$.program)return i$($.paths.egressTransparentEnv,{force:!0}),null;let J={CLAWDI_RUNTIME_USER:$.runtimeUser,CLAWDI_RUNTIME_UID:String($.runtimeUid),CLAWDI_RUNTIME_GID:String($.runtimeGid),CLAWDI_EGRESS_UID:String($.egressUid),CLAWDI_EGRESS_GID:String($.egressGid),CLAWDI_EGRESS_TRANSPARENT_PORT:String($.program.transparentPort),CLAWDI_EGRESS_NFT_TABLE:LU,CLAWDI_EGRESS_PROFILE_BUNDLE:$.program.profileBundlePath,CLAWDI_EGRESS_SECRET_FILE:$.program.secretFilePath??"",CLAWDI_EGRESS_CA_DIR:$.paths.egressCaDir,CLAWDI_EGRESS_CA_CERT:$.paths.egressCaCert,CLAWDI_EGRESS_SYSTEM_CA_BUNDLE:$.program.systemCaBundle,CLAWDI_EGRESS_TRANSPORT_VERSION:NU,CLAWDI_EGRESS_ENGINE_TYPE:"mitmproxy",CLAWDI_EGRESS_ENGINE_VERSION:$.program.engine.version,CLAWDI_EGRESS_ENGINE_URL:$.program.engine.url,CLAWDI_EGRESS_ENGINE_SHA256:$.program.engine.sha256,CLAWDI_EGRESS_ENGINE_BINARY_PATH:$.program.engine.binaryPath,CLAWDI_EGRESS_ADDON_PATH:$.program.addonPath,CLAWDI_EGRESS_ADDON_SHA256:$.program.addonSha256},X=Object.entries(J).sort(([Q],[W])=>Q.localeCompare(W)).map(([Q,W])=>`${Q}=${lT(W)}`);return o($.paths.egressTransparentEnv,`${X.join(`
|
|
529
529
|
`)}
|
|
530
530
|
`,{mode:420,dirMode:493}),U4(f0($.paths.egressTransparentEnv)),U4($.paths.egressTransparentEnv),$.paths.egressTransparentEnv}function _g$($){return IU("sha256").update($).digest("hex")}function Ag$($,J){if(!u$(J.runConfigRoot))return;for(let X of R4(J.runConfigRoot)){if(!X.endsWith(".json"))continue;let Q=X.slice(0,-5);if(!Pg$(Q))continue;if(!$.has(Q))i$(m(J.runConfigRoot,X),{force:!0})}}function Rg$($,J){if(!u$(J.runtimeSecretFileRoot))return;for(let X of R4(J.runtimeSecretFileRoot)){if(!X.endsWith(".json"))continue;let Q=X.slice(0,-5);if(!P6.safeParse(Q).success)continue;if(!$.has(Q))i$(m(J.runtimeSecretFileRoot,X),{force:!0})}}function Pg$($){let[J,X,...Q]=$.split("+");if(Q.length>0)return!1;if(!P6.safeParse(J).success)return!1;if(X===void 0)return!0;return NJ.safeParse(X).success}function kg$($){if($.liveSync?.enabled===!1)return[];let J=$.liveSync?.agents??[],X=new Map;for(let Q of J)X.set(Q.agentType,Q);return[...X.values()].sort((Q,W)=>Q.agentType.localeCompare(W.agentType))}function xg$($,J){let X=J.localEnvironments;G6(X,{recursive:!0}),A0(X);let Q=kg$($),W=new Set(Q.map((z)=>z.agentType)),Y=new Set([...vg$(J),...Eg$]);for(let z of Y)if(!W.has(z))i$(m(X,`${z}.json`),{force:!0});let G=[];for(let z of Q){let U=m(X,`${z.agentType}.json`);o(U,`${JSON.stringify({id:z.environmentId,agentType:z.agentType,managedBy:"clawdi runtime init",deploymentId:$.deploymentId,instanceId:$.instanceId},null,2)}
|