@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.
Files changed (46) hide show
  1. package/dist/chat-interface-core.d.ts.map +1 -1
  2. package/dist/chat-interface-core.js +6 -2
  3. package/dist/chat-interface-core.js.map +1 -1
  4. package/dist/components/autocomplete-popup.d.ts +12 -0
  5. package/dist/components/autocomplete-popup.d.ts.map +1 -0
  6. package/dist/components/autocomplete-popup.js +35 -0
  7. package/dist/components/autocomplete-popup.js.map +1 -0
  8. package/dist/components/code-block.d.ts +2 -0
  9. package/dist/components/code-block.d.ts.map +1 -0
  10. package/dist/components/code-block.js +58 -0
  11. package/dist/components/code-block.js.map +1 -0
  12. package/dist/components/input-area.d.ts +4 -2
  13. package/dist/components/input-area.d.ts.map +1 -1
  14. package/dist/components/input-area.js +18 -9
  15. package/dist/components/input-area.js.map +1 -1
  16. package/dist/components/message-actions.d.ts +16 -0
  17. package/dist/components/message-actions.d.ts.map +1 -0
  18. package/dist/components/message-actions.js +33 -0
  19. package/dist/components/message-actions.js.map +1 -0
  20. package/dist/components/message-bubble.d.ts.map +1 -1
  21. package/dist/components/message-bubble.js +4 -2
  22. package/dist/components/message-bubble.js.map +1 -1
  23. package/dist/components/message-list.d.ts +6 -2
  24. package/dist/components/message-list.d.ts.map +1 -1
  25. package/dist/components/message-list.js +2 -4
  26. package/dist/components/message-list.js.map +1 -1
  27. package/dist/hooks/use-autocomplete.d.ts +29 -0
  28. package/dist/hooks/use-autocomplete.d.ts.map +1 -0
  29. package/dist/hooks/use-autocomplete.js +149 -0
  30. package/dist/hooks/use-autocomplete.js.map +1 -0
  31. package/dist/hooks/use-chat-scroll.d.ts +12 -7
  32. package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
  33. package/dist/hooks/use-chat-scroll.js +88 -8
  34. package/dist/hooks/use-chat-scroll.js.map +1 -1
  35. package/dist/hooks/use-chat-session.d.ts.map +1 -1
  36. package/dist/hooks/use-chat-session.js +3 -0
  37. package/dist/hooks/use-chat-session.js.map +1 -1
  38. package/dist/index.d.ts +6 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +11 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/utils/markdown-config.d.ts +12 -0
  43. package/dist/utils/markdown-config.d.ts.map +1 -1
  44. package/dist/utils/markdown-config.js +29 -5
  45. package/dist/utils/markdown-config.js.map +1 -1
  46. 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
- * Auto-scrolls to bottom when:
15
- * - A new message arrives (user or assistant)
16
- * - The streaming message grows (if user is near the bottom)
17
- *
18
- * Respects user intent: if the user scrolled up to read history,
19
- * new content does NOT pull them down.
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;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GACV,EAAE,oBAAoB,GAAG,mBAAmB,CAyD5C"}
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
- * Auto-scrolls to bottom when:
10
- * - A new message arrives (user or assistant)
11
- * - The streaming message grows (if user is near the bottom)
12
- *
13
- * Respects user intent: if the user scrolled up to read history,
14
- * new content does NOT pull them down.
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
- return { scrollRef, scrollToBottom, isNearBottom };
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;;;AA0BZ,sCA4DC;AApFD,iCAAsD;AActD;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,GACY;IACrB,MAAM,SAAS,GAAG,IAAA,cAAM,EAAiB,IAAK,CAAC,CAAA;IAC/C,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAA;IAElC,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACpB,MAAM,SAAS,GAAG,GAAG,CAAA;QACrB,OAAO,EAAE,CAAC,YAAY,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,GAAG,SAAS,CAAA;IACrE,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,cAAc,GAAG,IAAA,mBAAW,EAChC,CAAC,WAA2B,QAAQ,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,EAAE;YAAE,OAAM;QACf,EAAE,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAA;IACjD,CAAC,EACD,EAAE,CACH,CAAA;IAED,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAA;QAC5B,IAAI,CAAC,EAAE;YAAE,OAAM;QAEf,MAAM,QAAQ,GAAG,GAAG,EAAE;YACpB,aAAa,CAAC,OAAO,GAAG,YAAY,EAAE,CAAA;QACxC,CAAC,CAAA;QAED,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1D,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACzD,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;IAElB,8BAA8B;IAC9B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,cAAc,CAAC,QAAQ,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAA;IAErC,8CAA8C;IAC9C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS;YAAE,OAAM;QACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,cAAc,CAAC,QAAQ,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;QACP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAA;IAE/B,0BAA0B;IAC1B,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,cAAc,CAAC,SAAS,CAAC,CAAA;QACzB,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,CAAA;AACpD,CAAC"}
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,CA0SvE"}
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":"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"}
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
@@ -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;AAGzE,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"}
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,iEAAyE;AAAhE,mHAAA,aAAa,OAAA;AAAE,mHAAA,aAAa,OAAA"}
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.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,aAAa,EAAE,GAAG,EAA8B,CAAA;AAG7D,eAAO,MAAM,aAAa,EAAE,GAAG,EAAiC,CAAA"}
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.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,4DAAkC;AAClC,kEAAwC;AACxC,4DAAkC;AAClC,wEAA8C;AAE9C,8DAA8D;AACjD,QAAA,aAAa,GAAU,CAAC,oBAAS,EAAE,uBAAY,CAAC,CAAA;AAE7D,8DAA8D;AACjD,QAAA,aAAa,GAAU,CAAC,oBAAS,EAAE,0BAAe,CAAC,CAAA"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portablecore/chat",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Unified chat UI for Portable platforms — composable ChatInterface with extension points",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",