@zero-library/chat-copilot 3.2.1 → 3.2.2

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/dist/index.cjs.js CHANGED
@@ -19,7 +19,7 @@ var LexicalTypeaheadMenuPlugin = require('@lexical/react/LexicalTypeaheadMenuPlu
19
19
  var utils = require('@lexical/utils');
20
20
  var ReactDOM = require('react-dom');
21
21
  var dayjs = require('dayjs');
22
- var classNames10 = require('classnames');
22
+ var classNames9 = require('classnames');
23
23
  var console2 = require('console');
24
24
  var InfiniteScroll = require('react-infinite-scroll-component');
25
25
  var xCard = require('@ant-design/x-card');
@@ -50,7 +50,7 @@ function _interopNamespace(e) {
50
50
  var React10__namespace = /*#__PURE__*/_interopNamespace(React10);
51
51
  var ReactDOM__namespace = /*#__PURE__*/_interopNamespace(ReactDOM);
52
52
  var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
53
- var classNames10__default = /*#__PURE__*/_interopDefault(classNames10);
53
+ var classNames9__default = /*#__PURE__*/_interopDefault(classNames9);
54
54
  var console2__default = /*#__PURE__*/_interopDefault(console2);
55
55
  var InfiniteScroll__default = /*#__PURE__*/_interopDefault(InfiniteScroll);
56
56
  var XMarkdown__default = /*#__PURE__*/_interopDefault(XMarkdown);
@@ -100,8 +100,14 @@ var chatCopilotEnUS = {
100
100
  summaryAnalysis: "Summary Analysis",
101
101
  headerClose: "Close",
102
102
  deepThinking: "Deep Thinking",
103
+ resource: "Resources",
103
104
  skill: "Skill",
104
105
  knowledge: "Knowledge Base",
106
+ datasource: "Datasource",
107
+ mcpServer: "MCP Server",
108
+ subAgent: "Sub-agent",
109
+ tool: "Tool",
110
+ loading: "Loading...",
105
111
  supportedExtensions: "Supported extensions: {{types}}",
106
112
  empty: "No data",
107
113
  selectFile: "Select File",
@@ -161,8 +167,6 @@ var chatCopilotEnUS = {
161
167
  previewEdit: "Preview & Edit",
162
168
  copy: "Copy",
163
169
  continueText: "Continue",
164
- aggregate: "Aggregate",
165
- sequence: "Sequence",
166
170
  chatTab: "Chat",
167
171
  traceTab: "Execution Trace",
168
172
  previewTab: "File Preview",
@@ -175,9 +179,6 @@ var chatCopilotEnUS = {
175
179
  execItemThinking: "Reasoning",
176
180
  execItemFile: "File",
177
181
  execItemPlan: "Plan",
178
- execItemSummaryDone: "{{count}} completed",
179
- execItemSummaryFailed: "{{count}} failed",
180
- execItemSummaryRunning: "{{count}} running",
181
182
  toolCallFallback: "Tool call",
182
183
  viewExecutionDetail: "View execution details",
183
184
  executionStart: "Start",
@@ -294,8 +295,14 @@ var chatCopilotJaJP = {
294
295
  headerClose: "\u9589\u3058\u308B",
295
296
  // ReasonBtn / SkillBtn / KnowledgeBtn
296
297
  deepThinking: "\u601D\u8003\u30D7\u30ED\u30BB\u30B9",
298
+ resource: "\u30EA\u30BD\u30FC\u30B9",
297
299
  skill: "\u30B9\u30AD\u30EB",
298
300
  knowledge: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9",
301
+ datasource: "\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9",
302
+ mcpServer: "MCP Server",
303
+ subAgent: "\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8",
304
+ tool: "\u30C4\u30FC\u30EB",
305
+ loading: "\u8AAD\u307F\u8FBC\u307F\u4E2D...",
299
306
  // Attachments
300
307
  supportedExtensions: "\u5BFE\u5FDC\u62E1\u5F35\u5B50\uFF1A{{types}}",
301
308
  empty: "\u30C7\u30FC\u30BF\u304C\u3042\u308A\u307E\u305B\u3093",
@@ -359,8 +366,6 @@ var chatCopilotJaJP = {
359
366
  previewEdit: "\u30D7\u30EC\u30D3\u30E5\u30FC\uFF06\u7DE8\u96C6",
360
367
  copy: "\u30B3\u30D4\u30FC",
361
368
  continueText: "\u7D9A\u3051\u308B",
362
- aggregate: "\u96C6\u7D04",
363
- sequence: "\u9806\u756A",
364
369
  chatTab: "\u4F1A\u8A71",
365
370
  traceTab: "\u5B9F\u884C\u30C8\u30EC\u30FC\u30B9",
366
371
  previewTab: "\u30D5\u30A1\u30A4\u30EB\u30D7\u30EC\u30D3\u30E5\u30FC",
@@ -373,9 +378,6 @@ var chatCopilotJaJP = {
373
378
  execItemThinking: "\u601D\u8003\u30D7\u30ED\u30BB\u30B9",
374
379
  execItemFile: "\u30D5\u30A1\u30A4\u30EB",
375
380
  execItemPlan: "\u5B9F\u884C\u8A08\u753B",
376
- execItemSummaryDone: "{{count}}\u4EF6\u5B8C\u4E86",
377
- execItemSummaryFailed: "{{count}}\u4EF6\u5931\u6557",
378
- execItemSummaryRunning: "{{count}}\u4EF6\u5B9F\u884C\u4E2D",
379
381
  toolCallFallback: "\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057",
380
382
  viewExecutionDetail: "\u5B9F\u884C\u8A73\u7D30\u3092\u898B\u308B",
381
383
  executionStart: "\u958B\u59CB",
@@ -497,8 +499,14 @@ var chatCopilotZhCN = {
497
499
  headerClose: "\u5173\u95ED",
498
500
  // ReasonBtn / SkillBtn / KnowledgeBtn
499
501
  deepThinking: "\u6DF1\u5EA6\u601D\u8003",
502
+ resource: "\u8D44\u6E90",
500
503
  skill: "\u6280\u80FD",
501
504
  knowledge: "\u77E5\u8BC6\u5E93",
505
+ datasource: "\u6570\u636E\u6E90",
506
+ mcpServer: "MCP Server",
507
+ subAgent: "\u5B50\u667A\u80FD\u4F53",
508
+ tool: "\u5DE5\u5177",
509
+ loading: "\u52A0\u8F7D\u4E2D...",
502
510
  // Attachments
503
511
  supportedExtensions: "\u652F\u6301\u6269\u5C55\u540D\uFF1A{{types}}",
504
512
  empty: "\u6682\u65E0\u6570\u636E",
@@ -562,8 +570,6 @@ var chatCopilotZhCN = {
562
570
  previewEdit: "\u9884\u89C8\u7F16\u8F91",
563
571
  copy: "\u590D\u5236",
564
572
  continueText: "\u7EE7\u7EED",
565
- aggregate: "\u805A\u5408",
566
- sequence: "\u987A\u5E8F",
567
573
  chatTab: "\u5BF9\u8BDD",
568
574
  traceTab: "\u6267\u884C\u8F68\u8FF9",
569
575
  previewTab: "\u6587\u4EF6\u9884\u89C8",
@@ -576,9 +582,6 @@ var chatCopilotZhCN = {
576
582
  execItemThinking: "\u601D\u8003\u8FC7\u7A0B",
577
583
  execItemFile: "\u6587\u4EF6",
578
584
  execItemPlan: "\u6267\u884C\u8BA1\u5212",
579
- execItemSummaryDone: "{{count}} \u9879\u5B8C\u6210",
580
- execItemSummaryFailed: "{{count}} \u9879\u5931\u8D25",
581
- execItemSummaryRunning: "{{count}} \u9879\u6267\u884C\u4E2D",
582
585
  toolCallFallback: "\u5DE5\u5177\u8C03\u7528",
583
586
  viewExecutionDetail: "\u67E5\u770B\u6267\u884C\u8BE6\u60C5",
584
587
  executionStart: "\u5F00\u59CB",
@@ -1175,7 +1178,7 @@ var VariableNode = class _VariableNode extends lexical.DecoratorNode {
1175
1178
  * 生成节点的纯文本表达,便于发送、存储和重新初始化编辑器内容。
1176
1179
  */
1177
1180
  getTextContent() {
1178
- return ` ${this.__resourceType}://${this.__resourceId}?name=${this.__resourceName}&label=${this.__resourceLabel} `;
1181
+ return serializeResourceToken(this.__resourceLabel, this.__resourceName, this.__resourceType, this.__resourceId);
1179
1182
  }
1180
1183
  /**
1181
1184
  * 将变量节点渲染为可交互的资源标签组件。
@@ -1194,6 +1197,61 @@ var VariableNode = class _VariableNode extends lexical.DecoratorNode {
1194
1197
  function $createVariableNode(resourceLabel, resourceName, resourceType, resourceId) {
1195
1198
  return new VariableNode(resourceLabel, resourceName, resourceType, resourceId);
1196
1199
  }
1200
+ function serializeResourceToken(resourceLabel, resourceName, resourceType, resourceId) {
1201
+ return `${encodeURIComponent(resourceType)}://${encodeURIComponent(resourceId)}?name=${encodeURIComponent(resourceName)}&label=${encodeURIComponent(
1202
+ resourceLabel
1203
+ )}`;
1204
+ }
1205
+ var emptyAgentResources = {
1206
+ skills: [],
1207
+ knowledges: [],
1208
+ datasources: [],
1209
+ mcpServers: [],
1210
+ subAgents: [],
1211
+ tools: []
1212
+ };
1213
+ var resourceTypeConfigMap = {
1214
+ skill: {
1215
+ categoryValue: "skill",
1216
+ labelKey: "skill",
1217
+ getItems: (resources) => resources.skills || [],
1218
+ getLabel: (item) => item.aliasName || item.name
1219
+ },
1220
+ knowledge: {
1221
+ categoryValue: "knowledge",
1222
+ labelKey: "knowledge",
1223
+ getItems: (resources) => resources.knowledges || [],
1224
+ getLabel: (item) => item.name
1225
+ },
1226
+ datasource: {
1227
+ categoryValue: "datasource",
1228
+ labelKey: "datasource",
1229
+ getItems: (resources) => resources.datasources || [],
1230
+ getLabel: (item) => item.name
1231
+ },
1232
+ mcp_server: {
1233
+ categoryValue: "mcpServer",
1234
+ labelKey: "mcpServer",
1235
+ getItems: (resources) => resources.mcpServers || [],
1236
+ getLabel: (item) => item.serverName || item.name
1237
+ },
1238
+ sub_agent: {
1239
+ categoryValue: "subAgent",
1240
+ labelKey: "subAgent",
1241
+ getItems: (resources) => resources.subAgents || [],
1242
+ getLabel: (item) => item.name
1243
+ },
1244
+ tool: {
1245
+ categoryValue: "tool",
1246
+ labelKey: "tool",
1247
+ getItems: (resources) => resources.tools || [],
1248
+ getLabel: (item) => item.name
1249
+ }
1250
+ };
1251
+ var categoryValueTypeMap = Object.fromEntries(
1252
+ Object.entries(resourceTypeConfigMap).map(([type, config]) => [config.categoryValue, type])
1253
+ );
1254
+ var isHashCommandConfig = (config) => !!config && !Array.isArray(config);
1197
1255
  var ResourceOption = class extends LexicalTypeaheadMenuPlugin.MenuOption {
1198
1256
  group;
1199
1257
  item;
@@ -1206,10 +1264,37 @@ var ResourceOption = class extends LexicalTypeaheadMenuPlugin.MenuOption {
1206
1264
  this.item = item;
1207
1265
  }
1208
1266
  };
1267
+ var getCategoryChildren = (category) => category.children || category.data || [];
1209
1268
  function VariablePickerPlugin({ commandConfig = {} }) {
1210
1269
  const [editor] = LexicalComposerContext.useLexicalComposerContext();
1211
1270
  const chatStore = useChatStore();
1212
- const [commandDataSource, setCommandDataSource] = React10.useState(commandConfig);
1271
+ const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
1272
+ const slashCommandConfig = commandConfig["/"];
1273
+ const normalizedCommandConfig = React10.useMemo(() => {
1274
+ const entries = Object.entries(commandConfig).reduce((result, [trigger, currentConfig]) => {
1275
+ if (trigger === "/" && Array.isArray(currentConfig)) {
1276
+ result.push([
1277
+ trigger,
1278
+ {
1279
+ component: "",
1280
+ dataSource: currentConfig.map((type) => ({
1281
+ value: resourceTypeConfigMap[type].categoryValue,
1282
+ label: t11(resourceTypeConfigMap[type].labelKey),
1283
+ ext: type,
1284
+ children: []
1285
+ }))
1286
+ }
1287
+ ]);
1288
+ return result;
1289
+ }
1290
+ if (isHashCommandConfig(currentConfig)) {
1291
+ result.push([trigger, currentConfig]);
1292
+ }
1293
+ return result;
1294
+ }, []);
1295
+ return Object.fromEntries(entries);
1296
+ }, [commandConfig, t11]);
1297
+ const [commandDataSource, setCommandDataSource] = React10.useState(normalizedCommandConfig);
1213
1298
  const [queryString, setQueryString] = React10.useState(null);
1214
1299
  const [isEditorFocused, setIsEditorFocused] = React10.useState(false);
1215
1300
  const [menuResetKey, setMenuResetKey] = React10.useState(0);
@@ -1241,61 +1326,48 @@ function VariablePickerPlugin({ commandConfig = {} }) {
1241
1326
  };
1242
1327
  }, [editor]);
1243
1328
  React10.useEffect(() => {
1244
- setCommandDataSource(commandConfig);
1245
- }, [commandConfig]);
1246
- const commandKeys = React10.useMemo(() => Object.keys(commandConfig), [commandConfig]);
1329
+ setCommandDataSource(normalizedCommandConfig);
1330
+ }, [normalizedCommandConfig]);
1331
+ const commandKeys = React10.useMemo(() => Object.keys(commandDataSource), [commandDataSource]);
1247
1332
  const commandKey = queryString?.[0] || "";
1248
1333
  const searchKeyword = queryString?.slice(commandKey.length).trim().toLocaleLowerCase() || "";
1249
- const categoryConfig = React10.useMemo(
1250
- () => ({
1251
- skill: {
1252
- load: () => chatStore.config.services.request.listSkills(),
1253
- getLabel: (item) => item.aliasName || item.name
1254
- },
1255
- knowledge: {
1256
- load: () => chatStore.config.services.request.listLibrarys({ libraryType: 1 /* KNOWLEDGE */ }),
1257
- getLabel: (item) => item.name
1258
- },
1259
- datasource: {
1260
- load: () => chatStore.config.services.request.listDataSources(),
1261
- getLabel: (item) => item.name
1262
- }
1263
- }),
1264
- [chatStore]
1265
- );
1266
- const formatDataSource = React10.useCallback(
1267
- (items, category) => {
1268
- const currentCategoryConfig = categoryConfig[category.value];
1269
- if (!items.length) return [];
1270
- return items.map((item) => ({
1271
- value: item.id,
1272
- label: currentCategoryConfig?.getLabel(item) || item.name,
1273
- children: []
1274
- }));
1275
- },
1276
- [categoryConfig]
1277
- );
1334
+ const formatDataSource = React10.useCallback((items, category) => {
1335
+ const currentResourceType = category.ext;
1336
+ const currentCategoryConfig = currentResourceType ? resourceTypeConfigMap[currentResourceType] : void 0;
1337
+ if (!items.length) return [];
1338
+ return items.map((item) => ({
1339
+ value: "id" in item ? item.id : item.name,
1340
+ label: currentCategoryConfig?.getLabel(item) || item.name,
1341
+ children: []
1342
+ }));
1343
+ }, []);
1278
1344
  React10.useEffect(() => {
1279
1345
  let isUnmounted = false;
1280
1346
  const initializeCommandDataSource = async () => {
1281
1347
  const nextEntries = await Promise.all(
1282
- Object.entries(commandConfig).map(async ([trigger, currentCommandConfig]) => {
1348
+ Object.entries(normalizedCommandConfig).map(async ([trigger, currentCommandConfig]) => {
1349
+ let availableResources = null;
1350
+ const requestTypes = trigger === "/" && Array.isArray(slashCommandConfig) ? slashCommandConfig : currentCommandConfig.dataSource.map((category) => category.ext || categoryValueTypeMap[category.value]).filter(Boolean);
1283
1351
  const nextDataSource = await Promise.all(
1284
1352
  (currentCommandConfig.dataSource || []).map(async (category) => {
1285
- const normalizedChildren = category.children || [];
1353
+ const normalizedChildren = getCategoryChildren(category);
1286
1354
  const nextCategory = {
1287
1355
  ...category,
1288
1356
  children: normalizedChildren
1289
1357
  };
1290
- const currentCategoryConfig = categoryConfig[category.value];
1358
+ const currentResourceType = category.ext || categoryValueTypeMap[category.value];
1359
+ const currentCategoryConfig = currentResourceType ? resourceTypeConfigMap[currentResourceType] : void 0;
1291
1360
  if (!currentCategoryConfig) {
1292
1361
  return nextCategory;
1293
1362
  }
1294
1363
  if (normalizedChildren.length) {
1295
1364
  return nextCategory;
1296
1365
  }
1297
- const response = await currentCategoryConfig.load();
1298
- const items = response.data || [];
1366
+ if (!availableResources) {
1367
+ const response = await chatStore.config.services.request.fetchAvailableResources(requestTypes);
1368
+ availableResources = response.data || emptyAgentResources;
1369
+ }
1370
+ const items = currentCategoryConfig.getItems(availableResources || emptyAgentResources);
1299
1371
  return {
1300
1372
  ...nextCategory,
1301
1373
  children: formatDataSource(items, category)
@@ -1318,11 +1390,11 @@ function VariablePickerPlugin({ commandConfig = {} }) {
1318
1390
  return () => {
1319
1391
  isUnmounted = true;
1320
1392
  };
1321
- }, [categoryConfig, commandConfig, formatDataSource]);
1393
+ }, [chatStore.config.services.request, formatDataSource, normalizedCommandConfig, slashCommandConfig]);
1322
1394
  const commandGroups = React10.useMemo(() => {
1323
1395
  if (!isEditorFocused) return [];
1324
1396
  return (commandDataSource[commandKey]?.dataSource || []).map((group) => {
1325
- const options = group.children || [];
1397
+ const options = getCategoryChildren(group);
1326
1398
  if (!searchKeyword) return { group, options };
1327
1399
  return {
1328
1400
  group,
@@ -1385,14 +1457,16 @@ function VariablePickerPlugin({ commandConfig = {} }) {
1385
1457
  function InitialStatePlugin({ value }) {
1386
1458
  const [editor] = LexicalComposerContext.useLexicalComposerContext();
1387
1459
  function parseAndAppendNodes(paragraph, value2) {
1388
- const variableRegex = /\/(\w+):\/\/([^?\s]+)\?name=([^&\s]+)&label=([^\s]+)/g;
1460
+ const variableRegex = /\/?(\w+):\/\/([^?\s]+)\?name=([^&\s]+)&label=([^\s]+)/g;
1389
1461
  let lastIndex = 0;
1390
1462
  let match;
1391
1463
  while ((match = variableRegex.exec(value2)) !== null) {
1392
1464
  if (match.index > lastIndex) {
1393
1465
  paragraph.append(lexical.$createTextNode(value2.substring(lastIndex, match.index)));
1394
1466
  }
1395
- paragraph.append($createVariableNode(decodeURIComponent(match[4]), decodeURIComponent(match[3]), match[1], match[2]));
1467
+ paragraph.append(
1468
+ $createVariableNode(decodeURIComponent(match[4]), decodeURIComponent(match[3]), decodeURIComponent(match[1]), decodeURIComponent(match[2]))
1469
+ );
1396
1470
  lastIndex = variableRegex.lastIndex;
1397
1471
  }
1398
1472
  if (lastIndex < value2.length) {
@@ -1433,6 +1507,17 @@ function normalizePastedFiles(files) {
1433
1507
  });
1434
1508
  });
1435
1509
  }
1510
+ function focusEditableToCursor(target, cursor = "end") {
1511
+ if (!target) return;
1512
+ target.focus();
1513
+ const selection = window.getSelection();
1514
+ if (!selection) return;
1515
+ const range = document.createRange();
1516
+ range.selectNodeContents(target);
1517
+ range.collapse(cursor !== "start");
1518
+ selection.removeAllRanges();
1519
+ selection.addRange(range);
1520
+ }
1436
1521
  var ChatInput = React10__namespace.forwardRef(
1437
1522
  ({
1438
1523
  value = "",
@@ -1462,7 +1547,11 @@ var ChatInput = React10__namespace.forwardRef(
1462
1547
  editable: !disabled && !readOnly
1463
1548
  };
1464
1549
  React10.useImperativeHandle(ref, () => ({
1465
- focus: () => contentEditableRef.current?.focus(),
1550
+ focus: (options) => {
1551
+ requestAnimationFrame(() => {
1552
+ focusEditableToCursor(contentEditableRef.current, options?.cursor || "end");
1553
+ });
1554
+ },
1466
1555
  blur: () => contentEditableRef.current?.blur(),
1467
1556
  nativeElement: contentEditableRef.current
1468
1557
  }));
@@ -1728,6 +1817,9 @@ var createChatService = (request, config) => {
1728
1817
  const fetchExecutionDebug = (conversationId) => {
1729
1818
  return request.get(`/agents/conversations/${conversationId}/executions/debug`);
1730
1819
  };
1820
+ const fetchAvailableResources = (types = ["skill", "knowledge", "datasource", "mcp_server"]) => {
1821
+ return request.get(`/agents/resources/available`, { types: Array.isArray(types) ? types.toString() : types });
1822
+ };
1731
1823
  return {
1732
1824
  fetchModelList,
1733
1825
  fetchAgentInfo,
@@ -1749,7 +1841,8 @@ var createChatService = (request, config) => {
1749
1841
  getAgentAvatar,
1750
1842
  conversationFavorite,
1751
1843
  shareConversation,
1752
- fetchExecutionDebug
1844
+ fetchExecutionDebug,
1845
+ fetchAvailableResources
1753
1846
  };
1754
1847
  };
1755
1848
 
@@ -1777,8 +1870,6 @@ function createChatStore() {
1777
1870
  /** 钩子函数 */
1778
1871
  hooks: {},
1779
1872
  layout: {},
1780
- /** 智能体执行链展示模式(默认聚合模式,可运行时切换) */
1781
- agentExecMode: "aggregate",
1782
1873
  loading: false,
1783
1874
  /** 文件预览状态 */
1784
1875
  preview: {
@@ -1867,9 +1958,6 @@ function createChatStore() {
1867
1958
  const setLayout = (layout) => {
1868
1959
  config.layout = common.deepMerge(defaultLayout, layout);
1869
1960
  };
1870
- const setExecMode = (mode) => {
1871
- config.agentExecMode = mode;
1872
- };
1873
1961
  const fetchExecutionDebug = (conversationId) => {
1874
1962
  return config.services.request.fetchExecutionDebug(conversationId);
1875
1963
  };
@@ -2900,8 +2988,6 @@ function createChatStore() {
2900
2988
  setParams,
2901
2989
  /** 设置布局配置 */
2902
2990
  setLayout,
2903
- /** 设置智能体执行链展示模式(聚合 / 顺序) */
2904
- setExecMode,
2905
2991
  /** 获取会话执行轨迹(debug 模式) */
2906
2992
  fetchExecutionDebug,
2907
2993
  /** 设置生命周期钩子 */
@@ -3310,35 +3396,10 @@ var ConversationList_default = ({ onClose }) => {
3310
3396
  var style_module_default = {
3311
3397
  popover: "style_module_popover",
3312
3398
  resourceBtn: "style_module_resourceBtn",
3313
- divider: "style_module_divider",
3314
- count: "style_module_count",
3315
- resourceBtnActive: "style_module_resourceBtnActive",
3316
- customModal: "style_module_customModal",
3317
- layout: "style_module_layout",
3318
- sider: "style_module_sider",
3319
- categoryName: "style_module_categoryName",
3320
- siderContent: "style_module_siderContent",
3321
- categoryItem: "style_module_categoryItem",
3322
- categoryActive: "style_module_categoryActive",
3323
- roundCheckbox: "style_module_roundCheckbox",
3324
- content: "style_module_content",
3325
- searchInput: "style_module_searchInput",
3326
- selectedCount: "style_module_selectedCount",
3327
- tagsArea: "style_module_tagsArea",
3328
- tagContainer: "style_module_tagContainer",
3329
- tag: "style_module_tag",
3330
- expandBtnWrapper: "style_module_expandBtnWrapper",
3331
- expandBtn: "style_module_expandBtn",
3332
- tagsExpanded: "style_module_tagsExpanded",
3333
- listArea: "style_module_listArea",
3334
- listInner: "style_module_listInner",
3335
- listItem: "style_module_listItem",
3336
- listItemSelected: "style_module_listItemSelected",
3337
- itemIconWrapper: "style_module_itemIconWrapper",
3338
- itemInfo: "style_module_itemInfo",
3339
- itemDesc: "style_module_itemDesc",
3340
- footer: "style_module_footer",
3341
- titleContainer: "style_module_titleContainer"};
3399
+ resourceDropdown: "style_module_resourceDropdown",
3400
+ resourceDropdownMenu: "style_module_resourceDropdownMenu",
3401
+ resourceDropdownSubMenu: "style_module_resourceDropdownSubMenu",
3402
+ resourceBtnActive: "style_module_resourceBtnActive"};
3342
3403
  var HistoryBtn_default = ({ icon, ...rest }) => {
3343
3404
  const chatStore = useChatStore();
3344
3405
  const agentState = valtio.useSnapshot(chatStore.agent);
@@ -3381,7 +3442,7 @@ var ChatHeader_default = ({
3381
3442
  const conversationState = valtio.useSnapshot(chatStore.conversation);
3382
3443
  const conversationsState = valtio.useSnapshot(chatStore.conversations);
3383
3444
  const conversationTitle = String(conversationsState.list.items.find((item) => item.key === conversationState.active.id)?.label || "");
3384
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames10__default.default(styles_module_default2.chatHeader, "zero-chat-header"), children: [
3445
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames9__default.default(styles_module_default2.chatHeader, "zero-chat-header"), children: [
3385
3446
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles_module_default2.chatHeaderContent, children: [
3386
3447
  /* @__PURE__ */ jsxRuntime.jsx(
3387
3448
  common.RenderWrapper,
@@ -3435,8 +3496,8 @@ var ConversationListHeader_default = ({ title = true, avatar = true, newConversa
3435
3496
  {
3436
3497
  control: title,
3437
3498
  DefaultComponent: /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, gap: 4, flex: 1, style: { minWidth: 0 }, children: [
3438
- /* @__PURE__ */ jsxRuntime.jsx(Text, { strong: true, className: classNames10__default.default("fz-16"), children: agentState.agentInfo.name }),
3439
- /* @__PURE__ */ jsxRuntime.jsx(Text, { type: "secondary", ellipsis: true, className: classNames10__default.default("fz-12"), children: agentState.agentInfo.description })
3499
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { strong: true, className: classNames9__default.default("fz-16"), children: agentState.agentInfo.name }),
3500
+ /* @__PURE__ */ jsxRuntime.jsx(Text, { type: "secondary", ellipsis: true, className: classNames9__default.default("fz-12"), children: agentState.agentInfo.description })
3440
3501
  ] }) })
3441
3502
  }
3442
3503
  )
@@ -3451,7 +3512,7 @@ var ConversationListHeader_default = ({ title = true, avatar = true, newConversa
3451
3512
  block: true,
3452
3513
  type: "primary",
3453
3514
  onClick: () => chatStore.createConversation(),
3454
- className: classNames10__default.default(styles_module_default2.createConversationButton),
3515
+ className: classNames9__default.default(styles_module_default2.createConversationButton),
3455
3516
  icon: /* @__PURE__ */ jsxRuntime.jsx(icons.PlusOutlined, {}),
3456
3517
  children: t11("newConversation")
3457
3518
  }
@@ -3461,35 +3522,12 @@ var ConversationListHeader_default = ({ title = true, avatar = true, newConversa
3461
3522
  ] });
3462
3523
  };
3463
3524
  var ConversationListPanel = ({ header }) => {
3464
- return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames10__default.default("height-full", "zero-chat-conversations", styles_module_default2.conversationListPanel), children: [
3525
+ return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames9__default.default("height-full", "zero-chat-conversations", styles_module_default2.conversationListPanel), children: [
3465
3526
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: header, DefaultComponent: ConversationListHeader_default }),
3466
3527
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "full-scroll", children: /* @__PURE__ */ jsxRuntime.jsx(ConversationList_default, {}) })
3467
3528
  ] });
3468
3529
  };
3469
3530
  var ConversationListPanel_default = ConversationListPanel;
3470
-
3471
- // src/components/agentExecShared.ts
3472
- var EXEC_CONTENT_EVENT_TYPES = ["text", "toolCall", "toolResult", "stepError", "runFailed", "files", "plan"];
3473
- function hasContent(content = [], countAnswer) {
3474
- return content.some((item) => {
3475
- const evt = item;
3476
- if (evt.type === "text") {
3477
- const t11 = item;
3478
- return countAnswer ? !!(t11.reasoningContent || t11.messageContent) : !!t11.reasoningContent;
3479
- }
3480
- return EXEC_CONTENT_EVENT_TYPES.includes(evt.type);
3481
- });
3482
- }
3483
- function hasExecContent(content = []) {
3484
- return hasContent(content, true);
3485
- }
3486
- function hasExecChain(content = []) {
3487
- return hasContent(content, false);
3488
- }
3489
- function isSubAgentEvent(tool) {
3490
- if (!tool) return false;
3491
- return !!tool.hasSubAgent || !!tool.subConversationId || !!tool.metadata?.conversationId || tool.toolName === "agent_spawn";
3492
- }
3493
3531
  var XCard = xCard.XCard;
3494
3532
  var { Text: AText } = antd.Typography;
3495
3533
  function getArtifactFallbackTitle(type) {
@@ -3956,7 +3994,7 @@ var CHART_COMPONENTS = Object.fromEntries(
3956
3994
  var Charts_default = ({ data, loading }) => {
3957
3995
  const { type, config } = data;
3958
3996
  const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
3959
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames10__default.default(styles_module_default3.chart, "scroll-fade-in"), children: loading ? (
3997
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames9__default.default(styles_module_default3.chart, "scroll-fade-in"), children: loading ? (
3960
3998
  // Antd 骨架屏
3961
3999
  /* @__PURE__ */ jsxRuntime.jsx(antd.Skeleton.Node, { active: true, className: styles_module_default3.chartSkeleton, children: /* @__PURE__ */ jsxRuntime.jsx(icons.DotChartOutlined, { className: styles_module_default3.chartSkeletonIcon }) })
3962
4000
  ) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -4054,9 +4092,9 @@ var IndexQuote_default = ({ data, loading, message: message3 }) => {
4054
4092
  setOpen(true);
4055
4093
  }
4056
4094
  };
4057
- const Content2 = /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { align: "center", gap: 8, children: /* @__PURE__ */ jsxRuntime.jsx("a", { onClick, children: citation?.citationName }) }) });
4095
+ const Content = /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { align: "center", gap: 8, children: /* @__PURE__ */ jsxRuntime.jsx("a", { onClick, children: citation?.citationName }) }) });
4058
4096
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-block m-l-8", children: [
4059
- /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: loading, size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Popover, { content: Content2, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Tag, { variant: "filled", color: "processing", className: "cursor-pointer", children: data?.citationName }) }) }),
4097
+ /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: loading, size: "small", children: /* @__PURE__ */ jsxRuntime.jsx(antd.Popover, { content: Content, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Tag, { variant: "filled", color: "processing", className: "cursor-pointer", children: data?.citationName }) }) }),
4060
4098
  open && /* @__PURE__ */ jsxRuntime.jsx(DocDrawer_default, { paramsStr: citation?.citationUrl, title: citation?.citationName, open, onClose: () => setOpen(false) })
4061
4099
  ] });
4062
4100
  };
@@ -4266,7 +4304,7 @@ var XMarkdown_default = React10.memo(({ message: message3, components = {}, cont
4266
4304
  return /* @__PURE__ */ jsxRuntime.jsx(
4267
4305
  XMarkdown__default.default,
4268
4306
  {
4269
- className: classNames10__default.default("x-markdown-light", styles_module_default4.xMarkdownStyle),
4307
+ className: classNames9__default.default("x-markdown-light", styles_module_default4.xMarkdownStyle),
4270
4308
  config,
4271
4309
  ...rest,
4272
4310
  content: processedContent,
@@ -6201,49 +6239,25 @@ var ToolCallItem = ({ item }) => {
6201
6239
  };
6202
6240
  var tool_call_item_default = ToolCallItem;
6203
6241
 
6204
- // src/components/agentExecList.module.less
6205
- var agentExecList_module_default = {
6206
- wrap: "agentExecList_module_wrap",
6207
- summary: "agentExecList_module_summary",
6208
- summaryIcon: "agentExecList_module_summaryIcon",
6209
- count: "agentExecList_module_count",
6210
- divider: "agentExecList_module_divider",
6211
- list: "agentExecList_module_list",
6212
- execRow: "agentExecList_module_execRow",
6213
- rowLine: "agentExecList_module_rowLine",
6214
- rowIcon: "agentExecList_module_rowIcon",
6215
- rowLabel: "agentExecList_module_rowLabel",
6216
- rowLabelError: "agentExecList_module_rowLabelError",
6217
- rowDetail: "agentExecList_module_rowDetail",
6218
- rowDetailExpandable: "agentExecList_module_rowDetailExpandable",
6219
- rowDetailAction: "agentExecList_module_rowDetailAction",
6220
- rowBody: "agentExecList_module_rowBody"
6221
- };
6222
- var AgentExecRow = React10.memo(({ icon, label, detail, status, content, onDetail }) => {
6223
- const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
6224
- const [open, setOpen] = React10.useState(false);
6225
- const hasExpand = !!content;
6226
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: agentExecList_module_default.execRow, children: [
6227
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: agentExecList_module_default.rowLine, onClick: () => hasExpand && setOpen((o) => !o), children: [
6228
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.rowIcon, children: icon }),
6229
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${agentExecList_module_default.rowLabel} ${status === "error" ? agentExecList_module_default.rowLabelError : ""}`, children: label }),
6230
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${agentExecList_module_default.rowDetail} ${hasExpand ? agentExecList_module_default.rowDetailExpandable : ""}`, title: detail, children: detail || " " }),
6231
- onDetail && /* @__PURE__ */ jsxRuntime.jsx(
6232
- "span",
6233
- {
6234
- className: agentExecList_module_default.rowDetailAction,
6235
- onClick: (e) => {
6236
- e.stopPropagation();
6237
- onDetail();
6238
- },
6239
- children: t11("viewExecutionDetail")
6240
- }
6241
- )
6242
- ] }),
6243
- open && content && /* @__PURE__ */ jsxRuntime.jsx("div", { className: agentExecList_module_default.rowBody, children: content })
6244
- ] });
6245
- });
6246
- var agentExecRow_default = AgentExecRow;
6242
+ // src/components/agentExecShared.ts
6243
+ var EXEC_CONTENT_EVENT_TYPES = ["text", "toolCall", "toolResult", "stepError", "runFailed", "files", "plan"];
6244
+ function hasContent(content = [], countAnswer) {
6245
+ return content.some((item) => {
6246
+ const evt = item;
6247
+ if (evt.type === "text") {
6248
+ const t11 = item;
6249
+ return !!(t11.reasoningContent || t11.messageContent) ;
6250
+ }
6251
+ return EXEC_CONTENT_EVENT_TYPES.includes(evt.type);
6252
+ });
6253
+ }
6254
+ function hasExecContent(content = []) {
6255
+ return hasContent(content);
6256
+ }
6257
+ function isSubAgentEvent(tool) {
6258
+ if (!tool) return false;
6259
+ return !!tool.hasSubAgent || !!tool.subConversationId || !!tool.metadata?.conversationId || tool.toolName === "agent_spawn";
6260
+ }
6247
6261
  var TOOL_LABEL = {
6248
6262
  loading: common.t(`${NS_CHAT_COPILOT}:execItemRunning`),
6249
6263
  success: common.t(`${NS_CHAT_COPILOT}:execItemDone`),
@@ -6351,63 +6365,44 @@ function buildExecRow(item, index, ctx) {
6351
6365
  return null;
6352
6366
  }
6353
6367
  }
6354
- function buildAgentExecItems(content, ctx) {
6355
- const items = [];
6356
- let lastThinkingText = null;
6357
- (content || []).forEach((item, index) => {
6358
- const row = buildExecRow(item, index, ctx);
6359
- if (!row) return;
6360
- if (row.kind === "thinking") {
6361
- if (row.detail === lastThinkingText) return;
6362
- lastThinkingText = row.detail;
6363
- }
6364
- items.push(row);
6365
- });
6366
- const completed = items.filter((i) => i.status === "success").length;
6367
- const failed = items.filter((i) => i.status === "error").length;
6368
- const loading = items.filter((i) => i.status === "loading").length;
6369
- return { items, completed, failed, loading };
6370
- }
6371
- function AgentExecList({ items, completed, failed, loading = 0, defaultActive = true }) {
6372
- if (!items.length) return null;
6373
- const summary = /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { align: "center", gap: 8, className: agentExecList_module_default.summary, children: [
6374
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.summaryIcon, children: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircleFilled, { style: { color: "#faad14", fontSize: 14 } }) }),
6375
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.count, children: common.t(`${NS_CHAT_COPILOT}:execItemSummaryDone`, { count: completed }) }),
6376
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.divider, children: "|" }),
6377
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.count, children: common.t(`${NS_CHAT_COPILOT}:execItemSummaryFailed`, { count: failed }) }),
6378
- loading > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
6379
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.divider, children: "|" }),
6380
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.count, children: common.t(`${NS_CHAT_COPILOT}:execItemSummaryRunning`, { count: loading }) })
6381
- ] })
6382
- ] });
6383
- return /* @__PURE__ */ jsxRuntime.jsx(
6384
- antd.Collapse,
6385
- {
6386
- ghost: true,
6387
- size: "small",
6388
- className: agentExecList_module_default.wrap,
6389
- defaultActiveKey: defaultActive ? ["agent-exec"] : [],
6390
- items: [
6368
+
6369
+ // src/components/agentExecList.module.less
6370
+ var agentExecList_module_default = {
6371
+ execRow: "agentExecList_module_execRow",
6372
+ rowLine: "agentExecList_module_rowLine",
6373
+ rowIcon: "agentExecList_module_rowIcon",
6374
+ rowLabel: "agentExecList_module_rowLabel",
6375
+ rowLabelError: "agentExecList_module_rowLabelError",
6376
+ rowDetail: "agentExecList_module_rowDetail",
6377
+ rowDetailExpandable: "agentExecList_module_rowDetailExpandable",
6378
+ rowDetailAction: "agentExecList_module_rowDetailAction",
6379
+ rowBody: "agentExecList_module_rowBody"
6380
+ };
6381
+ var AgentExecRow = React10.memo(({ icon, label, detail, status, content, onDetail }) => {
6382
+ const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
6383
+ const [open, setOpen] = React10.useState(false);
6384
+ const hasExpand = !!content;
6385
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: agentExecList_module_default.execRow, children: [
6386
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: agentExecList_module_default.rowLine, onClick: () => hasExpand && setOpen((o) => !o), children: [
6387
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: agentExecList_module_default.rowIcon, children: icon }),
6388
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${agentExecList_module_default.rowLabel} ${status === "error" ? agentExecList_module_default.rowLabelError : ""}`, children: label }),
6389
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${agentExecList_module_default.rowDetail} ${hasExpand ? agentExecList_module_default.rowDetailExpandable : ""}`, title: detail, children: detail || " " }),
6390
+ onDetail && /* @__PURE__ */ jsxRuntime.jsx(
6391
+ "span",
6391
6392
  {
6392
- key: "agent-exec",
6393
- label: summary,
6394
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: agentExecList_module_default.list, children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
6395
- agentExecRow_default,
6396
- {
6397
- icon: item.icon,
6398
- label: item.label,
6399
- detail: item.detail,
6400
- status: item.status,
6401
- content: item.content,
6402
- onDetail: item.onDetail
6403
- },
6404
- item.key
6405
- )) })
6393
+ className: agentExecList_module_default.rowDetailAction,
6394
+ onClick: (e) => {
6395
+ e.stopPropagation();
6396
+ onDetail();
6397
+ },
6398
+ children: t11("viewExecutionDetail")
6406
6399
  }
