@portablecore/chat 0.2.3 → 0.2.5
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/chat-interface-core.d.ts.map +1 -1
- package/dist/chat-interface-core.js +6 -2
- package/dist/chat-interface-core.js.map +1 -1
- package/dist/components/autocomplete-popup.d.ts +12 -0
- package/dist/components/autocomplete-popup.d.ts.map +1 -0
- package/dist/components/autocomplete-popup.js +35 -0
- package/dist/components/autocomplete-popup.js.map +1 -0
- package/dist/components/code-block.d.ts +2 -0
- package/dist/components/code-block.d.ts.map +1 -0
- package/dist/components/code-block.js +58 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/input-area.d.ts +4 -2
- package/dist/components/input-area.d.ts.map +1 -1
- package/dist/components/input-area.js +18 -9
- package/dist/components/input-area.js.map +1 -1
- package/dist/components/message-actions.d.ts +16 -0
- package/dist/components/message-actions.d.ts.map +1 -0
- package/dist/components/message-actions.js +33 -0
- package/dist/components/message-actions.js.map +1 -0
- package/dist/components/message-bubble.d.ts.map +1 -1
- package/dist/components/message-bubble.js +4 -2
- package/dist/components/message-bubble.js.map +1 -1
- package/dist/components/message-list.d.ts +6 -2
- package/dist/components/message-list.d.ts.map +1 -1
- package/dist/components/message-list.js +2 -4
- package/dist/components/message-list.js.map +1 -1
- package/dist/hooks/use-autocomplete.d.ts +29 -0
- package/dist/hooks/use-autocomplete.d.ts.map +1 -0
- package/dist/hooks/use-autocomplete.js +149 -0
- package/dist/hooks/use-autocomplete.js.map +1 -0
- package/dist/hooks/use-chat-scroll.d.ts +12 -7
- package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
- package/dist/hooks/use-chat-scroll.js +88 -8
- package/dist/hooks/use-chat-scroll.js.map +1 -1
- package/dist/hooks/use-chat-session.d.ts.map +1 -1
- package/dist/hooks/use-chat-session.js +3 -0
- package/dist/hooks/use-chat-session.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/markdown-config.d.ts +12 -0
- package/dist/utils/markdown-config.d.ts.map +1 -1
- package/dist/utils/markdown-config.js +29 -5
- package/dist/utils/markdown-config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { MentionSuggestion, SkillSuggestion } from "@portablecore/types/chat";
|
|
2
|
+
type AnyItem = MentionSuggestion | SkillSuggestion;
|
|
3
|
+
interface UseAutocompleteOptions {
|
|
4
|
+
textareaRef: React.RefObject<HTMLTextAreaElement>;
|
|
5
|
+
mentionResolver?: (query: string) => Promise<MentionSuggestion[]>;
|
|
6
|
+
skillResolver?: (query: string) => Promise<SkillSuggestion[]>;
|
|
7
|
+
onMentionSelect?: (item: MentionSuggestion) => void;
|
|
8
|
+
onSkillSelect?: (item: SkillSuggestion) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Generic autocomplete hook for @ mentions and \ skills.
|
|
12
|
+
*
|
|
13
|
+
* Monitors a textarea for trigger characters:
|
|
14
|
+
* - "@" triggers mention autocomplete (calls mentionResolver)
|
|
15
|
+
* - "\" triggers skill autocomplete (calls skillResolver)
|
|
16
|
+
*
|
|
17
|
+
* Returns state for rendering a popup, and attaches keyboard
|
|
18
|
+
* listeners for arrow navigation, Enter/Tab to select, Escape to close.
|
|
19
|
+
*/
|
|
20
|
+
export declare function useAutocomplete({ textareaRef, mentionResolver, skillResolver, onMentionSelect, onSkillSelect, }: UseAutocompleteOptions): {
|
|
21
|
+
isOpen: boolean;
|
|
22
|
+
items: AnyItem[];
|
|
23
|
+
selectedIndex: number;
|
|
24
|
+
activeType: "mention" | "skill" | null;
|
|
25
|
+
select: (item: AnyItem) => void;
|
|
26
|
+
close: () => void;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=use-autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-autocomplete.d.ts","sourceRoot":"","sources":["../../src/hooks/use-autocomplete.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAElF,KAAK,OAAO,GAAG,iBAAiB,GAAG,eAAe,CAAA;AAElD,UAAU,sBAAsB;IAC9B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IACjD,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACjE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IAC7D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACnD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;CAChD;AASD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,GACd,EAAE,sBAAsB;;;;;mBAiBd,OAAO;;EA6HjB"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.useAutocomplete = useAutocomplete;
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
/**
|
|
7
|
+
* Generic autocomplete hook for @ mentions and \ skills.
|
|
8
|
+
*
|
|
9
|
+
* Monitors a textarea for trigger characters:
|
|
10
|
+
* - "@" triggers mention autocomplete (calls mentionResolver)
|
|
11
|
+
* - "\" triggers skill autocomplete (calls skillResolver)
|
|
12
|
+
*
|
|
13
|
+
* Returns state for rendering a popup, and attaches keyboard
|
|
14
|
+
* listeners for arrow navigation, Enter/Tab to select, Escape to close.
|
|
15
|
+
*/
|
|
16
|
+
function useAutocomplete({ textareaRef, mentionResolver, skillResolver, onMentionSelect, onSkillSelect, }) {
|
|
17
|
+
const [state, setState] = (0, react_1.useState)({
|
|
18
|
+
isOpen: false,
|
|
19
|
+
items: [],
|
|
20
|
+
selectedIndex: 0,
|
|
21
|
+
activeType: null,
|
|
22
|
+
});
|
|
23
|
+
const triggerPosRef = (0, react_1.useRef)(null);
|
|
24
|
+
const debounceRef = (0, react_1.useRef)();
|
|
25
|
+
const close = (0, react_1.useCallback)(() => {
|
|
26
|
+
setState({ isOpen: false, items: [], selectedIndex: 0, activeType: null });
|
|
27
|
+
triggerPosRef.current = null;
|
|
28
|
+
}, []);
|
|
29
|
+
const handleSelect = (0, react_1.useCallback)((item) => {
|
|
30
|
+
const textarea = textareaRef.current;
|
|
31
|
+
if (!textarea || triggerPosRef.current === null)
|
|
32
|
+
return;
|
|
33
|
+
const text = textarea.value;
|
|
34
|
+
const cursorPos = textarea.selectionStart;
|
|
35
|
+
const before = text.substring(0, triggerPosRef.current);
|
|
36
|
+
const after = text.substring(cursorPos);
|
|
37
|
+
if (state.activeType === "mention") {
|
|
38
|
+
const mention = item;
|
|
39
|
+
const insertText = `@${mention.label} `;
|
|
40
|
+
textarea.value = before + insertText + after;
|
|
41
|
+
const newPos = before.length + insertText.length;
|
|
42
|
+
textarea.setSelectionRange(newPos, newPos);
|
|
43
|
+
textarea.dispatchEvent(new Event("input", { bubbles: true }));
|
|
44
|
+
onMentionSelect?.(mention);
|
|
45
|
+
}
|
|
46
|
+
else if (state.activeType === "skill") {
|
|
47
|
+
const skill = item;
|
|
48
|
+
const insertText = `\\${skill.name} `;
|
|
49
|
+
textarea.value = before + insertText + after;
|
|
50
|
+
const newPos = before.length + insertText.length;
|
|
51
|
+
textarea.setSelectionRange(newPos, newPos);
|
|
52
|
+
textarea.dispatchEvent(new Event("input", { bubbles: true }));
|
|
53
|
+
onSkillSelect?.(skill);
|
|
54
|
+
}
|
|
55
|
+
close();
|
|
56
|
+
textarea.focus();
|
|
57
|
+
}, [textareaRef, state.activeType, onMentionSelect, onSkillSelect, close]);
|
|
58
|
+
const handleInput = (0, react_1.useCallback)(() => {
|
|
59
|
+
const textarea = textareaRef.current;
|
|
60
|
+
if (!textarea)
|
|
61
|
+
return;
|
|
62
|
+
const cursorPos = textarea.selectionStart;
|
|
63
|
+
const text = textarea.value;
|
|
64
|
+
let triggerChar = null;
|
|
65
|
+
let triggerPos = -1;
|
|
66
|
+
for (let i = cursorPos - 1; i >= 0; i--) {
|
|
67
|
+
const ch = text[i];
|
|
68
|
+
if (ch === " " || ch === "\n")
|
|
69
|
+
break;
|
|
70
|
+
if (ch === "@") {
|
|
71
|
+
triggerChar = "@";
|
|
72
|
+
triggerPos = i;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (ch === "\\") {
|
|
76
|
+
triggerChar = "\\";
|
|
77
|
+
triggerPos = i;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (triggerPos < 0 || !triggerChar) {
|
|
82
|
+
if (state.isOpen)
|
|
83
|
+
close();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const query = text.substring(triggerPos + 1, cursorPos);
|
|
87
|
+
triggerPosRef.current = triggerPos;
|
|
88
|
+
if (debounceRef.current)
|
|
89
|
+
clearTimeout(debounceRef.current);
|
|
90
|
+
debounceRef.current = setTimeout(async () => {
|
|
91
|
+
try {
|
|
92
|
+
if (triggerChar === "@" && mentionResolver) {
|
|
93
|
+
const items = await mentionResolver(query);
|
|
94
|
+
setState({ isOpen: items.length > 0, items, selectedIndex: 0, activeType: "mention" });
|
|
95
|
+
}
|
|
96
|
+
else if (triggerChar === "\\" && skillResolver) {
|
|
97
|
+
const items = await skillResolver(query);
|
|
98
|
+
setState({ isOpen: items.length > 0, items, selectedIndex: 0, activeType: "skill" });
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
close();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
close();
|
|
106
|
+
}
|
|
107
|
+
}, 50);
|
|
108
|
+
}, [textareaRef, mentionResolver, skillResolver, state.isOpen, close]);
|
|
109
|
+
const handleKeyDown = (0, react_1.useCallback)((e) => {
|
|
110
|
+
if (!state.isOpen)
|
|
111
|
+
return;
|
|
112
|
+
if (e.key === "ArrowDown") {
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
setState((s) => ({ ...s, selectedIndex: Math.min(s.selectedIndex + 1, s.items.length - 1) }));
|
|
115
|
+
}
|
|
116
|
+
else if (e.key === "ArrowUp") {
|
|
117
|
+
e.preventDefault();
|
|
118
|
+
setState((s) => ({ ...s, selectedIndex: Math.max(s.selectedIndex - 1, 0) }));
|
|
119
|
+
}
|
|
120
|
+
else if ((e.key === "Enter" || e.key === "Tab") && state.items[state.selectedIndex]) {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
handleSelect(state.items[state.selectedIndex]);
|
|
123
|
+
}
|
|
124
|
+
else if (e.key === "Escape") {
|
|
125
|
+
e.preventDefault();
|
|
126
|
+
close();
|
|
127
|
+
}
|
|
128
|
+
}, [state, handleSelect, close]);
|
|
129
|
+
(0, react_1.useEffect)(() => {
|
|
130
|
+
const textarea = textareaRef.current;
|
|
131
|
+
if (!textarea)
|
|
132
|
+
return;
|
|
133
|
+
textarea.addEventListener("input", handleInput);
|
|
134
|
+
textarea.addEventListener("keydown", handleKeyDown);
|
|
135
|
+
return () => {
|
|
136
|
+
textarea.removeEventListener("input", handleInput);
|
|
137
|
+
textarea.removeEventListener("keydown", handleKeyDown);
|
|
138
|
+
};
|
|
139
|
+
}, [textareaRef, handleInput, handleKeyDown]);
|
|
140
|
+
return {
|
|
141
|
+
isOpen: state.isOpen,
|
|
142
|
+
items: state.items,
|
|
143
|
+
selectedIndex: state.selectedIndex,
|
|
144
|
+
activeType: state.activeType,
|
|
145
|
+
select: handleSelect,
|
|
146
|
+
close,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=use-autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-autocomplete.js","sourceRoot":"","sources":["../../src/hooks/use-autocomplete.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,18 +5,23 @@ interface UseChatScrollOptions {
|
|
|
5
5
|
}
|
|
6
6
|
interface UseChatScrollReturn {
|
|
7
7
|
scrollRef: React.RefObject<HTMLDivElement>;
|
|
8
|
+
messagesEndRef: React.RefObject<HTMLDivElement>;
|
|
8
9
|
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
9
10
|
isNearBottom: () => boolean;
|
|
11
|
+
spacerExpanded: boolean;
|
|
12
|
+
spacerHeight: number;
|
|
13
|
+
expandSpacer: () => void;
|
|
10
14
|
}
|
|
11
15
|
/**
|
|
12
|
-
* Manages auto-scroll behavior for a chat message list.
|
|
16
|
+
* Manages auto-scroll behavior and the spacer system for a chat message list.
|
|
13
17
|
*
|
|
14
|
-
*
|
|
15
|
-
* -
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* The spacer system (ported from legacy ChatInterface):
|
|
19
|
+
* - When user sends a message, the spacer expands to 100vh, pushing the
|
|
20
|
+
* user message to the top of the viewport to make room for the response.
|
|
21
|
+
* - During streaming, the spacer stays expanded so new content grows downward.
|
|
22
|
+
* - When streaming ends, the spacer shrinks to the exact height needed to
|
|
23
|
+
* keep messages in their current position ("lock" behavior).
|
|
24
|
+
* - When user scrolls up past the lock point, the spacer collapses completely.
|
|
20
25
|
*/
|
|
21
26
|
export declare function useChatScroll({ messages, streaming, }: UseChatScrollOptions): UseChatScrollReturn;
|
|
22
27
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC1C,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC1C,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC/C,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,OAAO,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,GAAG,mBAAmB,CAgJ5C"}
|
|
@@ -4,18 +4,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.useChatScroll = useChatScroll;
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
/**
|
|
7
|
-
* Manages auto-scroll behavior for a chat message list.
|
|
7
|
+
* Manages auto-scroll behavior and the spacer system for a chat message list.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* -
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
9
|
+
* The spacer system (ported from legacy ChatInterface):
|
|
10
|
+
* - When user sends a message, the spacer expands to 100vh, pushing the
|
|
11
|
+
* user message to the top of the viewport to make room for the response.
|
|
12
|
+
* - During streaming, the spacer stays expanded so new content grows downward.
|
|
13
|
+
* - When streaming ends, the spacer shrinks to the exact height needed to
|
|
14
|
+
* keep messages in their current position ("lock" behavior).
|
|
15
|
+
* - When user scrolls up past the lock point, the spacer collapses completely.
|
|
15
16
|
*/
|
|
16
17
|
function useChatScroll({ messages, streaming, }) {
|
|
17
18
|
const scrollRef = (0, react_1.useRef)(null);
|
|
19
|
+
const messagesEndRef = (0, react_1.useRef)(null);
|
|
18
20
|
const wasNearBottom = (0, react_1.useRef)(true);
|
|
21
|
+
const wasStreamingRef = (0, react_1.useRef)(false);
|
|
22
|
+
const lockedScrollPosition = (0, react_1.useRef)(null);
|
|
23
|
+
const lastMessageCountRef = (0, react_1.useRef)(messages.length);
|
|
24
|
+
const lastProgrammaticScroll = (0, react_1.useRef)(0);
|
|
25
|
+
const [spacerExpanded, setSpacerExpanded] = (0, react_1.useState)(false);
|
|
26
|
+
const [spacerHeight, setSpacerHeight] = (0, react_1.useState)(0);
|
|
19
27
|
const isNearBottom = (0, react_1.useCallback)(() => {
|
|
20
28
|
const el = scrollRef.current;
|
|
21
29
|
if (!el)
|
|
@@ -27,13 +35,22 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
27
35
|
const el = scrollRef.current;
|
|
28
36
|
if (!el)
|
|
29
37
|
return;
|
|
38
|
+
lastProgrammaticScroll.current = Date.now();
|
|
30
39
|
el.scrollTo({ top: el.scrollHeight, behavior });
|
|
31
40
|
}, []);
|
|
41
|
+
const expandSpacer = (0, react_1.useCallback)(() => {
|
|
42
|
+
setSpacerExpanded(true);
|
|
43
|
+
setSpacerHeight(0);
|
|
44
|
+
lockedScrollPosition.current = null;
|
|
45
|
+
}, []);
|
|
46
|
+
// Track scroll position for auto-scroll gating
|
|
32
47
|
(0, react_1.useEffect)(() => {
|
|
33
48
|
const el = scrollRef.current;
|
|
34
49
|
if (!el)
|
|
35
50
|
return;
|
|
36
51
|
const onScroll = () => {
|
|
52
|
+
if (Date.now() - lastProgrammaticScroll.current < 200)
|
|
53
|
+
return;
|
|
37
54
|
wasNearBottom.current = isNearBottom();
|
|
38
55
|
};
|
|
39
56
|
el.addEventListener("scroll", onScroll, { passive: true });
|
|
@@ -61,6 +78,69 @@ function useChatScroll({ messages, streaming, }) {
|
|
|
61
78
|
scrollToBottom("instant");
|
|
62
79
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
63
80
|
}, []);
|
|
64
|
-
|
|
81
|
+
// Lock messages in place when streaming ends
|
|
82
|
+
(0, react_1.useEffect)(() => {
|
|
83
|
+
if (streaming) {
|
|
84
|
+
wasStreamingRef.current = true;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (wasStreamingRef.current && spacerExpanded) {
|
|
88
|
+
wasStreamingRef.current = false;
|
|
89
|
+
const container = scrollRef.current;
|
|
90
|
+
const endMarker = messagesEndRef.current;
|
|
91
|
+
if (container && endMarker) {
|
|
92
|
+
const containerRect = container.getBoundingClientRect();
|
|
93
|
+
const endRect = endMarker.getBoundingClientRect();
|
|
94
|
+
const spaceBelow = containerRect.bottom - endRect.bottom;
|
|
95
|
+
const newSpacerHeight = Math.max(0, spaceBelow);
|
|
96
|
+
setSpacerHeight(newSpacerHeight);
|
|
97
|
+
setSpacerExpanded(false);
|
|
98
|
+
lockedScrollPosition.current = container.scrollTop;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}, [streaming, spacerExpanded]);
|
|
102
|
+
// Fallback: collapse spacer if new assistant message arrives without streaming
|
|
103
|
+
(0, react_1.useEffect)(() => {
|
|
104
|
+
const messageCount = messages.length;
|
|
105
|
+
const hadNewMessage = messageCount > lastMessageCountRef.current;
|
|
106
|
+
lastMessageCountRef.current = messageCount;
|
|
107
|
+
if (spacerExpanded && !streaming && hadNewMessage) {
|
|
108
|
+
const lastMessage = messages[messages.length - 1];
|
|
109
|
+
if (lastMessage?.role === "assistant") {
|
|
110
|
+
const timeoutId = setTimeout(() => {
|
|
111
|
+
if (!streaming && spacerExpanded) {
|
|
112
|
+
setSpacerExpanded(false);
|
|
113
|
+
setSpacerHeight(16);
|
|
114
|
+
}
|
|
115
|
+
}, 500);
|
|
116
|
+
return () => clearTimeout(timeoutId);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, [messages.length, spacerExpanded, streaming, messages]);
|
|
120
|
+
// Collapse spacer when user scrolls up past lock point
|
|
121
|
+
(0, react_1.useEffect)(() => {
|
|
122
|
+
const container = scrollRef.current;
|
|
123
|
+
if (!container)
|
|
124
|
+
return;
|
|
125
|
+
const handleScroll = () => {
|
|
126
|
+
if (lockedScrollPosition.current === null || spacerHeight <= 16)
|
|
127
|
+
return;
|
|
128
|
+
if (container.scrollTop < lockedScrollPosition.current - 50) {
|
|
129
|
+
setSpacerHeight(16);
|
|
130
|
+
lockedScrollPosition.current = null;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
container.addEventListener("scroll", handleScroll, { passive: true });
|
|
134
|
+
return () => container.removeEventListener("scroll", handleScroll);
|
|
135
|
+
}, [spacerHeight]);
|
|
136
|
+
return {
|
|
137
|
+
scrollRef,
|
|
138
|
+
messagesEndRef,
|
|
139
|
+
scrollToBottom,
|
|
140
|
+
isNearBottom,
|
|
141
|
+
spacerExpanded,
|
|
142
|
+
spacerHeight,
|
|
143
|
+
expandSpacer,
|
|
144
|
+
};
|
|
65
145
|
}
|
|
66
146
|
//# sourceMappingURL=use-chat-scroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-session.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-session.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,WAAW,EAEX,mBAAmB,EACpB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,4BAA4B,CAAA;AAMnC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,yEAAyE;IACzE,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,kBAAkB,EAAE,CAAA;IACpC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACpC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"use-chat-session.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-session.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,WAAW,EAEX,mBAAmB,EACpB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,4BAA4B,CAAA;AAMnC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,yEAAyE;IACzE,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,kBAAkB,EAAE,CAAA;IACpC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAA;IACpC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACxC,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAMD,wBAAgB,cAAc,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW,CA6SvE"}
|
|
@@ -110,7 +110,10 @@ function useChatSession(config) {
|
|
|
110
110
|
flushPendingContent();
|
|
111
111
|
const target = streamingMessageId.current || tempId;
|
|
112
112
|
setMessages((prev) => prev.filter((m) => m.id !== target));
|
|
113
|
+
// Reset so thinking dots reappear naturally between phases
|
|
114
|
+
// (e.g., FR → primary model transition). Legacy: line 3749.
|
|
113
115
|
bubbleCreated = false;
|
|
116
|
+
setAwaitingText(true);
|
|
114
117
|
break;
|
|
115
118
|
}
|
|
116
119
|
case "first_response": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-session.js","sourceRoot":"","sources":["../../src/hooks/use-chat-session.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAqDZ,
|
|
1
|
+
{"version":3,"file":"use-chat-session.js","sourceRoot":"","sources":["../../src/hooks/use-chat-session.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export { ChatInterfaceCore } from "./chat-interface-core.js";
|
|
|
13
13
|
export { useChatSession } from "./hooks/use-chat-session.js";
|
|
14
14
|
export type { ChatSession } from "./hooks/use-chat-session.js";
|
|
15
15
|
export { useChatScroll } from "./hooks/use-chat-scroll.js";
|
|
16
|
+
export { useAutocomplete } from "./hooks/use-autocomplete.js";
|
|
17
|
+
export { AutocompletePopup } from "./components/autocomplete-popup.js";
|
|
16
18
|
export { useAttachments } from "./hooks/use-attachments.js";
|
|
17
19
|
export type { AttachmentState } from "./hooks/use-attachments.js";
|
|
18
20
|
export { MessageList } from "./components/message-list.js";
|
|
@@ -23,9 +25,12 @@ export { BouncingDots } from "./components/bouncing-dots.js";
|
|
|
23
25
|
export { ThinkingIndicator } from "./components/thinking-indicator.js";
|
|
24
26
|
export type { ThinkingStage } from "./components/thinking-indicator.js";
|
|
25
27
|
export { SkillIndicator } from "./components/skill-indicator.js";
|
|
28
|
+
export { CodeBlock } from "./components/code-block.js";
|
|
29
|
+
export { MessageActions } from "./components/message-actions.js";
|
|
30
|
+
export type { MessageAction } from "./components/message-actions.js";
|
|
26
31
|
export { EmptyState } from "./components/empty-state.js";
|
|
27
32
|
export { formatTime, getDateSeparator, isDifferentDay } from "./utils/time.js";
|
|
28
33
|
export { groupMessages } from "./utils/message-grouping.js";
|
|
29
|
-
export { remarkPlugins, rehypePlugins } from "./utils/markdown-config.js";
|
|
34
|
+
export { remarkPlugins, rehypePlugins, defaultMarkdownComponents } from "./utils/markdown-config.js";
|
|
30
35
|
export type { ChatInterfaceConfig, ChatFeatureFlags, ChatVariant, ChatClassNames, StreamBodyOpts, MentionSuggestion, SkillSuggestion, DocumentRef, LiteMessage, MessageType, SseEvent, ChatSlots, RenderableMessage, } from "./types.js";
|
|
31
36
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAGpG,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,iBAAiB,GAClB,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* slots, resolvers, handlers).
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.EmptyState = exports.SkillIndicator = exports.ThinkingIndicator = exports.BouncingDots = exports.StreamingText = exports.InputArea = exports.MessageBubble = exports.MessageList = exports.useAttachments = exports.useChatScroll = exports.useChatSession = exports.ChatInterfaceCore = void 0;
|
|
14
|
+
exports.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.EmptyState = exports.MessageActions = exports.CodeBlock = exports.SkillIndicator = exports.ThinkingIndicator = exports.BouncingDots = exports.StreamingText = exports.InputArea = exports.MessageBubble = exports.MessageList = exports.useAttachments = exports.AutocompletePopup = exports.useAutocomplete = exports.useChatScroll = exports.useChatSession = exports.ChatInterfaceCore = void 0;
|
|
15
15
|
// The main product
|
|
16
16
|
var chat_interface_core_js_1 = require("./chat-interface-core.js");
|
|
17
17
|
Object.defineProperty(exports, "ChatInterfaceCore", { enumerable: true, get: function () { return chat_interface_core_js_1.ChatInterfaceCore; } });
|
|
@@ -21,6 +21,11 @@ Object.defineProperty(exports, "useChatSession", { enumerable: true, get: functi
|
|
|
21
21
|
// Scroll management
|
|
22
22
|
var use_chat_scroll_js_1 = require("./hooks/use-chat-scroll.js");
|
|
23
23
|
Object.defineProperty(exports, "useChatScroll", { enumerable: true, get: function () { return use_chat_scroll_js_1.useChatScroll; } });
|
|
24
|
+
// Autocomplete
|
|
25
|
+
var use_autocomplete_js_1 = require("./hooks/use-autocomplete.js");
|
|
26
|
+
Object.defineProperty(exports, "useAutocomplete", { enumerable: true, get: function () { return use_autocomplete_js_1.useAutocomplete; } });
|
|
27
|
+
var autocomplete_popup_js_1 = require("./components/autocomplete-popup.js");
|
|
28
|
+
Object.defineProperty(exports, "AutocompletePopup", { enumerable: true, get: function () { return autocomplete_popup_js_1.AutocompletePopup; } });
|
|
24
29
|
// Attachments
|
|
25
30
|
var use_attachments_js_1 = require("./hooks/use-attachments.js");
|
|
26
31
|
Object.defineProperty(exports, "useAttachments", { enumerable: true, get: function () { return use_attachments_js_1.useAttachments; } });
|
|
@@ -39,6 +44,10 @@ var thinking_indicator_js_1 = require("./components/thinking-indicator.js");
|
|
|
39
44
|
Object.defineProperty(exports, "ThinkingIndicator", { enumerable: true, get: function () { return thinking_indicator_js_1.ThinkingIndicator; } });
|
|
40
45
|
var skill_indicator_js_1 = require("./components/skill-indicator.js");
|
|
41
46
|
Object.defineProperty(exports, "SkillIndicator", { enumerable: true, get: function () { return skill_indicator_js_1.SkillIndicator; } });
|
|
47
|
+
var code_block_js_1 = require("./components/code-block.js");
|
|
48
|
+
Object.defineProperty(exports, "CodeBlock", { enumerable: true, get: function () { return code_block_js_1.CodeBlock; } });
|
|
49
|
+
var message_actions_js_1 = require("./components/message-actions.js");
|
|
50
|
+
Object.defineProperty(exports, "MessageActions", { enumerable: true, get: function () { return message_actions_js_1.MessageActions; } });
|
|
42
51
|
var empty_state_js_1 = require("./components/empty-state.js");
|
|
43
52
|
Object.defineProperty(exports, "EmptyState", { enumerable: true, get: function () { return empty_state_js_1.EmptyState; } });
|
|
44
53
|
// Utilities
|
|
@@ -51,4 +60,5 @@ Object.defineProperty(exports, "groupMessages", { enumerable: true, get: functio
|
|
|
51
60
|
var markdown_config_js_1 = require("./utils/markdown-config.js");
|
|
52
61
|
Object.defineProperty(exports, "remarkPlugins", { enumerable: true, get: function () { return markdown_config_js_1.remarkPlugins; } });
|
|
53
62
|
Object.defineProperty(exports, "rehypePlugins", { enumerable: true, get: function () { return markdown_config_js_1.rehypePlugins; } });
|
|
63
|
+
Object.defineProperty(exports, "defaultMarkdownComponents", { enumerable: true, get: function () { return markdown_config_js_1.defaultMarkdownComponents; } });
|
|
54
64
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,mBAAmB;AACnB,mEAA4D;AAAnD,2HAAA,iBAAiB,OAAA;AAE1B,qEAAqE;AACrE,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,oBAAoB;AACpB,iEAA0D;AAAjD,mHAAA,aAAa,OAAA;AAEtB,cAAc;AACd,iEAA2D;AAAlD,oHAAA,cAAc,OAAA;AAGvB,sEAAsE;AACtE,gEAA0D;AAAjD,8GAAA,WAAW,OAAA;AACpB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,kEAA4D;AAAnD,gHAAA,YAAY,OAAA;AACrB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AACvB,8DAAwD;AAA/C,4GAAA,UAAU,OAAA;AAEnB,YAAY;AACZ,2CAA8E;AAArE,qGAAA,UAAU,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AACrD,mEAA2D;AAAlD,oHAAA,aAAa,OAAA;AACtB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,mBAAmB;AACnB,mEAA4D;AAAnD,2HAAA,iBAAiB,OAAA;AAE1B,qEAAqE;AACrE,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,oBAAoB;AACpB,iEAA0D;AAAjD,mHAAA,aAAa,OAAA;AAEtB,eAAe;AACf,mEAA6D;AAApD,sHAAA,eAAe,OAAA;AACxB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,cAAc;AACd,iEAA2D;AAAlD,oHAAA,cAAc,OAAA;AAGvB,sEAAsE;AACtE,gEAA0D;AAAjD,8GAAA,WAAW,OAAA;AACpB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,kEAA4D;AAAnD,gHAAA,YAAY,OAAA;AACrB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AACvB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AAEvB,8DAAwD;AAA/C,4GAAA,UAAU,OAAA;AAEnB,YAAY;AACZ,2CAA8E;AAArE,qGAAA,UAAU,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AACrD,mEAA2D;AAAlD,oHAAA,aAAa,OAAA;AACtB,iEAAoG;AAA3F,mHAAA,aAAa,OAAA;AAAE,mHAAA,aAAa,OAAA;AAAE,+HAAA,yBAAyB,OAAA"}
|
|
@@ -6,4 +6,16 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export declare const remarkPlugins: any[];
|
|
8
8
|
export declare const rehypePlugins: any[];
|
|
9
|
+
/**
|
|
10
|
+
* Default markdown component overrides for chat messages.
|
|
11
|
+
*
|
|
12
|
+
* Includes:
|
|
13
|
+
* - CodeBlock with copy button and language labels (pre)
|
|
14
|
+
* - Scrollable table wrapper with styled headers/cells
|
|
15
|
+
* - XML tag suppression for AI tool-calling artifacts
|
|
16
|
+
*
|
|
17
|
+
* Consumers can extend these via the markdownComponents prop
|
|
18
|
+
* on ChatInterfaceCore. Consumer overrides take precedence.
|
|
19
|
+
*/
|
|
20
|
+
export declare const defaultMarkdownComponents: Record<string, any>;
|
|
9
21
|
//# sourceMappingURL=markdown-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-config.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-config.
|
|
1
|
+
{"version":3,"file":"markdown-config.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-config.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,eAAO,MAAM,aAAa,EAAE,GAAG,EAA8B,CAAA;AAG7D,eAAO,MAAM,aAAa,EAAE,GAAG,EAAiC,CAAA;AAEhE;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CA0BzD,CAAA"}
|
|
@@ -1,21 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
2
8
|
/**
|
|
3
9
|
* Shared markdown plugin configuration for chat messages.
|
|
4
10
|
*
|
|
5
11
|
* Both StreamingText (post-stream render) and MessageBubble
|
|
6
12
|
* use the same plugin set for consistent rendering.
|
|
7
13
|
*/
|
|
8
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.rehypePlugins = exports.remarkPlugins = void 0;
|
|
13
14
|
const remark_gfm_1 = __importDefault(require("remark-gfm"));
|
|
14
15
|
const remark_breaks_1 = __importDefault(require("remark-breaks"));
|
|
15
16
|
const rehype_raw_1 = __importDefault(require("rehype-raw"));
|
|
16
17
|
const rehype_highlight_1 = __importDefault(require("rehype-highlight"));
|
|
18
|
+
const code_block_js_1 = require("../components/code-block.js");
|
|
17
19
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
18
20
|
exports.remarkPlugins = [remark_gfm_1.default, remark_breaks_1.default];
|
|
19
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
22
|
exports.rehypePlugins = [rehype_raw_1.default, rehype_highlight_1.default];
|
|
23
|
+
/**
|
|
24
|
+
* Default markdown component overrides for chat messages.
|
|
25
|
+
*
|
|
26
|
+
* Includes:
|
|
27
|
+
* - CodeBlock with copy button and language labels (pre)
|
|
28
|
+
* - Scrollable table wrapper with styled headers/cells
|
|
29
|
+
* - XML tag suppression for AI tool-calling artifacts
|
|
30
|
+
*
|
|
31
|
+
* Consumers can extend these via the markdownComponents prop
|
|
32
|
+
* on ChatInterfaceCore. Consumer overrides take precedence.
|
|
33
|
+
*/
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
+
exports.defaultMarkdownComponents = {
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
pre: (props) => (0, jsx_runtime_1.jsx)(code_block_js_1.CodeBlock, { ...props }),
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
table: (props) => ((0, jsx_runtime_1.jsx)("div", { className: "overflow-x-auto -mx-2 px-2 my-3", children: (0, jsx_runtime_1.jsx)("table", { className: "min-w-full border-collapse text-sm", ...props }) })),
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
41
|
+
th: ({ vAlign: _v, align: _a, ...rest }) => ((0, jsx_runtime_1.jsx)("th", { className: "border border-slate-200 dark:border-slate-600 bg-slate-100 dark:bg-slate-700 px-3 py-2 text-left font-semibold text-slate-900 dark:text-slate-100 whitespace-nowrap", ...rest })),
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
+
td: ({ vAlign: _v, align: _a, ...rest }) => ((0, jsx_runtime_1.jsx)("td", { className: "border border-slate-200 dark:border-slate-600 px-3 py-2 text-slate-700 dark:text-slate-300", ...rest })),
|
|
44
|
+
};
|
|
21
45
|
//# sourceMappingURL=markdown-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-config.js","sourceRoot":"","sources":["../../src/utils/markdown-config.
|
|
1
|
+
{"version":3,"file":"markdown-config.js","sourceRoot":"","sources":["../../src/utils/markdown-config.tsx"],"names":[],"mappings":";;;;;;;AAAA;;;;;GAKG;AAEH,4DAAkC;AAClC,kEAAwC;AACxC,4DAAkC;AAClC,wEAA8C;AAC9C,+DAAuD;AAEvD,8DAA8D;AACjD,QAAA,aAAa,GAAU,CAAC,oBAAS,EAAE,uBAAY,CAAC,CAAA;AAE7D,8DAA8D;AACjD,QAAA,aAAa,GAAU,CAAC,oBAAS,EAAE,0BAAe,CAAC,CAAA;AAEhE;;;;;;;;;;GAUG;AACH,8DAA8D;AACjD,QAAA,yBAAyB,GAAwB;IAC5D,8DAA8D;IAC9D,GAAG,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,uBAAC,yBAAS,OAAK,KAAK,GAAI;IAE7C,8DAA8D;IAC9D,KAAK,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,CACrB,gCAAK,SAAS,EAAC,iCAAiC,YAC9C,kCAAO,SAAS,EAAC,oCAAoC,KAAK,KAAK,GAAI,GAC/D,CACP;IAED,8DAA8D;IAC9D,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,EAAO,EAAE,EAAE,CAAC,CAC/C,+BACE,SAAS,EAAC,qKAAqK,KAC3K,IAAI,GACR,CACH;IAED,8DAA8D;IAC9D,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,IAAI,EAAO,EAAE,EAAE,CAAC,CAC/C,+BACE,SAAS,EAAC,4FAA4F,KAClG,IAAI,GACR,CACH;CACF,CAAA"}
|
package/package.json
CHANGED