@portablecore/chat 0.2.11 → 0.2.13

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.
@@ -1 +1 @@
1
- {"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAahE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACnB,EAAE,sBAAsB,2CAuKxB"}
1
+ {"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAehE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACnB,EAAE,sBAAsB,2CAmMxB"}
@@ -8,12 +8,14 @@ const use_chat_session_js_1 = require("./hooks/use-chat-session.js");
8
8
  const use_chat_scroll_js_1 = require("./hooks/use-chat-scroll.js");
9
9
  const use_attachments_js_1 = require("./hooks/use-attachments.js");
10
10
  const use_whisper_mode_js_1 = require("./hooks/use-whisper-mode.js");
11
+ const use_thread_filter_js_1 = require("./hooks/use-thread-filter.js");
11
12
  const message_list_js_1 = require("./components/message-list.js");
12
13
  const input_area_js_1 = require("./components/input-area.js");
13
14
  const bouncing_dots_js_1 = require("./components/bouncing-dots.js");
14
15
  const thinking_indicator_js_1 = require("./components/thinking-indicator.js");
15
16
  const skill_indicator_js_1 = require("./components/skill-indicator.js");
16
17
  const empty_state_js_1 = require("./components/empty-state.js");
18
+ const thread_filter_header_js_1 = require("./components/thread-filter-header.js");
17
19
  /**
18
20
  * ChatInterfaceCore — The unified chat experience.
19
21
  *
@@ -29,12 +31,26 @@ const empty_state_js_1 = require("./components/empty-state.js");
29
31
  */
30
32
  function ChatInterfaceCore({ config, markdownComponents, }) {
31
33
  const session = (0, use_chat_session_js_1.useChatSession)(config);
32
- const scroll = (0, use_chat_scroll_js_1.useChatScroll)({ messages: session.messages, streaming: session.streaming });
34
+ const threadConfig = config.thread;
35
+ const selectedThreadId = threadConfig?.selectedId ?? null;
36
+ const onThreadMessageCountChange = (0, react_1.useCallback)((threadId, count) => {
37
+ threadConfig?.onMessageCountChange?.(threadId, count);
38
+ },
39
+ // eslint-disable-next-line react-hooks/exhaustive-deps
40
+ [threadConfig?.onMessageCountChange]);
41
+ const threadFilter = (0, use_thread_filter_js_1.useThreadFilter)({
42
+ messages: session.messages,
43
+ selectedThreadId,
44
+ onMessageCountChange: onThreadMessageCountChange,
45
+ });
46
+ const displayMessages = threadFilter.filteredMessages;
47
+ const scroll = (0, use_chat_scroll_js_1.useChatScroll)({ messages: displayMessages, streaming: session.streaming });
33
48
  const attachmentState = (0, use_attachments_js_1.useAttachments)(config.resolvers?.documentResolver);
34
49
  const slots = (config.slots || {});
35
50
  const variant = config.variant || "full";
36
51
  const isCompact = variant === "compact";
37
52
  const whisperEnabled = config.features?.whispers === true;
53
+ const threadsEnabled = config.features?.threads === true;
38
54
  // Build whisper recipients from config experts + users
39
55
  const whisperRecipients = (0, react_1.useMemo)(() => {
40
56
  if (!whisperEnabled)
@@ -111,7 +127,7 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
111
127
  }
112
128
  return ((0, jsx_runtime_1.jsx)("div", { className: `${indicatorMaxWidth} mx-auto px-4`, children: (0, jsx_runtime_1.jsx)(bouncing_dots_js_1.BouncingDots, { expertName: config.expert?.name, expertAvatarUrl: config.expert?.avatarUrl, expertEmoji: config.expert?.emoji }) }));
113
129
  };
114
- return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [(0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: session.messages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }) }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
130
+ return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [threadsEnabled && threadFilter.isFiltered && threadConfig?.selectedTitle && threadConfig.onClear && ((0, jsx_runtime_1.jsx)(thread_filter_header_js_1.ThreadFilterHeader, { threadTitle: threadConfig.selectedTitle, messageCount: displayMessages.length, onClear: threadConfig.onClear })), (0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: displayMessages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }) }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
115
131
  ? `Message ${config.expert.name}...`