6407
- ]
6408
- }
6409
- );
6410
- }
6400
+ )
6401
+ ] }),
6402
+ open && content && /* @__PURE__ */ jsxRuntime.jsx("div", { className: agentExecList_module_default.rowBody, children: content })
6403
+ ] });
6404
+ });
6405
+ var agentExecRow_default = AgentExecRow;
6411
6406
 
6412
6407
  // src/components/agentExecSequence.module.less
6413
6408
  var agentExecSequence_module_default = {
@@ -6456,33 +6451,8 @@ var AgentExecSequence = React10.memo(({ content, message: message3, customCompon
6456
6451
  var agentExecSequence_default = AgentExecSequence;
6457
6452
  var MessageRender_default = React10__namespace.default.memo(({ role, message: message3, messageIndex = -1, loading, containerRef, customComponents }) => {
6458
6453
  const chatStore = useChatStore();
6459
- const configState = valtio.useSnapshot(chatStore.config);
6460
- const execMode = configState.agentExecMode || "aggregate";
6461
- const isSequence = execMode === "sequence";
6462
6454
  const openSubAgent = React10.useCallback((item) => chatStore.openSubAgent(item), [chatStore]);
6463
- const {
6464
- items,
6465
- completed,
6466
- failed,
6467
- loading: runLoading
6468
- } = React10.useMemo(
6469
- () => buildAgentExecItems(message3.content || [], {
6470
- message: message3,
6471
- customComponents,
6472
- // 子智能体:打开右侧执行详情抽屉
6473
- onViewSubAgent: openSubAgent
6474
- }),
6475
- [message3, customComponents, openSubAgent]
6476
- );
6477
6455
  const hasSequenceContent = React10.useMemo(() => hasExecContent(message3.content || []), [message3.content]);
6478
- const finalAnswer = React10.useMemo(() => {
6479
- const lastText = [...message3.content || []].reverse().find((i) => i.type === "text");
6480
- if (!lastText) return null;
6481
- const content = lastText.messageContent || "";
6482
- if (!String(content).trim()) return null;
6483
- const answerItem = { ...lastText, reasoningContent: void 0 };
6484
- return /* @__PURE__ */ jsxRuntime.jsx(TextNode2, { item: answerItem, role: message3.role, customComponents, message: message3, messageIndex });
6485
- }, [message3, messageIndex, customComponents]);
6486
6456
  const quoteMsg = React10.useMemo(() => {
6487
6457
  const quoteMsg2 = {};
6488
6458
  if (message3.params) {
@@ -6498,16 +6468,14 @@ var MessageRender_default = React10__namespace.default.memo(({ role, message: me
6498
6468
  }, [message3.params, message3.quoteMsg]);
6499
6469
  const hasToolCall = React10.useMemo(() => (message3.content || []).some((i) => i.type === "toolCall" || i.type === "toolResult"), [message3]);
6500
6470
  const lastContentType = message3.content?.[message3.content.length - 1]?.type;
6501
- const hasVisibleContent = isSequence ? hasSequenceContent : items.length > 0;
6502
- const showPending = loading && !finalAnswer && (!hasVisibleContent || lastContentType !== "text");
6503
- if (isSequence ? !hasSequenceContent && !showPending : items.length === 0 && !finalAnswer && !showPending) return null;
6471
+ const showPending = loading && (!hasSequenceContent || lastContentType !== "text");
6472
+ if (!hasSequenceContent && !showPending) return null;
6504
6473
  return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { ref: containerRef, vertical: true, gap: 8, children: [
6505
- isSequence ? hasSequenceContent && /* @__PURE__ */ jsxRuntime.jsx(
6474
+ hasSequenceContent && /* @__PURE__ */ jsxRuntime.jsx(
6506
6475
  xV2.Bubble,
6507
6476
  {
6508
6477
  role: role.user,
6509
6478
  placement: role.placement,
6510
- variant: "borderless",
6511
6479
  className: styles_module_default.bubble,
6512
6480
  content: /* @__PURE__ */ jsxRuntime.jsx(
6513
6481
  agentExecSequence_default,
@@ -6521,18 +6489,8 @@ var MessageRender_default = React10__namespace.default.memo(({ role, message: me
6521
6489
  }
6522
6490
  )
6523
6491
  }
6524
- ) : items.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
6525
- xV2.Bubble,
6526
- {
6527
- role: role.user,
6528
- placement: role.placement,
6529
- variant: "borderless",
6530
- className: styles_module_default.bubble,
6531
- content: /* @__PURE__ */ jsxRuntime.jsx(AgentExecList, { items, completed, failed, loading: runLoading })
6532
- }
6533
6492
  ),
6534
6493
  hasToolCall && messageIndex >= 0 && /* @__PURE__ */ jsxRuntime.jsx(A2uiMessageCards, { messageIndex, message: message3 }),
6535
- !isSequence && finalAnswer && /* @__PURE__ */ jsxRuntime.jsx(xV2.Bubble, { role: role.user, placement: role.placement, className: styles_module_default.bubble, content: finalAnswer }),
6536
6494
  showPending && role.user === "agent" && /* @__PURE__ */ jsxRuntime.jsx(xV2.Bubble, { role: role.user, placement: role.placement, content: /* @__PURE__ */ jsxRuntime.jsx(RunStartedNode, {}) }),
6537
6495
  quoteMsg && /* @__PURE__ */ jsxRuntime.jsx(QuoteMsgNode, { quoteMsg, role })
6538
6496
  ] });
@@ -6551,7 +6509,7 @@ var WelcomeItem_default = ({ icon = true, title = true, description = true, prom
6551
6509
  /* @__PURE__ */ jsxRuntime.jsx(
6552
6510
  xV2.Welcome,
6553
6511
  {
6554
- className: classNames10__default.default(styles_module_default2.chatWelcome, "p-t-32"),
6512
+ className: classNames9__default.default(styles_module_default2.chatWelcome, "p-t-32"),
6555
6513
  variant: "borderless",
6556
6514
  icon: /* @__PURE__ */ jsxRuntime.jsx(
6557
6515
  common.RenderWrapper,
@@ -6577,7 +6535,7 @@ var WelcomeItem_default = ({ icon = true, title = true, description = true, prom
6577
6535
  DefaultComponent: /* @__PURE__ */ jsxRuntime.jsx(
6578
6536
  xV2.Prompts,
6579
6537
  {
6580
- className: classNames10__default.default("m-t-16", styles_module_default2.promptItem),
6538
+ className: classNames9__default.default("m-t-16", styles_module_default2.promptItem),
6581
6539
  wrap: true,
6582
6540
  onItemClick: (info) => chatStore.sendMessage(info.data.description),
6583
6541
  items: recommendQuestions
@@ -6786,264 +6744,13 @@ var BubbleListItems_default = ({
6786
6744
  autoScroll: false,
6787
6745
  ref: listRef,
6788
6746
  items: bubbleListItems,
6789
- className: classNames10__default.default(styles_module_default2.bubbleList, "height-full", "scroll-fade-in"),
6747
+ className: classNames9__default.default(styles_module_default2.bubbleList, "height-full", "scroll-fade-in"),
6790
6748
  onScroll: handleScroll
6791
6749
  },
6792
6750
  conversationState.active.id
6793
6751
  ) }) });
6794
6752
  };
6795
- var { Sider, Content } = antd.Layout;
6796
- var { Title: Title2, Text: Text4 } = antd.Typography;
6797
- var ALL_CATEGORY_ID = "all";
6798
- var ResourceSelectorModal_default = ({ open, type, onCancel }) => {
6799
- const chatStore = useChatStore();
6800
- const conversationState = valtio.useSnapshot(chatStore.conversation);
6801
- const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
6802
- const { token } = antd.theme.useToken();
6803
- const tagsContainerRef = React10.useRef(null);
6804
- const isSkill = type === "skill";
6805
- const [loading, setLoading] = React10.useState(false);
6806
- const [resources, setResources] = React10.useState([]);
6807
- const [categories, setCategories] = React10.useState([]);
6808
- const [selectedCategoryIds, setSelectedCategoryIds] = React10.useState([ALL_CATEGORY_ID]);
6809
- const [selectedIds, setSelectedIds] = React10.useState([]);
6810
- const [searchText, setSearchText] = React10.useState("");
6811
- const [tagsExpanded, setTagsExpanded] = React10.useState(false);
6812
- const [showExpandBtn, setShowExpandBtn] = React10.useState(false);
6813
- React10.useEffect(() => {
6814
- if (!open) {
6815
- setResources([]);
6816
- setCategories([]);
6817
- setSelectedCategoryIds([ALL_CATEGORY_ID]);
6818
- setSelectedIds([]);
6819
- setSearchText("");
6820
- setTagsExpanded(false);
6821
- setShowExpandBtn(false);
6822
- return;
6823
- }
6824
- let canceled = false;
6825
- setLoading(true);
6826
- const fetchData = async () => {
6827
- try {
6828
- const tagType = isSkill ? 3 /* SKILL */ : 2 /* KNOWLEDGE */;
6829
- const [tagsRes, resourcesRes] = await Promise.all([
6830
- chatStore.config.services.request.listTags({ tagType }),
6831
- isSkill ? chatStore.config.services.request.listSkills() : chatStore.config.services.request.listLibrarys({ libraryType: 1 /* KNOWLEDGE */ })
6832
- ]);
6833
- if (canceled) return;
6834
- const fetchedResources = resourcesRes.data || [];
6835
- setCategories(tagsRes.data || []);
6836
- setResources(fetchedResources);
6837
- const spec = conversationState.active.spec;
6838
- const initialItems = isSkill ? spec?.skills?.items : spec?.knowledges?.items;
6839
- const validIds = new Set(fetchedResources.map((r) => r.id));
6840
- const validSelectedIds = (initialItems || []).map((item) => item.id).filter((id) => validIds.has(id));
6841
- setSelectedIds(validSelectedIds);
6842
- if (initialItems && validSelectedIds.length !== initialItems.length) {
6843
- const currentSpec = chatStore.conversation.active.spec || {};
6844
- const clonedSpec = JSON.parse(JSON.stringify(currentSpec));
6845
- chatStore.setConversationSpec(getNextSpec(clonedSpec, validSelectedIds, fetchedResources));
6846
- }
6847
- } finally {
6848
- if (!canceled) setLoading(false);
6849
- }
6850
- };
6851
- fetchData();
6852
- return () => {
6853
- canceled = true;
6854
- };
6855
- }, [open, isSkill, chatStore, conversationState.active.spec]);
6856
- React10.useEffect(() => {
6857
- if (!open) return;
6858
- const checkHeight = () => {
6859
- if (tagsContainerRef.current) {
6860
- setShowExpandBtn(tagsContainerRef.current.scrollHeight > 60);
6861
- }
6862
- };
6863
- setTimeout(checkHeight, 0);
6864
- const observer = new ResizeObserver(checkHeight);
6865
- if (tagsContainerRef.current) observer.observe(tagsContainerRef.current);
6866
- return () => observer.disconnect();
6867
- }, [open, selectedIds]);
6868
- const allCategories = React10.useMemo(() => [{ id: ALL_CATEGORY_ID, name: t11("all") }, ...categories], [categories, t11]);
6869
- const filteredResources = React10.useMemo(() => {
6870
- return resources.filter((item) => {
6871
- const matchCategory = selectedCategoryIds.includes(ALL_CATEGORY_ID) || item.tagIds?.some((id) => selectedCategoryIds.includes(id));
6872
- const searchLower = searchText.trim().toLowerCase();
6873
- const itemName = item.name?.toLowerCase() || "";
6874
- const itemAlias = "aliasName" in item ? item.aliasName?.toLowerCase() || "" : "";
6875
- const matchSearch = !searchLower || itemName.includes(searchLower) || itemAlias.includes(searchLower);
6876
- return matchCategory && matchSearch;
6877
- });
6878
- }, [resources, selectedCategoryIds, searchText]);
6879
- const getNextSpec = (spec, ids, resourceList) => {
6880
- const nextSpec = { ...spec };
6881
- if (isSkill) {
6882
- nextSpec.skills = {
6883
- items: ids.map((id) => ({ id }))
6884
- };
6885
- } else {
6886
- nextSpec.knowledges = {
6887
- items: ids.map((id) => {
6888
- const resource = resourceList.find((r) => r.id === id);
6889
- return { id, name: resource?.name || "" };
6890
- })
6891
- };
6892
- }
6893
- return nextSpec;
6894
- };
6895
- const handleCategoryChange = (categoryId, checked) => {
6896
- if (categoryId === ALL_CATEGORY_ID) {
6897
- setSelectedCategoryIds(checked ? [ALL_CATEGORY_ID] : []);
6898
- return;
6899
- }
6900
- let nextIds = selectedCategoryIds.filter((id) => id !== ALL_CATEGORY_ID);
6901
- if (checked) {
6902
- nextIds.push(categoryId);
6903
- } else {
6904
- nextIds = nextIds.filter((id) => id !== categoryId);
6905
- }
6906
- setSelectedCategoryIds(nextIds.length ? nextIds : [ALL_CATEGORY_ID]);
6907
- };
6908
- const toggleItemSelection = (id) => {
6909
- setSelectedIds((prev) => prev.includes(id) ? prev.filter((i) => i !== id) : [...prev, id]);
6910
- };
6911
- const handleConfirm = () => {
6912
- const currentSpec = chatStore.conversation.active.spec || {};
6913
- const clonedSpec = JSON.parse(JSON.stringify(currentSpec));
6914
- chatStore.setConversationSpec(getNextSpec(clonedSpec, selectedIds, resources));
6915
- onCancel?.();
6916
- };
6917
- const getDisplayName = (id) => {
6918
- const item = resources.find((r) => r.id === id);
6919
- if (!item) return id;
6920
- return "aliasName" in item && item.aliasName ? item.aliasName : item.name || id;
6921
- };
6922
- const title = isSkill ? t11("selectSkill") : t11("selectKnowledge");
6923
- const iconType = isSkill ? "icon-skill" : "icon-remark";
6924
- return /* @__PURE__ */ jsxRuntime.jsx(
6925
- antd.Modal,
6926
- {
6927
- open,
6928
- className: style_module_default.customModal,
6929
- onCancel,
6930
- closeIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.CloseOutlined, {}),
6931
- width: 960,
6932
- centered: true,
6933
- destroyOnHidden: true,
6934
- title: /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.titleContainer, children: /* @__PURE__ */ jsxRuntime.jsx(Title2, { level: 5, children: title }) }),
6935
- footer: /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.footer, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Button, { type: "primary", onClick: handleConfirm, children: t11("confirm") }) }),
6936
- children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Layout, { className: style_module_default.layout, children: [
6937
- /* @__PURE__ */ jsxRuntime.jsx(Sider, { width: 220, className: style_module_default.sider, theme: "light", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.siderContent, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { gap: 4, vertical: true, children: allCategories.map((cat) => {
6938
- const isChecked = selectedCategoryIds.includes(cat.id);
6939
- return /* @__PURE__ */ jsxRuntime.jsxs(
6940
- antd.Flex,
6941
- {
6942
- className: classNames10__default.default(style_module_default.categoryItem, { [style_module_default.categoryActive]: isChecked }),
6943
- onClick: () => handleCategoryChange(cat.id, !isChecked),
6944
- children: [
6945
- /* @__PURE__ */ jsxRuntime.jsx(
6946
- antd.Checkbox,
6947
- {
6948
- checked: isChecked,
6949
- className: cat.id === ALL_CATEGORY_ID ? style_module_default.roundCheckbox : "",
6950
- onClick: (e) => e.stopPropagation(),
6951
- onChange: (e) => handleCategoryChange(cat.id, e.target.checked)
6952
- }
6953
- ),
6954
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: style_module_default.categoryName, children: cat.name })
6955
- ]
6956
- },
6957
- cat.id
6958
- );
6959
- }) }) }) }),
6960
- /* @__PURE__ */ jsxRuntime.jsxs(Content, { className: style_module_default.content, children: [
6961
- /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { align: "center", justify: "space-between", children: /* @__PURE__ */ jsxRuntime.jsx(
6962
- antd.Input,
6963
- {
6964
- className: style_module_default.searchInput,
6965
- placeholder: isSkill ? t11("searchSkill") : t11("searchKnowledge"),
6966
- prefix: /* @__PURE__ */ jsxRuntime.jsx(icons.SearchOutlined, { style: { color: token.colorTextQuaternary } }),
6967
- value: searchText,
6968
- onChange: (e) => setSearchText(e.target.value),
6969
- allowClear: true,
6970
- autoFocus: true
6971
- }
6972
- ) }),
6973
- selectedIds.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { vertical: true, gap: 2, children: /* @__PURE__ */ jsxRuntime.jsx(Text4, { type: "secondary", className: style_module_default.selectedCount, children: t11("selectedCount", { count: selectedIds.length }) }) }),
6974
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames10__default.default(style_module_default.tagsArea, { [style_module_default.tagsExpanded]: tagsExpanded }), children: [
6975
- /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { gap: 8, className: style_module_default.tagContainer, wrap: true, ref: tagsContainerRef, children: [
6976
- selectedIds.map((id) => /* @__PURE__ */ jsxRuntime.jsx(
6977
- antd.Tag,
6978
- {
6979
- closable: true,
6980
- onClose: (e) => {
6981
- e.preventDefault();
6982
- toggleItemSelection(id);
6983
- },
6984
- className: style_module_default.tag,
6985
- children: getDisplayName(id)
6986
- },
6987
- id
6988
- )),
6989
- showExpandBtn && tagsExpanded && /* @__PURE__ */ jsxRuntime.jsxs(antd.Button, { size: "small", className: style_module_default.expandBtn, onClick: () => setTagsExpanded(false), children: [
6990
- t11("collapse"),
6991
- " ",
6992
- /* @__PURE__ */ jsxRuntime.jsx(icons.UpOutlined, {})
6993
- ] })
6994
- ] }),
6995
- showExpandBtn && !tagsExpanded && /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.expandBtnWrapper, children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Button, { size: "small", className: style_module_default.expandBtn, onClick: () => setTagsExpanded(true), children: [
6996
- t11("expand"),
6997
- " ",
6998
- /* @__PURE__ */ jsxRuntime.jsx(icons.DownOutlined, {})
6999
- ] }) })
7000
- ] }),
7001
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.listArea, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: loading, classNames: { root: "full-spin" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.listInner, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { gap: 8, vertical: true, children: filteredResources.length > 0 ? filteredResources.map((item) => {
7002
- const isSelected = selectedIds.includes(item.id);
7003
- return /* @__PURE__ */ jsxRuntime.jsxs(
7004
- "div",
7005
- {
7006
- className: classNames10__default.default(style_module_default.listItem, { [style_module_default.listItemSelected]: isSelected }),
7007
- onClick: () => toggleItemSelection(item.id),
7008
- children: [
7009
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: style_module_default.itemIconWrapper, children: /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: iconType }) }),
7010
- /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: style_module_default.itemInfo, children: [
7011
- /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { justify: "space-between", children: [
7012
- /* @__PURE__ */ jsxRuntime.jsx(Text4, { strong: true, children: getDisplayName(item.id) }),
7013
- isSelected && /* @__PURE__ */ jsxRuntime.jsx(antd.Tag, { color: token.colorPrimary, variant: "outlined", children: t11("added") })
7014
- ] }),
7015
- /* @__PURE__ */ jsxRuntime.jsx(Text4, { type: "secondary", className: style_module_default.itemDesc, children: item.description || t11("noDescription") })
7016
- ] })
7017
- ]
7018
- },
7019
- item.id
7020
- );
7021
- }) : /* @__PURE__ */ jsxRuntime.jsx(antd.Empty, { description: t11("noMatch") }) }) }) }) })
7022
- ] })
7023
- ] })
7024
- }
7025
- );
7026
- };
7027
- var { Text: Text5 } = antd.Typography;
7028
- var KnowledgeBtn_default = ({}) => {
7029
- const chatStore = useChatStore();
7030
- const conversationState = valtio.useSnapshot(chatStore.conversation);
7031
- const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
7032
- const [modalOpen, setModalOpen] = React10.useState(false);
7033
- const knowledgeCount = conversationState.active.spec?.knowledges?.items?.length ?? 0;
7034
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7035
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: style_module_default.resourceBtn, onClick: () => setModalOpen(true), children: [
7036
- /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: "icon-remark" }),
7037
- /* @__PURE__ */ jsxRuntime.jsx(Text5, { children: t11("knowledge") }),
7038
- knowledgeCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7039
- /* @__PURE__ */ jsxRuntime.jsx(antd.Divider, { vertical: true, className: style_module_default.divider }),
7040
- /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { className: style_module_default.count, children: knowledgeCount })
7041
- ] })
7042
- ] }),
7043
- modalOpen && /* @__PURE__ */ jsxRuntime.jsx(ResourceSelectorModal_default, { open: modalOpen, type: "knowledge", onCancel: () => setModalOpen(false) })
7044
- ] });
7045
- };
7046
- var { Text: Text6 } = antd.Typography;
6753
+ var { Text: Text4 } = antd.Typography;
7047
6754
  var getModelIcon = (iconName) => {
7048
6755
  if (!iconName) {
7049
6756
  return "icon-zhinengti";
@@ -7104,7 +6811,7 @@ var ModelSelect_default = ({}) => {
7104
6811
  }
7105
6812
  return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { align: "center", gap: 8, children: [
7106
6813
  /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: getModelIcon(model.icon), style: { fontSize: 20, borderRadius: 4 } }),
7107
- /* @__PURE__ */ jsxRuntime.jsx(Text6, { children: model.label })
6814
+ /* @__PURE__ */ jsxRuntime.jsx(Text4, { children: model.label })
7108
6815
  ] });
