@hawtio/ai-plugin 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [0.2.1](///compare/v0.2.0...v0.2.1) (2026-06-17)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * chat history [#39](undefined/undefined/undefined/issues/39) 401ea48
11
+ * upgrade @hawtio/react to 2.3.0-pre.1 d52e5de
12
+
5
13
  ## [0.2.0](///compare/v0.1.6...v0.2.0) (2026-06-03)
6
14
 
7
15
 
package/dist/index.js CHANGED
@@ -49,17 +49,19 @@ var init_ai_model = __esm({
49
49
  { id: "claude-sonnet-4-6", name: "Claude Sonnet 4.6", tool: true, provider: "anthropic" },
50
50
  { id: "claude-haiku-4-5", name: "Claude Haiku 4.5", tool: true, provider: "anthropic" },
51
51
  // Google Gemini models
52
- { id: "gemini-2.5-flash", name: "Gemini 2.5 Flash", tool: true, provider: "google-genai" },
53
- { id: "gemini-2.5-flash-lite", name: "Gemini 2.5 Flash-Lite", tool: true, provider: "google-genai" },
54
- { id: "gemini-2.5-pro", name: "Gemini 2.5 Pro", tool: true, provider: "google-genai" },
52
+ { id: "gemini-3.5-flash", name: "Gemini 3.5 Flash", tool: true, provider: "google-genai" },
53
+ { id: "gemini-3.1-flash-lite", name: "Gemini 3.1 Flash-Lite", tool: true, provider: "google-genai" },
54
+ { id: "gemini-3.1-pro", name: "Gemini 3.1 Pro", tool: true, provider: "google-genai" },
55
55
  // Ollama models
56
- { id: "granite3.1-moe:latest", name: "Granite 3.1 Moe", tool: true, provider: "ollama" },
57
- { id: "granite3.1-dense:latest", name: "Granite 3.1 Dense", tool: true, provider: "ollama" },
56
+ { id: "granite4.1:3b", name: "Granite 4.1 3B", tool: true, provider: "ollama" },
58
57
  { id: "llama3:latest", name: "Llama 3", tool: false, provider: "ollama" },
59
58
  { id: "llama3.2:latest", name: "Llama 3.2", tool: true, provider: "ollama" },
59
+ { id: "gemma4:e4b", name: "Gemma 4 4B", tool: true, provider: "ollama" },
60
+ { id: "gemma4:e4b-mlx", name: "Gemma 4 4B MLX", tool: true, provider: "ollama" },
60
61
  { id: "phi4:latest", name: "Phi 4", tool: false, provider: "ollama" },
61
62
  { id: "phi3.5:latest", name: "Phi 3.5", tool: false, provider: "ollama" },
62
63
  { id: "qwen3.5:4b", name: "Qwen 3.5 4B", tool: true, provider: "ollama" },
64
+ { id: "qwen3.5:4b-mlx", name: "Qwen 3.5 4B MLX", tool: true, provider: "ollama" },
63
65
  { id: "qwen3.5:latest", name: "Qwen 3.5", tool: true, provider: "ollama" }
64
66
  ];
65
67
  }
@@ -106,13 +108,13 @@ var init_ai_service = __esm({
106
108
  model;
107
109
  llm;
108
110
  llmWithTools;
109
- messages = [];
111
+ memory = {};
110
112
  reset(model) {
111
113
  if (this.model && this.model.id === model.id && this.llm && (!model.tool || this.llmWithTools)) {
112
114
  return;
113
115
  }
114
116
  log.info("AI model to use:", model.id);
115
- this.messages = [];
117
+ this.memory = {};
116
118
  const { token } = aiPreferencesService.loadOptions();
117
119
  this.model = model;
118
120
  try {
@@ -187,40 +189,50 @@ var init_ai_service = __esm({
187
189
  return String(error);
188
190
  }
189
191
  }
190
- newChat(message, system) {
192
+ newChat(dialogId, message, system) {
191
193
  if (system) {
192
- this.messages = [new import_messages.SystemMessage(system)];
194
+ this.memory[dialogId] = [new import_messages.SystemMessage(system)];
193
195
  } else {
194
- this.messages = [];
196
+ this.memory[dialogId] = [];
195
197
  }
196
- return this.chat(message);
198
+ return this.chat(dialogId, message);
197
199
  }
198
- async chat(message) {
199
- this.messages.push(new import_messages.HumanMessage(message));
200
- const answer = await this.invoke(this.messages);
200
+ async chat(dialogId, message) {
201
+ let messages = this.memory[dialogId];
202
+ if (!messages) {
203
+ messages = [];
204
+ this.memory[dialogId] = messages;
205
+ }
206
+ messages.push(new import_messages.HumanMessage(message));
207
+ const answer = await this.invoke(messages);
201
208
  if (typeof answer !== "string") {
202
- this.messages.push(answer);
209
+ messages.push(answer);
203
210
  }
204
211
  return answer;
205
212
  }
206
- async invokeTools(toolCalls) {
213
+ async invokeTools(dialogId, toolCalls) {
207
214
  if (!this.llmWithTools) {
208
215
  return "Tool invocation not supported";
209
216
  }
217
+ let messages = this.memory[dialogId];
218
+ if (!messages) {
219
+ messages = [];
220
+ this.memory[dialogId] = messages;
221
+ }
210
222
  for (const call of toolCalls) {
211
223
  log.debug("\u{1F6E0}\uFE0F Call:", call.name, JSON.stringify(call.args));
212
224
  const selectedTool = TOOLS_BY_NAME[call.name];
213
225
  const toolAnswer = await selectedTool?.invoke(call);
214
226
  if (toolAnswer) {
215
227
  log.debug("\u{1F6E0}\uFE0F " + call.name + ":", toolAnswer);
216
- this.messages.push(toolAnswer);
228
+ messages.push(toolAnswer);
217
229
  }
218
230
  }
219
- const finalAnswer = await this.llmWithTools.invoke(this.messages);
231
+ const finalAnswer = await this.llmWithTools.invoke(messages);
220
232
  if (finalAnswer) {
221
- this.messages.push(finalAnswer);
233
+ messages.push(finalAnswer);
222
234
  }
223
- console.debug("Messages>>", this.messages);
235
+ console.debug("Messages>>", messages);
224
236
  return finalAnswer;
225
237
  }
226
238
  generateId() {
@@ -1940,6 +1952,34 @@ var init_react_split_es = __esm({
1940
1952
  }
1941
1953
  });
1942
1954
 
1955
+ // src/ai-plugin/jmx-ai/model.ts
1956
+ var ChatbotDialog;
1957
+ var init_model = __esm({
1958
+ "src/ai-plugin/jmx-ai/model.ts"() {
1959
+ "use strict";
1960
+ ChatbotDialog = class {
1961
+ constructor(messages, summary) {
1962
+ this.messages = messages;
1963
+ this.summary = summary;
1964
+ this.id = messages[0]?.id ?? "";
1965
+ }
1966
+ messages;
1967
+ summary;
1968
+ id;
1969
+ setMessages(messages) {
1970
+ if (messages[0]?.id !== this.id) {
1971
+ throw new Error("Not the same dialog");
1972
+ }
1973
+ this.messages = [...messages];
1974
+ }
1975
+ createConversation() {
1976
+ const text = this.summary ?? (this.messages[0]?.content ?? "").substring(0, 20);
1977
+ return { id: this.id, text };
1978
+ }
1979
+ };
1980
+ }
1981
+ });
1982
+
1943
1983
  // src/ai-plugin/jmx-ai/context.ts
1944
1984
  function useMBeanTree() {
1945
1985
  const [tree, setTree] = (0, import_react7.useState)(import_react6.MBeanTree.createEmpty(pluginName));
@@ -1999,14 +2039,39 @@ function pluginPathWithNodeId(node, searchParams = new URLSearchParams(window.lo
1999
2039
  return { pathname: pluginPath, search: query };
2000
2040
  }
2001
2041
  function useChatbot() {
2002
- const [messages, setMessages] = (0, import_react7.useState)([]);
2003
- const [conversations, setConversations] = (0, import_react7.useState)(initialConversations);
2042
+ const [messages, setMessages2] = (0, import_react7.useState)([]);
2043
+ const [dialogs, setDialogs] = (0, import_react7.useState)([]);
2044
+ const [conversations, setConversations] = (0, import_react7.useState)([]);
2004
2045
  const [announcement, setAnnouncement] = (0, import_react7.useState)("");
2005
2046
  const [isChatbotOpen, setIsChatbotOpen] = (0, import_react7.useState)(false);
2006
2047
  const [isSendButtonDisabled, setIsSendButtonDisabled] = (0, import_react7.useState)(false);
2048
+ const updateConversations = (messages2, summary) => {
2049
+ const dialogId = messages2[0]?.id;
2050
+ if (!dialogId) {
2051
+ return;
2052
+ }
2053
+ setMessages2(messages2);
2054
+ let dialog = dialogs.find((d) => d.id === dialogId);
2055
+ if (dialog) {
2056
+ dialog.setMessages(messages2);
2057
+ } else {
2058
+ dialog = new ChatbotDialog(messages2, summary);
2059
+ dialogs.push(dialog);
2060
+ }
2061
+ setDialogs([...dialogs]);
2062
+ log.debug("Updated dialogs:", dialogs);
2063
+ if (!conversations.some((c) => c.id === dialogId)) {
2064
+ const conversation = dialog.createConversation();
2065
+ conversations.push(conversation);
2066
+ setConversations([...conversations]);
2067
+ log.debug("Updated conversations:", conversations);
2068
+ }
2069
+ };
2007
2070
  return {
2008
2071
  messages,
2009
- setMessages,
2072
+ setMessages: setMessages2,
2073
+ dialogs,
2074
+ setDialogs,
2010
2075
  conversations,
2011
2076
  setConversations,
2012
2077
  announcement,
@@ -2014,10 +2079,11 @@ function useChatbot() {
2014
2079
  isChatbotOpen,
2015
2080
  setIsChatbotOpen,
2016
2081
  isSendButtonDisabled,
2017
- setIsSendButtonDisabled
2082
+ setIsSendButtonDisabled,
2083
+ updateConversations
2018
2084
  };
2019
2085
  }
2020
- var import_react6, import_react7, import_react_router_dom, MBeanTreeContext, initialConversations, ChatbotContext;
2086
+ var import_react6, import_react7, import_react_router_dom, MBeanTreeContext, ChatbotContext;
2021
2087
  var init_context = __esm({
2022
2088
  "src/ai-plugin/jmx-ai/context.ts"() {
2023
2089
  "use strict";
@@ -2025,18 +2091,22 @@ var init_context = __esm({
2025
2091
  import_react7 = require("react");
2026
2092
  import_react_router_dom = require("react-router-dom");
2027
2093
  init_globals();
2094
+ init_model();
2028
2095
  MBeanTreeContext = (0, import_react7.createContext)({
2029
2096
  tree: import_react6.MBeanTree.createEmpty(pluginName),
2097
+ loaded: false,
2030
2098
  selectedNode: null,
2031
2099
  setSelectedNode: () => {
2032
2100
  }
2033
2101
  });
2034
- initialConversations = {};
2035
2102
  ChatbotContext = (0, import_react7.createContext)({
2036
2103
  messages: [],
2037
2104
  setMessages: () => {
2038
2105
  },
2039
- conversations: initialConversations,
2106
+ dialogs: [],
2107
+ setDialogs: () => {
2108
+ },
2109
+ conversations: [],
2040
2110
  setConversations: () => {
2041
2111
  },
2042
2112
  announcement: "",
@@ -2047,6 +2117,8 @@ var init_context = __esm({
2047
2117
  },
2048
2118
  isSendButtonDisabled: false,
2049
2119
  setIsSendButtonDisabled: () => {
2120
+ },
2121
+ updateConversations: () => {
2050
2122
  }
2051
2123
  });
2052
2124
  }
@@ -2059,10 +2131,11 @@ var init_Jmx = __esm({
2059
2131
  });
2060
2132
 
2061
2133
  // src/ai-plugin/jmx-ai/DiagnosisChatbot.tsx
2062
- var import_Chatbot, import_ChatbotContent, import_ChatbotConversationHistoryNav, import_ChatbotFooter, import_ChatbotHeader, import_Message, import_MessageBar, import_MessageBox, import_react_core2, import_wrench_icon, import_react8, import_jsx_runtime2, DiagnosisChatbot, DiagnosisChatbotHeader, DiagnosisChatbotContent, DiagnosisChatbotFooter, ThinkInfo, ToolCallsInfo, ToolCallsApprove;
2134
+ var import_ui, import_Chatbot, import_ChatbotContent, import_ChatbotConversationHistoryNav, import_ChatbotFooter, import_ChatbotHeader, import_Message, import_MessageBar, import_MessageBox, import_react_core2, import_wrench_icon, import_react8, import_jsx_runtime2, DiagnosisChatbot, DiagnosisChatbotHeader, DiagnosisChatbotContent, DiagnosisChatbotFooter, ThinkInfo, ToolCallsInfo, ToolCallsApprove;
2063
2135
  var init_DiagnosisChatbot = __esm({
2064
2136
  "src/ai-plugin/jmx-ai/DiagnosisChatbot.tsx"() {
2065
2137
  "use strict";
2138
+ import_ui = require("@hawtio/react/ui");
2066
2139
  import_Chatbot = __toESM(require("@patternfly/chatbot/dist/dynamic/Chatbot"));
2067
2140
  import_ChatbotContent = __toESM(require("@patternfly/chatbot/dist/dynamic/ChatbotContent"));
2068
2141
  import_ChatbotConversationHistoryNav = __toESM(require("@patternfly/chatbot/dist/dynamic/ChatbotConversationHistoryNav"));
@@ -2079,25 +2152,25 @@ var init_DiagnosisChatbot = __esm({
2079
2152
  init_globals();
2080
2153
  import_jsx_runtime2 = require("react/jsx-runtime");
2081
2154
  DiagnosisChatbot = () => {
2082
- const { setMessages, conversations, setConversations } = (0, import_react8.useContext)(ChatbotContext);
2155
+ const { setMessages: setMessages2, dialogs, conversations } = (0, import_react8.useContext)(ChatbotContext);
2083
2156
  const [isDrawerOpen, setIsDrawerOpen] = (0, import_react8.useState)(false);
2084
- const findMatchingItems = (targetValue) => {
2085
- let filteredConversations = Object.entries(initialConversations).reduce(
2086
- (acc, [key, items]) => {
2087
- const filteredItems = items.filter(
2088
- (item) => item.text.toLowerCase().includes(targetValue.toLowerCase())
2089
- );
2090
- if (filteredItems.length > 0) {
2091
- acc[key] = filteredItems;
2092
- }
2093
- return acc;
2094
- },
2095
- {}
2096
- );
2097
- if (Object.keys(filteredConversations).length === 0) {
2098
- filteredConversations = [{ id: "13", noIcon: true, text: "No results found" }];
2157
+ const [filteredConversations, setFilteredConversations] = (0, import_react8.useState)(conversations);
2158
+ const onSelectItemInHistory = (selected) => {
2159
+ log.debug("Selected conversation with ID:", selected);
2160
+ const dialog = dialogs.find((c) => c.id === selected);
2161
+ if (dialog) {
2162
+ setMessages2(dialog.messages);
2163
+ setIsDrawerOpen(!isDrawerOpen);
2164
+ }
2165
+ };
2166
+ const handleSearchTextChange = (value) => {
2167
+ if (value.trim() === "") {
2168
+ setFilteredConversations(conversations);
2169
+ return;
2099
2170
  }
2100
- return filteredConversations;
2171
+ const filtered = conversations.filter((c) => c.text.toLowerCase().includes(value.toLowerCase()));
2172
+ log.debug("Filtered conversations:", filtered);
2173
+ setFilteredConversations(filtered);
2101
2174
  };
2102
2175
  const displayMode = import_Chatbot.ChatbotDisplayMode.drawer;
2103
2176
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_Chatbot.default, { isCompact: true, displayMode, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
@@ -2108,25 +2181,18 @@ var init_DiagnosisChatbot = __esm({
2108
2181
  displayMode,
2109
2182
  onDrawerToggle: () => {
2110
2183
  setIsDrawerOpen(!isDrawerOpen);
2111
- setConversations(initialConversations);
2184
+ setFilteredConversations(conversations);
2112
2185
  },
2113
2186
  isDrawerOpen,
2114
2187
  setIsDrawerOpen,
2115
- activeItemId: "1",
2116
- onSelectActiveItem: (_e, selectedItem) => log.debug(`Selected history item with id ${selectedItem}`),
2117
- conversations,
2188
+ onSelectActiveItem: (_e, selectedItem) => onSelectItemInHistory(String(selectedItem)),
2189
+ conversations: [...filteredConversations].reverse(),
2118
2190
  onNewChat: () => {
2119
2191
  setIsDrawerOpen(!isDrawerOpen);
2120
- setMessages([]);
2121
- setConversations(initialConversations);
2122
- },
2123
- handleTextInputChange: (value) => {
2124
- if (value === "") {
2125
- setConversations(initialConversations);
2126
- }
2127
- const newConversations = findMatchingItems(value);
2128
- setConversations(newConversations);
2192
+ setFilteredConversations(conversations);
2193
+ setMessages2([]);
2129
2194
  },
2195
+ handleTextInputChange: handleSearchTextChange,
2130
2196
  drawerContent: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
2131
2197
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(DiagnosisChatbotHeader, { isDrawerOpen, setIsDrawerOpen }),
2132
2198
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(DiagnosisChatbotContent, {}),
@@ -2163,8 +2229,8 @@ var init_DiagnosisChatbot = __esm({
2163
2229
  ] }, message.id)) }) });
2164
2230
  };
2165
2231
  DiagnosisChatbotFooter = () => {
2166
- const username = "user";
2167
- const { messages, setMessages, setAnnouncement, isSendButtonDisabled, setIsSendButtonDisabled } = (0, import_react8.useContext)(ChatbotContext);
2232
+ const { username } = (0, import_react8.useContext)(import_ui.PageContext);
2233
+ const { messages, setAnnouncement, isSendButtonDisabled, setIsSendButtonDisabled, updateConversations } = (0, import_react8.useContext)(ChatbotContext);
2168
2234
  const messagesRef = (0, import_react8.useRef)(messages);
2169
2235
  (0, import_react8.useEffect)(() => {
2170
2236
  messagesRef.current = messages;
@@ -2179,17 +2245,18 @@ var init_DiagnosisChatbot = __esm({
2179
2245
  newMessages.push(...messagesRef.current);
2180
2246
  newMessages.push(aiService.createUserMessage(username, message));
2181
2247
  newMessages.push(aiService.createLoadingBotMessage());
2182
- setMessages(newMessages);
2248
+ updateConversations(newMessages);
2183
2249
  setAnnouncement(`Message from User: ${message}. Message from Bot is loading.`);
2184
2250
  log.debug("handleSend - new messages:", newMessages);
2185
- const answer = await (newMessages.length === 2 ? aiService.newChat(message) : aiService.chat(message));
2251
+ const dialogId = newMessages[0].id;
2252
+ const answer = await (newMessages.length === 2 ? aiService.newChat(dialogId, message) : aiService.chat(dialogId, message));
2186
2253
  const loadedMessages = [];
2187
2254
  loadedMessages.push(...newMessages);
2188
2255
  log.debug("handleSend - loaded messages:", loadedMessages);
2189
2256
  loadedMessages.pop();
2190
2257
  const botMessage = aiService.toBotMessage(answer, ThinkInfo, ToolCallsInfo, ToolCallsApprove);
2191
2258
  loadedMessages.push(botMessage);
2192
- setMessages(loadedMessages);
2259
+ updateConversations(loadedMessages);
2193
2260
  setAnnouncement(`Message from Bot: ${answer}`);
2194
2261
  setIsSendButtonDisabled(false);
2195
2262
  };
@@ -2216,8 +2283,8 @@ var init_DiagnosisChatbot = __esm({
2216
2283
  ] }) }, index);
2217
2284
  };
2218
2285
  ToolCallsApprove = (toolCalls) => {
2219
- const username = "user";
2220
- const { messages, setMessages, setAnnouncement, setIsSendButtonDisabled } = (0, import_react8.useContext)(ChatbotContext);
2286
+ const { username } = (0, import_react8.useContext)(import_ui.PageContext);
2287
+ const { messages, setAnnouncement, setIsSendButtonDisabled, updateConversations } = (0, import_react8.useContext)(ChatbotContext);
2221
2288
  const messagesRef = (0, import_react8.useRef)(messages);
2222
2289
  const approve = async (toolCalls2) => {
2223
2290
  log.debug("Approved", messagesRef.current);
@@ -2226,7 +2293,7 @@ var init_DiagnosisChatbot = __esm({
2226
2293
  newMessages.push(...messagesRef.current);
2227
2294
  newMessages.push(aiService.createUserMessage(username, "Approved"));
2228
2295
  newMessages.push(aiService.createLoadingBotMessage());
2229
- setMessages(newMessages);
2296
+ updateConversations(newMessages);
2230
2297
  setAnnouncement(`User approved tool usage. Message from Bot is loading.`);
2231
2298
  log.debug("approve - newMessages:", newMessages);
2232
2299
  const answer = await aiService.invokeTools(toolCalls2);
@@ -2237,7 +2304,7 @@ var init_DiagnosisChatbot = __esm({
2237
2304
  loadedMessages.pop();
2238
2305
  const botMessage = aiService.toBotMessage(answer, ThinkInfo, ToolCallsInfo, ToolCallsApprove);
2239
2306
  loadedMessages.push(botMessage);
2240
- setMessages(loadedMessages);
2307
+ updateConversations(loadedMessages);
2241
2308
  setAnnouncement(`Message from Bot: ${answer}`);
2242
2309
  setIsSendButtonDisabled(false);
2243
2310
  };
@@ -3186,11 +3253,12 @@ What potential issues or anomalies do you see?`;
3186
3253
  });
3187
3254
 
3188
3255
  // src/ai-plugin/jmx-ai/attributes/Attributes.tsx
3189
- var import_react12, import_react_core4, import_react_icons2, import_react_table, import_react13, import_jsx_runtime4, Attributes, AiJmxToolbar;
3256
+ var import_react12, import_ui2, import_react_core4, import_react_icons2, import_react_table, import_react13, import_jsx_runtime4, Attributes, AiJmxToolbar;
3190
3257
  var init_Attributes = __esm({
3191
3258
  "src/ai-plugin/jmx-ai/attributes/Attributes.tsx"() {
3192
3259
  "use strict";
3193
3260
  import_react12 = require("@hawtio/react");
3261
+ import_ui2 = require("@hawtio/react/ui");
3194
3262
  import_react_core4 = require("@patternfly/react-core");
3195
3263
  import_react_icons2 = require("@patternfly/react-icons");
3196
3264
  import_react_table = require("@patternfly/react-table");
@@ -3198,11 +3266,11 @@ var init_Attributes = __esm({
3198
3266
  import_react13 = require("react");
3199
3267
  init_ai_service();
3200
3268
  init_context();
3269
+ init_DiagnosisChatbot();
3201
3270
  init_globals();
3202
3271
  init_jmx_ai_service();
3203
3272
  init_util();
3204
3273
  init_attribute_service();
3205
- init_DiagnosisChatbot();
3206
3274
  import_jsx_runtime4 = require("react/jsx-runtime");
3207
3275
  Attributes = () => {
3208
3276
  const { selectedNode } = (0, import_react13.useContext)(MBeanTreeContext);
@@ -3310,8 +3378,8 @@ var init_Attributes = __esm({
3310
3378
  };
3311
3379
  AiJmxToolbar = ({ attributes }) => {
3312
3380
  const { selectedNode } = (0, import_react13.useContext)(MBeanTreeContext);
3313
- const username = "user";
3314
- const { setMessages, setAnnouncement, setIsChatbotOpen } = (0, import_react13.useContext)(ChatbotContext);
3381
+ const { username } = (0, import_react13.useContext)(import_ui2.PageContext);
3382
+ const { setAnnouncement, setIsChatbotOpen, updateConversations } = (0, import_react13.useContext)(ChatbotContext);
3315
3383
  if (!selectedNode || !selectedNode.mbean || !selectedNode.objectName) {
3316
3384
  return null;
3317
3385
  }
@@ -3325,17 +3393,18 @@ var init_Attributes = __esm({
3325
3393
  const newMessages = [];
3326
3394
  newMessages.push(aiService.createUserMessage(username, diagnoseMessage));
3327
3395
  newMessages.push(aiService.createLoadingBotMessage());
3328
- setMessages(newMessages);
3396
+ updateConversations(newMessages, `Diagnose ${objectName}`);
3329
3397
  setAnnouncement("Diagnosis in progress...");
3330
3398
  log.debug("diagnose - new messages:", newMessages);
3331
- const answer = await aiService.newChat(diagnoseMessage, systemMessage);
3399
+ const dialogId = newMessages[0].id;
3400
+ const answer = await aiService.newChat(dialogId, diagnoseMessage, systemMessage);
3332
3401
  const loadedMessages = [];
3333
3402
  loadedMessages.push(...newMessages);
3334
3403
  log.debug("diagnose - loaded messages:", loadedMessages);
3335
3404
  loadedMessages.pop();
3336
3405
  const botMessage = aiService.toBotMessage(answer, ThinkInfo, ToolCallsInfo, ToolCallsApprove);
3337
3406
  loadedMessages.push(botMessage);
3338
- setMessages(loadedMessages);
3407
+ updateConversations(loadedMessages);
3339
3408
  setAnnouncement("Diagnosis complete.");
3340
3409
  };
3341
3410
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_core4.Toolbar, { id: "ai-jmx-toolbar", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_core4.ToolbarContent, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_core4.ToolbarItem, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_core4.Button, { variant: "primary", size: "sm", icon: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_icons2.MonitoringIcon, {}), onClick: diagnose, children: "Diagnose" }) }) }) });
@@ -3682,7 +3751,7 @@ var plugin = () => {
3682
3751
  aiCommon();
3683
3752
  jmxAi();
3684
3753
  };
3685
- import_react19.configManager.addProductInfo("Hawtio AI Plugin", "0.2.0");
3754
+ import_react19.configManager.addProductInfo("Hawtio AI Plugin", "0.2.1");
3686
3755
  // Annotate the CommonJS export names for ESM import in node:
3687
3756
  0 && (module.exports = {
3688
3757
  plugin