@asteby/metacore-ai-chat 1.2.0 → 1.3.0

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 (72) hide show
  1. package/README.md +39 -0
  2. package/dist/channel-list.d.ts +19 -0
  3. package/dist/channel-list.d.ts.map +1 -0
  4. package/dist/channel-list.js +42 -0
  5. package/dist/channel-list.js.map +1 -0
  6. package/dist/channel-thread.d.ts +9 -0
  7. package/dist/channel-thread.d.ts.map +1 -0
  8. package/dist/channel-thread.js +89 -0
  9. package/dist/channel-thread.js.map +1 -0
  10. package/dist/channels.d.ts +74 -0
  11. package/dist/channels.d.ts.map +1 -0
  12. package/dist/channels.js +59 -0
  13. package/dist/channels.js.map +1 -0
  14. package/dist/chat-header.d.ts +13 -0
  15. package/dist/chat-header.d.ts.map +1 -0
  16. package/dist/chat-header.js +8 -0
  17. package/dist/chat-header.js.map +1 -0
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js +1 -0
  20. package/dist/client.js.map +1 -1
  21. package/dist/composer.d.ts +7 -0
  22. package/dist/composer.d.ts.map +1 -0
  23. package/dist/composer.js +25 -0
  24. package/dist/composer.js.map +1 -0
  25. package/dist/context.d.ts +12 -1
  26. package/dist/context.d.ts.map +1 -1
  27. package/dist/context.js +9 -2
  28. package/dist/context.js.map +1 -1
  29. package/dist/copilot-chat.d.ts +14 -1
  30. package/dist/copilot-chat.d.ts.map +1 -1
  31. package/dist/copilot-chat.js +15 -23
  32. package/dist/copilot-chat.js.map +1 -1
  33. package/dist/copilot-inbox.d.ts +24 -0
  34. package/dist/copilot-inbox.d.ts.map +1 -0
  35. package/dist/copilot-inbox.js +51 -0
  36. package/dist/copilot-inbox.js.map +1 -0
  37. package/dist/copilot-widget.d.ts +26 -1
  38. package/dist/copilot-widget.d.ts.map +1 -1
  39. package/dist/copilot-widget.js +103 -15
  40. package/dist/copilot-widget.js.map +1 -1
  41. package/dist/index.d.ts +15 -1
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +12 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/markdown.d.ts +23 -0
  46. package/dist/markdown.d.ts.map +1 -0
  47. package/dist/markdown.js +82 -0
  48. package/dist/markdown.js.map +1 -0
  49. package/dist/text/normalize.d.ts +11 -0
  50. package/dist/text/normalize.d.ts.map +1 -0
  51. package/dist/text/normalize.js +32 -0
  52. package/dist/text/normalize.js.map +1 -0
  53. package/dist/text/plain-text.d.ts +3 -0
  54. package/dist/text/plain-text.d.ts.map +1 -0
  55. package/dist/text/plain-text.js +20 -0
  56. package/dist/text/plain-text.js.map +1 -0
  57. package/dist/text/tool-dump.d.ts +2 -0
  58. package/dist/text/tool-dump.d.ts.map +1 -0
  59. package/dist/text/tool-dump.js +30 -0
  60. package/dist/text/tool-dump.js.map +1 -0
  61. package/dist/types.d.ts +20 -0
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/types.js +14 -0
  64. package/dist/types.js.map +1 -1
  65. package/dist/use-channels.d.ts +15 -0
  66. package/dist/use-channels.d.ts.map +1 -0
  67. package/dist/use-channels.js +57 -0
  68. package/dist/use-channels.js.map +1 -0
  69. package/dist/use-chat.d.ts.map +1 -1
  70. package/dist/use-chat.js +1 -0
  71. package/dist/use-chat.js.map +1 -1
  72. package/package.json +5 -1
package/README.md CHANGED
@@ -52,6 +52,45 @@ on `ChatClient.send`, `loadHistory` and the HTTP client:
52
52
  An explicit `title`/`summary` wins over the derived ones. Rows without `id` or without anything to show are dropped.
53
53
  `action`, `model` and `payload` are kept on the normalized proposal so `decideProposal` hosts can use them.
54
54
 