7109
6816
  };
7110
6817
  React10.useEffect(() => {
@@ -7127,7 +6834,7 @@ var ModelSelect_default = ({}) => {
7127
6834
  const data = option.data;
7128
6835
  return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { gap: 12, children: [
7129
6836
  /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: getModelIcon(data?.icon), style: { fontSize: 20 } }),
7130
- /* @__PURE__ */ jsxRuntime.jsx(Text6, { children: data?.label })
6837
+ /* @__PURE__ */ jsxRuntime.jsx(Text4, { children: data?.label })
7131
6838
  ] });
7132
6839
  }
7133
6840
  }
@@ -7151,47 +6858,166 @@ var ReasonBtn_default = () => {
7151
6858
  };
7152
6859
  chatStore.setAgent(nextAgentInfo);
7153
6860
  };
7154
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames10__default.default(style_module_default.resourceBtn, { [style_module_default.resourceBtnActive]: currentModel?.reasoning }), onClick: toggleReasoning, children: [
6861
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames9__default.default(style_module_default.resourceBtn, { [style_module_default.resourceBtnActive]: currentModel?.reasoning }), onClick: toggleReasoning, children: [
7155
6862
  /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: "icon-reason" }),
7156
6863
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: t11("deepThinking") })
7157
6864
  ] });
