@tagit/ai-client-react 0.1.3-beta.1 → 0.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +296 -0
- package/dist/chat-conversation.d.ts +10 -0
- package/dist/chat-conversation.d.ts.map +1 -0
- package/dist/chat-conversation.js +157 -0
- package/dist/chat-conversation.js.map +1 -0
- package/dist/chat-widget.d.ts +3 -2
- package/dist/chat-widget.d.ts.map +1 -1
- package/dist/chat-widget.js +14 -2
- package/dist/chat-widget.js.map +1 -1
- package/dist/index.d.ts +3 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -12
- package/dist/index.js.map +1 -1
- package/dist/renderers/ChartRenderer.d.ts +7 -0
- package/dist/renderers/ChartRenderer.d.ts.map +1 -0
- package/dist/renderers/ChartRenderer.js +52 -0
- package/dist/renderers/ChartRenderer.js.map +1 -0
- package/dist/renderers/ContentBlockRenderer.d.ts +10 -0
- package/dist/renderers/ContentBlockRenderer.d.ts.map +1 -0
- package/dist/renderers/ContentBlockRenderer.js +13 -0
- package/dist/renderers/ContentBlockRenderer.js.map +1 -0
- package/dist/renderers/MarkdownRenderer.d.ts +8 -0
- package/dist/renderers/MarkdownRenderer.d.ts.map +1 -0
- package/dist/renderers/MarkdownRenderer.js +57 -0
- package/dist/renderers/MarkdownRenderer.js.map +1 -0
- package/package.json +12 -3
- package/src/chat-widget.css +619 -2
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,25 +7,15 @@
|
|
|
7
7
|
* @example
|
|
8
8
|
* ```tsx
|
|
9
9
|
* import { AIClient, createDefaultConfig } from '@tagit/ai-client-core';
|
|
10
|
-
* import { AIClientProvider,
|
|
10
|
+
* import { AIClientProvider, ChatWidget } from '@tagit/ai-client-react';
|
|
11
11
|
*
|
|
12
12
|
* const config = createDefaultConfig('use-case-id', 'https://orchestrator.url');
|
|
13
13
|
* const client = new AIClient(config);
|
|
14
14
|
*
|
|
15
|
-
* function ChatApp() {
|
|
16
|
-
* const { messages, sendMessage, isLoading } = useConversation();
|
|
17
|
-
* return (
|
|
18
|
-
* <div>
|
|
19
|
-
* {messages.map(m => <div key={m.id}>{m.role}: {m.content}</div>)}
|
|
20
|
-
* <button onClick={() => sendMessage('Hello')}>Send</button>
|
|
21
|
-
* </div>
|
|
22
|
-
* );
|
|
23
|
-
* }
|
|
24
|
-
*
|
|
25
15
|
* export default function App() {
|
|
26
16
|
* return (
|
|
27
17
|
* <AIClientProvider client={client}>
|
|
28
|
-
* <
|
|
18
|
+
* <ChatWidget mode="overlay" side="right" title="tagIt Assistant" />
|
|
29
19
|
* </AIClientProvider>
|
|
30
20
|
* );
|
|
31
21
|
* }
|
|
@@ -33,4 +23,5 @@
|
|
|
33
23
|
*/
|
|
34
24
|
export { AIClientProvider, useAIClient, useConversation, useClientEvents, } from './provider.js';
|
|
35
25
|
export { ChatWidget, } from './chat-widget.js';
|
|
26
|
+
export { ChatConversation, } from './chat-conversation.js';
|
|
36
27
|
//# 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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,GAMX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ChartRendererProps {
|
|
3
|
+
rawJson: string;
|
|
4
|
+
}
|
|
5
|
+
export declare const ChartRenderer: React.MemoExoticComponent<({ rawJson }: ChartRendererProps) => import("react/jsx-runtime").JSX.Element>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=ChartRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/renderers/ChartRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA6E1B,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,0CAAkD,kBAAkB,6CAwH5F,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Area, AreaChart, Bar, BarChart, CartesianGrid, Cell, Legend, Line, LineChart, Pie, PieChart, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart, ResponsiveContainer, Tooltip, XAxis, YAxis, } from 'recharts';
|
|
4
|
+
const DEFAULT_COLORS = ['#1d4ed8', '#0ea5e9', '#14b8a6', '#22c55e', '#f59e0b', '#ef4444'];
|
|
5
|
+
function fallbackCode(markup) {
|
|
6
|
+
return (_jsx("pre", { className: "tagIt-chat-md-code-block", children: _jsx("code", { children: markup }) }));
|
|
7
|
+
}
|
|
8
|
+
function readPayload(raw) {
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
if (!parsed.type || !Array.isArray(parsed.data)) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return parsed;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function asNumber(value, fallback) {
|
|
24
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return fallback;
|
|
28
|
+
}
|
|
29
|
+
export const ChartRenderer = React.memo(function ChartRenderer({ rawJson }) {
|
|
30
|
+
const payload = readPayload(rawJson);
|
|
31
|
+
if (!payload) {
|
|
32
|
+
return fallbackCode(rawJson);
|
|
33
|
+
}
|
|
34
|
+
const chartHeight = Math.max(220, asNumber(payload.height, 280));
|
|
35
|
+
const data = payload.data;
|
|
36
|
+
const legendStyle = {
|
|
37
|
+
whiteSpace: 'normal',
|
|
38
|
+
wordBreak: 'break-word',
|
|
39
|
+
lineHeight: '1.5',
|
|
40
|
+
paddingTop: '4px',
|
|
41
|
+
};
|
|
42
|
+
const series = payload.series && payload.series.length > 0
|
|
43
|
+
? payload.series
|
|
44
|
+
: [{ dataKey: 'value', fill: DEFAULT_COLORS[0], stroke: DEFAULT_COLORS[0] }];
|
|
45
|
+
const xKey = payload.xKey || payload.nameKey || 'name';
|
|
46
|
+
const yKey = payload.yKey || series[0].dataKey;
|
|
47
|
+
const nameKey = payload.nameKey || xKey;
|
|
48
|
+
const valueKey = payload.valueKey || yKey;
|
|
49
|
+
const colors = payload.colors && payload.colors.length > 0 ? payload.colors : DEFAULT_COLORS;
|
|
50
|
+
return (_jsx("div", { className: "tagIt-chat-chart-wrap", role: "img", "aria-label": `${payload.type} visualization`, children: _jsxs(ResponsiveContainer, { width: "100%", height: chartHeight, children: [payload.type === 'BarChart' ? (_jsxs(BarChart, { data: data, margin: { top: 8, right: 16, left: 0, bottom: 8 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey }), _jsx(YAxis, {}), _jsx(Tooltip, {}), _jsx(Legend, { wrapperStyle: legendStyle }), series.map((item, index) => (_jsx(Bar, { dataKey: item.dataKey, fill: item.fill || colors[index % colors.length], name: item.name || item.dataKey }, `${item.dataKey}-${index}`)))] })) : null, payload.type === 'LineChart' ? (_jsxs(LineChart, { data: data, margin: { top: 8, right: 16, left: 0, bottom: 8 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey }), _jsx(YAxis, {}), _jsx(Tooltip, {}), _jsx(Legend, { wrapperStyle: legendStyle }), series.map((item, index) => (_jsx(Line, { type: "monotone", dataKey: item.dataKey, stroke: item.stroke || colors[index % colors.length], name: item.name || item.dataKey, dot: false }, `${item.dataKey}-${index}`)))] })) : null, payload.type === 'AreaChart' ? (_jsxs(AreaChart, { data: data, margin: { top: 8, right: 16, left: 0, bottom: 8 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3" }), _jsx(XAxis, { dataKey: xKey }), _jsx(YAxis, {}), _jsx(Tooltip, {}), _jsx(Legend, { wrapperStyle: legendStyle }), series.map((item, index) => (_jsx(Area, { type: "monotone", dataKey: item.dataKey, stroke: item.stroke || colors[index % colors.length], fill: item.fill || colors[index % colors.length], fillOpacity: 0.25, name: item.name || item.dataKey }, `${item.dataKey}-${index}`)))] })) : null, payload.type === 'PieChart' ? (_jsxs(PieChart, { children: [_jsx(Tooltip, {}), _jsx(Legend, { wrapperStyle: legendStyle }), _jsx(Pie, { data: data, dataKey: valueKey, nameKey: nameKey, outerRadius: 95, children: data.map((_, index) => (_jsx(Cell, { fill: colors[index % colors.length] }, `cell-${index}`))) })] })) : null, payload.type === 'RadarChart' ? (_jsxs(RadarChart, { data: data, outerRadius: 100, children: [_jsx(PolarGrid, {}), _jsx(PolarAngleAxis, { dataKey: xKey }), _jsx(PolarRadiusAxis, {}), _jsx(Tooltip, {}), _jsx(Legend, { wrapperStyle: legendStyle }), series.map((item, index) => (_jsx(Radar, { dataKey: item.dataKey, stroke: item.stroke || colors[index % colors.length], fill: item.fill || colors[index % colors.length], fillOpacity: 0.2, name: item.name || item.dataKey }, `${item.dataKey}-${index}`)))] })) : null] }) }));
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=ChartRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChartRenderer.js","sourceRoot":"","sources":["../../src/renderers/ChartRenderer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { MessageRole } from '@tagit/ai-client-core';
|
|
3
|
+
interface ContentBlockRendererProps {
|
|
4
|
+
role: MessageRole;
|
|
5
|
+
content: string;
|
|
6
|
+
showStreamingCursor?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const ContentBlockRenderer: React.MemoExoticComponent<({ role, content, showStreamingCursor, }: ContentBlockRendererProps) => import("react/jsx-runtime").JSX.Element>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=ContentBlockRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentBlockRenderer.d.ts","sourceRoot":"","sources":["../../src/renderers/ContentBlockRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,UAAU,yBAAyB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB,sEAI9B,yBAAyB,6CAe1B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { MarkdownRenderer } from './MarkdownRenderer.js';
|
|
4
|
+
export const ContentBlockRenderer = React.memo(function ContentBlockRenderer({ role, content, showStreamingCursor = false, }) {
|
|
5
|
+
if (role === 'user') {
|
|
6
|
+
return _jsx(_Fragment, { children: content });
|
|
7
|
+
}
|
|
8
|
+
if (showStreamingCursor) {
|
|
9
|
+
return (_jsxs("div", { className: "tagIt-chat-md-root tagIt-chat-md-streaming", children: [content, _jsx("span", { className: "tagIt-chat-streaming-cursor", "aria-hidden": "true" })] }));
|
|
10
|
+
}
|
|
11
|
+
return _jsx(MarkdownRenderer, { markdown: content, showStreamingCursor: showStreamingCursor });
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=ContentBlockRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentBlockRenderer.js","sourceRoot":"","sources":["../../src/renderers/ContentBlockRenderer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,oBAAoB,CAAC,EAC3E,IAAI,EACJ,OAAO,EACP,mBAAmB,GAAG,KAAK,GACD;IAC1B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,4BAAG,OAAO,GAAI,CAAC;IACxB,CAAC;IAED,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,CACL,eAAK,SAAS,EAAC,4CAA4C,aACxD,OAAO,EACR,eAAM,SAAS,EAAC,6BAA6B,iBAAa,MAAM,GAAG,IAC/D,CACP,CAAC;IACJ,CAAC;IAED,OAAO,KAAC,gBAAgB,IAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,GAAI,CAAC;AAC3F,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import 'highlight.js/styles/github-dark.css';
|
|
2
|
+
interface MarkdownRendererProps {
|
|
3
|
+
markdown: string;
|
|
4
|
+
showStreamingCursor?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function MarkdownRenderer({ markdown, showStreamingCursor }: MarkdownRendererProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=MarkdownRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../src/renderers/MarkdownRenderer.tsx"],"names":[],"mappings":"AAMA,OAAO,qCAAqC,CAAC;AAE7C,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AA6CD,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,mBAA2B,EAAE,EAAE,qBAAqB,2CA4ChG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useState } from 'react';
|
|
3
|
+
import { Check, Copy } from 'lucide-react';
|
|
4
|
+
import ReactMarkdown from 'react-markdown';
|
|
5
|
+
import remarkGfm from 'remark-gfm';
|
|
6
|
+
import rehypeHighlight from 'rehype-highlight';
|
|
7
|
+
import { ChartRenderer } from './ChartRenderer.js';
|
|
8
|
+
import 'highlight.js/styles/github-dark.css';
|
|
9
|
+
function extractText(children) {
|
|
10
|
+
if (typeof children === 'string') {
|
|
11
|
+
return children;
|
|
12
|
+
}
|
|
13
|
+
if (Array.isArray(children)) {
|
|
14
|
+
return children.map(extractText).join('');
|
|
15
|
+
}
|
|
16
|
+
if (children && typeof children === 'object' && 'props' in children) {
|
|
17
|
+
const childNode = children.props?.children;
|
|
18
|
+
return extractText(childNode);
|
|
19
|
+
}
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
function CodeBlock({ className, children }) {
|
|
23
|
+
const [copied, setCopied] = useState(false);
|
|
24
|
+
const timerRef = useRef(null);
|
|
25
|
+
const text = extractText(children).replace(/\n$/, '');
|
|
26
|
+
function handleCopy() {
|
|
27
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
28
|
+
setCopied(true);
|
|
29
|
+
if (timerRef.current)
|
|
30
|
+
clearTimeout(timerRef.current);
|
|
31
|
+
timerRef.current = setTimeout(() => setCopied(false), 1500);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return (_jsxs("pre", { className: "tagIt-chat-md-code-block", children: [_jsx("button", { type: "button", className: "tagIt-chat-md-copy-btn", onClick: handleCopy, "aria-label": copied ? 'Copied' : 'Copy code', "data-copied": copied ? '' : undefined, children: copied ? _jsx(Check, { size: 14 }) : _jsx(Copy, { size: 14 }) }), _jsx("code", { className: className, children: children })] }));
|
|
35
|
+
}
|
|
36
|
+
export function MarkdownRenderer({ markdown, showStreamingCursor = false }) {
|
|
37
|
+
const components = {
|
|
38
|
+
code({ className, children, ...props }) {
|
|
39
|
+
const text = extractText(children).replace(/\n$/, '');
|
|
40
|
+
const match = /language-(\w+)/.exec(className || '');
|
|
41
|
+
const language = match?.[1];
|
|
42
|
+
if (language === 'chart') {
|
|
43
|
+
return _jsx(ChartRenderer, { rawJson: text });
|
|
44
|
+
}
|
|
45
|
+
const inline = !(className && className.includes('language-'));
|
|
46
|
+
if (inline) {
|
|
47
|
+
return (_jsx("code", { className: "tagIt-chat-md-inline-code", ...props, children: children }));
|
|
48
|
+
}
|
|
49
|
+
return _jsx(CodeBlock, { className: className, children: children });
|
|
50
|
+
},
|
|
51
|
+
a({ href, children, ...props }) {
|
|
52
|
+
return (_jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", ...props, children: children }));
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
return (_jsxs("div", { className: "tagIt-chat-md-root", children: [_jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [rehypeHighlight], components: components, children: markdown }), showStreamingCursor ? _jsx("span", { className: "tagIt-chat-streaming-cursor", "aria-hidden": "true" }) : null] }));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=MarkdownRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../src/renderers/MarkdownRenderer.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tagit/ai-client-react",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "React
|
|
3
|
+
"version": "0.3.0-beta.1",
|
|
4
|
+
"description": "Self-contained React chat widget and hooks for TagIt AI client",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -29,11 +29,20 @@
|
|
|
29
29
|
"./provider": {
|
|
30
30
|
"types": "./dist/provider.d.ts",
|
|
31
31
|
"default": "./dist/provider.js"
|
|
32
|
+
},
|
|
33
|
+
"./conversation": {
|
|
34
|
+
"types": "./dist/chat-conversation.d.ts",
|
|
35
|
+
"default": "./dist/chat-conversation.js"
|
|
32
36
|
}
|
|
33
37
|
},
|
|
34
38
|
"dependencies": {
|
|
39
|
+
"highlight.js": "^11.11.1",
|
|
35
40
|
"lucide-react": "^1.7.0",
|
|
36
|
-
"
|
|
41
|
+
"react-markdown": "^10.1.0",
|
|
42
|
+
"recharts": "^3.8.1",
|
|
43
|
+
"rehype-highlight": "^7.0.2",
|
|
44
|
+
"remark-gfm": "^4.0.1",
|
|
45
|
+
"@tagit/ai-client-core": "0.3.0-beta.1"
|
|
37
46
|
},
|
|
38
47
|
"peerDependencies": {
|
|
39
48
|
"react": "^18.0.0",
|