@ai-group/chat-sdk 3.7.1-alpha7 → 3.7.1-alpha8

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.
Files changed (87) hide show
  1. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -1
  2. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js +82 -7
  3. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/index.js.map +2 -2
  4. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js +24 -1
  5. package/dist/cjs/components/XAdkChatbot/components/MarkdownRender/styles.js.map +2 -2
  6. package/dist/cjs/components/XAdkChatbot/index.d.ts +2 -2
  7. package/dist/cjs/components/XAdkChatbot/index.js +15 -4
  8. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  9. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -1
  10. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js +17 -10
  11. package/dist/cjs/components/XAdkProvider/compound/DefaultLayout.js.map +2 -2
  12. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  13. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  14. package/dist/cjs/components/XAdkProvider/index.js +9 -8
  15. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  16. package/dist/cjs/components/XAdkSender/InlineTagInput.js +93 -24
  17. package/dist/cjs/components/XAdkSender/InlineTagInput.js.map +2 -2
  18. package/dist/cjs/components/XAdkSender/InputTags.js.map +2 -2
  19. package/dist/cjs/components/XAdkSender/styles.js +13 -0
  20. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  21. package/dist/cjs/index.d.ts +3 -2
  22. package/dist/cjs/index.js +10 -0
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/cjs/presets/xgroup/index.d.ts +1 -0
  25. package/dist/cjs/presets/xgroup/index.js +2 -0
  26. package/dist/cjs/presets/xgroup/index.js.map +2 -2
  27. package/dist/cjs/presets/xgroup/knowledgeReference.d.ts +17 -0
  28. package/dist/cjs/presets/xgroup/knowledgeReference.js +160 -0
  29. package/dist/cjs/presets/xgroup/knowledgeReference.js.map +7 -0
  30. package/dist/cjs/presets/xgroup/preset.d.ts +3 -1
  31. package/dist/cjs/presets/xgroup/preset.js +17 -0
  32. package/dist/cjs/presets/xgroup/preset.js.map +2 -2
  33. package/dist/cjs/presets/xgroup/strategies.d.ts +1 -1
  34. package/dist/cjs/presets/xgroup/strategies.js +3 -5
  35. package/dist/cjs/presets/xgroup/strategies.js.map +2 -2
  36. package/dist/cjs/types/ChatStrategies.d.ts +3 -1
  37. package/dist/cjs/types/ChatStrategies.js.map +1 -1
  38. package/dist/cjs/types/XAdkChatbot.d.ts +18 -0
  39. package/dist/cjs/types/XAdkChatbot.js.map +1 -1
  40. package/dist/cjs/utils/markdownResource.d.ts +1 -1
  41. package/dist/cjs/utils/markdownResource.js +13 -7
  42. package/dist/cjs/utils/markdownResource.js.map +2 -2
  43. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.d.ts +3 -1
  44. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js +88 -22
  45. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/index.js.map +1 -1
  46. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js +2 -2
  47. package/dist/esm/components/XAdkChatbot/components/MarkdownRender/styles.js.map +1 -1
  48. package/dist/esm/components/XAdkChatbot/index.d.ts +2 -2
  49. package/dist/esm/components/XAdkChatbot/index.js +16 -8
  50. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  51. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.d.ts +2 -1
  52. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js +13 -8
  53. package/dist/esm/components/XAdkProvider/compound/DefaultLayout.js.map +1 -1
  54. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +4 -0
  55. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  56. package/dist/esm/components/XAdkProvider/index.js +6 -2
  57. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  58. package/dist/esm/components/XAdkSender/InlineTagInput.js +55 -6
  59. package/dist/esm/components/XAdkSender/InlineTagInput.js.map +1 -1
  60. package/dist/esm/components/XAdkSender/InputTags.js +1 -0
  61. package/dist/esm/components/XAdkSender/InputTags.js.map +1 -1
  62. package/dist/esm/components/XAdkSender/styles.js +1 -1
  63. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  64. package/dist/esm/index.d.ts +3 -2
  65. package/dist/esm/index.js +2 -3
  66. package/dist/esm/index.js.map +1 -1
  67. package/dist/esm/presets/xgroup/index.d.ts +1 -0
  68. package/dist/esm/presets/xgroup/index.js +1 -0
  69. package/dist/esm/presets/xgroup/index.js.map +1 -1
  70. package/dist/esm/presets/xgroup/knowledgeReference.d.ts +17 -0
  71. package/dist/esm/presets/xgroup/knowledgeReference.js +94 -0
  72. package/dist/esm/presets/xgroup/knowledgeReference.js.map +1 -0
  73. package/dist/esm/presets/xgroup/preset.d.ts +3 -1
  74. package/dist/esm/presets/xgroup/preset.js +15 -0
  75. package/dist/esm/presets/xgroup/preset.js.map +1 -1
  76. package/dist/esm/presets/xgroup/strategies.d.ts +1 -1
  77. package/dist/esm/presets/xgroup/strategies.js +3 -3
  78. package/dist/esm/presets/xgroup/strategies.js.map +1 -1
  79. package/dist/esm/types/ChatStrategies.d.ts +3 -1
  80. package/dist/esm/types/ChatStrategies.js.map +1 -1
  81. package/dist/esm/types/XAdkChatbot.d.ts +18 -0
  82. package/dist/esm/types/XAdkChatbot.js.map +1 -1
  83. package/dist/esm/utils/markdownResource.d.ts +1 -1
  84. package/dist/esm/utils/markdownResource.js +7 -1
  85. package/dist/esm/utils/markdownResource.js.map +1 -1
  86. package/dist/umd/chat-sdk.min.js +1 -1
  87. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  export * from "./preset";
2
+ export * from "./knowledgeReference";
2
3
  export * from "./strategies";
3
4
  export * from "./transport";
4
5
  export * from "./upload";
@@ -1,4 +1,5 @@
1
1
  export * from "./preset";
2
+ export * from "./knowledgeReference";
2
3
  export * from "./strategies";
3
4
  export * from "./transport";