7158
6865
  };
7159
- var { Text: Text7 } = antd.Typography;
7160
- var SkillBtn_default = ({}) => {
6866
+ var getResourceKey = (item) => "id" in item ? item.id : item.name;
6867
+ var defaultResourceTypes = ["skill", "knowledge", "datasource", "mcp_server"];
6868
+ var resourceTypeMap = {
6869
+ skill: {
6870
+ responseKey: "skills",
6871
+ nodeType: "skill",
6872
+ labelKey: "skill",
6873
+ getLabel: (item) => item.aliasName || item.name
6874
+ },
6875
+ knowledge: {
6876
+ responseKey: "knowledges",
6877
+ nodeType: "knowledge",
6878
+ labelKey: "knowledge",
6879
+ getLabel: (item) => item.name
6880
+ },
6881
+ datasource: {
6882
+ responseKey: "datasources",
6883
+ nodeType: "datasource",
6884
+ labelKey: "datasource",
6885
+ getLabel: (item) => item.name
6886
+ },
6887
+ mcp_server: {
6888
+ responseKey: "mcpServers",
6889
+ nodeType: "mcpServer",
6890
+ labelKey: "mcpServer",
6891
+ getLabel: (item) => item.serverName || item.name
6892
+ },
6893
+ sub_agent: {
6894
+ responseKey: "subAgents",
6895
+ nodeType: "subAgent",
6896
+ labelKey: "subAgent",
6897
+ getLabel: (item) => item.name
6898
+ },
6899
+ tool: {
6900
+ responseKey: "tools",
6901
+ nodeType: "tool",
6902
+ labelKey: "tool",
6903
+ getLabel: (item) => item.name
6904
+ }
6905
+ };
6906
+ var emptyAgentResources2 = {
6907
+ skills: [],
6908
+ knowledges: [],
6909
+ datasources: [],
6910
+ mcpServers: [],
6911
+ subAgents: [],
6912
+ tools: []
6913
+ };
6914
+ var focusSenderInputToEnd = () => {
6915
+ requestAnimationFrame(() => {
6916
+ requestAnimationFrame(() => {
6917
+ const input = document.querySelector('.zero-chat-sender .ant-sender-input[contenteditable="true"]');
6918
+ if (!input) return;
6919
+ input.focus();
6920
+ const selection = window.getSelection();
6921
+ if (!selection) return;
6922
+ const range = document.createRange();
6923
+ range.selectNodeContents(input);
6924
+ range.collapse(false);
6925
+ selection.removeAllRanges();
6926
+ selection.addRange(range);
6927
+ });
6928
+ });
6929
+ };
6930
+ var appendResourceToken = (content, token) => {
6931
+ if (!content) return token;
6932
+ return /\s$/.test(content) ? `${content}${token}` : `${content} ${token}`;
6933
+ };
6934
+ var ResourceBtn_default = ({ types = defaultResourceTypes }) => {
7161
6935
  const chatStore = useChatStore();
7162
6936
  const conversationState = valtio.useSnapshot(chatStore.conversation);
7163
6937
  const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
7164
- const [modalOpen, setModalOpen] = React10.useState(false);
7165
- const [skillsCount, setSkillsCount] = React10.useState(0);
7166
- React10.useEffect(() => {
7167
- let canceled = false;
7168
- const syncSkillsCount = async () => {
7169
- const initialItems = conversationState.active.spec?.skills?.items;
7170
- if (!initialItems?.length) {
7171
- setSkillsCount(0);
7172
- return;
6938
+ const [open, setOpen] = React10.useState(false);
6939
+ const [loading, setLoading] = React10.useState(false);
6940
+ const [resources, setResources] = React10.useState(null);
6941
+ const menuItems = React10.useMemo(() => {
6942
+ const buildChildren = (categoryKey, resourceLabel, items2, getLabel) => items2.map((item) => ({
6943
+ key: getResourceKey(item),
6944
+ label: getLabel(item),
6945
+ onClick: () => {
6946
+ const resourceName = getLabel(item);
6947
+ const currentContent = conversationState.messages[conversationState.active.id]?.content || "";
6948
+ const nextContent = appendResourceToken(
6949
+ currentContent,
6950
+ serializeResourceToken(resourceLabel, resourceName, resourceTypeMap[categoryKey].nodeType, getResourceKey(item))
6951
+ );
6952
+ chatStore.setContent(nextContent);
6953
+ setOpen(false);
6954
+ focusSenderInputToEnd();
7173
6955
  }
7174
- const { data } = await chatStore.config.services.request.listSkills();
7175
- if (canceled) return;
7176
- const validIds = new Set((data || []).map((item) => item.id));
7177
- setSkillsCount(initialItems.map((item) => item.id).filter((id) => validIds.has(id)).length);
7178
- };
7179
- syncSkillsCount();
7180
- return () => {
7181
- canceled = true;
7182
- };
7183
- }, [chatStore, conversationState.active.spec?.skills?.items]);
7184
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7185
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: style_module_default.resourceBtn, onClick: () => setModalOpen(true), children: [
7186
- /* @__PURE__ */ jsxRuntime.jsx(IconFont_default, { type: "icon-skill" }),
7187
- /* @__PURE__ */ jsxRuntime.jsx(Text7, { children: t11("skill") }),
7188
- skillsCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
7189
- /* @__PURE__ */ jsxRuntime.jsx(antd.Divider, { vertical: true, className: style_module_default.divider }),
7190
- /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { className: style_module_default.count, children: skillsCount })
7191
- ] })
7192
- ] }),
7193
- modalOpen && /* @__PURE__ */ jsxRuntime.jsx(ResourceSelectorModal_default, { open: modalOpen, type: "skill", onCancel: () => setModalOpen(false) })
7194
- ] });
6956
+ }));
6957
+ const buildSubMenu = (key, label, items2, getLabel) => ({
6958
+ key,
6959
+ label,
6960
+ popupClassName: style_module_default.resourceDropdownSubMenu,
6961
+ children: buildChildren(key, label, items2, getLabel)
6962
+ });
6963
+ if (loading) {
6964
+ return [
6965
+ {
6966
+ key: "loading",
6967
+ disabled: true,
6968
+ label: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
6969
+ /* @__PURE__ */ jsxRuntime.jsx(icons.LoadingOutlined, { spin: true, style: { marginRight: 8 } }),
6970
+ t11("loading")
6971
+ ] })
6972
+ }
6973
+ ];
6974
+ }
6975
+ if (!resources) {
6976
+ return [
6977
+ {
6978
+ key: "empty",
6979
+ disabled: true,
6980
+ label: t11("empty")
6981
+ }
6982
+ ];
6983
+ }
6984
+ const items = [];
6985
+ types.forEach((type) => {
6986
+ const currentConfig = resourceTypeMap[type];
6987
+ const currentItems = resources[currentConfig.responseKey];
6988
+ if (!currentItems?.length) return;
6989
+ items.push(buildSubMenu(type, t11(currentConfig.labelKey), currentItems, currentConfig.getLabel));
6990
+ });
6991
+ return items.length ? items : [
6992
+ {
6993
+ key: "empty",
6994
+ disabled: true,
6995
+ label: t11("empty")
6996
+ }
6997
+ ];
6998
+ }, [chatStore, conversationState.active.id, conversationState.messages, loading, resources, t11, types]);
6999
+ const handleOpenChange = async (nextOpen) => {
7000
+ setOpen(nextOpen);
7001
+ if (!nextOpen) return;
7002
+ setLoading(true);
7003
+ try {
7004
+ const { data } = await chatStore.config.services.request.fetchAvailableResources(types);
7005
+ setResources(data || emptyAgentResources2);
7006
+ } finally {
7007
+ setLoading(false);
7008
+ }
7009
+ };
7010
+ return /* @__PURE__ */ jsxRuntime.jsx(
7011
+ antd.Dropdown,
7012
+ {
7013
+ classNames: { root: style_module_default.resourceDropdown },
7014
+ menu: { items: menuItems, className: style_module_default.resourceDropdownMenu },
7015
+ trigger: ["click"],
7016
+ open,
7017
+ onOpenChange: handleOpenChange,
7018
+ children: /* @__PURE__ */ jsxRuntime.jsx(antd.Button, { type: "text", icon: /* @__PURE__ */ jsxRuntime.jsx(icons.PlusOutlined, {}) })
7019
+ }
7020
+ );
7195
7021
  };
