@@ -372,14 +372,14 @@ func (a AgentService) InstallPlugin(req dto.AgentPluginInstallReq) error {
372372 mgr := cmd .NewCommandMgr (cmd .WithTask (* t ), cmd .WithContext (t .TaskCtx ), cmd .WithTimeout (10 * time .Minute ))
373373 if req .Type == "qqbot" {
374374 legacyPluginPath := path .Join (openclawPluginBaseDir , "qqbot" )
375- if err := mgr .RunBashCf ("docker exec %s test -d %s" , install . ContainerName , legacyPluginPath ); err == nil {
376- if _ , err := mgr . RunWithStdout ( "docker" , "exec" , "-i" , install .ContainerName , "sh" , "-c" , buildOpenclawPluginUninstallScript ( " qqbot") ); err != nil {
375+ if err := mgr .Run ("docker" , " exec" , install . ContainerName , " test" , "-d" , legacyPluginPath ); err == nil {
376+ if err := uninstallOpenclawPlugin ( mgr , install .ContainerName , "qqbot" ); err != nil {
377377 return err
378378 }
379379 time .Sleep (2 * time .Second )
380380 }
381381 }
382- if _ , err := mgr . RunWithStdout ( "docker" , "exec" , install .ContainerName , "sh" , "-c" , buildOpenclawPluginInstallScript ( spec , pluginID ) ); err != nil {
382+ if err := installOpenclawPlugin ( mgr , install .ContainerName , spec , pluginID ); err != nil {
383383 return err
384384 }
385385 conf , err := readOpenclawConfig (agent .ConfigPath )
@@ -415,11 +415,11 @@ func (a AgentService) UpgradePlugin(req dto.AgentPluginUpgradeReq) error {
415415 }
416416 upgradeTask .AddSubTask ("Upgrade OpenClaw plugin" , func (t * task.Task ) error {
417417 mgr := cmd .NewCommandMgr (cmd .WithTask (* t ), cmd .WithContext (t .TaskCtx ), cmd .WithTimeout (10 * time .Minute ))
418- if _ , err := mgr . RunWithStdout ( "docker" , "exec" , "-i" , install .ContainerName , "sh" , "-c" , buildOpenclawPluginUninstallScript ( pluginID ) ); err != nil {
418+ if err := uninstallOpenclawPlugin ( mgr , install .ContainerName , pluginID ); err != nil {
419419 return err
420420 }
421421 time .Sleep (2 * time .Second )
422- if _ , err := mgr . RunWithStdout ( "docker" , "exec" , install .ContainerName , "sh" , "-c" , buildOpenclawPluginInstallScript ( spec , pluginID ) ); err != nil {
422+ if err := installOpenclawPlugin ( mgr , install .ContainerName , spec , pluginID ); err != nil {
423423 return err
424424 }
425425 conf , err := readOpenclawConfig (agent .ConfigPath )
@@ -455,7 +455,7 @@ func (a AgentService) UninstallPlugin(req dto.AgentPluginUninstallReq) error {
455455 }
456456 uninstallTask .AddSubTask ("Uninstall OpenClaw plugin" , func (t * task.Task ) error {
457457 mgr := cmd .NewCommandMgr (cmd .WithTask (* t ), cmd .WithContext (t .TaskCtx ), cmd .WithTimeout (10 * time .Minute ))
458- if _ , err := mgr . RunWithStdout ( "docker" , "exec" , "-i" , install .ContainerName , "sh" , "-c" , buildOpenclawPluginUninstallScript ( pluginID ) ); err != nil {
458+ if err := uninstallOpenclawPlugin ( mgr , install .ContainerName , pluginID ); err != nil {
459459 return err
460460 }
461461 conf , err := readOpenclawConfig (agent .ConfigPath )
@@ -487,7 +487,7 @@ func (a AgentService) LoginWeixinChannel(req dto.AgentWeixinLoginReq) error {
487487 if agent .AgentType == constant .AppHermesAgent {
488488 return mgr .Run ("docker" , buildHermesWeixinLoginArgs (install .ContainerName )... )
489489 }
490- return mgr .RunBashCf ("docker exec %s openclaw channels login --channel openclaw-weixin" , install . ContainerName )
490+ return mgr .Run ("docker" , " exec" , install . ContainerName , " openclaw" , " channels" , " login" , " --channel" , " openclaw-weixin" )
491491 }, nil )
492492 if agent .AgentType == constant .AppHermesAgent {
493493 loginTask .AddSubTask ("Restart Hermes-Agent container" , func (t * task.Task ) error {
@@ -584,17 +584,26 @@ func (a AgentService) ApproveChannelPairing(req dto.AgentChannelPairingApproveRe
584584 return validateHermesPairingApproveResult (output , err )
585585 }
586586 if req .AccountID != "" {
587- return cmd .RunDefaultBashCf (
588- "docker exec %s openclaw pairing approve %s %q --account %q" ,
587+ return cmd .NewCommandMgr (cmd .WithTimeout (20 * time .Second )).Run (
588+ "docker" ,
589+ "exec" ,
589590 install .ContainerName ,
591+ "openclaw" ,
592+ "pairing" ,
593+ "approve" ,
590594 req .Type ,
591595 req .PairingCode ,
596+ "--account" ,
592597 req .AccountID ,
593598 )
594599 }
595- return cmd .RunDefaultBashCf (
596- "docker exec %s openclaw pairing approve %s %q" ,
600+ return cmd .NewCommandMgr (cmd .WithTimeout (20 * time .Second )).Run (
601+ "docker" ,
602+ "exec" ,
597603 install .ContainerName ,
604+ "openclaw" ,
605+ "pairing" ,
606+ "approve" ,
598607 req .Type ,
599608 req .PairingCode ,
600609 )
@@ -1289,20 +1298,40 @@ func appendPluginAllow(conf map[string]interface{}, pluginID string) {
12891298 plugins ["allow" ] = append (allow , pluginID )
12901299}
12911300
1292- func buildOpenclawPluginInstallScript (spec , pluginID string ) string {
1293- return fmt .Sprintf (
1294- "set -e; workdir=%s/%s; rm -rf \" $workdir\" ; mkdir -p \" $workdir\" ; cd \" $workdir\" ; npm pack --silent %q >/dev/null 2>&1; pkg=$(find \" $workdir\" -maxdepth 1 -type f -name '*.tgz' | head -n 1); printf '%%s\\ n' \" $pkg\" ; openclaw plugins install \" $pkg\" --dangerously-force-unsafe-install; rm -rf \" $workdir\" " ,
1295- openclawPluginPackageTmpDir ,
1296- pluginID ,
1297- spec ,
1298- )
1301+ func installOpenclawPlugin (mgr * cmd.CommandHelper , containerName , spec , pluginID string ) error {
1302+ workdir := path .Join (openclawPluginPackageTmpDir , pluginID )
1303+ defer func () {
1304+ _ = mgr .Run ("docker" , "exec" , containerName , "rm" , "-rf" , workdir )
1305+ }()
1306+ if err := mgr .Run ("docker" , "exec" , containerName , "rm" , "-rf" , workdir ); err != nil {
1307+ return err
1308+ }
1309+ if err := mgr .Run ("docker" , "exec" , containerName , "mkdir" , "-p" , workdir ); err != nil {
1310+ return err
1311+ }
1312+ if err := mgr .Run ("docker" , "exec" , "-w" , workdir , containerName , "npm" , "pack" , "--silent" , spec ); err != nil {
1313+ return err
1314+ }
1315+ pkgPath , err := mgr .RunWithStdout ("docker" , "exec" , containerName , "find" , workdir , "-maxdepth" , "1" , "-type" , "f" , "-name" , "*.tgz" , "-print" , "-quit" )
1316+ if err != nil {
1317+ return err
1318+ }
1319+ pkgPath = strings .TrimSpace (pkgPath )
1320+ if pkgPath == "" {
1321+ return fmt .Errorf ("openclaw plugin package not found" )
1322+ }
1323+ return mgr .Run ("docker" , "exec" , containerName , "openclaw" , "plugins" , "install" , pkgPath , "--dangerously-force-unsafe-install" )
12991324}
13001325
1301- func buildOpenclawPluginUninstallScript ( pluginID string ) string {
1302- return fmt . Sprintf (
1303- "set +e; printf 'yes \\ n' | openclaw plugins uninstall %s; code=$?; if [ \" $code \" -eq 137 ]; then exit 0; fi; exit \" $code \" " ,
1304- pluginID ,
1326+ func uninstallOpenclawPlugin ( mgr * cmd. CommandHelper , containerName , pluginID string ) error {
1327+ _ , err := mgr . RunPipe (
1328+ cmd. PipeCommand { Name : " printf" , Args : [] string { "yes \n " }} ,
1329+ cmd. PipeCommand { Name : "docker" , Args : [] string { "exec" , "-i" , containerName , "openclaw" , "plugins" , "uninstall" , pluginID }} ,
13051330 )
1331+ if err != nil && strings .Contains (err .Error (), "exit status 137" ) {
1332+ return nil
1333+ }
1334+ return err
13061335}
13071336
13081337func resolvePluginMeta (pluginType string ) (string , string , error ) {
@@ -1357,7 +1386,7 @@ func loadOpenclawPluginLatestVersion(containerName, pluginType string) (string,
13571386 if err != nil {
13581387 return "" , err
13591388 }
1360- output , err := runDockerExecWithStdout (20 * time .Second , containerName , "npm" , "view" , spec , "version" , "--json" )
1389+ output , err := cmd . RunDockerExecWithStdout (20 * time .Second , containerName , "npm" , "view" , spec , "version" , "--json" )
13611390 if err != nil {
13621391 return "" , err
13631392 }
0 commit comments