4
5
  export * from "./upload";
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../../src/presets/xgroup/index.ts"],"sourcesContent":["export * from \"./preset\";\nexport * from \"./strategies\";\nexport * from \"./transport\";\nexport * from \"./upload\";\n"],"mappings":"AAAA;AACA;AACA;AACA"}
1
+ {"version":3,"names":[],"sources":["../../../../src/presets/xgroup/index.ts"],"sourcesContent":["export * from \"./preset\";\nexport * from \"./knowledgeReference\";\nexport * from \"./strategies\";\nexport * from \"./transport\";\nexport * from \"./upload\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1,17 @@
1
+ import type { MarkdownExtension, MarkdownExtensionNode } from "../../types";
2
+ export interface XGroupKnowledgeReference {
3
+ knowledgeNo: string;
4
+ documentNo: string;
5
+ shardingNos: string[];
6
+ label: string;
7
+ version?: string;
8
+ }
9
+ export declare const XGROUP_KNOWLEDGE_NO_ATTRIBUTES: readonly ["knowledge-no", "knowledge-base-no", "workspace-no", "knowledgeno", "knowledgebaseno", "workspaceno"];
10
+ export declare const XGROUP_DOCUMENT_NO_ATTRIBUTES: readonly ["document-no", "document-id", "documentno", "documentid"];
11
+ export declare const XGROUP_VERSION_ATTRIBUTES: readonly ["version", "document-version", "documentversion"];
12
+ export declare const XGROUP_SHARDING_NO_ATTRIBUTES: readonly ["sharding-nos", "sharding-no", "shardingnos", "shardingno"];
13
+ export declare const parseXGroupKnowledgeReference: ({ attributes, text, }: Pick<MarkdownExtensionNode, "attributes" | "text">) => XGroupKnowledgeReference;
14
+ /** 从已完成的 Agent 文本中提取知识库引用,不在流式渲染期间产生副作用。 */
15
+ export declare const extractXGroupKnowledgeReferences: (text: string) => XGroupKnowledgeReference[];
16
+ export declare const xGroupKnowledgeReferenceMarkdownExtension: MarkdownExtension;
17
+ export declare const xGroupMarkdownExtensions: readonly MarkdownExtension[];
@@ -0,0 +1,94 @@
1
+ import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
2
+ import React from "react";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export var XGROUP_KNOWLEDGE_NO_ATTRIBUTES = ["knowledge-no", "knowledge-base-no", "workspace-no", "knowledgeno", "knowledgebaseno", "workspaceno"];
5
+ export var XGROUP_DOCUMENT_NO_ATTRIBUTES = ["document-no", "document-id", "documentno", "documentid"];
6
+ export var XGROUP_VERSION_ATTRIBUTES = ["version", "document-version", "documentversion"];
7
+ export var XGROUP_SHARDING_NO_ATTRIBUTES = ["sharding-nos", "sharding-no", "shardingnos", "shardingno"];
8
+ var AI_KB_REF_REGEX = /<ai-kb-ref\b([^>]*)>([\s\S]*?)<\/ai-kb-ref>/gi;
9
+ var XML_ATTRIBUTE_REGEX = /([a-z][a-z0-9-]*)\s*=\s*(["'])(.*?)\2/gi;
10
+ var getFirstAttribute = function getFirstAttribute(attributes, names) {
11
+ var _iterator = _createForOfIteratorHelper(names),
12
+ _step;
13
+ try {
14
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
15
+ var name = _step.value;
16
+ var value = attributes[name];
17
+ if (value !== null && value !== void 0 && value.trim()) return value.trim();
18
+ }
19
+ } catch (err) {
20
+ _iterator.e(err);
21
+ } finally {
22
+ _iterator.f();
23
+ }
24
+ return "";
25
+ };
26
+ export var parseXGroupKnowledgeReference = function parseXGroupKnowledgeReference(_ref) {
27
+ var attributes = _ref.attributes,
28
+ text = _ref.text;
29
+ var rawShardingNos = getFirstAttribute(attributes, XGROUP_SHARDING_NO_ATTRIBUTES) || text;
30
+ return {
31
+ knowledgeNo: getFirstAttribute(attributes, XGROUP_KNOWLEDGE_NO_ATTRIBUTES),
32
+ documentNo: getFirstAttribute(attributes, XGROUP_DOCUMENT_NO_ATTRIBUTES),
33
+ shardingNos: rawShardingNos.split(/[,,\s]+/).map(function (item) {
34
+ return item.trim();
35
+ }).filter(Boolean),
36
+ label: text,
37
+ version: getFirstAttribute(attributes, XGROUP_VERSION_ATTRIBUTES) || undefined
38
+ };
39
+ };
40
+
41
+ /** 从已完成的 Agent 文本中提取知识库引用,不在流式渲染期间产生副作用。 */
42
+ export var extractXGroupKnowledgeReferences = function extractXGroupKnowledgeReferences(text) {
43
+ if (!text) return [];
44
+ var references = [];
45
+ var referenceRegex = new RegExp(AI_KB_REF_REGEX.source, AI_KB_REF_REGEX.flags);
46
+ var referenceMatch;
47
+ while ((referenceMatch = referenceRegex.exec(text)) !== null) {
48
+ var attributes = {};
49
+ var attributeRegex = new RegExp(XML_ATTRIBUTE_REGEX.source, XML_ATTRIBUTE_REGEX.flags);
50
+ var attributeMatch = void 0;
51
+ while (attributeMatch = attributeRegex.exec(referenceMatch[1] || "")) {
52
+ attributes[(attributeMatch[1] || "").toLowerCase()] = attributeMatch[3] || "";
53
+ }
54
+ var label = (referenceMatch[2] || "").replace(/<[^>]+>/g, "").trim();
55
+ references.push(parseXGroupKnowledgeReference({
56
+ attributes: attributes,
57
+ text: label
58
+ }));
59
+ }
60
+ return references;
61
+ };
62
+ var renderStaticKnowledgeReference = function renderStaticKnowledgeReference(node) {
63
+ var reference = parseXGroupKnowledgeReference(node);
64
+ return /*#__PURE__*/_jsx("span", {
65
+ "aria-label": "\u77E5\u8BC6\u5E93\u5F15\u7528 ".concat(reference.label || "引"),
66
+ "data-xadk-knowledge-reference": "true",
67
+ style: {
68
+ boxSizing: "border-box",
69
+ display: "inline-flex",
70
+ alignItems: "center",
71
+ justifyContent: "center",
72
+ minWidth: 18,
73
+ height: 18,
74
+ margin: "0 3px",
75
+ padding: "0 5px",
76
+ border: "1px solid #e4e6eb",
77
+ borderRadius: 9,
78
+ background: "#f1f2f4",
79
+ color: "#8a8f99",
80
+ fontSize: 12,
81
+ fontWeight: 500,
82
+ lineHeight: "18px",
83
+ verticalAlign: "1px"
84
+ },
85
+ children: reference.label || "引"
86
+ });
87
+ };
88
+ export var xGroupKnowledgeReferenceMarkdownExtension = {
89
+ tagName: "ai-kb-ref",
90
+ allowedAttributes: [].concat(XGROUP_KNOWLEDGE_NO_ATTRIBUTES, XGROUP_DOCUMENT_NO_ATTRIBUTES, XGROUP_VERSION_ATTRIBUTES, XGROUP_SHARDING_NO_ATTRIBUTES),
91
+ render: renderStaticKnowledgeReference
92
+ };
93
+ export var xGroupMarkdownExtensions = [xGroupKnowledgeReferenceMarkdownExtension];
94
+ //# sourceMappingURL=knowledgeReference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","jsx","_jsx","XGROUP_KNOWLEDGE_NO_ATTRIBUTES","XGROUP_DOCUMENT_NO_ATTRIBUTES","XGROUP_VERSION_ATTRIBUTES","XGROUP_SHARDING_NO_ATTRIBUTES","AI_KB_REF_REGEX","XML_ATTRIBUTE_REGEX","getFirstAttribute","attributes","names","_iterator","_createForOfIteratorHelper","_step","s","n","done","name","value","trim","err","e","f","parseXGroupKnowledgeReference","_ref","text","rawShardingNos","knowledgeNo","documentNo","shardingNos","split","map","item","filter","Boolean","label","version","undefined","extractXGroupKnowledgeReferences","references","referenceRegex","RegExp","source","flags","referenceMatch","exec","attributeRegex","attributeMatch","toLowerCase","replace","push","renderStaticKnowledgeReference","node","reference","concat","style","boxSizing","display","alignItems","justifyContent","minWidth","height","margin","padding","border","borderRadius","background","color","fontSize","fontWeight","lineHeight","verticalAlign","children","xGroupKnowledgeReferenceMarkdownExtension","tagName","allowedAttributes","render","xGroupMarkdownExtensions"],"sources":["../../../../src/presets/xgroup/knowledgeReference.tsx"],"sourcesContent":["import React from \"react\";\n\nimport type { MarkdownExtension, MarkdownExtensionNode } from \"@/types\";\n\nexport interface XGroupKnowledgeReference {\n knowledgeNo: string;\n documentNo: string;\n shardingNos: string[];\n label: string;\n version?: string;\n}\n\nexport const XGROUP_KNOWLEDGE_NO_ATTRIBUTES = [\n \"knowledge-no\",\n \"knowledge-base-no\",\n \"workspace-no\",\n \"knowledgeno\",\n \"knowledgebaseno\",\n \"workspaceno\",\n] as const;\nexport const XGROUP_DOCUMENT_NO_ATTRIBUTES = [\n \"document-no\",\n \"document-id\",\n \"documentno\",\n \"documentid\",\n] as const;\nexport const XGROUP_VERSION_ATTRIBUTES = [\n \"version\",\n \"document-version\",\n \"documentversion\",\n] as const;\nexport const XGROUP_SHARDING_NO_ATTRIBUTES = [\n \"sharding-nos\",\n \"sharding-no\",\n \"shardingnos\",\n \"shardingno\",\n] as const;\n\nconst AI_KB_REF_REGEX = /<ai-kb-ref\\b([^>]*)>([\\s\\S]*?)<\\/ai-kb-ref>/gi;\nconst XML_ATTRIBUTE_REGEX = /([a-z][a-z0-9-]*)\\s*=\\s*([\"'])(.*?)\\2/gi;\n\nconst getFirstAttribute = (\n attributes: Readonly<Record<string, string>>,\n names: readonly string[],\n) => {\n for (const name of names) {\n const value = attributes[name];\n if (value?.trim()) return value.trim();\n }\n return \"\";\n};\n\nexport const parseXGroupKnowledgeReference = ({\n attributes,\n text,\n}: Pick<MarkdownExtensionNode, \"attributes\" | \"text\">): XGroupKnowledgeReference => {\n const rawShardingNos =\n getFirstAttribute(attributes, XGROUP_SHARDING_NO_ATTRIBUTES) || text;\n return {\n knowledgeNo: getFirstAttribute(attributes, XGROUP_KNOWLEDGE_NO_ATTRIBUTES),\n documentNo: getFirstAttribute(attributes, XGROUP_DOCUMENT_NO_ATTRIBUTES),\n shardingNos: rawShardingNos\n .split(/[,,\\s]+/)\n .map((item) => item.trim())\n .filter(Boolean),\n label: text,\n version:\n getFirstAttribute(attributes, XGROUP_VERSION_ATTRIBUTES) || undefined,\n };\n};\n\n/** 从已完成的 Agent 文本中提取知识库引用,不在流式渲染期间产生副作用。 */\nexport const extractXGroupKnowledgeReferences = (\n text: string,\n): XGroupKnowledgeReference[] => {\n if (!text) return [];\n const references: XGroupKnowledgeReference[] = [];\n const referenceRegex = new RegExp(\n AI_KB_REF_REGEX.source,\n AI_KB_REF_REGEX.flags,\n );\n let referenceMatch: RegExpExecArray | null;\n\n while ((referenceMatch = referenceRegex.exec(text)) !== null) {\n const attributes: Record<string, string> = {};\n const attributeRegex = new RegExp(\n XML_ATTRIBUTE_REGEX.source,\n XML_ATTRIBUTE_REGEX.flags,\n );\n let attributeMatch: RegExpExecArray | null;\n while ((attributeMatch = attributeRegex.exec(referenceMatch[1] || \"\"))) {\n attributes[(attributeMatch[1] || \"\").toLowerCase()] =\n attributeMatch[3] || \"\";\n }\n const label = (referenceMatch[2] || \"\")\n .replace(/<[^>]+>/g, \"\")\n .trim();\n references.push(\n parseXGroupKnowledgeReference({ attributes, text: label }),\n );\n }\n return references;\n};\n\nconst renderStaticKnowledgeReference = (node: MarkdownExtensionNode) => {\n const reference = parseXGroupKnowledgeReference(node);\n return (\n <span\n aria-label={`知识库引用 ${reference.label || \"引\"}`}\n data-xadk-knowledge-reference=\"true\"\n style={{\n boxSizing: \"border-box\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: 18,\n height: 18,\n margin: \"0 3px\",\n padding: \"0 5px\",\n border: \"1px solid #e4e6eb\",\n borderRadius: 9,\n background: \"#f1f2f4\",\n color: \"#8a8f99\",\n fontSize: 12,\n fontWeight: 500,\n lineHeight: \"18px\",\n verticalAlign: \"1px\",\n }}\n >\n {reference.label || \"引\"}\n </span>\n );\n};\n\nexport const xGroupKnowledgeReferenceMarkdownExtension: MarkdownExtension = {\n tagName: \"ai-kb-ref\",\n allowedAttributes: [\n ...XGROUP_KNOWLEDGE_NO_ATTRIBUTES,\n ...XGROUP_DOCUMENT_NO_ATTRIBUTES,\n ...XGROUP_VERSION_ATTRIBUTES,\n ...XGROUP_SHARDING_NO_ATTRIBUTES,\n ],\n render: renderStaticKnowledgeReference,\n};\n\nexport const xGroupMarkdownExtensions: readonly MarkdownExtension[] = [\n xGroupKnowledgeReferenceMarkdownExtension,\n];\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { ChatPreset, ChatPresetInput, ChatStrategies, UploadRequestFn } from "../../types";
1
+ import type { ChatPreset, ChatPresetInput, ChatStrategies, MarkdownExtension, UploadRequestFn } from "../../types";
2
2
  /** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */
3
3
  export declare const xGroupAdkPreset: ChatPreset;
4
+ /** 合并预设与接入方扩展;同名标签始终由接入方覆盖。 */
5
+ export declare const resolvePresetMarkdownExtensions: (preset: ChatPresetInput | undefined, overrides?: readonly MarkdownExtension[]) => MarkdownExtension[];
4
6
  /** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */
5
7
  export declare const basePreset: ChatPreset;
6
8
  /** 统一解析字符串预设和对象预设,默认保持历史行为使用 xgroup-adk。 */
@@ -1,11 +1,14 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
1
2
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
3
  import { parseAgentMessage } from "../../utils";
3
4
  import { baseChatStrategies, xGroupMarkdownResourceLinkSchemes, xGroupToolKindResolver } from "./strategies";
5
+ import { xGroupMarkdownExtensions } from "./knowledgeReference";
4
6
  import { createXGroupUploadRequest } from "./upload";
5
7
 
6
8
  /** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */
7
9
  export var xGroupAdkPreset = {
8
10
  name: "xgroup-adk",
11
+ markdownExtensions: xGroupMarkdownExtensions,
9
12
  strategies: {
10
13
  resolveToolKind: xGroupToolKindResolver,
11
14
  createFunctionResponse: baseChatStrategies.createFunctionResponse,
@@ -19,6 +22,18 @@ export var xGroupAdkPreset = {
19
22
  createUploadRequest: createXGroupUploadRequest
20
23
  };
21
24
 
25
+ /** 合并预设与接入方扩展;同名标签始终由接入方覆盖。 */
26
+ export var resolvePresetMarkdownExtensions = function resolvePresetMarkdownExtensions(preset) {
27
+ var overrides = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
28
+ var registeredTags = new Set();
29
+ return [].concat(_toConsumableArray(overrides), _toConsumableArray(resolveChatPreset(preset).markdownExtensions || [])).filter(function (extension) {
30
+ var tagName = extension.tagName.toLowerCase();
31
+ if (registeredTags.has(tagName)) return false;
32
+ registeredTags.add(tagName);
33
+ return true;
34
+ });
35
+ };
36
+
22
37
  /** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */
23
38
  export var basePreset = {
24
39
  name: "base",
@@ -1 +1 @@
1
- {"version":3,"names":["parseAgentMessage","baseChatStrategies","xGroupMarkdownResourceLinkSchemes","xGroupToolKindResolver","createXGroupUploadRequest","xGroupAdkPreset","name","strategies","resolveToolKind","createFunctionResponse","parseProcessMessage","text","options","_objectSpread","mode","markdownResourceLinkSchemes","createUploadRequest","basePreset","resolveChatPreset","preset","mergeChatStrategies","overrides","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../../src/presets/xgroup/preset.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n UploadRequestFn,\n} from \"@/types\";\nimport {\n baseChatStrategies,\n xGroupMarkdownResourceLinkSchemes,\n xGroupToolKindResolver,\n} from \"./strategies\";\nimport { createXGroupUploadRequest } from \"./upload\";\n\n/** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n markdownResourceLinkSchemes: xGroupMarkdownResourceLinkSchemes,\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\n/** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\n/** 统一解析字符串预设和对象预设,默认保持历史行为使用 xgroup-adk。 */\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\n/** 将预设策略与局部覆盖合并,供组件和业务侧按需覆盖单个函数。 */\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\n/** 从当前预设中解析上传实现,业务显式传入 uploadRequest 时仍然优先使用业务实现。 */\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],"mappings":";AAAA,SAASA,iBAAiB;AAO1B,SACEC,kBAAkB,EAClBC,iCAAiC,EACjCC,sBAAsB;AAExB,SAASC,yBAAyB;;AAElC;AACA,OAAO,IAAMC,eAA2B,GAAG;EACzCC,IAAI,EAAE,YAAY;EAClBC,UAAU,EAAE;IACVC,eAAe,EAAEL,sBAAsB;IACvCM,sBAAsB,EAAER,kBAAkB,CAACQ,sBAAsB;IACjEC,mBAAmB,EAAE,SAAAA,oBAACC,IAAI,EAAEC,OAAO;MAAA,OACjCZ,iBAAiB,CAACW,IAAI,EAAAE,aAAA;QAAIC,IAAI,EAAE;MAAS,GAAKF,OAAO,CAAE,CAAC;IAAA;IAC1DG,2BAA2B,EAAEb;EAC/B,CAAC;EACDc,mBAAmB,EAAEZ;AACvB,CAAC;;AAED;AACA,OAAO,IAAMa,UAAsB,GAAG;EACpCX,IAAI,EAAE,MAAM;EACZC,UAAU,EAAEN;AACd,CAAC;;AAED;AACA,OAAO,IAAMiB,iBAAiB,GAAG,SAApBA,iBAAiBA,CAC5BC,MAAmC,EACpB;EACf,IAAI,CAACA,MAAM,IAAIA,MAAM,KAAK,YAAY,EAAE,OAAOd,eAAe;EAC9D,IAAIc,MAAM,KAAK,MAAM,EAAE,OAAOF,UAAU;EACxC,OAAOE,MAAM;AACf,CAAC;;AAED;AACA,OAAO,IAAMC,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAC9BD,MAAmC,EACnCE,SAA0B;EAAA,OAAAR,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAEvBZ,kBAAkB,GAClBiB,iBAAiB,CAACC,MAAM,CAAC,CAACZ,UAAU,GACpCc,SAAS;AAAA,CACZ;;AAEF;AACA,OAAO,IAAMC,0BAA0B,GAAG,SAA7BA,0BAA0BA,CACrCH,MAAmC,EACnCI,OAIC,EAC+B;EAAA,IAAAC,qBAAA,EAAAC,kBAAA;EAChC,QAAAD,qBAAA,GAAO,CAAAC,kBAAA,GAAAP,iBAAiB,CAACC,MAAM,CAAC,EAACH,mBAAmB,cAAAQ,qBAAA,uBAA7CA,qBAAA,CAAAE,IAAA,CAAAD,kBAAA,EAAgDF,OAAO,CAAC;AACjE,CAAC"}
1
+ {"version":3,"names":["parseAgentMessage","baseChatStrategies","xGroupMarkdownResourceLinkSchemes","xGroupToolKindResolver","xGroupMarkdownExtensions","createXGroupUploadRequest","xGroupAdkPreset","name","markdownExtensions","strategies","resolveToolKind","createFunctionResponse","parseProcessMessage","text","options","_objectSpread","mode","markdownResourceLinkSchemes","createUploadRequest","resolvePresetMarkdownExtensions","preset","overrides","arguments","length","undefined","registeredTags","Set","concat","_toConsumableArray","resolveChatPreset","filter","extension","tagName","toLowerCase","has","add","basePreset","mergeChatStrategies","resolvePresetUploadRequest","context","_resolveChatPreset$cr","_resolveChatPreset","call"],"sources":["../../../../src/presets/xgroup/preset.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatPreset,\n ChatPresetInput,\n ChatStrategies,\n MarkdownExtension,\n UploadRequestFn,\n} from \"@/types\";\nimport {\n baseChatStrategies,\n xGroupMarkdownResourceLinkSchemes,\n xGroupToolKindResolver,\n} from \"./strategies\";\nimport { xGroupMarkdownExtensions } from \"./knowledgeReference\";\nimport { createXGroupUploadRequest } from \"./upload\";\n\n/** 众安信科 ADK 官方预设:聚合工具展示、消息解析、确认响应和默认上传等业务策略。 */\nexport const xGroupAdkPreset: ChatPreset = {\n name: \"xgroup-adk\",\n markdownExtensions: xGroupMarkdownExtensions,\n strategies: {\n resolveToolKind: xGroupToolKindResolver,\n createFunctionResponse: baseChatStrategies.createFunctionResponse,\n parseProcessMessage: (text, options) =>\n parseAgentMessage(text, { mode: \"comment\", ...options }),\n markdownResourceLinkSchemes: xGroupMarkdownResourceLinkSchemes,\n },\n createUploadRequest: createXGroupUploadRequest,\n};\n\n/** 合并预设与接入方扩展;同名标签始终由接入方覆盖。 */\nexport const resolvePresetMarkdownExtensions = (\n preset: ChatPresetInput | undefined,\n overrides: readonly MarkdownExtension[] = [],\n) => {\n const registeredTags = new Set<string>();\n return [\n ...overrides,\n ...(resolveChatPreset(preset).markdownExtensions || []),\n ].filter((extension) => {\n const tagName = extension.tagName.toLowerCase();\n if (registeredTags.has(tagName)) return false;\n registeredTags.add(tagName);\n return true;\n });\n};\n\n/** 基础预设用于完全通用的 SDK 行为,不绑定众安信科后端协议。 */\nexport const basePreset: ChatPreset = {\n name: \"base\",\n strategies: baseChatStrategies,\n};\n\n/** 统一解析字符串预设和对象预设,默认保持历史行为使用 xgroup-adk。 */\nexport const resolveChatPreset = (\n preset: ChatPresetInput | undefined,\n): ChatPreset => {\n if (!preset || preset === \"xgroup-adk\") return xGroupAdkPreset;\n if (preset === \"base\") return basePreset;\n return preset;\n};\n\n/** 将预设策略与局部覆盖合并,供组件和业务侧按需覆盖单个函数。 */\nexport const mergeChatStrategies = (\n preset: ChatPresetInput | undefined,\n overrides?: ChatStrategies,\n): ChatStrategies => ({\n ...baseChatStrategies,\n ...resolveChatPreset(preset).strategies,\n ...overrides,\n});\n\n/** 从当前预设中解析上传实现,业务显式传入 uploadRequest 时仍然优先使用业务实现。 */\nexport const resolvePresetUploadRequest = (\n preset: ChatPresetInput | undefined,\n context: {\n url: string;\n token?: string;\n appNo?: string;\n },\n): UploadRequestFn | undefined => {\n return resolveChatPreset(preset).createUploadRequest?.(context);\n};\n"],"mappings":";;AAAA,SAASA,iBAAiB;AAQ1B,SACEC,kBAAkB,EAClBC,iCAAiC,EACjCC,sBAAsB;AAExB,SAASC,wBAAwB;AACjC,SAASC,yBAAyB;;AAElC;AACA,OAAO,IAAMC,eAA2B,GAAG;EACzCC,IAAI,EAAE,YAAY;EAClBC,kBAAkB,EAAEJ,wBAAwB;EAC5CK,UAAU,EAAE;IACVC,eAAe,EAAEP,sBAAsB;IACvCQ,sBAAsB,EAAEV,kBAAkB,CAACU,sBAAsB;IACjEC,mBAAmB,EAAE,SAAAA,oBAACC,IAAI,EAAEC,OAAO;MAAA,OACjCd,iBAAiB,CAACa,IAAI,EAAAE,aAAA;QAAIC,IAAI,EAAE;MAAS,GAAKF,OAAO,CAAE,CAAC;IAAA;IAC1DG,2BAA2B,EAAEf;EAC/B,CAAC;EACDgB,mBAAmB,EAAEb;AACvB,CAAC;;AAED;AACA,OAAO,IAAMc,+BAA+B,GAAG,SAAlCA,+BAA+BA,CAC1CC,MAAmC,EAEhC;EAAA,IADHC,SAAuC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,EAAE;EAE5C,IAAMG,cAAc,GAAG,IAAIC,GAAG,CAAS,CAAC;EACxC,OAAO,GAAAC,MAAA,CAAAC,kBAAA,CACFP,SAAS,GAAAO,kBAAA,CACRC,iBAAiB,CAACT,MAAM,CAAC,CAACZ,kBAAkB,IAAI,EAAE,GACtDsB,MAAM,CAAC,UAACC,SAAS,EAAK;IACtB,IAAMC,OAAO,GAAGD,SAAS,CAACC,OAAO,CAACC,WAAW,CAAC,CAAC;IAC/C,IAAIR,cAAc,CAACS,GAAG,CAACF,OAAO,CAAC,EAAE,OAAO,KAAK;IAC7CP,cAAc,CAACU,GAAG,CAACH,OAAO,CAAC;IAC3B,OAAO,IAAI;EACb,CAAC,CAAC;AACJ,CAAC;;AAED;AACA,OAAO,IAAMI,UAAsB,GAAG;EACpC7B,IAAI,EAAE,MAAM;EACZE,UAAU,EAAER;AACd,CAAC;;AAED;AACA,OAAO,IAAM4B,iBAAiB,GAAG,SAApBA,iBAAiBA,CAC5BT,MAAmC,EACpB;EACf,IAAI,CAACA,MAAM,IAAIA,MAAM,KAAK,YAAY,EAAE,OAAOd,eAAe;EAC9D,IAAIc,MAAM,KAAK,MAAM,EAAE,OAAOgB,UAAU;EACxC,OAAOhB,MAAM;AACf,CAAC;;AAED;AACA,OAAO,IAAMiB,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAC9BjB,MAAmC,EACnCC,SAA0B;EAAA,OAAAN,aAAA,CAAAA,aAAA,CAAAA,aAAA,KAEvBd,kBAAkB,GAClB4B,iBAAiB,CAACT,MAAM,CAAC,CAACX,UAAU,GACpCY,SAAS;AAAA,CACZ;;AAEF;AACA,OAAO,IAAMiB,0BAA0B,GAAG,SAA7BA,0BAA0BA,CACrClB,MAAmC,EACnCmB,OAIC,EAC+B;EAAA,IAAAC,qBAAA,EAAAC,kBAAA;EAChC,QAAAD,qBAAA,GAAO,CAAAC,kBAAA,GAAAZ,iBAAiB,CAACT,MAAM,CAAC,EAACF,mBAAmB,cAAAsB,qBAAA,uBAA7CA,qBAAA,CAAAE,IAAA,CAAAD,kBAAA,EAAgDF,OAAO,CAAC;AACjE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { ChatStrategies, ToolRenderKind } from "../../types";
2
- export declare const xGroupMarkdownResourceLinkSchemes: readonly ["skill", "plugin", "tool", "knowledge", "agent", "model", "kb"];
2
+ export declare const xGroupMarkdownResourceLinkSchemes: readonly ["skill", "kb"];
3
3
  export declare const formatXGroupMarkdownResourceLinksAsText: (text: string, options?: {
4
4
  stripTrigger?: boolean;
5
5
  }) => string;
@@ -1,9 +1,9 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
- import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
2
  import { parseAgentMessage } from "../../utils";
4
3
  import { MARKDOWN_RESOURCE_LINK_SCHEMES } from "../../utils/markdownResource";
5
4
  import { formatMarkdownResourceLinksAsText } from "../../utils/markdownResource";
6
- export var xGroupMarkdownResourceLinkSchemes = [].concat(_toConsumableArray(MARKDOWN_RESOURCE_LINK_SCHEMES), ["kb"]);
5
+ export var xGroupMarkdownResourceLinkSchemes = MARKDOWN_RESOURCE_LINK_SCHEMES;
6
+ var baseMarkdownResourceLinkSchemes = [];
7
7
  export var formatXGroupMarkdownResourceLinksAsText = function formatXGroupMarkdownResourceLinksAsText(text, options) {
8
8
  return formatMarkdownResourceLinksAsText(text, _objectSpread(_objectSpread({}, options), {}, {
9
9
  schemes: xGroupMarkdownResourceLinkSchemes
@@ -36,6 +36,6 @@ export var baseChatStrategies = {
36
36
  };
37
37
  },
38
38
  parseProcessMessage: parseAgentMessage,
39
- markdownResourceLinkSchemes: MARKDOWN_RESOURCE_LINK_SCHEMES
39
+ markdownResourceLinkSchemes: baseMarkdownResourceLinkSchemes
40
40
  };
41
41
  //# sourceMappingURL=strategies.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["parseAgentMessage","MARKDOWN_RESOURCE_LINK_SCHEMES","formatMarkdownResourceLinksAsText","xGroupMarkdownResourceLinkSchemes","concat","_toConsumableArray","formatXGroupMarkdownResourceLinksAsText","text","options","_objectSpread","schemes","baseToolKindResolver","xGroupToolKindResolver","_ref","name","baseChatStrategies","resolveToolKind","createFunctionResponse","fnCall","confirmed","id","response","parseProcessMessage","markdownResourceLinkSchemes"],"sources":["../../../../src/presets/xgroup/strategies.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n} from \"@/types\";\nimport { MARKDOWN_RESOURCE_LINK_SCHEMES } from \"@/utils/markdownResource\";\nimport { formatMarkdownResourceLinksAsText } from \"@/utils/markdownResource\";\n\nexport const xGroupMarkdownResourceLinkSchemes = [\n ...MARKDOWN_RESOURCE_LINK_SCHEMES,\n \"kb\",\n] as const;\n\nexport const formatXGroupMarkdownResourceLinksAsText = (\n text: string,\n options?: { stripTrigger?: boolean },\n) =>\n formatMarkdownResourceLinksAsText(text, {\n ...options,\n schemes: xGroupMarkdownResourceLinkSchemes,\n });\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\n/** 众安信科预设的工具类型映射,集中处理当前后端约定的 tool name。 */\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\n/** SDK 基础策略:不带业务协议偏好的最小行为集合。 */\nexport const baseChatStrategies: Required<\n Pick<\n ChatStrategies,\n | \"resolveToolKind\"\n | \"createFunctionResponse\"\n | \"parseProcessMessage\"\n | \"markdownResourceLinkSchemes\"\n >\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n markdownResourceLinkSchemes: MARKDOWN_RESOURCE_LINK_SCHEMES,\n};\n"],"mappings":";;AAAA,SAASA,iBAAiB;AAO1B,SAASC,8BAA8B;AACvC,SAASC,iCAAiC;AAE1C,OAAO,IAAMC,iCAAiC,MAAAC,MAAA,CAAAC,kBAAA,CACzCJ,8BAA8B,IACjC,IAAI,EACI;AAEV,OAAO,IAAMK,uCAAuC,GAAG,SAA1CA,uCAAuCA,CAClDC,IAAY,EACZC,OAAoC;EAAA,OAEpCN,iCAAiC,CAACK,IAAI,EAAAE,aAAA,CAAAA,aAAA,KACjCD,OAAO;IACVE,OAAO,EAAEP;EAAiC,EAC3C,CAAC;AAAA;AAEJ,OAAO,IAAMQ,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAA;EAAA,OAAyB,SAAS;AAAA;;AAEnE;AACA,OAAO,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAAC,IAAA,EAIb;EAAA,IAHpBC,IAAI,GAAAD,IAAA,CAAJC,IAAI;EAIJ,IAAIA,IAAI,KAAK,0BAA0B,EAAE,OAAO,UAAU;EAC1D,IAAIA,IAAI,KAAK,iBAAiB,EAAE,OAAO,SAAS;EAChD,OAAO,SAAS;AAClB,CAAC;;AAED;AACA,OAAO,IAAMC,kBAQZ,GAAG;EACFC,eAAe,EAAE,SAAAA,gBAAA;IAAA,OAAM,SAAS;EAAA;EAChCC,sBAAsB,EAAE,SAAAA,uBACtBC,MAAoB,EACpBC,SAAkB;IAAA,OACI;MACtBC,EAAE,EAAEF,MAAM,CAACE,EAAE;MACbN,IAAI,EAAEI,MAAM,CAACJ,IAAI;MACjBO,QAAQ,EAAE;QAAEF,SAAS,EAATA;MAAU;IACxB,CAAC;EAAA,CAAC;EACFG,mBAAmB,EAAEtB,iBAAiB;EACtCuB,2BAA2B,EAAEtB;AAC/B,CAAC"}
1
+ {"version":3,"names":["parseAgentMessage","MARKDOWN_RESOURCE_LINK_SCHEMES","formatMarkdownResourceLinksAsText","xGroupMarkdownResourceLinkSchemes","baseMarkdownResourceLinkSchemes","formatXGroupMarkdownResourceLinksAsText","text","options","_objectSpread","schemes","baseToolKindResolver","xGroupToolKindResolver","_ref","name","baseChatStrategies","resolveToolKind","createFunctionResponse","fnCall","confirmed","id","response","parseProcessMessage","markdownResourceLinkSchemes"],"sources":["../../../../src/presets/xgroup/strategies.ts"],"sourcesContent":["import { parseAgentMessage } from \"@/utils\";\nimport type {\n ChatStrategies,\n FunctionCall,\n FunctionResponse,\n ToolRenderKind,\n} from \"@/types\";\nimport { MARKDOWN_RESOURCE_LINK_SCHEMES } from \"@/utils/markdownResource\";\nimport { formatMarkdownResourceLinksAsText } from \"@/utils/markdownResource\";\n\nexport const xGroupMarkdownResourceLinkSchemes = MARKDOWN_RESOURCE_LINK_SCHEMES;\nconst baseMarkdownResourceLinkSchemes: readonly string[] = [];\n\nexport const formatXGroupMarkdownResourceLinksAsText = (\n text: string,\n options?: { stripTrigger?: boolean },\n) =>\n formatMarkdownResourceLinksAsText(text, {\n ...options,\n schemes: xGroupMarkdownResourceLinkSchemes,\n });\n\nexport const baseToolKindResolver = (): ToolRenderKind => \"default\";\n\n/** 众安信科预设的工具类型映射,集中处理当前后端约定的 tool name。 */\nexport const xGroupToolKindResolver = ({\n name,\n}: {\n name?: string;\n}): ToolRenderKind => {\n if (name === \"adk_request_confirmation\") return \"approval\";\n if (name === \"transferToAgent\") return \"handoff\";\n return \"default\";\n};\n\n/** SDK 基础策略:不带业务协议偏好的最小行为集合。 */\nexport const baseChatStrategies: Required<\n Pick<\n ChatStrategies,\n | \"resolveToolKind\"\n | \"createFunctionResponse\"\n | \"parseProcessMessage\"\n | \"markdownResourceLinkSchemes\"\n >\n> = {\n resolveToolKind: () => \"default\",\n createFunctionResponse: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ): FunctionResponse => ({\n id: fnCall.id,\n name: fnCall.name,\n response: { confirmed },\n }),\n parseProcessMessage: parseAgentMessage,\n markdownResourceLinkSchemes: baseMarkdownResourceLinkSchemes,\n};\n"],"mappings":";AAAA,SAASA,iBAAiB;AAO1B,SAASC,8BAA8B;AACvC,SAASC,iCAAiC;AAE1C,OAAO,IAAMC,iCAAiC,GAAGF,8BAA8B;AAC/E,IAAMG,+BAAkD,GAAG,EAAE;AAE7D,OAAO,IAAMC,uCAAuC,GAAG,SAA1CA,uCAAuCA,CAClDC,IAAY,EACZC,OAAoC;EAAA,OAEpCL,iCAAiC,CAACI,IAAI,EAAAE,aAAA,CAAAA,aAAA,KACjCD,OAAO;IACVE,OAAO,EAAEN;EAAiC,EAC3C,CAAC;AAAA;AAEJ,OAAO,IAAMO,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAA;EAAA,OAAyB,SAAS;AAAA;;AAEnE;AACA,OAAO,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAAC,IAAA,EAIb;EAAA,IAHpBC,IAAI,GAAAD,IAAA,CAAJC,IAAI;EAIJ,IAAIA,IAAI,KAAK,0BAA0B,EAAE,OAAO,UAAU;EAC1D,IAAIA,IAAI,KAAK,iBAAiB,EAAE,OAAO,SAAS;EAChD,OAAO,SAAS;AAClB,CAAC;;AAED;AACA,OAAO,IAAMC,kBAQZ,GAAG;EACFC,eAAe,EAAE,SAAAA,gBAAA;IAAA,OAAM,SAAS;EAAA;EAChCC,sBAAsB,EAAE,SAAAA,uBACtBC,MAAoB,EACpBC,SAAkB;IAAA,OACI;MACtBC,EAAE,EAAEF,MAAM,CAACE,EAAE;MACbN,IAAI,EAAEI,MAAM,CAACJ,IAAI;MACjBO,QAAQ,EAAE;QAAEF,SAAS,EAATA;MAAU;IACxB,CAAC;EAAA,CAAC;EACFG,mBAAmB,EAAErB,iBAAiB;EACtCsB,2BAA2B,EAAElB;AAC/B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type React from "react";
2
2
  import type { ParseAgentMessageOptions, ParsedPart } from "../utils";
3
- import type { IMessage, FunctionCall, FunctionResponse } from "./XAdkChatbot";
3
+ import type { IMessage, FunctionCall, FunctionResponse, MarkdownExtension } from "./XAdkChatbot";
4
4
  import type { ToolRenderKind } from "./FunctionCallRender";
5
5
  import type { UploadRequestFn } from "./XAdkSender";
6
6
  export interface ToolKindResolveContext {
@@ -37,6 +37,8 @@ export interface ChatStrategies {
37
37
  export interface ChatPreset {
38
38
  name: string;
39
39
  strategies?: ChatStrategies;
40
+ /** 当前协议预设提供的默认 Markdown/XML 标签扩展。 */
41
+ markdownExtensions?: readonly MarkdownExtension[];
40
42
  /**
41
43
  * 基于当前协议预设创建默认文件上传函数。
42
44
  * 用户显式传入 config.uploadRequest 时优先使用用户配置。
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/ChatStrategies.ts"],"sourcesContent":["import type React from \"react\";\nimport type { ParseAgentMessageOptions, ParsedPart } from \"@/utils\";\nimport type { IMessage, FunctionCall, FunctionResponse } from \"./XAdkChatbot\";\nimport type { ToolRenderKind } from \"./FunctionCallRender\";\nimport type { UploadRequestFn } from \"./XAdkSender\";\n\nexport interface ToolKindResolveContext {\n name?: string;\n msg?: IMessage;\n}\n\nexport interface ChatStrategies {\n /**\n * 工具名/消息 -> 渲染类型解析策略。\n */\n resolveToolKind?: (ctx: ToolKindResolveContext) => ToolRenderKind;\n /**\n * 函数调用确认场景中,基于工具调用和用户选择生成 functionResponse。\n */\n createFunctionResponse?: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ) => FunctionResponse;\n /**\n * 将模型文本拆分为过程节点和最终答案。\n */\n parseProcessMessage?: (\n text: string,\n options?: ParseAgentMessageOptions,\n ) => ParsedPart[];\n /**\n * Markdown 资源链接协议白名单,如 skill://、plugin://。\n * 业务预设可在这里追加私有协议,例如 xgroup-adk 的 kb://。\n */\n markdownResourceLinkSchemes?: readonly string[];\n /**\n * 自定义 approval 场景渲染,返回 null 则使用默认渲染。\n */\n renderApproval?: (\n msg: IMessage,\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void,\n ) => React.ReactNode | null;\n /**\n * 自定义 handoff 场景渲染,返回 null 则使用默认渲染。\n */\n renderHandoff?: (msg: IMessage) => React.ReactNode | null;\n}\n\nexport interface ChatPreset {\n name: string;\n strategies?: ChatStrategies;\n /**\n * 基于当前协议预设创建默认文件上传函数。\n * 用户显式传入 config.uploadRequest 时优先使用用户配置。\n */\n createUploadRequest?: (context: {\n url: string;\n token?: string;\n appNo?: string;\n }) => UploadRequestFn | undefined;\n}\n\nexport type ChatPresetInput = \"base\" | \"xgroup-adk\" | ChatPreset;\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["../../../src/types/ChatStrategies.ts"],"sourcesContent":["import type React from \"react\";\nimport type { ParseAgentMessageOptions, ParsedPart } from \"@/utils\";\nimport type {\n IMessage,\n FunctionCall,\n FunctionResponse,\n MarkdownExtension,\n} from \"./XAdkChatbot\";\nimport type { ToolRenderKind } from \"./FunctionCallRender\";\nimport type { UploadRequestFn } from \"./XAdkSender\";\n\nexport interface ToolKindResolveContext {\n name?: string;\n msg?: IMessage;\n}\n\nexport interface ChatStrategies {\n /**\n * 工具名/消息 -> 渲染类型解析策略。\n */\n resolveToolKind?: (ctx: ToolKindResolveContext) => ToolRenderKind;\n /**\n * 函数调用确认场景中,基于工具调用和用户选择生成 functionResponse。\n */\n createFunctionResponse?: (\n fnCall: FunctionCall,\n confirmed: boolean,\n ) => FunctionResponse;\n /**\n * 将模型文本拆分为过程节点和最终答案。\n */\n parseProcessMessage?: (\n text: string,\n options?: ParseAgentMessageOptions,\n ) => ParsedPart[];\n /**\n * Markdown 资源链接协议白名单,如 skill://、plugin://。\n * 业务预设可在这里追加私有协议,例如 xgroup-adk 的 kb://。\n */\n markdownResourceLinkSchemes?: readonly string[];\n /**\n * 自定义 approval 场景渲染,返回 null 则使用默认渲染。\n */\n renderApproval?: (\n msg: IMessage,\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void,\n ) => React.ReactNode | null;\n /**\n * 自定义 handoff 场景渲染,返回 null 则使用默认渲染。\n */\n renderHandoff?: (msg: IMessage) => React.ReactNode | null;\n}\n\nexport interface ChatPreset {\n name: string;\n strategies?: ChatStrategies;\n /** 当前协议预设提供的默认 Markdown/XML 标签扩展。 */\n markdownExtensions?: readonly MarkdownExtension[];\n /**\n * 基于当前协议预设创建默认文件上传函数。\n * 用户显式传入 config.uploadRequest 时优先使用用户配置。\n */\n createUploadRequest?: (context: {\n url: string;\n token?: string;\n appNo?: string;\n }) => UploadRequestFn | undefined;\n}\n\nexport type ChatPresetInput = \"base\" | \"xgroup-adk\" | ChatPreset;\n"],"mappings":""}
@@ -252,6 +252,22 @@ export type RenderMarkdownResourceLink = (link: MarkdownResourceLink) => ReactNo
252
252
  * }}
253
253
  */
254
254
  export type RenderFunctionCall = (msg: IMessage) => ReactNode | null;
255
+ /** Markdown 自定义标签经过安全过滤后的结构化节点。 */
256
+ export interface MarkdownExtensionNode {
257
+ tagName: string;
258
+ attributes: Readonly<Record<string, string>>;
259
+ text: string;
260
+ children: ReactNode;
261
+ }
262
+ /**
263
+ * Markdown 自定义标签扩展。
264
+ * 标签及属性只有显式注册后才会交给渲染函数,业务协议无需进入 SDK 核心。
265
+ */
266
+ export interface MarkdownExtension {
267
+ tagName: string;
268
+ allowedAttributes?: readonly string[];
269
+ render: (node: MarkdownExtensionNode) => ReactNode | null;
270
+ }
255
271
  export interface XAdkChatbotProps extends Partial<XAdkSenderProps> {
256
272
  /**
257
273
  * 自定义工具调用渲染函数
@@ -364,6 +380,8 @@ export interface XAdkChatbotProps extends Partial<XAdkSenderProps> {
364
380
  onResourceLinkClick?: (link: MarkdownResourceLink) => void;
365
381
  /** 自定义 Markdown 资源链接渲染,返回 null 则降级使用默认标签样式 */
366
382
  renderResourceLink?: RenderMarkdownResourceLink;
383
+ /** Markdown/XML 自定义标签扩展 */
384
+ markdownExtensions?: readonly MarkdownExtension[];
367
385
  /** 消息列表为空时展示的自定义空状态组件 */
368
386
  empty?: ReactNode | (() => ReactNode);
369
387
  }
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/XAdkChatbot.ts"],"sourcesContent":["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * XAdkChatbot 命令式 API\n */\nexport interface XAdkChatbotHandle {\n /** 手动滚动到底部 */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n}\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\nexport interface MarkdownResourceLink {\n /** 完整链接,如 skill://InnerSkill01 */\n href: string;\n /** Markdown 链接文字,如 @skill-creator */\n label: string;\n /** 协议类型,如 skill/plugin/knowledge */\n type: string;\n /** 协议值,如 InnerSkill01 */\n value: string;\n}\n\nexport type RenderMarkdownResourceLink = (\n link: MarkdownResourceLink,\n) => ReactNode | null;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /**\n * 数据是否就绪,就绪后触发首次自动滚底。默认 true。\n * 仅在需要等待异步加载历史消息的场景(如 XAdkProvider 内)才需设为 false,\n * 待数据加载完成后再切换为 true;独立使用时无需关心此属性。\n */\n initialized?: boolean;\n /**\n * 当前会话 ID,切换时自动重置滚动状态并置底。\n * 不传则退化为仅依赖 initialized 的单次置底行为。\n */\n sessionId?: string;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n\n /** 点击 Markdown 资源链接标签的回调,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n\n /** 自定义 Markdown 资源链接渲染,返回 null 则降级使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n\n /** 消息列表为空时展示的自定义空状态组件 */\n empty?: ReactNode | (() => ReactNode);\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["../../../src/types/XAdkChatbot.ts"],"sourcesContent":["import type { CSSProperties, JSX, ReactNode } from \"react\";\nimport { type XAdkSenderProps } from \"./XAdkSender\";\nimport { type SendContent } from \"./XAiSender\";\nimport { type FileItem } from \"./FileGallery\";\nimport { type ToolRenderKind } from \"./FunctionCallRender\";\nimport { type ChatPresetInput, type ChatStrategies } from \"./ChatStrategies\";\n\n/**\n * XAdkChatbot 命令式 API\n */\nexport interface XAdkChatbotHandle {\n /** 手动滚动到底部 */\n scrollToBottom: (behavior?: ScrollBehavior) => void;\n}\n\n/**\n * 消息分组接口\n */\nexport interface ChatGroup {\n id: string;\n role: \"user\" | \"bot\";\n msgs: IMessage[];\n invocationId?: string;\n allFiles: any[];\n /** 点赞状态: 1=赞, -1=踩, 0=未反馈 */\n isLike?: number;\n}\n\nexport interface IInvocation {\n id: string;\n name: string;\n spanId: string;\n traceId: string;\n parentSpanId: string;\n startTime: number;\n endTime: number;\n sessionId: string;\n invocationId: string;\n duration: number;\n attributes: Record<string, string>;\n botName: string;\n workspaceNo: string;\n status: number;\n agentName: string;\n agentNo: string;\n agentVersionNo: string;\n userId: string;\n}\n\nexport interface AgentRunRequest {\n stream?: boolean;\n sessionId: string | undefined;\n content: {\n parts: Array<{\n text?: string;\n functionResponse?: {\n id?: string;\n name?: string;\n response?: any;\n };\n }>;\n role: string;\n };\n files?: Array<{\n fileName: string;\n fileId?: string;\n tempUrl: string;\n type?: string;\n mimeType: string;\n }>;\n stateDelta?: any;\n}\nexport interface Blob {\n displayName?: string;\n mimeType?: string;\n data: string;\n}\n\nexport interface FunctionCall {\n id?: string;\n name: string;\n args: { [key: string]: any };\n}\n\nexport interface FunctionResponse {\n id?: string;\n name: string;\n response: { [key: string]: any };\n}\n\nexport interface FileData {\n displayName: string;\n mimeType: string;\n fileUri: string;\n}\n\nexport interface ExecutableCode {\n language: \"UNKNOWN\" | \"PYTHON\";\n code: string;\n}\n\nexport interface CodeExecutionResult {\n outcome: \"UNKNOWN\" | \"OK\" | \"FAILED\" | \"DEADLINE_EXCEEDED\";\n output: string;\n}\n\nexport interface Part {\n text?: string;\n inlineData?: Blob;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n thought?: boolean;\n fileData?: FileData;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n errorMessage?: string;\n}\n\nexport interface GenAiContent {\n role: string;\n parts: Part[];\n}\n\nexport interface LlmRequest {\n contents: GenAiContent[];\n}\n\nexport interface LlmResponse {\n partial?: boolean;\n content: GenAiContent;\n error?: string;\n errorMessage?: string;\n errorCode?: string;\n longRunningToolIds?: string[];\n}\n\nexport interface UsageMetadata {\n candidatesTokenCount?: number;\n promptTokenCount?: number;\n totalTokenCount?: number;\n [key: string]: any;\n}\n\nexport interface EventActions {\n message?: string;\n artifactDelta?: any;\n functionCall?: FunctionCall;\n functionResponse?: FunctionResponse;\n finishReason?: string;\n}\n\nexport interface Event extends LlmResponse {\n id?: string;\n author?: string;\n modelCode?: string;\n invocationId?: string;\n actions?: EventActions;\n longRunningToolIds?: string[];\n branch?: string;\n timestamp?: number;\n finishReason?: string;\n usageMetadata?: UsageMetadata;\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n groundingMetadata?: {\n searchEntryPoint?: {\n renderedContent?: any;\n };\n };\n isLike?: number;\n sessionId?: string;\n}\n\nexport interface SessionState {\n [key: string]: unknown;\n}\n\nexport interface Session {\n id?: string;\n appName?: string;\n userId?: string;\n state?: SessionState;\n events?: Event[];\n lastUpdateTime?: number;\n}\n\nexport interface TimeTick {\n position: number;\n label: string;\n}\n\nexport interface IMessage {\n /** 前端生成的唯一标识 */\n id: string;\n /** 单次请求的唯一标识 */\n invocationId?: string;\n /** 单个Event的唯一标识,一个event里有可能有多个parts的消息 */\n eventId?: string;\n /** 消息发起人:智能体名称、user */\n author?: string;\n role: \"bot\" | \"user\";\n /** 时间戳 */\n timestamp?: number;\n isLoading?: boolean;\n /** 函数调用 */\n functionCall?: FunctionCall;\n /** 函数调用结果 */\n functionResponse?: FunctionResponse;\n /** 文件上传 */\n inlineData?: Blob;\n /** 文本消息 */\n text?: string;\n /** 文件信息 */\n fileData?: FileData[];\n /** 思考 */\n thought?: boolean;\n executableCode?: ExecutableCode;\n codeExecutionResult?: CodeExecutionResult;\n renderedContent?: any;\n /** 原始数据 */\n raw?: any;\n /** 模型编码,通常来自 stream 事件或历史消息 */\n modelCode?: string;\n /** 事件级 token 使用量等模型调用元数据 */\n usageMetadata?: UsageMetadata;\n /** 结束原因,通常来自最后一条 stream 事件 */\n finishReason?: string;\n // 下面暂时没有用到\n evalStatus?: any;\n failedMetric?: any;\n evalScore?: any;\n evalThreshold?: any;\n invocationIndex?: any;\n finalResponsePartIndex?: any;\n toolUseIndex?: any;\n /** 是否赞/踩 */\n isLike?: number;\n}\n\nexport type ActionProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => JSX.Element | null;\n\nexport type ActionExtraProps = (data: {\n message: ChatGroup;\n isLastBotMsg: boolean;\n}) => ReactNode;\n\nexport interface MarkdownResourceLink {\n /** 完整链接,如 skill://InnerSkill01 */\n href: string;\n /** Markdown 链接文字,如 @skill-creator */\n label: string;\n /** 协议类型,如 skill/plugin/knowledge */\n type: string;\n /** 协议值,如 InnerSkill01 */\n value: string;\n}\n\nexport type RenderMarkdownResourceLink = (\n link: MarkdownResourceLink,\n) => ReactNode | null;\n\n/**\n * 自定义工具调用渲染函数\n * - 返回 ReactNode:使用自定义渲染\n * - 返回 null:降级使用默认渲染\n *\n * @example\n * renderFunctionCall={(msg) => {\n * if (msg.functionCall?.name === 'my_tool') return <MyToolRender msg={msg} />;\n * return null; // 其他工具使用默认渲染\n * }}\n */\nexport type RenderFunctionCall = (msg: IMessage) => ReactNode | null;\n\n/** Markdown 自定义标签经过安全过滤后的结构化节点。 */\nexport interface MarkdownExtensionNode {\n tagName: string;\n attributes: Readonly<Record<string, string>>;\n text: string;\n children: ReactNode;\n}\n\n/**\n * Markdown 自定义标签扩展。\n * 标签及属性只有显式注册后才会交给渲染函数,业务协议无需进入 SDK 核心。\n */\nexport interface MarkdownExtension {\n tagName: string;\n allowedAttributes?: readonly string[];\n render: (node: MarkdownExtensionNode) => ReactNode | null;\n}\n\nexport interface XAdkChatbotProps extends Partial<XAdkSenderProps> {\n /**\n * 自定义工具调用渲染函数\n * 返回 null 则降级使用默认渲染\n */\n renderFunctionCall?: RenderFunctionCall;\n /**\n * 工具名 → 渲染类型的解析策略,默认使用 defaultToolKindResolver\n */\n toolKindResolver?: (name: string | undefined) => ToolRenderKind;\n /**\n * 聊天策略,可由 Provider preset 自动下发,也可在组件局部覆盖。\n */\n strategies?: ChatStrategies;\n /**\n * 组件直用时的协议预设。默认沿用 xgroup-adk 以兼容既有业务接入;\n * 需要中立行为时可传入 base。\n */\n preset?: ChatPresetInput;\n className?: string;\n style?: CSSProperties;\n // 加载状态\n loading?: boolean;\n /** 消息列表 */\n messages: IMessage[];\n /** 开场白 */\n prologue?: string;\n /** 建议回复 */\n suggestions?: string[];\n /** 欢迎页面 */\n welcome?: ReactNode;\n /** 显示函数调用详情 */\n showFnCallDetail?: boolean;\n /**\n * 数据是否就绪,就绪后触发首次自动滚底。默认 true。\n * 仅在需要等待异步加载历史消息的场景(如 XAdkProvider 内)才需设为 false,\n * 待数据加载完成后再切换为 true;独立使用时无需关心此属性。\n */\n initialized?: boolean;\n /**\n * 当前会话 ID,切换时自动重置滚动状态并置底。\n * 不传则退化为仅依赖 initialized 的单次置底行为。\n */\n sessionId?: string;\n /** 提交回调 */\n onSubmit?: ({ text, files }: SendContent) => void;\n /** 函数调用确认回调 */\n onConfirm?: (fnCall: FunctionCall, confirmed: boolean) => void;\n /** 停止回调 */\n onStop?: () => void;\n /** 清除回调 */\n onClear?: () => void;\n /** 建议回复回调 */\n onSuggest?: (text: string) => void;\n\n // ========== 新增功能 ==========\n\n /** Agent 名称 (欢迎页面) */\n agentName?: string;\n /** Agent 图标 (欢迎页面) */\n agentIcon?: string;\n /** Agent 描述 (欢迎页面) */\n description?: string;\n\n /** 是否显示重试按钮 */\n showRetry?: boolean;\n /** 是否显示复制按钮 */\n showCopy?: boolean;\n /** 是否显示日志按钮 */\n showLog?: boolean;\n\n /** 重试回调 */\n onRetry?: () => void;\n /** 复制回调 */\n onCopy?: (text: string) => void;\n /** 查看日志回调 */\n onShowLog?: (invocationId: string, timestamp?: number) => void;\n\n /** 是否启用消息分组 (默认 true) */\n enableGrouping?: boolean;\n\n /** 是否自动解析 process 内容并展示思维链 (默认 true) */\n enableProcessParsing?: boolean;\n\n /** 消息功能区 */\n actions?: ActionProps;\n /** 追加在消息功能区之后的内容,适合展示 token 消耗等业务扩展信息 */\n actionsExtra?: ActionExtraProps;\n\n /**\n * Process 解析选项\n * @example\n * // 业务项目格式 (注释模式)\n * parseOptions={{ mode: 'comment' }}\n *\n * @example\n * // 自定义格式\n * parseOptions={{\n * mode: 'custom',\n * customPatterns: [\n * { regex: /\\[REASONING\\]([\\s\\S]*?)\\[\\/REASONING\\]/g, type: 'reasoning' }\n * ]\n * }}\n */\n parseOptions?: {\n mode?: \"xml\" | \"comment\" | \"custom\";\n customPatterns?: Array<{ regex: RegExp; type: string }>;\n finalMarker?: string;\n };\n\n /** 是否禁用输入 */\n disabled?: boolean;\n\n /** 是否流式响应 */\n stream?: boolean;\n\n /** 点击对话中附件卡片的回调(非图片、非音视频文件) */\n onFileClick?: (file: FileItem) => void;\n\n /** 点击 Markdown 资源链接标签的回调,如 [@skill](skill://xxx) */\n onResourceLinkClick?: (link: MarkdownResourceLink) => void;\n\n /** 自定义 Markdown 资源链接渲染,返回 null 则降级使用默认标签样式 */\n renderResourceLink?: RenderMarkdownResourceLink;\n\n /** Markdown/XML 自定义标签扩展 */\n markdownExtensions?: readonly MarkdownExtension[];\n\n /** 消息列表为空时展示的自定义空状态组件 */\n empty?: ReactNode | (() => ReactNode);\n}\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  import type { MarkdownResourceLink, XAdkSenderSubmitPart } from "../types";
2
- export declare const MARKDOWN_RESOURCE_LINK_SCHEMES: readonly ["skill", "plugin", "tool", "knowledge", "agent", "model"];
2
+ export declare const MARKDOWN_RESOURCE_LINK_SCHEMES: readonly ["skill", "kb"];
3
3
  export type MarkdownResourceLinkScheme = (typeof MARKDOWN_RESOURCE_LINK_SCHEMES)[number] | (string & {});
4
4
  export interface MarkdownResourceLinkOptions {
5
5
  schemes?: readonly MarkdownResourceLinkScheme[];
@@ -1,4 +1,10 @@
1
- export var MARKDOWN_RESOURCE_LINK_SCHEMES = ["skill", "plugin", "tool", "knowledge", "agent", "model"];
1
+ export var MARKDOWN_RESOURCE_LINK_SCHEMES = ["skill", "kb"
2
+ // "plugin",
3
+ // "tool",
4
+ // "knowledge",
5
+ // "agent",
6
+ // "model",
7
+ ];
2
8
  var getResourceLinkSchemeSet = function getResourceLinkSchemeSet(options) {
3
9
  return new Set((options === null || options === void 0 ? void 0 : options.schemes) || MARKDOWN_RESOURCE_LINK_SCHEMES);
4
10
  };
@@ -1 +1 @@
1
- {"version":3,"names":["MARKDOWN_RESOURCE_LINK_SCHEMES","getResourceLinkSchemeSet","options","Set","schemes","RESOURCE_LINK_REGEX","stripTriggerPrefix","label","replace","getMarkdownResourceDisplayLabel","trim","parseMarkdownResourceLinksAsParts","text","parts","lastIndex","mentionIndex","regex","RegExp","source","flags","match","exec","_match$index","_label$match","href","start","index","link","parseMarkdownResourceHref","push","type","slice","displayName","value","mention","id","concat","Date","now","toString","uri","targetId","trigger","data","length","arguments","undefined","toLowerCase","has","decodeURIComponent","replaceMarkdownResourceLinks","replacer","formatMarkdownResourceLinksAsText","stripTrigger"],"sources":["../../../src/utils/markdownResource.ts"],"sourcesContent":["import type {\n MarkdownResourceLink,\n MentionTag,\n XAdkSenderSubmitPart,\n} from \"@/types\";\n\nexport const MARKDOWN_RESOURCE_LINK_SCHEMES = [\n \"skill\",\n \"plugin\",\n \"tool\",\n \"knowledge\",\n \"agent\",\n \"model\",\n] as const;\n\nexport type MarkdownResourceLinkScheme =\n | (typeof MARKDOWN_RESOURCE_LINK_SCHEMES)[number]\n | (string & {});\n\nexport interface MarkdownResourceLinkOptions {\n schemes?: readonly MarkdownResourceLinkScheme[];\n}\n\nconst getResourceLinkSchemeSet = (options?: MarkdownResourceLinkOptions) =>\n new Set<string>(options?.schemes || MARKDOWN_RESOURCE_LINK_SCHEMES);\n\nconst RESOURCE_LINK_REGEX =\n /\\[([^\\]\\n]+)\\]\\(([a-z][a-z0-9+.-]*:\\/{2,3}[^)\\s]+)\\)/gi;\n\nconst stripTriggerPrefix = (label: string) => label.replace(/^[@/#$]+/, \"\");\n\nexport const getMarkdownResourceDisplayLabel = (label: string) =>\n stripTriggerPrefix(label).trim();\n\n/** 将包含资源链接的 Markdown 还原成 Sender 可编辑的有序片段。 */\nexport const parseMarkdownResourceLinksAsParts = (\n text: string,\n options?: MarkdownResourceLinkOptions,\n): XAdkSenderSubmitPart[] => {\n if (!text) return [];\n\n const parts: XAdkSenderSubmitPart[] = [];\n let lastIndex = 0;\n let mentionIndex = 0;\n const regex = new RegExp(RESOURCE_LINK_REGEX.source, RESOURCE_LINK_REGEX.flags);\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n const source = match[0];\n const label = match[1] || \"\";\n const href = match[2] || \"\";\n const start = match.index ?? 0;\n const link = parseMarkdownResourceHref(href, label, options);\n if (!link) continue;\n\n if (start > lastIndex) {\n parts.push({ type: \"text\", text: text.slice(lastIndex, start) });\n }\n\n const displayName = getMarkdownResourceDisplayLabel(link.label || link.value);\n const mention: MentionTag = {\n id: `pasted-${link.type}-${mentionIndex}-${Date.now().toString(36)}`,\n label: displayName,\n displayName,\n type: link.type,\n uri: link.href,\n targetId: link.value,\n value: link.value,\n trigger: label.match(/^[@/#$]+/)?.[0],\n data: { uri: link.href, value: link.value },\n };\n parts.push({ type: \"mention\", mention });\n mentionIndex += 1;\n lastIndex = start + source.length;\n }\n\n if (lastIndex < text.length) {\n parts.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n return parts.length > 0 ? parts : [{ type: \"text\", text }];\n};\n\nexport const parseMarkdownResourceHref = (\n href: string,\n label = \"\",\n options?: MarkdownResourceLinkOptions,\n): MarkdownResourceLink | null => {\n const match = href.match(/^([a-z][a-z0-9+.-]*):\\/{2,3}(.+)$/i);\n if (!match) return null;\n\n const type = match[1].toLowerCase();\n if (!getResourceLinkSchemeSet(options).has(type)) return null;\n\n return {\n href,\n label: label || href,\n type,\n value: decodeURIComponent(match[2]),\n };\n};\n\nexport const replaceMarkdownResourceLinks = (\n text: string,\n replacer: (link: MarkdownResourceLink) => string,\n options?: MarkdownResourceLinkOptions,\n) => {\n if (!text) return \"\";\n return text.replace(\n RESOURCE_LINK_REGEX,\n (source, label: string, href: string) => {\n const link = parseMarkdownResourceHref(href, label, options);\n return link ? replacer(link) : source;\n },\n );\n};\n\nexport const formatMarkdownResourceLinksAsText = (\n text: string,\n options?: MarkdownResourceLinkOptions & { stripTrigger?: boolean },\n) =>\n replaceMarkdownResourceLinks(\n text,\n (link) => {\n const label = link.label || link.value;\n return options?.stripTrigger === false\n ? label\n : stripTriggerPrefix(label);\n },\n options,\n );\n"],"mappings":"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"}
1
+ {"version":3,"names":["MARKDOWN_RESOURCE_LINK_SCHEMES","getResourceLinkSchemeSet","options","Set","schemes","RESOURCE_LINK_REGEX","stripTriggerPrefix","label","replace","getMarkdownResourceDisplayLabel","trim","parseMarkdownResourceLinksAsParts","text","parts","lastIndex","mentionIndex","regex","RegExp","source","flags","match","exec","_match$index","_label$match","href","start","index","link","parseMarkdownResourceHref","push","type","slice","displayName","value","mention","id","concat","Date","now","toString","uri","targetId","trigger","data","length","arguments","undefined","toLowerCase","has","decodeURIComponent","replaceMarkdownResourceLinks","replacer","formatMarkdownResourceLinksAsText","stripTrigger"],"sources":["../../../src/utils/markdownResource.ts"],"sourcesContent":["import type {\n MarkdownResourceLink,\n MentionTag,\n XAdkSenderSubmitPart,\n} from \"@/types\";\n\nexport const MARKDOWN_RESOURCE_LINK_SCHEMES = [\n \"skill\",\n \"kb\",\n // \"plugin\",\n // \"tool\",\n // \"knowledge\",\n // \"agent\",\n // \"model\",\n] as const;\n\nexport type MarkdownResourceLinkScheme =\n | (typeof MARKDOWN_RESOURCE_LINK_SCHEMES)[number]\n | (string & {});\n\nexport interface MarkdownResourceLinkOptions {\n schemes?: readonly MarkdownResourceLinkScheme[];\n}\n\nconst getResourceLinkSchemeSet = (options?: MarkdownResourceLinkOptions) =>\n new Set<string>(options?.schemes || MARKDOWN_RESOURCE_LINK_SCHEMES);\n\nconst RESOURCE_LINK_REGEX =\n /\\[([^\\]\\n]+)\\]\\(([a-z][a-z0-9+.-]*:\\/{2,3}[^)\\s]+)\\)/gi;\n\nconst stripTriggerPrefix = (label: string) => label.replace(/^[@/#$]+/, \"\");\n\nexport const getMarkdownResourceDisplayLabel = (label: string) =>\n stripTriggerPrefix(label).trim();\n\n/** 将包含资源链接的 Markdown 还原成 Sender 可编辑的有序片段。 */\nexport const parseMarkdownResourceLinksAsParts = (\n text: string,\n options?: MarkdownResourceLinkOptions,\n): XAdkSenderSubmitPart[] => {\n if (!text) return [];\n\n const parts: XAdkSenderSubmitPart[] = [];\n let lastIndex = 0;\n let mentionIndex = 0;\n const regex = new RegExp(\n RESOURCE_LINK_REGEX.source,\n RESOURCE_LINK_REGEX.flags,\n );\n\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n const source = match[0];\n const label = match[1] || \"\";\n const href = match[2] || \"\";\n const start = match.index ?? 0;\n const link = parseMarkdownResourceHref(href, label, options);\n if (!link) continue;\n\n if (start > lastIndex) {\n parts.push({ type: \"text\", text: text.slice(lastIndex, start) });\n }\n\n const displayName = getMarkdownResourceDisplayLabel(\n link.label || link.value,\n );\n const mention: MentionTag = {\n id: `pasted-${link.type}-${mentionIndex}-${Date.now().toString(36)}`,\n label: displayName,\n displayName,\n type: link.type,\n uri: link.href,\n targetId: link.value,\n value: link.value,\n trigger: label.match(/^[@/#$]+/)?.[0],\n data: { uri: link.href, value: link.value },\n };\n parts.push({ type: \"mention\", mention });\n mentionIndex += 1;\n lastIndex = start + source.length;\n }\n\n if (lastIndex < text.length) {\n parts.push({ type: \"text\", text: text.slice(lastIndex) });\n }\n return parts.length > 0 ? parts : [{ type: \"text\", text }];\n};\n\nexport const parseMarkdownResourceHref = (\n href: string,\n label = \"\",\n options?: MarkdownResourceLinkOptions,\n): MarkdownResourceLink | null => {\n const match = href.match(/^([a-z][a-z0-9+.-]*):\\/{2,3}(.+)$/i);\n if (!match) return null;\n\n const type = match[1].toLowerCase();\n if (!getResourceLinkSchemeSet(options).has(type)) return null;\n\n return {\n href,\n label: label || href,\n type,\n value: decodeURIComponent(match[2]),\n };\n};\n\nexport const replaceMarkdownResourceLinks = (\n text: string,\n replacer: (link: MarkdownResourceLink) => string,\n options?: MarkdownResourceLinkOptions,\n) => {\n if (!text) return \"\";\n return text.replace(\n RESOURCE_LINK_REGEX,\n (source, label: string, href: string) => {\n const link = parseMarkdownResourceHref(href, label, options);\n return link ? replacer(link) : source;\n },\n );\n};\n\nexport const formatMarkdownResourceLinksAsText = (\n text: string,\n options?: MarkdownResourceLinkOptions & { stripTrigger?: boolean },\n) =>\n replaceMarkdownResourceLinks(\n text,\n (link) => {\n const label = link.label || link.value;\n return options?.stripTrigger === false\n ? label\n : stripTriggerPrefix(label);\n },\n options,\n );\n"],"mappings":"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"}