7196
7022
  var ChatSender_default2 = React10.forwardRef(
7197
7023
  ({
@@ -7201,8 +7027,9 @@ var ChatSender_default2 = React10.forwardRef(
7201
7027
  sendBtnProps,
7202
7028
  footerBelow = false,
7203
7029
  reasonBtn = true,
7204
- skillsBtn = false,
7205
- knowledgeBtn = false,
7030
+ resourceBtn = true,
7031
+ // skillsBtn = false,
7032
+ // knowledgeBtn = false,
7206
7033
  modelSelect = false,
7207
7034
  commandConfig,
7208
7035
  uploadConfig
@@ -7259,9 +7086,8 @@ var ChatSender_default2 = React10.forwardRef(
7259
7086
  extraFooterBelow: /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: footerBelow }),
7260
7087
  extraFooter: /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { justify: "space-between", flex: 1, children: [
7261
7088
  /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { gap: 8, children: [
7089
+ /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: resourceBtn, DefaultComponent: ResourceBtn_default }),
7262
7090
  agentState.agentInfo.agentType === 2 /* AUTONOMOUS */ && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: reasonBtn, DefaultComponent: ReasonBtn_default }) }),
7263
- /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: skillsBtn, DefaultComponent: SkillBtn_default }),
7264
- /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: knowledgeBtn, DefaultComponent: KnowledgeBtn_default }),
7265
7091
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: extraBtn })
7266
7092
  ] }),
