(req dto.AgentBatchSkillInstallReq)
| 353 | } |
| 354 | |
| 355 | func (a AgentService) BatchInstallSkill(req dto.AgentBatchSkillInstallReq) ([]dto.AgentBatchSkillInstallResult, error) { |
| 356 | if req.AgentType != constant.AppOpenclaw && req.AgentType != constant.AppHermesAgent { |
| 357 | return nil, fmt.Errorf("%s does not support skill batch install", req.AgentType) |
| 358 | } |
| 359 | packagePath, err := validateLocalSkillPackagePath(req.PackagePath) |
| 360 | if err != nil { |
| 361 | return nil, err |
| 362 | } |
| 363 | if format, err := localSkillPackageFormat(packagePath); err != nil { |
| 364 | return nil, err |
| 365 | } else if format != "zip" { |
| 366 | return nil, fmt.Errorf("only .zip skill packages can be installed") |
| 367 | } |
| 368 | skillName := sanitizeLocalSkillDirName(req.SkillName, packagePath, req.SkillName) |
| 369 | agents, err := listBatchAgents(req.AgentType) |
| 370 | if err != nil { |
| 371 | return nil, err |
| 372 | } |
| 373 | results := make([]dto.AgentBatchSkillInstallResult, 0, len(agents)) |
| 374 | for _, agent := range agents { |
| 375 | result := dto.AgentBatchSkillInstallResult{ |
| 376 | AgentID: agent.ID, |
| 377 | AgentName: agent.Name, |
| 378 | AppInstallID: agent.AppInstallID, |
| 379 | } |
| 380 | ctx, message := loadBatchAgentInstall(agent, req.AgentType) |
| 381 | if message != "" { |
| 382 | result.Message = message |
| 383 | results = append(results, result) |
| 384 | continue |
| 385 | } |
| 386 | install := ctx.install |
| 387 | result.AppInstallID = install.ID |
| 388 | if install.Status == constant.StatusInstalling || install.Status == constant.StatusUpgrading { |
| 389 | result.Message = fmt.Sprintf("agent status is %s", install.Status) |
| 390 | results = append(results, result) |
| 391 | continue |
| 392 | } |
| 393 | if err := ensureContainerRunning(install.ContainerName); err != nil { |
| 394 | result.Message = err.Error() |
| 395 | results = append(results, result) |
| 396 | continue |
| 397 | } |
| 398 | installTask, err := task.NewTaskWithOps(skillName, task.TaskInstall, task.TaskScopeAI, buildBatchSkillInstallTaskID(req.TaskID, agent.ID), agent.ID) |
| 399 | if err != nil { |
| 400 | result.Message = err.Error() |
| 401 | results = append(results, result) |
| 402 | continue |
| 403 | } |
| 404 | currentAgent := ctx.agent |
| 405 | currentInstall := ctx.install |
| 406 | installTask.AddSubTask("Install local skill", func(t *task.Task) error { |
| 407 | mgr := cmd.NewCommandMgr(cmd.WithTask(*t), cmd.WithContext(t.TaskCtx), cmd.WithTimeout(20*time.Minute)) |
| 408 | return installLocalSkillPackage(mgr, currentInstall.ContainerName, currentAgent.AgentType, currentAgent.ConfigPath, packagePath, skillName) |
| 409 | }, nil) |
| 410 | go func() { |
| 411 | if err := installTask.Execute(); err != nil { |
| 412 | global.LOG.Errorf("batch install local skill failed: %v", err) |
nothing calls this directly
no test coverage detected