Skip to content

Commit 026eea2

Browse files
committed
refactor: update agent and core utilities
1 parent 3a8aa43 commit 026eea2

86 files changed

Lines changed: 1850 additions & 897 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

agent/app/service/agents.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ func validateAgentConfigFileContent(agentType, content string) error {
990990
}
991991

992992
func getOpenclawNPMRegistry(containerName string) (string, error) {
993-
registry, err := runDockerExecWithStdout(20*time.Second, containerName, "npm", "get", "registry")
993+
registry, err := cmd.RunDockerExecWithStdout(20*time.Second, containerName, "npm", "get", "registry")
994994
if err != nil {
995995
return "", err
996996
}
@@ -1002,7 +1002,7 @@ func getOpenclawNPMRegistry(containerName string) (string, error) {
10021002
}
10031003

10041004
func setOpenclawNPMRegistry(containerName, registry string) error {
1005-
return cmd.RunDefaultBashCf("docker exec %s npm set registry %q", containerName, registry)
1005+
return cmd.NewCommandMgr().Run("docker", "exec", containerName, "npm", "set", "registry", registry)
10061006
}
10071007

10081008
func (a AgentService) loadAgentAndInstall(agentID uint) (*model.Agent, *model.AppInstall, error) {

agent/app/service/agents_agents.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func (a AgentService) CreateRole(req dto.AgentRoleCreateReq) (*dto.AgentRoleCrea
2323
return nil, err
2424
}
2525

26-
args := []string{"exec", install.ContainerName, "openclaw", "agents", "add", req.Name}
26+
args := []string{"openclaw", "agents", "add", req.Name}
2727
workspace := "/home/node/.openclaw/workspace-agent_" + req.Name
2828
agentDir := "/home/node/.openclaw/agents/" + req.Name
2929
args = append(args, "--workspace", workspace)
@@ -43,8 +43,7 @@ func (a AgentService) CreateRole(req dto.AgentRoleCreateReq) (*dto.AgentRoleCrea
4343
args = append(args, "--agent-dir", agentDir)
4444
args = append(args, "--non-interactive", "--json")
4545

46-
mgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Minute))
47-
output, err := mgr.RunWithStdout("docker", args...)
46+
output, err := cmd.RunDockerExecWithStdout(5*time.Minute, install.ContainerName, args...)
4847
if err != nil {
4948
return nil, err
5049
}
@@ -125,10 +124,8 @@ func (a AgentService) DeleteRole(req dto.AgentRoleDeleteReq) error {
125124
return buserr.New("ErrRecordNotFound")
126125
}
127126

128-
args := []string{"exec", install.ContainerName, "openclaw", "agents", "delete", req.ID, "--force"}
129-
130-
mgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Minute))
131-
if _, err = mgr.RunWithStdout("docker", args...); err != nil {
127+
args := []string{"openclaw", "agents", "delete", req.ID, "--force"}
128+
if _, err = cmd.RunDockerExecWithStdout(5*time.Minute, install.ContainerName, args...); err != nil {
132129
return err
133130
}
134131
if target.Workspace != "" {
@@ -171,8 +168,6 @@ func (a AgentService) operateRoleBinding(req dto.AgentRoleBindReq, action string
171168
return buserr.New("ErrInvalidParams")
172169
}
173170
args := []string{
174-
"exec",
175-
install.ContainerName,
176171
"openclaw",
177172
"agents",
178173
action,
@@ -182,8 +177,7 @@ func (a AgentService) operateRoleBinding(req dto.AgentRoleBindReq, action string
182177
binding,
183178
}
184179
args = append(args, "--json")
185-
mgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Minute))
186-
_, err = mgr.RunWithStdout("docker", args...)
180+
_, err = cmd.RunDockerExecWithStdout(5*time.Minute, install.ContainerName, args...)
187181
return err
188182
}
189183

agent/app/service/agents_channels.go

Lines changed: 52 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

13081337
func 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
}

agent/app/service/agents_overview.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/1Panel-dev/1Panel/agent/app/dto"
1212
"github.com/1Panel-dev/1Panel/agent/constant"
13+
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
1314
)
1415