7267
7093
  agentState.agentInfo.agentType === 2 /* AUTONOMOUS */ && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: modelSelect, DefaultComponent: ModelSelect_default }) })
@@ -7346,7 +7172,7 @@ var MonacoEditor = ({ value = "", onChange, placeholder, height = 200, readOnly
7346
7172
  ) });
7347
7173
  };
7348
7174
  var MonacoEditor_default = MonacoEditor;
7349
- var { Text: Text8 } = antd.Typography;
7175
+ var { Text: Text5 } = antd.Typography;
7350
7176
  var FormFileUpload = ({ value, onChange, multiple = false }) => {
7351
7177
  const { token } = antd.theme.useToken();
7352
7178
  const fileList = Array.isArray(value) ? value : value ? [value] : [];
@@ -7418,8 +7244,8 @@ var FormFileUpload = ({ value, onChange, multiple = false }) => {
7418
7244
  }
7419
7245
  ),
7420
7246
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { overflow: "hidden", display: "flex", flexDirection: "column", flex: 1 }, children: [
7421
- /* @__PURE__ */ jsxRuntime.jsx(Text8, { ellipsis: true, style: { width: "100%", fontSize: 14, fontWeight: 500 }, children: file.name }),
7422
- /* @__PURE__ */ jsxRuntime.jsxs(Text8, { type: "secondary", style: { fontSize: 12 }, children: [
7247
+ /* @__PURE__ */ jsxRuntime.jsx(Text5, { ellipsis: true, style: { width: "100%", fontSize: 14, fontWeight: 500 }, children: file.name }),
7248
+ /* @__PURE__ */ jsxRuntime.jsxs(Text5, { type: "secondary", style: { fontSize: 12 }, children: [
7423
7249
  (file.extension || common.getFileSuffixName(file.name)).toUpperCase(),
7424
7250
  " \u2022 ",
7425
7251
  formatFileSize(file.size)
@@ -8015,11 +7841,11 @@ function EventRow({ evt, selected, onSelect }) {
8015
7841
  const { role, lane, preview } = eventSummary(evt);
8016
7842
  const isError = evt.eventType === "run_failed" || evt.eventType === "step_error";
8017
7843
  const time = tsToTime(evt);
8018
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames10__default.default(execution_trace_module_default.eventRow, { [execution_trace_module_default.eventRowSelected]: selected }), onClick: () => onSelect(evt), children: [
8019
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames10__default.default(execution_trace_module_default.eventLane, execution_trace_module_default[`lane_${lane}`]) }),
7844
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames9__default.default(execution_trace_module_default.eventRow, { [execution_trace_module_default.eventRowSelected]: selected }), onClick: () => onSelect(evt), children: [
7845
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames9__default.default(execution_trace_module_default.eventLane, execution_trace_module_default[`lane_${lane}`]) }),
8020
7846
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: execution_trace_module_default.eventIcon, children: eventIcon(evt.eventType) }),
8021
7847
  /* @__PURE__ */ jsxRuntime.jsx(antd.Tag, { className: execution_trace_module_default.eventRole, color: ROLE_COLOR[role], children: roleLabel(role) }),
8022
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames10__default.default(execution_trace_module_default.eventType, { [execution_trace_module_default.eventTypeError]: isError }), children: evt.eventType }),
7848
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames9__default.default(execution_trace_module_default.eventType, { [execution_trace_module_default.eventTypeError]: isError }), children: evt.eventType }),
8023
7849
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: execution_trace_module_default.eventPreview, title: preview, children: preview || " " }),
8024
7850
  time && /* @__PURE__ */ jsxRuntime.jsx("span", { className: execution_trace_module_default.eventTime, children: time })