55
+ ## Markdown replies
56
+
57
+ AI replies render as safe Markdown + GFM (`Markdown`, also exported): headings, lists, tables (horizontal scroll),
58
+ blockquotes, inline/blocked code with a copy button, links and images. Raw HTML is never rendered, dangerous URL
59
+ schemes are dropped, external links open with `noopener noreferrer`, images are limited to http(s)/same-origin.
60
+ Unterminated code fences are closed while a reply is typed in. Styled with theme tokens only (no typography plugin).
61
+ Pass `onLinkClick` to `CopilotProvider` to route in-app links through your router (return `true` when handled).
62
+
63
+ ## Channels: bot + agents + team
64
+
65
+ Give the widget an adapter and it becomes a unified inbox. The package knows no endpoint or socket; you map your backend:
66
+
67
+ ```tsx
68
+ const channels: ChannelAdapter = {
69
+ listChannels: () => api.get('/internal-chat/channels').then(toChannels), // kind: 'bot' | 'agent' | 'team'
70
+ loadMessages: (id) => api.get(`/internal-chat/channels/${id}/messages`).then(toMessages),
71
+ send: (id, body) => api.post(`/internal-chat/channels/${id}/messages`, { body }).then(toMessage),
72
+ markRead: (id) => api.post(`/internal-chat/channels/${id}/read`),
73
+ subscribe: (on) => ws.subscribe('INTERNAL_CHAT_MESSAGE', (e) => on({ type: 'message', message: toMessage(e.payload) })),
74
+ }
75
+ <CopilotWidget channels={channels} fullscreenHref="/agent" />
76
+ ```
77
+
78
+ - The bot channel (your `ChatClient`) is injected first (`includeBot={false}` to omit). An `agent` channel with its own
79
+ `client: ChatClient` gets the full AI chat (proposals, history); without one it is served by the adapter like a team thread.
80
+ - Unread counts drive a FAB badge (live even while the panel is closed); the last opened channel is remembered.
81
+ - `subscribe` events: `message`, `unread`, `presence`, `channels` (refetch).
82
+
83
+ ## Full screen
84
+
85
+ The header's expand button turns the widget into a viewport-filling surface (list + thread side by side from `md` up;
86
+ phones always get it). `Escape` steps back: expanded → floating → closed. `fullscreenHref` / `onOpenFullscreen` add an
87
+ "open full view" link for apps with their own workspace route. `hidden` removes the widget on routes that already show it.
88
+
89
+ ## Demo badge
90
+
91
+ The badge shows when `CopilotProvider demo` / `CopilotWidget demo` is set, or when the backend flags a reply with
92
+ `demo: true` (`createHttpChatClient` reads `demo` / `is_demo`). Never leave it permanently on for real data.
93
+
55
94
  ## Accessibility and states
56
95
 
57
96
  - `CopilotWidget` panel is `role="dialog"` (`aria-label` = branding name, `aria-modal="false"`: the page stays usable).
