diff --git a/server-core/src/main/java/io/onedev/server/web/component/ai/chat/ChatPanel.java b/server-core/src/main/java/io/onedev/server/web/component/ai/chat/ChatPanel.java
index bd90669e2d..1644b93e12 100644
--- a/server-core/src/main/java/io/onedev/server/web/component/ai/chat/ChatPanel.java
+++ b/server-core/src/main/java/io/onedev/server/web/component/ai/chat/ChatPanel.java
@@ -6,6 +6,7 @@ import static io.onedev.server.web.translation.Translation._T;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -13,6 +14,7 @@ import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.servlet.http.Cookie;
+import org.apache.commons.lang3.SerializationUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
@@ -31,10 +33,13 @@ import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
import org.json.JSONException;
import org.json.JSONWriter;
import org.jspecify.annotations.Nullable;
@@ -46,6 +51,8 @@ import io.onedev.server.persistence.dao.Dao;
import io.onedev.server.service.ChatService;
import io.onedev.server.service.UserService;
import io.onedev.server.service.support.ChatResponding;
+import io.onedev.server.service.support.ChatTool;
+import io.onedev.server.util.facade.UserFacade;
import io.onedev.server.web.WebConstants;
import io.onedev.server.web.WebSession;
import io.onedev.server.web.behavior.ChangeObserver;
@@ -59,11 +66,14 @@ import io.onedev.server.web.component.select2.ChoiceProvider;
import io.onedev.server.web.component.select2.ResponseFiller;
import io.onedev.server.web.component.select2.Select2Choice;
import io.onedev.server.web.component.user.UserAvatar;
+import io.onedev.server.web.util.ChatToolAware;
public class ChatPanel extends Panel {
private static final long serialVersionUID = 1L;
+ private static final int TIMEOUT_SECONDS = 120;
+
private static final String COOKIE_ACTIVE_AI = "active-ai";
@Inject
@@ -80,6 +90,23 @@ public class ChatPanel extends Panel {
private RepeatingView messagesView;
private WebMarkupContainer respondingContainer;
+
+ private final IModel
> entitledAisModel = new LoadableDetachableModel>() {
+
+ @Override
+ protected List load() {
+ if (getUser() != null) {
+ return getUser().getEntitledAis();
+ } else {
+ return userService.cloneCache().values().stream()
+ .filter(it -> it.getType() == User.Type.AI && !it.isDisabled() && it.isEntitleToAll())
+ .sorted(Comparator.comparing(UserFacade::getDisplayName))
+ .map(it->userService.load(it.getId()))
+ .collect(Collectors.toList());
+ }
+ }
+
+ };
public ChatPanel(String componentId) {
super(componentId);
@@ -100,7 +127,7 @@ public class ChatPanel extends Panel {
protected List