8025
7851
  ] });
@@ -8068,8 +7894,8 @@ function ExecutionSection({
8068
7894
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: execution_trace_module_default.userMessageContent, children: /* @__PURE__ */ jsxRuntime.jsx(XMarkdown_default, { content: userInput.payloadJson?.event?.message || "" }) })
8069
7895
  ] }),
8070
7896
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: execution_trace_module_default.turnList, children: turns.map((group, gi) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: execution_trace_module_default.turnSection, children: [
8071
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames10__default.default(execution_trace_module_default.turnHeader, group.kind !== "turn" && execution_trace_module_default.turnHeaderMuted), children: [
8072
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames10__default.default(execution_trace_module_default.turnHeaderDot, group.kind !== "turn" && execution_trace_module_default.turnHeaderDotMuted) }),
7897
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: classNames9__default.default(execution_trace_module_default.turnHeader, group.kind !== "turn" && execution_trace_module_default.turnHeaderMuted), children: [
7898
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: classNames9__default.default(execution_trace_module_default.turnHeaderDot, group.kind !== "turn" && execution_trace_module_default.turnHeaderDotMuted) }),
8073
7899
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: execution_trace_module_default.turnTitle, children: group.kind === "turn" ? common.t(`${NS_CHAT_COPILOT}:turnLabel`, { index: group.turnIndex + 1, title: group.title }) : group.title }),
8074
7900
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: execution_trace_module_default.turnMeta, children: [
8075
7901
  group.durationMs != null ? formatDuration(group.durationMs) : "",
@@ -8149,7 +7975,6 @@ var ExecutionTracePanel_default = ExecutionTracePanel;
8149
7975
  // src/ui/layouts/components/styles.module.less
8150
7976
  var styles_module_default5 = {
8151
7977
  bodyWidth: "styles_module_bodyWidth",
8152
- execModeBar: "styles_module_execModeBar",
8153
7978
  mainTabs: "styles_module_mainTabs",
8154
7979
  inputContainer: "styles_module_inputContainer",
8155
7980
  disclaimerNotice: "styles_module_disclaimerNotice",
@@ -8160,42 +7985,13 @@ var styles_module_default5 = {
8160
7985
  subAgentTitle: "styles_module_subAgentTitle",
8161
7986
  subAgentMessages: "styles_module_subAgentMessages"
8162
7987
  };
8163
- var ExecModeSwitch = React10.memo(() => {
8164
- const chatStore = useChatStore();
8165
- const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
8166
- const configState = valtio.useSnapshot(chatStore.config);
8167
- const conversationState = valtio.useSnapshot(chatStore.conversation);
8168
- const activeId = conversationState.active.id;
8169
- const messages = conversationState.messages[activeId]?.message;
8170
- const hasAgentExec = React10.useMemo(() => (messages || []).some((m) => m.role === 2 && hasExecChain(m.content || [])), [messages]);
8171
- const handleExecModeChange = React10.useCallback(
8172
- (v) => {
8173
- chatStore.setExecMode(v);
8174
- },
8175
- [chatStore]
8176
- );
8177
- if (!hasAgentExec) return null;
8178
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles_module_default5.execModeBar, children: /* @__PURE__ */ jsxRuntime.jsx(
8179
- antd.Segmented,
8180
- {
8181
- size: "small",
8182
- value: configState.agentExecMode,
8183
- onChange: handleExecModeChange,
8184
- options: [
8185
- { label: t11("aggregate"), value: "aggregate" },
8186
- { label: t11("sequence"), value: "sequence" }
8187
- ]
8188
- }
8189
- ) });
8190
- });
8191
7988
  var ChatContent = React10.memo(({ senderRef }) => {
8192
7989
  const chatStore = useChatStore();
8193
7990
  const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
8194
7991
  const configState = valtio.useSnapshot(chatStore.config);
8195
7992
  const agentState = valtio.useSnapshot(chatStore.agent);
8196
- return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { align: "center", vertical: true, gap: 24, className: classNames10__default.default(styles_module_default5.bodyWidth, "height-full"), children: [
7993
+ return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { align: "center", vertical: true, gap: 24, className: classNames9__default.default(styles_module_default5.bodyWidth, "height-full"), children: [
8197
7994
  common.shouldRender(agentState.agentInfo.userInput && agentState.agentInfo.userInput.length > 0) && /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.userInput, DefaultComponent: UserInputPanel_default }),
8198
- /* @__PURE__ */ jsxRuntime.jsx(ExecModeSwitch, {}),
8199
7995
  common.shouldRender(configState.layout.messageList) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "full-scroll", style: { width: "100%" }, children: /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.messageList, DefaultComponent: BubbleListItems_default }) }),