@@ -0,0 +1,19 @@
1
+ import { type ChatChannel } from './channels';
2
+ export declare function ChannelAvatar({ channel, size }: {
3
+ channel: ChatChannel;
4
+ size?: number;
5
+ }): import("react").JSX.Element;
6
+ export declare function UnreadBadge({ count, label }: {
7
+ count: number;
8
+ label: string;
9
+ }): import("react").JSX.Element | null;
10
+ /** Conversation list: avatar, name, last message, relative time, unread badge. */
11
+ export declare function ChannelList({ channels, activeId, loading, error, onSelect, onRetry, }: {
12
+ channels: readonly ChatChannel[];
13
+ activeId: string | null;
14
+ loading?: boolean;
15
+ error?: boolean;
16
+ onSelect: (id: string) => void;
17
+ onRetry?: () => void;
18
+ }): import("react").JSX.Element;
19
+ //# sourceMappingURL=channel-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-list.d.ts","sourceRoot":"","sources":["../src/channel-list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsC,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAMjF,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,IAAS,EAAE,EAAE;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,+BAkC5F;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,sCAU7E;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB,+BA8DA"}
@@ -0,0 +1,42 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Mascot } from '@asteby/metacore-app-providers';
3
+ import { BOT_CHANNEL_ID, formatRelativeTime } from './channels';
4
+ import { useCopilot } from './context';
5
+ import { AGENT_ENTER, AGENT_FOCUS } from './surfaces';
6
+ const cx = (...c) => c.filter(Boolean).join(' ');
7
+ export function ChannelAvatar({ channel, size = 36 }) {
8
+ const { branding } = useCopilot();
9
+ const initials = channel.name
10
+ .split(/\s+/)
11
+ .filter(Boolean)
12
+ .slice(0, 2)
13
+ .map((w) => w[0]?.toUpperCase())
14
+ .join('');
15
+ let inner;
16
+ if (channel.avatar)
17
+ inner = channel.avatar;
18
+ else if (channel.avatarUrl)
19
+ inner = _jsx("img", { src: channel.avatarUrl, alt: "", className: "size-full rounded-full object-cover" });
20
+ else if (channel.kind === 'bot' || channel.id === BOT_CHANNEL_ID) {
21
+ inner = branding.avatar ?? _jsx(Mascot, { skin: branding.mascotSkin, size: size });
22
+ }
23
+ else {
24
+ inner = (_jsx("span", { "aria-hidden": true, className: cx('flex size-full items-center justify-center rounded-full text-xs font-semibold', channel.kind === 'agent' ? 'bg-primary/15 text-primary' : 'bg-muted text-muted-foreground'), children: initials || '?' }));
25
+ }
26
+ return (_jsxs("span", { className: "relative inline-flex shrink-0", style: { width: size, height: size }, children: [inner, channel.online && (_jsx("span", { className: "absolute -bottom-0.5 -right-0.5 size-2.5 rounded-full border-2 border-[var(--surface-panel,var(--card))] bg-emerald-500", "aria-hidden": true }))] }));
27
+ }
28
+ export function UnreadBadge({ count, label }) {
29
+ if (count <= 0)
30
+ return null;
31
+ return (_jsx("span", { className: "inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-primary px-1.5 text-[10px] font-bold text-primary-foreground", "aria-label": `${count} ${label}`, children: count > 9 ? '9+' : count }));
32
+ }
33
+ /** Conversation list: avatar, name, last message, relative time, unread badge. */
34
+ export function ChannelList({ channels, activeId, loading, error, onSelect, onRetry, }) {
35
+ const { labels } = useCopilot();
36
+ return (_jsxs("nav", { "aria-label": labels.channels, className: "flex min-h-0 flex-1 flex-col overflow-y-auto p-2", children: [error && (_jsxs("div", { role: "alert", className: "mb-2 flex items-center justify-between gap-2 rounded-md border border-destructive/50 p-2 text-xs text-destructive", children: [_jsx("span", { children: labels.channelsError }), onRetry && (_jsx("button", { type: "button", onClick: onRetry, className: cx('inline-flex min-h-11 items-center rounded-md border px-3', AGENT_FOCUS), children: labels.retry }))] })), loading && channels.length === 0 && (_jsx("div", { "aria-busy": "true", "aria-label": labels.loadingMessages, className: "space-y-2 p-1", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex animate-pulse items-center gap-3 motion-reduce:animate-none", children: [_jsx("div", { className: "size-9 rounded-full bg-muted" }), _jsxs("div", { className: "flex-1 space-y-1.5", children: [_jsx("div", { className: "h-3 w-1/3 rounded bg-muted" }), _jsx("div", { className: "h-3 w-2/3 rounded bg-muted" })] })] }, i))) })), !loading && !error && channels.length === 0 && _jsx("p", { className: "p-4 text-center text-sm text-muted-foreground", children: labels.noChannels }), _jsx("ul", { className: "space-y-0.5", children: channels.map((c) => {
37
+ const active = c.id === activeId;
38
+ const unread = c.unread ?? 0;
39
+ return (_jsx("li", { className: AGENT_ENTER, children: _jsxs("button", { type: "button", "aria-current": active ? 'true' : undefined, onClick: () => onSelect(c.id), className: cx('flex min-h-14 w-full items-center gap-3 rounded-xl px-2.5 py-2 text-left transition-colors motion-reduce:transition-none', active ? 'bg-primary/10' : 'hover:bg-muted', AGENT_FOCUS), children: [_jsx(ChannelAvatar, { channel: c }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "flex items-baseline justify-between gap-2", children: [_jsx("span", { className: cx('truncate text-sm', unread > 0 ? 'font-semibold' : 'font-medium'), children: c.name }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: formatRelativeTime(c.lastAt, labels.locale) })] }), _jsxs("span", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "truncate text-xs text-muted-foreground", children: c.lastMessage || c.description || '' }), _jsx(UnreadBadge, { count: unread, label: labels.unread })] })] })] }) }, c.id));
40
+ }) })] }));
41
+ }
42
+ //# sourceMappingURL=channel-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-list.js","sourceRoot":"","sources":["../src/channel-list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ChannelAdapter, ChatChannel } from './channels';
2
+ /** Human conversation (team / adapter-served agent): history, live messages, composer. */
3
+ export declare function ChannelThread({ adapter, channel, onRead, }: {
4
+ adapter: ChannelAdapter;
5
+ channel: ChatChannel;
6
+ /** Called when the channel was read (open + new messages while visible). */
7
+ onRead?: (channelId: string) => void;
8
+ }): import("react").JSX.Element;
9
+ //# sourceMappingURL=channel-thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-thread.d.ts","sourceRoot":"","sources":["../src/channel-thread.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAA;AAe7E,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,MAAM,GACP,EAAE;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,OAAO,EAAE,WAAW,CAAA;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;CACrC,+BA4HA"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { RotateCw, WifiOff } from 'lucide-react';
4
+ import { Composer } from './composer';
5
+ import { useCopilot } from './context';
6
+ import { AGENT_ENTER, AGENT_FOCUS } from './surfaces';
7
+ import { useOnline } from './use-online';
8
+ const cx = (...c) => c.filter(Boolean).join(' ');
9
+ function timeLabel(iso, locale) {
10
+ if (!iso)
11
+ return '';
12
+ const d = new Date(iso);
13
+ if (Number.isNaN(d.getTime()))
14
+ return '';
15
+ return d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' });
16
+ }
17
+ /** Human conversation (team / adapter-served agent): history, live messages, composer. */
18
+ export function ChannelThread({ adapter, channel, onRead, }) {
19
+ const { labels } = useCopilot();
20
+ const online = useOnline();
21
+ const [messages, setMessages] = useState([]);
22
+ const [loading, setLoading] = useState(true);
23
+ const [loadError, setLoadError] = useState(false);
24
+ const [sendError, setSendError] = useState(null);
25
+ const [nonce, setNonce] = useState(0);
26
+ const [sending, setSending] = useState(false);
27
+ const endRef = useRef(null);
28
+ const lastSent = useRef('');
29
+ const markRead = useCallback(() => {
30
+ void adapter.markRead?.(channel.id)?.catch?.(() => { });
31
+ onRead?.(channel.id);
32
+ }, [adapter, channel.id, onRead]);
33
+ useEffect(() => {
34
+ let live = true;
35
+ setLoading(true);
36
+ setLoadError(false);
37
+ setMessages([]);
38
+ adapter.loadMessages(channel.id).then((m) => {
39
+ if (!live)
40
+ return;
41
+ setMessages(m);
42
+ setLoading(false);
43
+ markRead();
44
+ }, () => {
45
+ if (!live)
46
+ return;
47
+ setLoadError(true);
48
+ setLoading(false);
49
+ });
50
+ const off = adapter.subscribe?.((e) => {
51
+ if (!live || e.type !== 'message' || e.message.channelId !== channel.id)
52
+ return;
53
+ setMessages((prev) => (prev.some((x) => x.id === e.message.id) ? prev : [...prev, e.message]));
54
+ if (!e.message.mine)
55
+ markRead();
56
+ });
57
+ return () => {
58
+ live = false;
59
+ off?.();
60
+ };
61
+ // markRead intentionally excluded: it only forwards to the adapter for the same channel.
62
+ // eslint-disable-next-line react-hooks/exhaustive-deps
63
+ }, [adapter, channel.id, nonce]);
64
+ useEffect(() => {
65
+ // Do not return scrollIntoView's value (may be a Promise).
66
+ endRef.current?.scrollIntoView?.({ block: 'end' });
67
+ }, [messages.length, loading]);
68
+ const send = async (text) => {
69
+ const body = text.trim();
70
+ if (!body)
71
+ return;
72
+ lastSent.current = body;
73
+ setSending(true);
74
+ setSendError(null);
75
+ try {
76
+ const stored = await adapter.send(channel.id, body);
77
+ if (stored)
78
+ setMessages((prev) => (prev.some((x) => x.id === stored.id) ? prev : [...prev, stored]));
79
+ }
80
+ catch {
81
+ setSendError(labels.sendFailed);
82
+ }
83
+ finally {
84
+ setSending(false);
85
+ }
86
+ };
87
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [!online && (_jsxs("div", { role: "status", className: "flex items-center gap-2 border-b bg-muted px-3 py-2 text-xs", children: [_jsx(WifiOff, { className: "size-3.5 shrink-0", "aria-hidden": true }), " ", labels.offline] })), _jsxs("div", { className: "min-h-0 flex-1 space-y-1.5 overflow-y-auto p-3", role: "log", "aria-live": "polite", "aria-busy": loading, children: [loading && (_jsxs("div", { "aria-busy": "true", "aria-label": labels.loadingMessages, className: "flex flex-col gap-1.5 py-2", children: [_jsx("div", { className: "ml-auto h-10 w-[55%] animate-pulse rounded-xl rounded-tr-none bg-primary/15 motion-reduce:animate-none" }), _jsx("div", { className: "h-10 w-[65%] animate-pulse rounded-xl rounded-tl-none bg-muted motion-reduce:animate-none" }), _jsx("div", { className: "ml-auto h-8 w-[40%] animate-pulse rounded-xl rounded-tr-none bg-primary/15 motion-reduce:animate-none" })] })), loadError && (_jsxs("div", { role: "alert", className: "flex items-center justify-between gap-2 rounded-md border border-destructive/50 p-2 text-xs text-destructive", children: [_jsx("span", { children: labels.messagesError }), _jsxs("button", { type: "button", onClick: () => setNonce((n) => n + 1), className: cx('inline-flex min-h-11 items-center gap-1 rounded-md border px-3', AGENT_FOCUS), children: [_jsx(RotateCw, { className: "size-3", "aria-hidden": true }), " ", labels.retry] })] })), messages.map((m) => (_jsxs("div", { className: cx('flex flex-col', m.mine ? 'items-end' : 'items-start', AGENT_ENTER), children: [!m.mine && m.senderName && _jsx("span", { className: "mb-0.5 px-1 text-[11px] text-muted-foreground", children: m.senderName }), _jsxs("div", { className: cx('max-w-[85%] whitespace-pre-wrap break-words rounded-2xl px-3 py-2 text-sm', m.mine ? 'rounded-br-md bg-primary text-primary-foreground' : 'rounded-bl-md bg-muted text-foreground'), children: [m.body, m.attachments?.map((a) => (_jsx("a", { href: a.url, target: "_blank", rel: "noreferrer noopener", className: "mt-1 block text-xs underline", children: a.name }, a.url)))] }), _jsx("span", { className: "px-1 pt-0.5 text-[10px] text-muted-foreground", children: timeLabel(m.createdAt, labels.locale) })] }, m.id))), sendError && (_jsxs("div", { role: "alert", className: "flex items-center justify-between gap-2 rounded-md border border-destructive/50 p-2 text-xs text-destructive", children: [_jsx("span", { children: sendError }), _jsxs("button", { type: "button", onClick: () => void send(lastSent.current), className: cx('inline-flex min-h-11 items-center gap-1 rounded-md border px-3', AGENT_FOCUS), children: [_jsx(RotateCw, { className: "size-3", "aria-hidden": true }), " ", labels.retry] })] })), _jsx("div", { ref: endRef })] }), _jsx(Composer, { onSend: (t) => void send(t), busy: sending, online: online })] }));
88
+ }
89
+ //# sourceMappingURL=channel-thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-thread.js","sourceRoot":"","sources":["../src/channel-thread.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { ChatAttachment, ChatClient } from './types';
3
+ /** Id of the built-in bot channel the inbox injects first. */
4
+ export declare const BOT_CHANNEL_ID = "__bot__";
5
+ /**
6
+ * `bot`: the host's copilot (uses the provider `ChatClient`).
7
+ * `agent`: an AI agent; give it its own `client` to get the full AI chat
8
+ * (proposals, history), or let the adapter serve its messages.
9
+ * `team`: people (DMs, groups) served by the adapter.
10
+ */
11
+ export type ChannelKind = 'bot' | 'agent' | 'team';
12
+ export interface ChatChannel {
13
+ id: string;
14
+ kind: ChannelKind;
15
+ name: string;
16
+ description?: string;
17
+ avatarUrl?: string;
18
+ /** Custom avatar; wins over `avatarUrl` and the mascot. */
19
+ avatar?: ReactNode;
20
+ unread?: number;
21
+ lastMessage?: string;
22
+ /** ISO timestamp of the last message (list ordering + relative time). */
23
+ lastAt?: string;
24
+ online?: boolean;
25
+ /** AI-backed channel: renders the full AI chat over this transport. */
26
+ client?: ChatClient;
27
+ }
28
+ export interface ChannelMessage {
29
+ id: string;
30
+ channelId: string;
31
+ body: string;
32
+ /** Sent by the current user (right-aligned). */
33
+ mine: boolean;
34
+ senderName?: string;
35
+ createdAt?: string;
36
+ attachments?: ChatAttachment[];
37
+ }
38
+ export type ChannelEvent = {
39
+ type: 'message';
40
+ message: ChannelMessage;
41
+ } | {
42
+ type: 'unread';
43
+ channelId: string;
44
+ unread: number;
45
+ } | {
46
+ type: 'presence';
47
+ channelId: string;
48
+ online: boolean;
49
+ }
50
+ /** The channel list changed on the server; refetch it. */
51
+ | {
52
+ type: 'channels';
53
+ };
54
+ /**
55
+ * Transport for the channel inbox. The host injects it (the package knows no
56
+ * endpoint, socket or store), so any backend — internal chat, agent runs,
57
+ * WhatsApp — plugs into the same widget.
58
+ */
59
+ export interface ChannelAdapter {
60
+ listChannels(): Promise<ChatChannel[]>;
61
+ loadMessages(channelId: string): Promise<ChannelMessage[]>;
62
+ /** Resolve with the stored message when available; it is deduped by id against `subscribe` echoes. */
63
+ send(channelId: string, body: string, attachments?: ChatAttachment[]): Promise<ChannelMessage | void>;
64
+ markRead?(channelId: string): Promise<void>;
65
+ /** Live events; returns the unsubscribe. */
66
+ subscribe?(handler: (event: ChannelEvent) => void): () => void;
67
+ }
68
+ /** Pure list-state step for live events; exported for tests. */
69
+ export declare function applyChannelEvent(channels: readonly ChatChannel[], event: ChannelEvent, activeId: string | null): ChatChannel[];
70
+ /** Most recent first; channels without activity keep their relative order. */
71
+ export declare function sortChannels(channels: readonly ChatChannel[]): ChatChannel[];
72
+ /** "hace 5 min" style label; empty for missing/invalid input. */
73
+ export declare function formatRelativeTime(iso: string | undefined, locale?: string, now?: number): string;
74
+ //# sourceMappingURL=channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzD,8DAA8D;AAC9D,eAAO,MAAM,cAAc,YAAY,CAAA;AAEvC;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;AAElD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,uEAAuE;IACvE,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,gDAAgD;IAChD,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAA;CAC/B;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAC1D,0DAA0D;GACxD;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAA;AAExB;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACtC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IAC1D,sGAAsG;IACtG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACrG,QAAQ,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,4CAA4C;IAC5C,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CAC/D;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,WAAW,EAAE,CAkBf;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAY5E;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,SAAO,EAAE,GAAG,SAAa,GAAG,MAAM,CAWnG"}
@@ -0,0 +1,59 @@
1
+ /** Id of the built-in bot channel the inbox injects first. */
2
+ export const BOT_CHANNEL_ID = '__bot__';
3
+ /** Pure list-state step for live events; exported for tests. */
4
+ export function applyChannelEvent(channels, event, activeId) {
5
+ switch (event.type) {
6
+ case 'message': {
7
+ const m = event.message;
8
+ const next = channels.map((c) => {
9
+ if (c.id !== m.channelId)
10
+ return c;
11
+ const bump = !m.mine && m.channelId !== activeId ? 1 : 0;
12
+ return { ...c, lastMessage: m.body, lastAt: m.createdAt ?? c.lastAt, unread: (c.unread ?? 0) + bump };
13
+ });
14
+ return sortChannels(next);
15
+ }
16
+ case 'unread':
17
+ return channels.map((c) => (c.id === event.channelId ? { ...c, unread: event.unread } : c));
18
+ case 'presence':
19
+ return channels.map((c) => (c.id === event.channelId ? { ...c, online: event.online } : c));
20
+ default:
21
+ return [...channels];
22
+ }
23
+ }
24
+ /** Most recent first; channels without activity keep their relative order. */
25
+ export function sortChannels(channels) {
26
+ return channels
27
+ .map((c, i) => ({ c, i }))
28
+ .sort((a, b) => {
29
+ const ta = a.c.lastAt ? Date.parse(a.c.lastAt) : NaN;
30
+ const tb = b.c.lastAt ? Date.parse(b.c.lastAt) : NaN;
31
+ if (Number.isNaN(ta) && Number.isNaN(tb))
32
+ return a.i - b.i;
33
+ if (Number.isNaN(ta))
34
+ return 1;
35
+ if (Number.isNaN(tb))
36
+ return -1;
37
+ return tb - ta || a.i - b.i;
38
+ })
39
+ .map((x) => x.c);
40
+ }
41
+ /** "hace 5 min" style label; empty for missing/invalid input. */
42
+ export function formatRelativeTime(iso, locale = 'es', now = Date.now()) {
43
+ if (!iso)
44
+ return '';
45
+ const t = Date.parse(iso);
46
+ if (Number.isNaN(t))
47
+ return '';
48
+ const diff = Math.round((t - now) / 1000);
49
+ const abs = Math.abs(diff);
50
+ const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto', style: 'short' });
51
+ if (abs < 45)
52
+ return rtf.format(0, 'second');
53
+ if (abs < 3600)
54
+ return rtf.format(Math.round(diff / 60), 'minute');
55
+ if (abs < 86400)
56
+ return rtf.format(Math.round(diff / 3600), 'hour');
57
+ return rtf.format(Math.round(diff / 86400), 'day');
58
+ }
59
+ //# sourceMappingURL=channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.js","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"AAGA,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAA;AA4DvC,gEAAgE;AAChE,MAAM,UAAU,iBAAiB,CAC/B,QAAgC,EAChC,KAAmB,EACnB,QAAuB;IAEvB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAA;YACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS;oBAAE,OAAO,CAAC,CAAA;gBAClC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACxD,OAAO,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;YACvG,CAAC,CAAC,CAAA;YACF,OAAO,YAAY,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7F,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7F;YACE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;IACxB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,QAAgC;IAC3D,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACpD,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACpD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAA;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,CAAA;QAC/B,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,GAAuB,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACzF,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IACnB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACzB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;IACpF,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC5C,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;IAClE,IAAI,GAAG,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IACnE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ /** Translucent top bar shared by every chat surface: start slot, avatar, title, end slot. */
3
+ export declare function ChatHeader({ start, avatar, title, subtitle, badge, children, className, }: {
4
+ start?: ReactNode;
5
+ avatar?: ReactNode;
6
+ title: string;
7
+ subtitle?: string;
8
+ badge?: ReactNode;
9
+ /** Right-side controls. */
10
+ children?: ReactNode;
11
+ className?: string;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=chat-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-header.d.ts","sourceRoot":"","sources":["../src/chat-header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,GACV,EAAE;IACD,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,+BAaA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AGENT_BAR } from './surfaces';
3
+ const cx = (...c) => c.filter(Boolean).join(' ');
4
+ /** Translucent top bar shared by every chat surface: start slot, avatar, title, end slot. */
5
+ export function ChatHeader({ start, avatar, title, subtitle, badge, children, className, }) {
6
+ return (_jsxs("header", { className: cx('flex shrink-0 items-center gap-2 px-3 py-2', AGENT_BAR, className), children: [start, avatar, _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("h2", { className: "truncate text-sm font-semibold leading-tight", children: title }), subtitle && _jsx("p", { className: "truncate text-[11px] leading-tight text-muted-foreground", children: subtitle })] }), badge, children] }));
7
+ }
8
+ //# sourceMappingURL=chat-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-header.js","sourceRoot":"","sources":["../src/chat-header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAoC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEnF,6FAA6F;AAC7F,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,SAAS,GAUV;IACC,OAAO,CACL,kBAAQ,SAAS,EAAE,EAAE,CAAC,4CAA4C,EAAE,SAAS,EAAE,SAAS,CAAC,aACtF,KAAK,EACL,MAAM,EACP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,aAAI,SAAS,EAAC,8CAA8C,YAAE,KAAK,GAAM,EACxE,QAAQ,IAAI,YAAG,SAAS,EAAC,0DAA0D,YAAE,QAAQ,GAAK,IAC/F,EACL,KAAK,EACL,QAAQ,IACF,CACV,CAAA;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,QAAQ,EAGT,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAGD,eAAO,MAAM,aAAa,cAA6D,CAAA;AAEvF,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAQnD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,qBAA0B,GAAG,UAAU,CAgCjG"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,QAAQ,EAGT,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,qBAAqB;IACpC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAGD,eAAO,MAAM,aAAa,cAA6D,CAAA;AAEvF,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAQnD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,qBAA0B,GAAG,UAAU,CAiCjG"}
package/dist/client.js CHANGED
@@ -31,6 +31,7 @@ export function createHttpChatClient(http, opts = {}) {
31
31
  reply: String(d.reply ?? d.response ?? d.message ?? ''),
32
32
  proposals: normalizeProposals(d.proposals),
33
33
  attachments: Array.isArray(d.attachments) ? d.attachments : undefined,
34
+ demo: d.demo === true || d.is_demo === true ? true : undefined,
34
35
  };