116
132
  : "Send a message...", prefillText: config.prefillText, inputPrefix: slots.inputPrefix, inputSuffix: slots.inputSuffix, attachments: attachmentState.attachments, uploading: attachmentState.uploading, onAddFiles: attachmentState.addFiles, onRemoveAttachment: attachmentState.remove, hasDocumentResolver: !!config.resolvers?.documentResolver, variant: variant, classNames: config.classNames, mentionResolver: config.resolvers?.mentionResolver, skillResolver: config.resolvers?.skillResolver, whisper: whisperInputProps })] }), slots.sidePanel && ((0, jsx_runtime_1.jsx)("div", { className: "w-80 border-l border-border overflow-y-auto", children: slots.sidePanel }))] }));
117
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ interface ThreadFilterHeaderProps {
2
+ threadTitle: string;
3
+ messageCount: number;
4
+ onClear: () => void;
5
+ }
6
+ /**
7
+ * Header shown when viewing a filtered thread.
8
+ * Displays the thread name, message count, and provides an exit button.
9
+ *
10
+ * Faithfully reproduces the legacy Expert ThreadFilterHeader layout:
11
+ * - ThreadsIcon (4-line staggered list) + title + count on the left
12
+ * - "Exit thread" button with X icon on the right
13
+ * - Surface-2 background with bottom border
14
+ */
15
+ export declare function ThreadFilterHeader({ threadTitle, messageCount, onClear, }: ThreadFilterHeaderProps): import("react/jsx-runtime").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=thread-filter-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-filter-header.d.ts","sourceRoot":"","sources":["../../src/components/thread-filter-header.tsx"],"names":[],"mappings":"AAIA,UAAU,uBAAuB;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,YAAY,EACZ,OAAO,GACR,EAAE,uBAAuB,2CAoCzB"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.ThreadFilterHeader = ThreadFilterHeader;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const lucide_react_1 = require("lucide-react");
7
+ /**
8
+ * Header shown when viewing a filtered thread.
9
+ * Displays the thread name, message count, and provides an exit button.
10
+ *
11
+ * Faithfully reproduces the legacy Expert ThreadFilterHeader layout:
12
+ * - ThreadsIcon (4-line staggered list) + title + count on the left
13
+ * - "Exit thread" button with X icon on the right
14
+ * - Surface-2 background with bottom border
15
+ */
16
+ function ThreadFilterHeader({ threadTitle, messageCount, onClear, }) {
17
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between px-4 py-2 bg-[var(--surface-2,#f1f5f9)] dark:bg-[var(--surface-2,#1e293b)] border-b border-[var(--border-default,#e2e8f0)] dark:border-[var(--border-default,#334155)]", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-2 min-w-0", children: [(0, jsx_runtime_1.jsx)("svg", { className: "w-4 h-4 text-slate-500 dark:text-slate-400 flex-shrink-0", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: (0, jsx_runtime_1.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 10h16M4 14h10M4 18h6" }) }), (0, jsx_runtime_1.jsxs)("div", { className: "min-w-0", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-sm font-medium text-slate-900 dark:text-slate-100 truncate block", children: threadTitle }), (0, jsx_runtime_1.jsxs)("span", { className: "text-xs text-slate-500 dark:text-slate-400", children: [messageCount, " ", messageCount === 1 ? "message" : "messages", " in thread"] })] })] }), (0, jsx_runtime_1.jsxs)("button", { onClick: onClear, className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-slate-500 dark:text-slate-400 hover:text-slate-700 dark:hover:text-slate-200 hover:bg-slate-200/50 dark:hover:bg-slate-700/50 rounded-lg transition-colors", title: "Show all messages", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.X, { className: "w-3 h-3" }), (0, jsx_runtime_1.jsx)("span", { children: "Exit thread" })] })] }));
18
+ }
19
+ //# sourceMappingURL=thread-filter-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-filter-header.js","sourceRoot":"","sources":["../../src/components/thread-filter-header.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAmBZ,gDAwCC;;AAzDD,+CAAgC;AAQhC;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,YAAY,EACZ,OAAO,GACiB;IACxB,OAAO,CACL,iCAAK,SAAS,EAAC,0MAA0M,aACvN,iCAAK,SAAS,EAAC,iCAAiC,aAC9C,gCACE,SAAS,EAAC,0DAA0D,EACpE,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,OAAO,EAAC,WAAW,YAEnB,iCACE,aAAa,EAAC,OAAO,EACrB,cAAc,EAAC,OAAO,EACtB,WAAW,EAAE,CAAC,EACd,CAAC,EAAC,gCAAgC,GAClC,GACE,EACN,iCAAK,SAAS,EAAC,SAAS,aACtB,iCAAM,SAAS,EAAC,uEAAuE,YACpF,WAAW,GACP,EACP,kCAAM,SAAS,EAAC,4CAA4C,aACzD,YAAY,OAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,kBACtD,IACH,IACF,EACN,oCACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,2NAA2N,EACrO,KAAK,EAAC,mBAAmB,aAEzB,uBAAC,gBAAC,IAAC,SAAS,EAAC,SAAS,GAAG,EACzB,2DAAwB,IACjB,IACL,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { LiteMessage } from "../types.js";
2
+ interface UseThreadFilterOpts {
3
+ messages: LiteMessage[];
4
+ selectedThreadId: string | null;
5
+ onMessageCountChange?: (threadId: string, count: number) => void;
6
+ }
7
+ interface UseThreadFilterReturn {
8
+ filteredMessages: LiteMessage[];
9
+ isFiltered: boolean;
10
+ /** True during the frame after a thread switch (for scroll transition) */
11
+ transitionPending: boolean;
12
+ }
13
+ /**
14
+ * Filters messages by thread ID with smart fallback logic.
15
+ *
16
+ * Inclusion rules (ported from legacy ChatInterface):
17
+ * 1. Direct match: message.threadId === selectedThreadId
18
+ * 2. User message without threadId: include if next assistant message is in thread
19
+ * 3. Assistant message without threadId: include if preceding user message is in thread
20
+ * (handles older messages saved before thread_id was set at INSERT time)
21
+ */
22
+ export declare function useThreadFilter({ messages, selectedThreadId, onMessageCountChange, }: UseThreadFilterOpts): UseThreadFilterReturn;
23
+ export {};
24
+ //# sourceMappingURL=use-thread-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-thread-filter.d.ts","sourceRoot":"","sources":["../../src/hooks/use-thread-filter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjE;AAED,UAAU,qBAAqB;IAC7B,gBAAgB,EAAE,WAAW,EAAE,CAAA;IAC/B,UAAU,EAAE,OAAO,CAAA;IACnB,0EAA0E;IAC1E,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,GACrB,EAAE,mBAAmB,GAAG,qBAAqB,CAsE7C"}
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useThreadFilter = useThreadFilter;
5
+ const react_1 = require("react");
6
+ /**
7
+ * Filters messages by thread ID with smart fallback logic.
8
+ *
9
+ * Inclusion rules (ported from legacy ChatInterface):
10
+ * 1. Direct match: message.threadId === selectedThreadId
11
+ * 2. User message without threadId: include if next assistant message is in thread
12
+ * 3. Assistant message without threadId: include if preceding user message is in thread
13
+ * (handles older messages saved before thread_id was set at INSERT time)
14
+ */
15
+ function useThreadFilter({ messages, selectedThreadId, onMessageCountChange, }) {
16
+ const prevThreadIdRef = (0, react_1.useRef)(undefined);
17
+ const transitionPendingRef = (0, react_1.useRef)(false);
18
+ const filteredMessages = (0, react_1.useMemo)(() => {
19
+ if (!selectedThreadId)
20
+ return messages;
21
+ return messages.filter((msg, idx) => {
22
+ if (msg.threadId === selectedThreadId)
23
+ return true;
24
+ if (msg.role === "user" && !msg.threadId) {
25
+ for (let i = idx + 1; i < messages.length; i++) {
26
+ const futureMsg = messages[i];
27
+ if (!futureMsg)
28
+ continue;
29
+ if (futureMsg.role === "assistant") {
30
+ return futureMsg.threadId === selectedThreadId;
31
+ }
32
+ if (futureMsg.threadId && futureMsg.threadId !== selectedThreadId) {
33
+ return false;
34
+ }
35
+ }
36
+ }
37
+ if (msg.role === "assistant" && !msg.threadId) {
38
+ for (let i = idx - 1; i >= 0; i--) {
39
+ const prevMsg = messages[i];
40
+ if (!prevMsg)
41
+ continue;
42
+ if (prevMsg.role === "user") {
43
+ return prevMsg.threadId === selectedThreadId;
44
+ }
45
+ if (prevMsg.role === "assistant")
46
+ break;
47
+ }
48
+ }
49
+ return false;
50
+ });
51
+ }, [messages, selectedThreadId]);
52
+ (0, react_1.useEffect)(() => {
53
+ if (selectedThreadId && onMessageCountChange) {
54
+ onMessageCountChange(selectedThreadId, filteredMessages.length);
55
+ }
56
+ }, [selectedThreadId, filteredMessages.length, onMessageCountChange]);
57
+ const handleTransition = (0, react_1.useCallback)(() => {
58
+ if (prevThreadIdRef.current === undefined) {
59
+ prevThreadIdRef.current = selectedThreadId;
60
+ return;
61
+ }
62
+ if (prevThreadIdRef.current === selectedThreadId)
63
+ return;
64
+ prevThreadIdRef.current = selectedThreadId;
65
+ transitionPendingRef.current = true;
66
+ requestAnimationFrame(() => {
67
+ setTimeout(() => {
68
+ transitionPendingRef.current = false;
69
+ }, 150);
70
+ });
71
+ }, [selectedThreadId]);
72
+ (0, react_1.useEffect)(() => {
73
+ handleTransition();
74
+ }, [handleTransition]);
75
+ return {
76
+ filteredMessages,
77
+ isFiltered: selectedThreadId !== null,
78
+ transitionPending: transitionPendingRef.current,
79
+ };
80
+ }
81
+ //# sourceMappingURL=use-thread-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-thread-filter.js","sourceRoot":"","sources":["../../src/hooks/use-thread-filter.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -36,6 +36,8 @@ export type { WhisperModeState, UseWhisperModeReturn } from "./hooks/use-whisper
36
36
  export { ProviderSelector } from "./components/provider-selector.js";
37
37
  export { useProviderSelection } from "./hooks/use-provider-selection.js";
38
38
  export type { ProviderSelectionState } from "./hooks/use-provider-selection.js";
39
+ export { ThreadFilterHeader } from "./components/thread-filter-header.js";
40
+ export { useThreadFilter } from "./hooks/use-thread-filter.js";
39
41
  export { formatTime, getDateSeparator, isDifferentDay } from "./utils/time.js";
40
42
  export { groupMessages } from "./utils/message-grouping.js";
41
43
  export { remarkPlugins, rehypePlugins, defaultMarkdownComponents } from "./utils/markdown-config.js";
@@ -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,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG3E,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;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAG/E,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,cAAc,EACd,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,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG3E,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;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,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,cAAc,EACd,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.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.useProviderSelection = exports.ProviderSelector = exports.useWhisperMode = exports.WhisperRecipientPicker = 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;
14
+ exports.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.useThreadFilter = exports.ThreadFilterHeader = exports.useProviderSelection = exports.ProviderSelector = exports.useWhisperMode = exports.WhisperRecipientPicker = 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; } });
@@ -59,6 +59,11 @@ var provider_selector_js_1 = require("./components/provider-selector.js");
59
59
  Object.defineProperty(exports, "ProviderSelector", { enumerable: true, get: function () { return provider_selector_js_1.ProviderSelector; } });