8200
7996
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.senderHeader, DefaultComponent: /* @__PURE__ */ jsxRuntime.jsx(ChatSenderHeader_default, {}) }),
8201
7997
  /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { className: styles_module_default5.inputContainer, vertical: true, gap: 8, children: [
@@ -8212,7 +8008,7 @@ var ChatContent = React10.memo(({ senderRef }) => {
8212
8008
  ] });
8213
8009
  });
8214
8010
  var ChatMainPanel = React10.memo(
8215
- React10.forwardRef(({ debugMode = false }, ref) => {
8011
+ React10.forwardRef(({ showDebugLog = false }, ref) => {
8216
8012
  const chatStore = useChatStore();
8217
8013
  const senderRef = React10.useRef(null);
8218
8014
  const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
@@ -8226,12 +8022,12 @@ var ChatMainPanel = React10.memo(
8226
8022
  []
8227
8023
  );
8228
8024
  const configState = valtio.useSnapshot(chatStore.config);
8229
- return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames10__default.default("height-full"), children: [
8025
+ return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames9__default.default("height-full"), children: [
8230
8026
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.chatHeader, DefaultComponent: ChatHeader_default }),
8231
- debugMode ? /* @__PURE__ */ jsxRuntime.jsx(
8027
+ showDebugLog ? /* @__PURE__ */ jsxRuntime.jsx(
8232
8028
  antd.Tabs,
8233
8029
  {
8234
- className: classNames10__default.default(styles_module_default5.mainTabs),
8030
+ className: classNames9__default.default(styles_module_default5.mainTabs),
8235
8031
  defaultActiveKey: "chat",
8236
8032
  items: [
8237
8033
  { key: "chat", label: t11("chatTab"), children: /* @__PURE__ */ jsxRuntime.jsx(ChatContent, { senderRef }) },
@@ -8258,7 +8054,7 @@ var ChatPreviewPanel = React10.memo(({ file }) => {
8258
8054
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
8259
8055
  file.fileUrl && /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: "height-full", children: [
8260
8056
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles_module_default5.previewHeader, children: [
8261
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames10__default.default(styles_module_default5.previewHeaderTitle, "text-ellipsis"), title: file.fileName, children: file.fileName }),
8057
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames9__default.default(styles_module_default5.previewHeaderTitle, "text-ellipsis"), title: file.fileName, children: file.fileName }),
8262
8058
  /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { gap: 8, justify: "center", align: "center", children: [
8263
8059
  /* @__PURE__ */ jsxRuntime.jsx(
8264
8060
  antd.Button,
@@ -8296,7 +8092,7 @@ var ChatPreviewPanel = React10.memo(({ file }) => {
8296
8092
  ] });
8297
8093
  });
8298
8094
  var ChatPreviewPanel_default = ChatPreviewPanel;
8299
- var { Text: Text9 } = antd.Typography;
8095
+ var { Text: Text6 } = antd.Typography;
8300
8096
  function roleForMessage(role) {
8301
8097
  if (role === 1) {
8302
8098
  return { user: "user", role: 1, placement: "end" };
@@ -8355,7 +8151,7 @@ var ChatSubAgentPanel = React10.memo(() => {
8355
8151
  const subAgentName = active.agentName || active.toolName || t11("subAgentExecutionDetail");
8356
8152
  return /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: "height-full", children: [
8357
8153
  /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { align: "center", justify: "space-between", gap: 8, className: styles_module_default5.subAgentHeader, children: [
8358
- /* @__PURE__ */ jsxRuntime.jsx(Text9, { strong: true, className: styles_module_default5.subAgentTitle, title: subAgentName, children: subAgentName }),
8154
+ /* @__PURE__ */ jsxRuntime.jsx(Text6, { strong: true, className: styles_module_default5.subAgentTitle, title: subAgentName, children: subAgentName }),
8359
8155
  /* @__PURE__ */ jsxRuntime.jsx(
8360
8156
  antd.Button,
8361
8157
  {
@@ -8367,7 +8163,7 @@ var ChatSubAgentPanel = React10.memo(() => {
8367
8163
  }
8368
8164
  )
8369
8165
  ] }),
8370
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames10__default.default("full-scroll", styles_module_default5.subAgentMessages), children: loading ? /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { justify: "center", align: "center", style: { height: 120 }, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { size: "small" }) }) : /* @__PURE__ */ jsxRuntime.jsx(xV2.Bubble.List, { ref: listRef, autoScroll: false, items, onScroll: handleScroll, className: "height-full" }) })
8166
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: classNames9__default.default("full-scroll", styles_module_default5.subAgentMessages), children: loading ? /* @__PURE__ */ jsxRuntime.jsx(antd.Flex, { justify: "center", align: "center", style: { height: 120 }, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { size: "small" }) }) : /* @__PURE__ */ jsxRuntime.jsx(xV2.Bubble.List, { ref: listRef, autoScroll: false, items, onScroll: handleScroll, className: "height-full" }) })
8371
8167
  ] });
8372
8168
  });
8373
8169
  var ChatSubAgentPanel_default = ChatSubAgentPanel;
@@ -8379,17 +8175,7 @@ var index_module_default3 = {
8379
8175
  hideSplitterBar: "index_module_hideSplitterBar",
8380
8176
  rightTabs: "index_module_rightTabs"
8381
8177
  };
8382
- function readModeDebug(target) {
8383
- try {
8384
- return new URLSearchParams(target.location.search).get("mode") === "debug";
8385
- } catch {
8386
- return false;
8387
- }
8388
- }
8389
- function resolveDebugMode() {
8390
- return readModeDebug(window) || window.top !== window && readModeDebug(window.top);
8391
- }
8392
- var layouts_default = React10.forwardRef(({ theme: theme4, params, hooks, layout, config, services }, _ref) => {
8178
+ var layouts_default = React10.forwardRef(({ theme: theme3, params, hooks, layout, config, services }, _ref) => {
8393
8179
  const { t: t11 } = common.useTranslation(NS_CHAT_COPILOT);
8394
8180
  const chatStore = React10.useMemo(() => createChatStore(), []);
8395
8181
  const senderRef = React10.useRef(null);
@@ -8444,7 +8230,7 @@ var layouts_default = React10.forwardRef(({ theme: theme4, params, hooks, layout
8444
8230
  const hasPreView = React10.useMemo(() => {
8445
8231
  return common.shouldRender(configState.layout.preview) && (!!configState.preview.file.fileUrl || !!configState.preview.file.content);
8446
8232
  }, [configState.layout.preview, configState.preview.file]);
8447
- const isDebugMode = React10.useMemo(() => resolveDebugMode(), []);
8233
+ const showDebugLog = !!config.showDebugLog;
8448
8234
  const hasSubAgentPanel = !!subAgentState.active;
8449
8235
  const subAgentTrigger = subAgentState.active?.toolCallId ?? subAgentState.active?.toolName ?? subAgentState.active?.subConversationId;
8450
8236
  const previewTrigger = configState.preview.file?.fileUrl || configState.preview.file?.content;
@@ -8513,7 +8299,7 @@ var layouts_default = React10.forwardRef(({ theme: theme4, params, hooks, layout
8513
8299
  React10.useEffect(() => {
8514
8300
  hooks?.onBeforeInit?.();
8515
8301
  }, []);
8516
- return /* @__PURE__ */ jsxRuntime.jsx(xV2.XProvider, { theme: { cssVar: {}, ...theme4 }, children: /* @__PURE__ */ jsxRuntime.jsx(ChatProvider, { store: chatStore, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: configState.loading, classNames: { root: "full-spin" }, children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames10__default.default(index_module_default3.chatLayout, "zero-chat-layout", "height-full"), children: [
8302
+ return /* @__PURE__ */ jsxRuntime.jsx(xV2.XProvider, { theme: { cssVar: {}, ...theme3 }, children: /* @__PURE__ */ jsxRuntime.jsx(ChatProvider, { store: chatStore, children: /* @__PURE__ */ jsxRuntime.jsx(antd.Spin, { spinning: configState.loading, classNames: { root: "full-spin" }, children: /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { vertical: true, className: classNames9__default.default(index_module_default3.chatLayout, "zero-chat-layout", "height-full"), children: [
8517
8303
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.globalHeader, DefaultComponent: ChatHeader_default }),
8518
8304
  /* @__PURE__ */ jsxRuntime.jsxs(antd.Flex, { ref: containerRef, className: "full-scroll", children: [
8519
8305
  /* @__PURE__ */ jsxRuntime.jsx(common.RenderWrapper, { control: configState.layout.leftPanel }),
@@ -8521,14 +8307,14 @@ var layouts_default = React10.forwardRef(({ theme: theme4, params, hooks, layout
8521
8307
  /* @__PURE__ */ jsxRuntime.jsxs(
8522
8308
  antd.Splitter,
8523
8309
  {
8524
- className: classNames10__default.default("flex-1", index_module_default3.animatedSplitter, { [index_module_default3.hideSplitterBar]: !hasRightPanel }),
8310
+ className: classNames9__default.default("flex-1", index_module_default3.animatedSplitter, { [index_module_default3.hideSplitterBar]: !hasRightPanel }),
8525
8311
  onResize: (p) => setSizes(p),
8526
8312
  children: [
8527
- /* @__PURE__ */ jsxRuntime.jsx(antd.Splitter.Panel, { collapsible: false, max: 800, min: 400, size: sizes[0], children: /* @__PURE__ */ jsxRuntime.jsx(ChatMainPanel_default, { ref: senderRef, debugMode: isDebugMode }) }),
8313
+ /* @__PURE__ */ jsxRuntime.jsx(antd.Splitter.Panel, { collapsible: false, max: 800, min: 400, size: sizes[0], children: /* @__PURE__ */ jsxRuntime.jsx(ChatMainPanel_default, { ref: senderRef, showDebugLog }) }),
8528
8314
  hasRightPanel && /* @__PURE__ */ jsxRuntime.jsx(antd.Splitter.Panel, { collapsible: false, min: 360, size: sizes[1], children: /* @__PURE__ */ jsxRuntime.jsx(
8529
8315
  antd.Tabs,
8530
8316
  {
8531
- className: classNames10__default.default("height-full", index_module_default3.rightTabs),
8317
+ className: classNames9__default.default("height-full", index_module_default3.rightTabs),
8532
8318
  activeKey: effectiveRightTab,
8533
8319
  onChange: (k) => setActiveRightTab(k),
8534
8320
  tabBarStyle: { marginBottom: 0 },