diff --git a/core/init/migration/migrate.go b/core/init/migration/migrate.go
index faa3708441a6..d8ef4abbe736 100644
--- a/core/init/migration/migrate.go
+++ b/core/init/migration/migrate.go
@@ -29,6 +29,7 @@ func Init() {
migrations.AddScriptSync,
migrations.UpdateXpackHideMenuSort,
migrations.AdjustXpackNode,
+ migrations.UpdateAiAgentsMenu,
})
if err := m.Migrate(); err != nil {
global.LOG.Error(err)
diff --git a/core/init/migration/migrations/init.go b/core/init/migration/migrations/init.go
index f540219902fc..67a410a8c18e 100644
--- a/core/init/migration/migrations/init.go
+++ b/core/init/migration/migrations/init.go
@@ -687,3 +687,78 @@ var AdjustXpackNode = &gormigrate.Migration{
return tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Update("value", string(updatedJSON)).Error
},
}
+
+var UpdateAiAgentsMenu = &gormigrate.Migration{
+ ID: "20260209-update-ai-agents-menu",
+ Migrate: func(tx *gorm.DB) error {
+ var menuJSON string
+ if err := tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Pluck("value", &menuJSON).Error; err != nil {
+ return err
+ }
+ if menuJSON == "" {
+ menuJSON = helper.LoadMenus()
+ }
+
+ var menus []dto.ShowMenu
+ if err := json.Unmarshal([]byte(menuJSON), &menus); err != nil {
+ return tx.Model(&model.Setting{}).
+ Where("key = ?", "HideMenu").
+ Update("value", helper.LoadMenus()).Error
+ }
+
+ foundAI := false
+ newItem := dto.ShowMenu{
+ ID: "44",
+ Disabled: false,
+ Title: "aiTools.agents.agents",
+ IsShow: true,
+ Label: "Agents",
+ Path: "/ai/agents/agent",
+ Sort: 50,
+ }
+
+ for i := range menus {
+ if menus[i].Label != "AI-Menu" {
+ continue
+ }
+ foundAI = true
+ menus[i].IsShow = true
+
+ exists := false
+ for j := range menus[i].Children {
+ child := &menus[i].Children[j]
+ if child.Label == newItem.Label {
+ exists = true
+ child.IsShow = true
+ if child.Title == "" {
+ child.Title = newItem.Title
+ }
+ if child.Sort == 0 {
+ child.Sort = newItem.Sort
+ }
+ break
+ }
+ }
+
+ if !exists {
+ menus[i].Children = append([]dto.ShowMenu{newItem}, menus[i].Children...)
+ }
+ break
+ }
+
+ if !foundAI {
+ return tx.Model(&model.Setting{}).
+ Where("key = ?", "HideMenu").
+ Update("value", helper.LoadMenus()).Error
+ }
+
+ updatedJSON, err := json.Marshal(menus)
+ if err != nil {
+ return tx.Model(&model.Setting{}).
+ Where("key = ?", "HideMenu").
+ Update("value", helper.LoadMenus()).Error
+ }
+
+ return tx.Model(&model.Setting{}).Where("key = ?", "HideMenu").Update("value", string(updatedJSON)).Error
+ },
+}
diff --git a/frontend/src/views/setting/panel/hidemenu/index.vue b/frontend/src/views/setting/panel/hidemenu/index.vue
index 276f2adcf29a..956729b75505 100644
--- a/frontend/src/views/setting/panel/hidemenu/index.vue
+++ b/frontend/src/views/setting/panel/hidemenu/index.vue
@@ -17,7 +17,13 @@
{{ i18n.global.t(data.title) }}
-
+
-
-
+