60
60
  var use_provider_selection_js_1 = require("./hooks/use-provider-selection.js");
61
61
  Object.defineProperty(exports, "useProviderSelection", { enumerable: true, get: function () { return use_provider_selection_js_1.useProviderSelection; } });
62
+ // Thread filtering
63
+ var thread_filter_header_js_1 = require("./components/thread-filter-header.js");
64
+ Object.defineProperty(exports, "ThreadFilterHeader", { enumerable: true, get: function () { return thread_filter_header_js_1.ThreadFilterHeader; } });
65
+ var use_thread_filter_js_1 = require("./hooks/use-thread-filter.js");
66
+ Object.defineProperty(exports, "useThreadFilter", { enumerable: true, get: function () { return use_thread_filter_js_1.useThreadFilter; } });
62
67
  // Utilities
63
68
  var time_js_1 = require("./utils/time.js");
64
69
  Object.defineProperty(exports, "formatTime", { enumerable: true, get: function () { return time_js_1.formatTime; } });
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,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;AACnB,wFAAiF;AAAxE,qIAAA,sBAAsB,OAAA;AAE/B,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,qBAAqB;AACrB,0EAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,+EAAwE;AAA/D,iIAAA,oBAAoB,OAAA;AAG7B,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"}
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;AACnB,wFAAiF;AAAxE,qIAAA,sBAAsB,OAAA;AAE/B,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,qBAAqB;AACrB,0EAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,+EAAwE;AAA/D,iIAAA,oBAAoB,OAAA;AAG7B,mBAAmB;AACnB,gFAAyE;AAAhE,6HAAA,kBAAkB,OAAA;AAC3B,qEAA8D;AAArD,uHAAA,eAAe,OAAA;AAExB,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portablecore/chat",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
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",
@@ -13,12 +13,6 @@
13
13
  "files": [
14
14
  "dist"
15
15
  ],