35
36
  },
36
37
  async listSessions() {
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Capsule composer shared by the AI chat and the channel thread. */
2
+ export declare function Composer({ onSend, busy, online, }: {
3
+ onSend: (text: string) => void;
4
+ busy?: boolean;
5
+ online?: boolean;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=composer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.d.ts","sourceRoot":"","sources":["../src/composer.tsx"],"names":[],"mappings":"AAQA,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,MAAa,GACd,EAAE;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,+BAiCA"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Send } from 'lucide-react';
4
+ import { AGENT_CAPSULE, AGENT_FOCUS } from './surfaces';
5
+ import { useCopilot } from './context';
6
+ const TOUCH = 'inline-flex min-h-11 min-w-11 items-center justify-center';
7
+ const cx = (...c) => c.filter(Boolean).join(' ');
8
+ /** Capsule composer shared by the AI chat and the channel thread. */
9
+ export function Composer({ onSend, busy, online = true, }) {
10
+ const { labels } = useCopilot();
11
+ const [draft, setDraft] = useState('');
12
+ const submit = (e) => {
13
+ e?.preventDefault();
14
+ if (!online || busy || !draft.trim())
15
+ return;
16
+ const text = draft;
17
+ setDraft('');
18
+ onSend(text);
19
+ };
20
+ return (_jsxs("form", { onSubmit: submit, className: cx(AGENT_CAPSULE, 'm-3 flex items-end gap-2 p-2'), children: [_jsx("textarea", { "aria-label": labels.placeholder, className: "max-h-32 min-h-9 flex-1 resize-none bg-transparent px-2 py-1.5 text-sm outline-none", placeholder: labels.placeholder, rows: 1, value: draft, onChange: (e) => setDraft(e.target.value), onKeyDown: (e) => {
21
+ if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing)
22
+ submit(e);
23
+ } }), _jsx("button", { type: "submit", "aria-label": labels.send, disabled: !draft.trim() || busy || !online, className: cx(TOUCH, 'rounded-full bg-primary text-primary-foreground disabled:opacity-50', AGENT_FOCUS), children: _jsx(Send, { className: "size-4", "aria-hidden": true }) })] }));
24
+ }
25
+ //# sourceMappingURL=composer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composer.js","sourceRoot":"","sources":["../src/composer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,KAAK,GAAG,2DAA2D,CAAA;AACzE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAoC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEnF,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,MAAM,GAAG,IAAI,GAKd;IACC,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IAC/B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,CAAC,CAAa,EAAE,EAAE;QAC/B,CAAC,EAAE,cAAc,EAAE,CAAA;QACnB,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE,OAAM;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAA;QAClB,QAAQ,CAAC,EAAE,CAAC,CAAA;QACZ,MAAM,CAAC,IAAI,CAAC,CAAA;IACd,CAAC,CAAA;IACD,OAAO,CACL,gBAAM,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,8BAA8B,CAAC,aAClF,iCACc,MAAM,CAAC,WAAW,EAC9B,SAAS,EAAC,qFAAqF,EAC/F,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW;wBAAE,MAAM,CAAC,CAAC,CAAC,CAAA;gBAC/E,CAAC,GACD,EACF,iBACE,IAAI,EAAC,QAAQ,gBACD,MAAM,CAAC,IAAI,EACvB,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,MAAM,EAC1C,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,qEAAqE,EAAE,WAAW,CAAC,YAExG,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,wBAAe,GAChC,IACJ,CACR,CAAA;AACH,CAAC"}
package/dist/context.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
+ import type { MarkdownProps } from './markdown';
2
3
  import { type ChatClient, type CopilotBranding, type CopilotLabels, type CopilotPermissions } from './types';
3
4
  export interface CopilotContextValue {
4
5
  client: ChatClient;
@@ -9,6 +10,8 @@ export interface CopilotContextValue {
9
10
  suggestions: readonly string[] | null;
10
11
  /** Show the "demo data" badge. */
11
12
  demo: boolean;
13
+ /** Link-click interceptor for Markdown replies (SPA navigation). */
14
+ onLinkClick?: MarkdownProps['onLinkClick'];
12
15
  }
13
16
  export interface CopilotProviderProps {
14
17
  /** Transport. Build one with `createHttpChatClient(api)` or inject your own. */
@@ -20,10 +23,18 @@ export interface CopilotProviderProps {
20
23
  suggestions?: readonly string[];
21
24
  /** Mark the copilot as running on demo data: renders the `labels.demo` badge. */
22
25
  demo?: boolean;
26
+ /** Intercept links in AI replies (return true when handled) for SPA navigation. */
27
+ onLinkClick?: MarkdownProps['onLinkClick'];
23
28
  children: ReactNode;
24
29
  }
25
- export declare function CopilotProvider({ client, permissions, branding, labels, suggestions, demo, children, }: CopilotProviderProps): import("react").JSX.Element;
30
+ export declare function CopilotProvider({ client, permissions, branding, labels, suggestions, demo, onLinkClick, children, }: CopilotProviderProps): import("react").JSX.Element;
26
31
  export declare function useCopilot(): CopilotContextValue;
27
32
  /** Starter prompts: provider override first, else tenant branding. */
28
33
  export declare function useCopilotSuggestions(): string[];
34
+ /** Re-provides the copilot context with another transport/branding (one AI channel). */
35
+ export declare function CopilotScope({ client, branding, children, }: {
36
+ client?: ChatClient;
37
+ branding?: CopilotBranding;
38
+ children: ReactNode;
39
+ }): import("react").JSX.Element;
29
40
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1E,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAA;IACzC,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,wEAAwE;IACxE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACrC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAA;CACd;AAID,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAC/B,oEAAoE;IACpE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAY,EACZ,QAAQ,GACT,EAAE,oBAAoB,+BAatB;AAED,wBAAgB,UAAU,IAAI,mBAAmB,CAIhD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAIhD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAE1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAA;IACzC,QAAQ,EAAE,eAAe,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,wEAAwE;IACxE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;IACrC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAA;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;CAC3C;AAID,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,MAAM,EAAE,UAAU,CAAA;IAClB,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;IAC/B,oEAAoE;IACpE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC/B,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,mFAAmF;IACnF,WAAW,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAA;IAC1C,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAY,EACZ,WAAW,EACX,QAAQ,GACT,EAAE,oBAAoB,+BActB;AAED,wBAAgB,UAAU,IAAI,mBAAmB,CAIhD;AAED,sEAAsE;AACtE,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAIhD;AAED,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,QAAQ,EAAE,SAAS,CAAA;CACpB,+BAOA"}
package/dist/context.js CHANGED
@@ -3,7 +3,7 @@ import { createContext, useContext, useMemo } from 'react';
3
3
  import { useAgentSuggestions } from '@asteby/metacore-app-providers';
4
4
  import { DEFAULT_LABELS, } from './types';
5
5
  const CopilotContext = createContext(null);
6
- export function CopilotProvider({ client, permissions, branding, labels, suggestions, demo = false, children, }) {
6
+ export function CopilotProvider({ client, permissions, branding, labels, suggestions, demo = false, onLinkClick, children, }) {
7
7
  const value = useMemo(() => ({
8
8
  client,
9
9
  permissions: { canChat: true, canDecideProposals: true, ...permissions },
@@ -11,7 +11,8 @@ export function CopilotProvider({ client, permissions, branding, labels, suggest
11
11
  labels: { ...DEFAULT_LABELS, ...labels },
12
12
  suggestions: suggestions ?? null,
13
13
  demo,
14
- }), [client, permissions, branding, labels, suggestions, demo]);
14
+ onLinkClick,
15
+ }), [client, permissions, branding, labels, suggestions, demo, onLinkClick]);
15
16
  return _jsx(CopilotContext.Provider, { value: value, children: children });
16
17
  }
17
18
  export function useCopilot() {
@@ -26,4 +27,10 @@ export function useCopilotSuggestions() {
26
27
  const fromBranding = useAgentSuggestions();
27
28
  return suggestions ? [...suggestions] : fromBranding;
28
29
  }
30
+ /** Re-provides the copilot context with another transport/branding (one AI channel). */
31
+ export function CopilotScope({ client, branding, children, }) {
32
+ const parent = useCopilot();
33
+ const value = useMemo(() => ({ ...parent, client: client ?? parent.client, branding: branding ?? parent.branding }), [parent, client, branding]);
34
+ return _jsx(CopilotContext.Provider, { value: value, children: children });
35
+ }
29
36
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAA;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EACL,cAAc,GAKf,MAAM,SAAS,CAAA;AAahB,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAA;AAetE,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAI,GAAG,KAAK,EACZ,QAAQ,GACa;IACrB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM;QACN,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE;QACxE,QAAQ,EAAE,QAAQ,IAAI,EAAE;QACxB,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE;QACxC,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,IAAI;KACL,CAAC,EACF,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAC3D,CAAA;IACD,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IAC7E,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAA;IACpC,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAA;IAC1C,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;AACtD,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,OAAO,CAAA;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAEpE,OAAO,EACL,cAAc,GAKf,MAAM,SAAS,CAAA;AAehB,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAA;AAiBtE,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,WAAW,EACX,QAAQ,EACR,MAAM,EACN,WAAW,EACX,IAAI,GAAG,KAAK,EACZ,WAAW,EACX,QAAQ,GACa;IACrB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM;QACN,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE;QACxE,QAAQ,EAAE,QAAQ,IAAI,EAAE;QACxB,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE;QACxC,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,IAAI;QACJ,WAAW;KACZ,CAAC,EACF,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CACxE,CAAA;IACD,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IAC7E,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,qBAAqB;IACnC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,CAAA;IACpC,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAA;IAC1C,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;AACtD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,QAAQ,GAKT;IACC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,EAC7F,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAC3B,CAAA;IACD,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAA2B,CAAA;AACpF,CAAC"}