1516
const (
@@ -101,7 +102,7 @@ func countOpenclawConfiguredChannels(conf map[string]interface{}) int {
101102
}
102103

103104
func loadOpenclawOverviewSkillStats(containerName string) (int, error) {
104-
output, err := runDockerExecWithStdout(5*time.Minute, containerName, "sh", "-c", "openclaw skills list --json 2>&1")
105+
output, err := cmd.RunDockerExecWithStdout(5*time.Minute, containerName, "openclaw", "skills", "list", "--json")
105106
if err != nil {
106107
return 0, err
107108
}

agent/app/service/agents_skills.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (a AgentService) ListSkills(req dto.AgentIDReq) ([]dto.AgentSkillItem, erro
5555
if agent.AgentType != constant.AppOpenclaw {
5656
return nil, fmt.Errorf("%s does not support", agent.AgentType)
5757
}
58-
output, err := runDockerExecWithStdout(5*time.Minute, install.ContainerName, "sh", "-c", "openclaw skills list --json 2>&1")
58+
output, err := cmd.RunDockerExecWithStdout(5*time.Minute, install.ContainerName, "openclaw", "skills", "list", "--json")
5959
if err != nil {
6060
return nil, err
6161
}
@@ -143,7 +143,7 @@ func (a AgentService) InstallSkill(req dto.AgentSkillInstallReq) error {
143143
}
144144
installTask.AddSubTask("Install OpenClaw skill", func(t *task.Task) error {
145145
mgr := cmd.NewCommandMgr(cmd.WithTask(*t), cmd.WithContext(t.TaskCtx), cmd.WithTimeout(20*time.Minute))
146-
return mgr.Run("docker", "exec", install.ContainerName, "sh", "-c", buildOpenclawSkillInstallCommand(req.Source, req.Slug))
146+
return installOpenclawSkill(mgr, install.ContainerName, req.Source, req.Slug)
147147
}, nil)
148148
go func() {
149149
if err := installTask.Execute(); err != nil {
@@ -205,9 +205,9 @@ func parseOpenclawSkillsList(output string) ([]dto.AgentSkillItem, error) {
205205
func loadOpenclawSkillSearchOutput(containerName, source, keyword string) (string, error) {
206206
switch source {
207207
case "skillhub":
208-
return runDockerExecWithStdout(2*time.Minute, containerName, "skillhub", "search", keyword, "--json")
208+
return cmd.RunDockerExecWithStdout(2*time.Minute, containerName, "skillhub", "search", keyword, "--json")
209209
default:
210-
return runDockerExecWithStdout(
210+
return cmd.RunDockerExecWithStdout(
211211
2*time.Minute,
212212
containerName,
213213
"sh",
@@ -261,22 +261,28 @@ func parseClawhubSearchResult(output, source string) []dto.AgentSkillSearchItem
261261
return items
262262
}
263263

264-
func buildOpenclawSkillInstallCommand(source, slug string) string {
264+
func installOpenclawSkill(mgr *cmd.CommandHelper, containerName, source, slug string) error {
265+
if err := mgr.Run("docker", "exec", containerName, "mkdir", "-p", openclawManagedSkillsDir); err != nil {
266+
return err
267+
}
265268
switch source {
266269
case "clawhub-global", "clawhub-cn":
267-
return fmt.Sprintf(
268-
"mkdir -p %s && CLAWHUB_REGISTRY=%q clawhub --workdir /home/node/.openclaw --dir skills install %q",
269-
openclawManagedSkillsDir,
270-
resolveClawhubRegistry(source),
270+
return mgr.Run(
271+
"docker",
272+
"exec",
273+
"-e",
274+
"CLAWHUB_REGISTRY="+resolveClawhubRegistry(source),
275+
containerName,
276+
"clawhub",
277+
"--workdir",
278+
"/home/node/.openclaw",
279+
"--dir",
280+
"skills",
281+
"install",
271282
slug,
272283
)
273284
default:
274-
return fmt.Sprintf(
275-
"mkdir -p %s && skillhub --dir %s install %q",
276-
openclawManagedSkillsDir,
277-
openclawManagedSkillsDir,
278-
slug,
279-
)
285+
return mgr.Run("docker", "exec", containerName, "skillhub", "--dir", openclawManagedSkillsDir, "install", slug)
280286
}
281287
}
282288

@@ -290,7 +296,7 @@ func resolveClawhubRegistry(source string) string {
290296
}
291297

292298
func getOpenclawSkillKey(containerName, name string) (string, error) {
293-
output, err := runDockerExecWithStdout(2*time.Minute, containerName, "sh", "-c", fmt.Sprintf("openclaw skills info %q --json 2>&1", name))
299+
output, err := cmd.RunDockerExecWithStdout(2*time.Minute, containerName, "openclaw", "skills", "info", name, "--json")
294300
if err != nil {
295301
return "", err
296302
}

agent/app/service/agents_utils.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/1Panel-dev/1Panel/agent/buserr"
2020
"github.com/1Panel-dev/1Panel/agent/constant"
2121
"github.com/1Panel-dev/1Panel/agent/global"
22-
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
2322
"github.com/1Panel-dev/1Panel/agent/utils/common"
2423
"github.com/1Panel-dev/1Panel/agent/utils/files"
2524
"github.com/1Panel-dev/1Panel/agent/utils/req_helper"
@@ -60,11 +59,6 @@ func ensureContainerRunning(containerName string) error {
6059
return nil
6160
}
6261

63-
func runDockerExecWithStdout(timeout time.Duration, containerName string, args ...string) (string, error) {
64-
commandArgs := append([]string{"exec", containerName}, args...)
65-
return cmd.NewCommandMgr(cmd.WithTimeout(timeout)).RunWithStdout("docker", commandArgs...)
66-
}
67-
6862
func resolveAgentAccountInput(provider, apiKey, baseURL string) (resolvedAgentAccountInput, error) {
6963
resolvedAPIKey := strings.TrimSpace(apiKey)
7064
resolvedBaseURL := strings.TrimSpace(baseURL)

agent/app/service/ai.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func (u *AIToolService) LoadDetail(name string) (string, error) {
7777
if err != nil {
7878
return "", err
7979
}
80-
stdout, err := cmd.RunDefaultWithStdoutBashCf("docker exec %s ollama show %s", containerName, name)
80+
stdout, err := cmd.RunDockerExecWithStdout(20*time.Second, containerName, "ollama", "show", name)
8181
if err != nil {
8282
return "", err
8383
}
@@ -137,7 +137,7 @@ func (u *AIToolService) Close(name string) error {
137137
if err != nil {
138138
return err
139139
}
140-
if err := cmd.RunDefaultBashCf("docker exec %s ollama stop %s", containerName, name); err != nil {
140+
if err := cmd.NewCommandMgr().Run("docker", "exec", containerName, "ollama", "stop", name); err != nil {
141141
return fmt.Errorf("handle ollama stop %s failed, %v", name, err)
142142
}
143143
return nil
@@ -194,7 +194,7 @@ func (u *AIToolService) Delete(req dto.ForceDelete) error {
194194
}
195195
for _, item := range ollamaList {
196196
if item.Status != constant.StatusDeleted {
197-
if err := cmd.RunDefaultBashCf("docker exec %s ollama rm %s", containerName, item.Name); err != nil && !req.ForceDelete {
197+
if err := cmd.NewCommandMgr().Run("docker", "exec", containerName, "ollama", "rm", item.Name); err != nil && !req.ForceDelete {
198198
return fmt.Errorf("handle ollama rm %s failed, %v", item.Name, err)
199199
}
200200
}
@@ -210,7 +210,7 @@ func (u *AIToolService) Sync() ([]dto.OllamaModelDropList, error) {
210210
if err != nil {
211211
return nil, err
212212
}
213-
stdout, err := cmd.RunDefaultWithStdoutBashCf("docker exec %s ollama list", containerName)
213+
stdout, err := cmd.RunDockerExecWithStdout(20*time.Second, containerName, "ollama", "list")
214214
if err != nil {
215215
return nil, err
216216
}
@@ -382,12 +382,15 @@ func LoadContainerName() (string, error) {
382382
}
383383

384384
func loadModelSize(name string, containerName string) (string, error) {
385-
stdout, err := cmd.RunDefaultWithStdoutBashCf("docker exec %s ollama list | grep %s", containerName, name)
385+
stdout, err := cmd.RunDockerExecWithStdout(20*time.Second, containerName, "ollama", "list")
386386
if err != nil {
387387
return "", err
388388
}
389389
lines := strings.Split(stdout, "\n")
390390
for _, line := range lines {
391+
if !strings.Contains(line, name) {
392+
continue
393+
}
391394
parts := strings.Fields(line)
392395
if len(parts) < 5 {
393396
continue

0 commit comments

Comments
 (0)