diff --git a/api/src/org/labkey/api/mcp/McpService.java b/api/src/org/labkey/api/mcp/McpService.java index 06afb51e63a..ff1b009feac 100644 --- a/api/src/org/labkey/api/mcp/McpService.java +++ b/api/src/org/labkey/api/mcp/McpService.java @@ -25,6 +25,8 @@ import org.labkey.api.settings.OptionalFeatureService; import org.labkey.api.util.HtmlString; import org.labkey.api.util.logging.LogHelper; +import org.labkey.api.view.HtmlView; +import org.labkey.api.view.HttpView; import org.labkey.api.writer.ContainerUser; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ToolContext; @@ -232,4 +234,9 @@ default List sendMessageEx(ChatClient chat, String message) /** Drop and recreate the vector store table. Use when the embedding model has changed and dimensions no longer match. */ void resetVectorStore(); + + default HttpView getAssistantStatusView() + { + return new HtmlView(HtmlString.of("AI Assistant features are not available.")); + } } diff --git a/core/src/org/labkey/core/admin/AdminController.java b/core/src/org/labkey/core/admin/AdminController.java index 91da0c6172f..64d0cdcc26e 100644 --- a/core/src/org/labkey/core/admin/AdminController.java +++ b/core/src/org/labkey/core/admin/AdminController.java @@ -146,6 +146,7 @@ import org.labkey.api.exp.api.StorageProvisioner; import org.labkey.api.exp.property.Lookup; import org.labkey.api.files.FileContentService; +import org.labkey.api.mcp.McpService; import org.labkey.api.message.settings.AbstractConfigTypeProvider.EmailConfigFormImpl; import org.labkey.api.message.settings.MessageConfigService; import org.labkey.api.message.settings.MessageConfigService.ConfigTypeProvider; @@ -3525,6 +3526,25 @@ public void addNavTrail(NavTree root) } } + // NOTE let the Professional Module register this action (there is no ProfessionalController) + + @RequiresPermission(TroubleshooterPermission.class) + public class AssistantStatusAction extends SimpleViewAction + { + @Override + public ModelAndView getView(Object o, BindException errors) throws Exception + { + return McpService.get().getAssistantStatusView(); + } + + @Override + public void addNavTrail(NavTree root) + { + addAdminNavTrail(root, "AI Assistant Status", this.getClass()); + } + } + + public static class ConfigureSystemMaintenanceForm { @@ -11142,9 +11162,10 @@ private JSONObject getConfigurationJson() res.put("server", AdminBean.getPropertyMap()); final Map> sets = new TreeMap<>(); - new SqlSelector(CoreSchema.getInstance().getScope(), - new SQLFragment("SELECT category, name, value FROM prop.propertysets PS inner join prop.properties P on PS.\"set\" = P.\"set\"\n" + - "WHERE objectid = ? AND category IN ('SiteConfig') AND encryption='None' AND LOWER(name) NOT LIKE '%password%'", ContainerManager.getRoot())).forEachMap(m -> + var sql = new SQLFragment("SELECT category, name, value FROM prop.propertysets PS inner join prop.properties P on PS.\"set\" = P.\"set\"\n") + .append("WHERE objectid = ").appendValue(ContainerManager.getRoot()).append(" AND category IN ('SiteConfig') AND encryption='None' AND LOWER(name) NOT LIKE '%password%'"); + new SqlSelector(CoreSchema.getInstance().getScope(), sql) + .forEachMap(m -> { String category = (String)m.get("category"); String name = (String)m.get("name");