16
- "scripts": {
17
- "build": "tsc",
18
- "dev": "tsc --watch",
19
- "clean": "rm -rf dist",
20
- "typecheck": "tsc --noEmit"
21
- },
22
16
  "keywords": [
23
17
  "portable",
24
18
  "chat",
@@ -29,12 +23,12 @@
29
23
  "author": "Portable",
30
24
  "license": "UNLICENSED",
31
25
  "dependencies": {
32
- "@portablecore/chat-runtime": "workspace:*",
33
- "@portablecore/types": "workspace:*",
34
26
  "remark-gfm": "^4.0.1",
35
27
  "remark-breaks": "^4.0.0",
36
28
  "rehype-raw": "^7.0.0",
37
- "rehype-highlight": "^7.0.2"
29
+ "rehype-highlight": "^7.0.2",
30
+ "@portablecore/types": "0.11.4",
31
+ "@portablecore/chat-runtime": "0.1.0"
38
32
  },
39
33
  "peerDependencies": {
40
34
  "react": ">=18.0.0",
@@ -49,5 +43,11 @@
49
43
  "react-markdown": "^10.1.0",
50
44
  "@nvq/flowtoken": "^2.0.6",
51
45
  "lucide-react": "^0.562.0"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc",
49
+ "dev": "tsc --watch",
50
+ "clean": "rm -rf dist",
51
+ "typecheck": "tsc --noEmit"
52
52
  }
53
- }
53
+ }