@hkyhy/marsun-components-core 0.1.39 → 0.1.40
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.
|
@@ -2,7 +2,7 @@ const h = "<think>", m = "</think>", p = new RegExp(
|
|
|
2
2
|
h.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "([\\s\\S]*?)" + m.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"),
|
|
3
3
|
"gi"
|
|
4
4
|
), c = /<\/?think>/gi;
|
|
5
|
-
function
|
|
5
|
+
function s(n) {
|
|
6
6
|
return n.replace(/\n{3,}/g, `
|
|
7
7
|
|
|
8
8
|
`).trimEnd();
|
|
@@ -14,10 +14,10 @@ function T(n) {
|
|
|
14
14
|
`);
|
|
15
15
|
return i = i.replace(/```\s*mermaid[ \t]*(?!\n)/gi, "```mermaid\n"), i = i.replace(
|
|
16
16
|
/```mermaid\n([\s\S]*?)(\n(?:风格说明|Style)[^\n`]*[\s\S]*?)(?=```|$)/gi,
|
|
17
|
-
(o, r,
|
|
17
|
+
(o, r, t) => `\`\`\`mermaid
|
|
18
18
|
${r.trimEnd()}
|
|
19
19
|
\`\`\`
|
|
20
|
-
${
|
|
20
|
+
${t.trim()}`
|
|
21
21
|
), i;
|
|
22
22
|
}
|
|
23
23
|
function d(n) {
|
|
@@ -27,19 +27,19 @@ function w(n, i = !1) {
|
|
|
27
27
|
var g;
|
|
28
28
|
if (!n)
|
|
29
29
|
return { thinking: "", answer: "", isThinking: i };
|
|
30
|
-
const o = n.toLowerCase(), r = o.lastIndexOf(m),
|
|
30
|
+
const o = n.toLowerCase(), r = o.lastIndexOf(m), t = o.lastIndexOf(h), a = [];
|
|
31
31
|
for (const e of n.matchAll(p)) {
|
|
32
32
|
const l = (g = e[1]) == null ? void 0 : g.trim();
|
|
33
33
|
l && a.push(l);
|
|
34
34
|
}
|
|
35
|
-
if (i && r === -1)
|
|
35
|
+
if (i && r === -1 && t !== -1)
|
|
36
36
|
return {
|
|
37
|
-
thinking:
|
|
37
|
+
thinking: s(n.replace(c, "").trim()),
|
|
38
38
|
answer: "",
|
|
39
39
|
isThinking: !0
|
|
40
40
|
};
|
|
41
|
-
if (
|
|
42
|
-
const e = n.slice(0,
|
|
41
|
+
if (t > r) {
|
|
42
|
+
const e = n.slice(0, t).replace(c, "").trim(), l = n.slice(t + h.length).replace(c, "").trim(), k = [
|
|
43
43
|
...e ? [e] : [],
|
|
44
44
|
...a,
|
|
45
45
|
...l ? [l] : []
|
|
@@ -47,29 +47,29 @@ function w(n, i = !1) {
|
|
|
47
47
|
|
|
48
48
|
`);
|
|
49
49
|
return {
|
|
50
|
-
thinking:
|
|
50
|
+
thinking: s(k),
|
|
51
51
|
answer: "",
|
|
52
52
|
isThinking: i
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
if (r !== -1) {
|
|
56
|
-
const e =
|
|
56
|
+
const e = s(
|
|
57
57
|
n.slice(r + m.length).replace(c, "").trim()
|
|
58
58
|
);
|
|
59
59
|
if (e)
|
|
60
60
|
return {
|
|
61
|
-
thinking:
|
|
61
|
+
thinking: s(a.join(`
|
|
62
62
|
|
|
63
63
|
`)),
|
|
64
64
|
answer: e,
|
|
65
65
|
isThinking: !1
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
|
-
const f =
|
|
68
|
+
const f = s(
|
|
69
69
|
n.replace(p, "").replace(c, "").trim()
|
|
70
70
|
);
|
|
71
71
|
return {
|
|
72
|
-
thinking:
|
|
72
|
+
thinking: s(a.join(`
|
|
73
73
|
|
|
74
74
|
`)),
|
|
75
75
|
answer: f,
|
|
@@ -79,7 +79,7 @@ function w(n, i = !1) {
|
|
|
79
79
|
export {
|
|
80
80
|
d as hasCitationMarkers,
|
|
81
81
|
T as normalizeAssistantMarkdown,
|
|
82
|
-
|
|
82
|
+
s as normalizeDisplayText,
|
|
83
83
|
w as parseAssistantContent
|
|
84
84
|
};
|
|
85
85
|
//# sourceMappingURL=messageContent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageContent.js","sources":["../../../../../src/components/AgentHub/Chat/utils/messageContent.ts"],"sourcesContent":["const THINK_OPEN = '<' + 'think>';\nconst THINK_CLOSE = '<' + '/think>';\nconst THINK_BLOCK_RE = new RegExp(\n THINK_OPEN.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') +\n '([\\\\s\\\\S]*?)' +\n THINK_CLOSE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n 'gi',\n);\nconst THINK_TAG_RE = /<\\/?think>/gi;\n\nexport interface ParsedAssistantContent {\n /** Reasoning text extracted from think blocks */\n thinking: string;\n /** User-facing answer (outside think blocks) */\n answer: string;\n /** Stream still inside an unclosed think block */\n isThinking: boolean;\n}\n\n/** Collapse excessive blank lines and trim trailing whitespace for display */\nexport function normalizeDisplayText(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n}\n\nconst CITATION_MARKER_TEST_RE = /\\[ID[:-]\\d+\\]/;\n\n/** Normalize assistant markdown from persisted sessions (fences, mermaid blocks). */\nexport function normalizeAssistantMarkdown(content: string): string {\n if (!content) return content;\n\n let text = content.replace(/\\r\\n/g, '\\n');\n\n // Ensure newline after ```mermaid opening fence\n text = text.replace(/```\\s*mermaid[ \\t]*(?!\\n)/gi, '```mermaid\\n');\n\n // Move trailing prose after mermaid block out of the fence when closing ``` is missing\n text = text.replace(\n /```mermaid\\n([\\s\\S]*?)(\\n(?:风格说明|Style)[^\\n`]*[\\s\\S]*?)(?=```|$)/gi,\n (_, chart, prose) => {\n const trimmedChart = chart.trimEnd();\n return `\\`\\`\\`mermaid\\n${trimmedChart}\\n\\`\\`\\`\\n${prose.trim()}`;\n },\n );\n\n return text;\n}\n\nexport function hasCitationMarkers(content: string): boolean {\n return CITATION_MARKER_TEST_RE.test(content);\n}\n\n/**\n * Split assistant output into hidden reasoning and visible answer.\n * RAGFlow / reasoning models may wrap chain-of-thought in think tags.\n */\nexport function parseAssistantContent(content: string, streaming = false): ParsedAssistantContent {\n if (!content) {\n return { thinking: '', answer: '', isThinking: streaming };\n }\n\n const lower = content.toLowerCase();\n const lastClose = lower.lastIndexOf(THINK_CLOSE);\n const lastOpen = lower.lastIndexOf(THINK_OPEN);\n\n const thinkingParts: string[] = [];\n for (const match of content.matchAll(THINK_BLOCK_RE)) {\n const part = match[1]?.trim();\n if (part) thinkingParts.push(part);\n }\n\n // Streaming:
|
|
1
|
+
{"version":3,"file":"messageContent.js","sources":["../../../../../src/components/AgentHub/Chat/utils/messageContent.ts"],"sourcesContent":["const THINK_OPEN = '<' + 'think>';\nconst THINK_CLOSE = '<' + '/think>';\nconst THINK_BLOCK_RE = new RegExp(\n THINK_OPEN.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') +\n '([\\\\s\\\\S]*?)' +\n THINK_CLOSE.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'),\n 'gi',\n);\nconst THINK_TAG_RE = /<\\/?think>/gi;\n\nexport interface ParsedAssistantContent {\n /** Reasoning text extracted from think blocks */\n thinking: string;\n /** User-facing answer (outside think blocks) */\n answer: string;\n /** Stream still inside an unclosed think block */\n isThinking: boolean;\n}\n\n/** Collapse excessive blank lines and trim trailing whitespace for display */\nexport function normalizeDisplayText(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n').trimEnd();\n}\n\nconst CITATION_MARKER_TEST_RE = /\\[ID[:-]\\d+\\]/;\n\n/** Normalize assistant markdown from persisted sessions (fences, mermaid blocks). */\nexport function normalizeAssistantMarkdown(content: string): string {\n if (!content) return content;\n\n let text = content.replace(/\\r\\n/g, '\\n');\n\n // Ensure newline after ```mermaid opening fence\n text = text.replace(/```\\s*mermaid[ \\t]*(?!\\n)/gi, '```mermaid\\n');\n\n // Move trailing prose after mermaid block out of the fence when closing ``` is missing\n text = text.replace(\n /```mermaid\\n([\\s\\S]*?)(\\n(?:风格说明|Style)[^\\n`]*[\\s\\S]*?)(?=```|$)/gi,\n (_, chart, prose) => {\n const trimmedChart = chart.trimEnd();\n return `\\`\\`\\`mermaid\\n${trimmedChart}\\n\\`\\`\\`\\n${prose.trim()}`;\n },\n );\n\n return text;\n}\n\nexport function hasCitationMarkers(content: string): boolean {\n return CITATION_MARKER_TEST_RE.test(content);\n}\n\n/**\n * Split assistant output into hidden reasoning and visible answer.\n * RAGFlow / reasoning models may wrap chain-of-thought in think tags.\n */\nexport function parseAssistantContent(content: string, streaming = false): ParsedAssistantContent {\n if (!content) {\n return { thinking: '', answer: '', isThinking: streaming };\n }\n\n const lower = content.toLowerCase();\n const lastClose = lower.lastIndexOf(THINK_CLOSE);\n const lastOpen = lower.lastIndexOf(THINK_OPEN);\n\n const thinkingParts: string[] = [];\n for (const match of content.matchAll(THINK_BLOCK_RE)) {\n const part = match[1]?.trim();\n if (part) thinkingParts.push(part);\n }\n\n // Streaming: unclosed think block — treat buffered text as reasoning until </think>\n if (streaming && lastClose === -1 && lastOpen !== -1) {\n return {\n thinking: normalizeDisplayText(content.replace(THINK_TAG_RE, '').trim()),\n answer: '',\n isThinking: true,\n };\n }\n\n // Streaming: unclosed think block at the end (open after last close)\n if (lastOpen > lastClose) {\n const beforeOpen = content.slice(0, lastOpen).replace(THINK_TAG_RE, '').trim();\n const insideThink = content\n .slice(lastOpen + THINK_OPEN.length)\n .replace(THINK_TAG_RE, '')\n .trim();\n const thinking = [\n ...(beforeOpen ? [beforeOpen] : []),\n ...thinkingParts,\n ...(insideThink ? [insideThink] : []),\n ].join('\\n\\n');\n\n return {\n thinking: normalizeDisplayText(thinking),\n answer: '',\n isThinking: streaming,\n };\n }\n\n // Prefer final answer after the last closing think tag\n if (lastClose !== -1) {\n const answer = normalizeDisplayText(\n content\n .slice(lastClose + THINK_CLOSE.length)\n .replace(THINK_TAG_RE, '')\n .trim(),\n );\n if (answer) {\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n }\n }\n\n const answer = normalizeDisplayText(\n content.replace(THINK_BLOCK_RE, '').replace(THINK_TAG_RE, '').trim(),\n );\n\n return {\n thinking: normalizeDisplayText(thinkingParts.join('\\n\\n')),\n answer,\n isThinking: false,\n };\n}\n"],"names":["THINK_OPEN","THINK_CLOSE","THINK_BLOCK_RE","THINK_TAG_RE","normalizeDisplayText","text","CITATION_MARKER_TEST_RE","normalizeAssistantMarkdown","content","_","chart","prose","hasCitationMarkers","parseAssistantContent","streaming","_a","lower","lastClose","lastOpen","thinkingParts","match","part","beforeOpen","insideThink","thinking","answer"],"mappings":"AAAA,MAAMA,IAAa,WACbC,IAAc,YACdC,IAAiB,IAAI;AAAA,EACzBF,EAAW,QAAQ,uBAAuB,MAAM,IAC9C,iBACAC,EAAY,QAAQ,uBAAuB,MAAM;AAAA,EACnD;AACF,GACME,IAAe;AAYd,SAASC,EAAqBC,GAAsB;AACzD,SAAOA,EAAK,QAAQ,WAAW;AAAA;AAAA,CAAM,EAAE,QAAA;AACzC;AAEA,MAAMC,IAA0B;AAGzB,SAASC,EAA2BC,GAAyB;AAClE,MAAI,CAACA,EAAS,QAAOA;AAErB,MAAIH,IAAOG,EAAQ,QAAQ,SAAS;AAAA,CAAI;AAGxC,SAAAH,IAAOA,EAAK,QAAQ,+BAA+B,cAAc,GAGjEA,IAAOA,EAAK;AAAA,IACV;AAAA,IACA,CAACI,GAAGC,GAAOC,MAEF;AAAA,EADcD,EAAM,QAAA,CACU;AAAA;AAAA,EAAaC,EAAM,MAAM;AAAA,EAChE,GAGKN;AACT;AAEO,SAASO,EAAmBJ,GAA0B;AAC3D,SAAOF,EAAwB,KAAKE,CAAO;AAC7C;AAMO,SAASK,EAAsBL,GAAiBM,IAAY,IAA+B;AAvDlG,MAAAC;AAwDE,MAAI,CAACP;AACH,WAAO,EAAE,UAAU,IAAI,QAAQ,IAAI,YAAYM,EAAA;AAGjD,QAAME,IAAQR,EAAQ,YAAA,GAChBS,IAAYD,EAAM,YAAYf,CAAW,GACzCiB,IAAWF,EAAM,YAAYhB,CAAU,GAEvCmB,IAA0B,CAAA;AAChC,aAAWC,KAASZ,EAAQ,SAASN,CAAc,GAAG;AACpD,UAAMmB,KAAON,IAAAK,EAAM,CAAC,MAAP,gBAAAL,EAAU;AACvB,IAAIM,KAAMF,EAAc,KAAKE,CAAI;AAAA,EACnC;AAGA,MAAIP,KAAaG,MAAc,MAAMC,MAAa;AAChD,WAAO;AAAA,MACL,UAAUd,EAAqBI,EAAQ,QAAQL,GAAc,EAAE,EAAE,MAAM;AAAA,MACvE,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA;AAKhB,MAAIe,IAAWD,GAAW;AACxB,UAAMK,IAAad,EAAQ,MAAM,GAAGU,CAAQ,EAAE,QAAQf,GAAc,EAAE,EAAE,KAAA,GAClEoB,IAAcf,EACjB,MAAMU,IAAWlB,EAAW,MAAM,EAClC,QAAQG,GAAc,EAAE,EACxB,KAAA,GACGqB,IAAW;AAAA,MACf,GAAIF,IAAa,CAACA,CAAU,IAAI,CAAA;AAAA,MAChC,GAAGH;AAAA,MACH,GAAII,IAAc,CAACA,CAAW,IAAI,CAAA;AAAA,IAAC,EACnC,KAAK;AAAA;AAAA,CAAM;AAEb,WAAO;AAAA,MACL,UAAUnB,EAAqBoB,CAAQ;AAAA,MACvC,QAAQ;AAAA,MACR,YAAYV;AAAA,IAAA;AAAA,EAEhB;AAGA,MAAIG,MAAc,IAAI;AACpB,UAAMQ,IAASrB;AAAA,MACbI,EACG,MAAMS,IAAYhB,EAAY,MAAM,EACpC,QAAQE,GAAc,EAAE,EACxB,KAAA;AAAA,IAAK;AAEV,QAAIsB;AACF,aAAO;AAAA,QACL,UAAUrB,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,QACzD,QAAAM;AAAAA,QACA,YAAY;AAAA,MAAA;AAAA,EAGlB;AAEA,QAAMA,IAASrB;AAAA,IACbI,EAAQ,QAAQN,GAAgB,EAAE,EAAE,QAAQC,GAAc,EAAE,EAAE,KAAA;AAAA,EAAK;AAGrE,SAAO;AAAA,IACL,UAAUC,EAAqBe,EAAc,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,IACzD,QAAAM;AAAA,IACA,YAAY;AAAA,EAAA;AAEhB;"}
|