@sqlrooms/ai-core 0.26.0 → 0.26.1-rc.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.
- package/dist/components/GroupedMessageParts.js +1 -1
- package/dist/components/GroupedMessageParts.js.map +1 -1
- package/dist/components/ReasoningBox.d.ts +2 -14
- package/dist/components/ReasoningBox.d.ts.map +1 -1
- package/dist/components/ReasoningBox.js +2 -14
- package/dist/components/ReasoningBox.js.map +1 -1
- package/dist/components/SessionControls.d.ts.map +1 -1
- package/dist/components/SessionControls.js +1 -1
- package/dist/components/SessionControls.js.map +1 -1
- package/dist/components/session/SessionTitle.d.ts.map +1 -1
- package/dist/components/session/SessionTitle.js +2 -2
- package/dist/components/session/SessionTitle.js.map +1 -1
- package/dist/components/tools/ToolErrorMessage.d.ts.map +1 -1
- package/dist/components/tools/ToolErrorMessage.js +1 -1
- package/dist/components/tools/ToolErrorMessage.js.map +1 -1
- package/dist/hooks/useAiChat.js +1 -1
- package/dist/hooks/useAiChat.js.map +1 -1
- package/dist/hooks/useAssistantMessageParts.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
|
@@ -26,7 +26,7 @@ export const GroupedMessageParts = ({ groupedParts, totalPartsCount, customMarkd
|
|
|
26
26
|
return (_jsx("div", { className: "text-muted-foreground text-xs", children: part.text }, `group-${groupIndex}`));
|
|
27
27
|
}
|
|
28
28
|
if (group.type === 'tool-group') {
|
|
29
|
-
return (_jsx(ReasoningBox, { title: group.title, defaultOpen: group.defaultExpanded, children: group.parts.map((part, partIndex) => (_jsx(ToolPartRenderer, { part: part }, `tool-call-${groupIndex}-${partIndex}`))) }, `group-${groupIndex}`));
|
|
29
|
+
return (_jsx(ReasoningBox, { title: group.title ? String(group.title) : undefined, defaultOpen: group.defaultExpanded, children: group.parts.map((part, partIndex) => (_jsx(ToolPartRenderer, { part: part }, `tool-call-${groupIndex}-${partIndex}`))) }, `group-${groupIndex}`));
|
|
30
30
|
}
|
|
31
31
|
return null;
|
|
32
32
|
}) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupedMessageParts.js","sourceRoot":"","sources":["../../src/components/GroupedMessageParts.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,UAAU,EAAE,eAAe,EAAC,MAAM,UAAU,CAAC;AAerD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CAAC,EACtE,YAAY,EACZ,eAAe,EACf,wBAAwB,GACzB,EAAE,EAAE;IACH,OAAO,CACL,4BACG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YACtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,OAAO,CACL,KAAC,cAAc,IAEb,OAAO,EAAE,IAAI,CAAC,IAAI,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,KAAK,eAAe,GAAG,CAAC,EAClD,wBAAwB,EAAE,wBAAwB,IAH7C,SAAS,UAAU,EAAE,CAI1B,CACH,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACjD,OAAO,CACL,cAEE,SAAS,EAAC,+BAA+B,YAExC,IAAI,CAAC,IAAI,IAHL,SAAS,UAAU,EAAE,CAItB,CACP,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,OAAO,CACL,KAAC,YAAY,IAEX,KAAK,EAAE,KAAK,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"GroupedMessageParts.js","sourceRoot":"","sources":["../../src/components/GroupedMessageParts.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAC,UAAU,EAAE,eAAe,EAAC,MAAM,UAAU,CAAC;AAerD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAuC,CAAC,EACtE,YAAY,EACZ,eAAe,EACf,wBAAwB,GACzB,EAAE,EAAE;IACH,OAAO,CACL,4BACG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YACtC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC5C,OAAO,CACL,KAAC,cAAc,IAEb,OAAO,EAAE,IAAI,CAAC,IAAI,EAClB,QAAQ,EAAE,KAAK,CAAC,UAAU,KAAK,eAAe,GAAG,CAAC,EAClD,wBAAwB,EAAE,wBAAwB,IAH7C,SAAS,UAAU,EAAE,CAI1B,CACH,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,CAAC;gBACjD,OAAO,CACL,cAEE,SAAS,EAAC,+BAA+B,YAExC,IAAI,CAAC,IAAI,IAHL,SAAS,UAAU,EAAE,CAItB,CACP,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,OAAO,CACL,KAAC,YAAY,IAEX,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EACpD,WAAW,EAAE,KAAK,CAAC,eAAe,YAEjC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CACpC,KAAC,gBAAgB,IAEf,IAAI,EAAE,IAAI,IADL,aAAa,UAAU,IAAI,SAAS,EAAE,CAE3C,CACH,CAAC,IATG,SAAS,UAAU,EAAE,CAUb,CAChB,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,GACD,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from 'react';\nimport {Components} from 'react-markdown';\nimport {AnalysisAnswer} from './AnalysisAnswer';\nimport {ReasoningBox} from './ReasoningBox';\nimport {ToolPartRenderer} from './ToolPartRenderer';\nimport {isTextPart, isReasoningPart} from '../utils';\nimport type {ToolGroup} from '../hooks/useToolGrouping';\n\n/**\n * Props for the GroupedMessageParts component\n */\ntype GroupedMessagePartsProps = {\n /** Array of grouped parts from useToolGrouping hook */\n groupedParts: ToolGroup[];\n /** Total number of message parts (used to determine if a text part is the final answer) */\n totalPartsCount: number;\n /** Optional custom components for markdown rendering */\n customMarkdownComponents?: Partial<Components>;\n};\n\n/**\n * Component that renders message parts with ReasoningBox grouping.\n * Groups consecutive tool parts into collapsible ReasoningBox components.\n *\n * @component\n * @param props - Component props\n * @returns A React component displaying the grouped message parts\n */\nexport const GroupedMessageParts: React.FC<GroupedMessagePartsProps> = ({\n groupedParts,\n totalPartsCount,\n customMarkdownComponents,\n}) => {\n return (\n <>\n {groupedParts.map((group, groupIndex) => {\n if (group.type === 'text') {\n const part = group.parts[0];\n if (!part || !isTextPart(part)) return null;\n return (\n <AnalysisAnswer\n key={`group-${groupIndex}`}\n content={part.text}\n isAnswer={group.startIndex === totalPartsCount - 1}\n customMarkdownComponents={customMarkdownComponents}\n />\n );\n }\n\n if (group.type === 'reasoning') {\n const part = group.parts[0];\n if (!part || !isReasoningPart(part)) return null;\n return (\n <div\n key={`group-${groupIndex}`}\n className=\"text-muted-foreground text-xs\"\n >\n {part.text}\n </div>\n );\n }\n\n if (group.type === 'tool-group') {\n return (\n <ReasoningBox\n key={`group-${groupIndex}`}\n title={group.title ? String(group.title) : undefined}\n defaultOpen={group.defaultExpanded}\n >\n {group.parts.map((part, partIndex) => (\n <ToolPartRenderer\n key={`tool-call-${groupIndex}-${partIndex}`}\n part={part}\n />\n ))}\n </ReasoningBox>\n );\n }\n\n return null;\n })}\n </>\n );\n};\n"]}
|
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
type ReasoningBoxProps = {
|
|
2
2
|
children: React.ReactNode;
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
className?: string;
|
|
4
|
+
title?: string;
|
|
5
5
|
defaultOpen?: boolean;
|
|
6
6
|
};
|
|
7
|
-
/**
|
|
8
|
-
* Component that renders a collapsible box for grouping consecutive tool parts.
|
|
9
|
-
* Starts collapsed by default (content hidden) unless defaultOpen is true.
|
|
10
|
-
* Clicking the title expands to show full content.
|
|
11
|
-
*
|
|
12
|
-
* @component
|
|
13
|
-
* @param props - Component props
|
|
14
|
-
* @param props.children - The tool parts to render inside the box
|
|
15
|
-
* @param props.title - Custom title to display (default: "Thought")
|
|
16
|
-
* @param props.defaultOpen - Whether the box should be expanded by default (default: false)
|
|
17
|
-
* @returns A React component displaying a collapsible reasoning box
|
|
18
|
-
*/
|
|
19
7
|
export declare const ReasoningBox: React.FC<ReasoningBoxProps>;
|
|
20
8
|
export {};
|
|
21
9
|
//# sourceMappingURL=ReasoningBox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReasoningBox.d.ts","sourceRoot":"","sources":["../../src/components/ReasoningBox.tsx"],"names":[],"mappings":"AAIA,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,
|
|
1
|
+
{"version":3,"file":"ReasoningBox.d.ts","sourceRoot":"","sources":["../../src/components/ReasoningBox.tsx"],"names":[],"mappings":"AAIA,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AACF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiDpD,CAAC"}
|
|
@@ -2,26 +2,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { ChevronDownIcon, ChevronRightIcon } from 'lucide-react';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import { cn } from '@sqlrooms/ui';
|
|
5
|
-
|
|
6
|
-
* Component that renders a collapsible box for grouping consecutive tool parts.
|
|
7
|
-
* Starts collapsed by default (content hidden) unless defaultOpen is true.
|
|
8
|
-
* Clicking the title expands to show full content.
|
|
9
|
-
*
|
|
10
|
-
* @component
|
|
11
|
-
* @param props - Component props
|
|
12
|
-
* @param props.children - The tool parts to render inside the box
|
|
13
|
-
* @param props.title - Custom title to display (default: "Thought")
|
|
14
|
-
* @param props.defaultOpen - Whether the box should be expanded by default (default: false)
|
|
15
|
-
* @returns A React component displaying a collapsible reasoning box
|
|
16
|
-
*/
|
|
17
|
-
export const ReasoningBox = ({ children, title, defaultOpen = false }) => {
|
|
5
|
+
export const ReasoningBox = ({ children, className, title, defaultOpen = false, }) => {
|
|
18
6
|
const displayTitle = title ?? 'Thought';
|
|
19
7
|
// Start with defaultOpen state (collapsed by default unless specified)
|
|
20
8
|
const [isOpen, setIsOpen] = useState(defaultOpen);
|
|
21
9
|
const handleToggle = () => {
|
|
22
10
|
setIsOpen(!isOpen);
|
|
23
11
|
};
|
|
24
|
-
return (_jsxs("div", { className:
|
|
12
|
+
return (_jsxs("div", { className: cn('border-muted rounded-md border', className), children: [_jsxs("button", { onClick: handleToggle, className: cn('flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-normal', 'text-gray-500 dark:text-gray-400', 'hover:bg-muted/80 transition-colors', isOpen ? 'rounded-t-md' : 'rounded-md'), children: [isOpen ? (_jsx(ChevronDownIcon, { className: "h-3 w-3 shrink-0" })) : (_jsx(ChevronRightIcon, { className: "h-3 w-3 shrink-0" })), _jsx("span", { className: "flex-1 truncate", children: displayTitle })] }), isOpen && (_jsx("div", { className: cn('overflow-y-auto px-3 pb-3', 'scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-transparent', 'dark:scrollbar-thumb-gray-600'), style: {
|
|
25
13
|
scrollbarWidth: 'thin',
|
|
26
14
|
scrollbarColor: 'rgb(209 213 219) transparent',
|
|
27
15
|
}, children: _jsx("div", { className: "flex flex-col gap-2 pt-2", children: children }) }))] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReasoningBox.js","sourceRoot":"","sources":["../../src/components/ReasoningBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,eAAe,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ReasoningBox.js","sourceRoot":"","sources":["../../src/components/ReasoningBox.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,eAAe,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAQhC,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,QAAQ,EACR,SAAS,EACT,KAAK,EACL,WAAW,GAAG,KAAK,GACpB,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,KAAK,IAAI,SAAS,CAAC;IACxC,uEAAuE;IACvE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,SAAS,CAAC,aAC7D,kBACE,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,EAAE,CACX,wEAAwE,EACxE,kCAAkC,EAClC,qCAAqC,EACrC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CACvC,aAEA,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,eAAe,IAAC,SAAS,EAAC,kBAAkB,GAAG,CACjD,CAAC,CAAC,CAAC,CACF,KAAC,gBAAgB,IAAC,SAAS,EAAC,kBAAkB,GAAG,CAClD,EACD,eAAM,SAAS,EAAC,iBAAiB,YAAE,YAAY,GAAQ,IAChD,EACR,MAAM,IAAI,CACT,cACE,SAAS,EAAE,EAAE,CACX,2BAA2B,EAC3B,qEAAqE,EACrE,+BAA+B,CAChC,EACD,KAAK,EAAE;oBACL,cAAc,EAAE,MAAM;oBACtB,cAAc,EAAE,8BAA8B;iBAC/C,YAED,cAAK,SAAS,EAAC,0BAA0B,YAAE,QAAQ,GAAO,GACtD,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {ChevronDownIcon, ChevronRightIcon} from 'lucide-react';\nimport {useState} from 'react';\nimport {cn} from '@sqlrooms/ui';\n\ntype ReasoningBoxProps = {\n children: React.ReactNode;\n className?: string;\n title?: string;\n defaultOpen?: boolean;\n};\nexport const ReasoningBox: React.FC<ReasoningBoxProps> = ({\n children,\n className,\n title,\n defaultOpen = false,\n}) => {\n const displayTitle = title ?? 'Thought';\n // Start with defaultOpen state (collapsed by default unless specified)\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n const handleToggle = () => {\n setIsOpen(!isOpen);\n };\n\n return (\n <div className={cn('border-muted rounded-md border', className)}>\n <button\n onClick={handleToggle}\n className={cn(\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-normal',\n 'text-gray-500 dark:text-gray-400',\n 'hover:bg-muted/80 transition-colors',\n isOpen ? 'rounded-t-md' : 'rounded-md',\n )}\n >\n {isOpen ? (\n <ChevronDownIcon className=\"h-3 w-3 shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"h-3 w-3 shrink-0\" />\n )}\n <span className=\"flex-1 truncate\">{displayTitle}</span>\n </button>\n {isOpen && (\n <div\n className={cn(\n 'overflow-y-auto px-3 pb-3',\n 'scrollbar-thin scrollbar-thumb-gray-300 scrollbar-track-transparent',\n 'dark:scrollbar-thumb-gray-600',\n )}\n style={{\n scrollbarWidth: 'thin',\n scrollbarColor: 'rgb(209 213 219) transparent',\n }}\n >\n <div className=\"flex flex-col gap-2 pt-2\">{children}</div>\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionControls.d.ts","sourceRoot":"","sources":["../../src/components/SessionControls.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,
|
|
1
|
+
{"version":3,"file":"SessionControls.d.ts","sourceRoot":"","sources":["../../src/components/SessionControls.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CA8BA,CAAC"}
|
|
@@ -15,6 +15,6 @@ import { SessionActions, SessionDropdown, SessionTitle } from './session';
|
|
|
15
15
|
*/
|
|
16
16
|
export const SessionControls = ({ className, children }) => {
|
|
17
17
|
const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());
|
|
18
|
-
return (_jsx(_Fragment, { children: _jsxs("div", { className: cn('flex flex-wrap items-center justify-between', className), children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(SessionDropdown, {}), _jsx(SessionTitle, {}), currentSession && (_jsx("div", { className: "text-muted-foreground text-xs", children: currentSession.model }))] }), children, _jsx(SessionActions, {})] }) }));
|
|
18
|
+
return (_jsx(_Fragment, { children: _jsxs("div", { className: cn('flex flex-wrap items-center justify-between gap-2', className), children: [_jsxs("div", { className: "flex flex-grow items-center gap-3", children: [_jsx(SessionDropdown, {}), _jsx(SessionTitle, {}), currentSession && (_jsx("div", { className: "text-muted-foreground whitespace-nowrap text-xs", children: currentSession.model }))] }), children, _jsx(SessionActions, {})] }) }));
|
|
19
19
|
};
|
|
20
20
|
//# sourceMappingURL=SessionControls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionControls.js","sourceRoot":"","sources":["../../src/components/SessionControls.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,YAAY,EAAC,MAAM,WAAW,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAGvB,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,OAAO,CACL,4BAEE,eACE,SAAS,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"SessionControls.js","sourceRoot":"","sources":["../../src/components/SessionControls.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAC,MAAM,cAAc,CAAC;AAEhC,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAC,cAAc,EAAE,eAAe,EAAE,YAAY,EAAC,MAAM,WAAW,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAGvB,CAAC,EAAC,SAAS,EAAE,QAAQ,EAAC,EAAE,EAAE;IAC7B,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,OAAO,CACL,4BAEE,eACE,SAAS,EAAE,EAAE,CACX,mDAAmD,EACnD,SAAS,CACV,aAGD,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,eAAe,KAAG,EACnB,KAAC,YAAY,KAAG,EACf,cAAc,IAAI,CACjB,cAAK,SAAS,EAAC,iDAAiD,YAC7D,cAAc,CAAC,KAAK,GACjB,CACP,IACG,EAGL,QAAQ,EAGT,KAAC,cAAc,KAAG,IACd,GACL,CACJ,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {cn} from '@sqlrooms/ui';\nimport React from 'react';\nimport {useStoreWithAi} from '../AiSlice';\nimport {SessionActions, SessionDropdown, SessionTitle} from './session';\n\n/**\n * Main component for managing AI sessions.\n * Combines session dropdown, title editing, action buttons, and delete confirmation.\n *\n * @example\n * ```tsx\n * <SessionControls className=\"p-4 border-b\">\n * <Button>Custom Button</Button>\n * </SessionControls>\n * ```\n */\nexport const SessionControls: React.FC<{\n className?: string;\n children?: React.ReactNode;\n}> = ({className, children}) => {\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n return (\n <>\n {/* Header with session controls */}\n <div\n className={cn(\n 'flex flex-wrap items-center justify-between gap-2',\n className,\n )}\n >\n {/* Left side - History Button and Editable Session Title */}\n <div className=\"flex flex-grow items-center gap-3\">\n <SessionDropdown />\n <SessionTitle />\n {currentSession && (\n <div className=\"text-muted-foreground whitespace-nowrap text-xs\">\n {currentSession.model}\n </div>\n )}\n </div>\n\n {/* Render children if provided */}\n {children}\n\n {/* Right side buttons */}\n <SessionActions />\n </div>\n </>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionTitle.d.ts","sourceRoot":"","sources":["../../../src/components/session/SessionTitle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,
|
|
1
|
+
{"version":3,"file":"SessionTitle.d.ts","sourceRoot":"","sources":["../../../src/components/session/SessionTitle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAwBpD,CAAC"}
|
|
@@ -13,10 +13,10 @@ import { useStoreWithAi } from '../../AiSlice';
|
|
|
13
13
|
export const SessionTitle = ({ className }) => {
|
|
14
14
|
const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());
|
|
15
15
|
const renameSession = useStoreWithAi((s) => s.ai.renameSession);
|
|
16
|
-
return (_jsx("div", { className: cn('flex items-center gap-2', className), children: currentSession ? (_jsx(EditableText, { value: currentSession.name, onChange: (newName) => {
|
|
16
|
+
return (_jsx("div", { className: cn('flex w-full items-center gap-2', className), children: currentSession ? (_jsx(EditableText, { value: currentSession.name, onChange: (newName) => {
|
|
17
17
|
if (currentSession && newName.trim()) {
|
|
18
18
|
renameSession(currentSession.id, newName);
|
|
19
19
|
}
|
|
20
|
-
}, placeholder: "Session name", className: "text-sm font-medium"
|
|
20
|
+
}, placeholder: "Session name", className: "text-sm font-medium" })) : (_jsx("span", { className: "text-muted-foreground text-sm font-medium", children: "No session selected" })) }));
|
|
21
21
|
};
|
|
22
22
|
//# sourceMappingURL=SessionTitle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionTitle.js","sourceRoot":"","sources":["../../../src/components/session/SessionTitle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAS7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACvE,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IAEhE,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"SessionTitle.js","sourceRoot":"","sources":["../../../src/components/session/SessionTitle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,EAAE,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAC;AAS7C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACvE,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IAEhE,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,gCAAgC,EAAE,SAAS,CAAC,YAC5D,cAAc,CAAC,CAAC,CAAC,CAChB,KAAC,YAAY,IACX,KAAK,EAAE,cAAc,CAAC,IAAI,EAC1B,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;gBACpB,IAAI,cAAc,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBACrC,aAAa,CAAC,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC,EACD,WAAW,EAAC,cAAc,EAC1B,SAAS,EAAC,qBAAqB,GAC/B,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,2CAA2C,oCAEpD,CACR,GACG,CACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {cn, EditableText} from '@sqlrooms/ui';\nimport React from 'react';\nimport {useStoreWithAi} from '../../AiSlice';\n\n/**\n * Props for the SessionTitle component\n */\nexport interface SessionTitleProps {\n className?: string;\n}\n\n/**\n * Component that displays the current session name as an editable text field.\n * Shows the model name if available and a placeholder if no session is selected.\n *\n * @example\n * ```tsx\n * <SessionTitle className=\"my-custom-class\" />\n * ```\n */\nexport const SessionTitle: React.FC<SessionTitleProps> = ({className}) => {\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n const renameSession = useStoreWithAi((s) => s.ai.renameSession);\n\n return (\n <div className={cn('flex w-full items-center gap-2', className)}>\n {currentSession ? (\n <EditableText\n value={currentSession.name}\n onChange={(newName) => {\n if (currentSession && newName.trim()) {\n renameSession(currentSession.id, newName);\n }\n }}\n placeholder=\"Session name\"\n className=\"text-sm font-medium\"\n />\n ) : (\n <span className=\"text-muted-foreground text-sm font-medium\">\n No session selected\n </span>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"ToolErrorMessage.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,2CA4C5D"}
|
|
@@ -9,7 +9,7 @@ export function ToolErrorMessage(props) {
|
|
|
9
9
|
const editorHeightPx = props.editorHeightPx ?? 300;
|
|
10
10
|
const hasDetails = props.details != null;
|
|
11
11
|
const popoverOpen = useDisclosure();
|
|
12
|
-
return (_jsxs(Popover, { open: popoverOpen.isOpen, onOpenChange: popoverOpen.onToggle, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { className: "w-fit", variant: "ghost", size: "xs", children: _jsx(TriangleAlertIcon, {}) }) }), _jsx(PopoverContent, { align: align, style: { width: '600px', maxWidth: '80%' }, children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "border-b text-sm font-medium
|
|
12
|
+
return (_jsxs(Popover, { open: popoverOpen.isOpen, onOpenChange: popoverOpen.onToggle, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { className: "w-fit", variant: "ghost", size: "xs", children: _jsx(TriangleAlertIcon, {}) }) }), _jsx(PopoverContent, { align: align, style: { width: '600px', maxWidth: '80%' }, children: _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "border-b text-sm font-medium", children: title }), errorText ? (_jsx("div", { className: "whitespace-pre-wrap font-mono text-xs", children: errorText })) : null, hasDetails && popoverOpen.isOpen ? (_jsx("div", { className: "w-full overflow-hidden rounded-md border", style: { height: editorHeightPx }, children: _jsx(JsonMonacoEditor, { value: props.details, readOnly: true, options: {
|
|
13
13
|
lineNumbers: 'off',
|
|
14
14
|
minimap: { enabled: false },
|
|
15
15
|
scrollBeyondLastLine: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolErrorMessage.js","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,MAAM,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAwC/C,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,GAAG,CAAC;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IAEpC,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,QAAQ,aACnE,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,YACjD,KAAC,iBAAiB,KAAG,GACd,GACM,EACjB,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAC,YACpE,eAAK,SAAS,EAAC,qBAAqB,aAClC,cAAK,SAAS,EAAC
|
|
1
|
+
{"version":3,"file":"ToolErrorMessage.js","sourceRoot":"","sources":["../../../src/components/tools/ToolErrorMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,gBAAgB,EAAC,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,MAAM,EACN,OAAO,EACP,cAAc,EACd,cAAc,EACd,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAwC/C,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACpD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,GAAG,CAAC;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,aAAa,EAAE,CAAC;IAEpC,OAAO,CACL,MAAC,OAAO,IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,QAAQ,aACnE,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IAAC,SAAS,EAAC,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,YACjD,KAAC,iBAAiB,KAAG,GACd,GACM,EACjB,KAAC,cAAc,IAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAC,YACpE,eAAK,SAAS,EAAC,qBAAqB,aAClC,cAAK,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAO,EAC1D,SAAS,CAAC,CAAC,CAAC,CACX,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,GACN,CACP,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAClC,cACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAC,MAAM,EAAE,cAAc,EAAC,YAE/B,KAAC,gBAAgB,IACf,KAAK,EAAE,KAAK,CAAC,OAAiD,EAC9D,QAAQ,EAAE,IAAI,EACd,OAAO,EAAE;oCACP,WAAW,EAAE,KAAK;oCAClB,OAAO,EAAE,EAAC,OAAO,EAAE,KAAK,EAAC;oCACzB,oBAAoB,EAAE,KAAK;oCAC3B,QAAQ,EAAE,IAAI;iCACf,GACD,GACE,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,GACS,IACT,CACX,CAAC;AACJ,CAAC","sourcesContent":["import {JsonMonacoEditor} from '@sqlrooms/monaco-editor';\nimport {\n Button,\n Popover,\n PopoverContent,\n PopoverTrigger,\n useDisclosure,\n} from '@sqlrooms/ui';\nimport {TriangleAlertIcon} from 'lucide-react';\n\n/**\n * Displays a compact, reusable popover with a warning icon and error details.\n * Intended for tool rendering/processing errors to keep UIs consistent.\n *\n * The popover is controllable to optimize performance by only rendering the\n * JsonMonacoEditor when the popover is actually open.\n */\nexport interface ToolErrorMessageProps {\n /**\n * Error object or message to display inside the popover body.\n */\n error?: unknown;\n /**\n * Optional structured details to render in a Monaco JSON editor.\n */\n details?: string | object;\n /**\n * Header text shown at the top of the popover.\n * Defaults to \"Tool rendering error\".\n */\n title?: string;\n /**\n * Label shown next to the warning icon in the trigger button.\n * Defaults to \"Tool rendering failed\".\n */\n triggerLabel?: string;\n /**\n * Alignment of the popover content relative to its trigger.\n * Defaults to \"start\".\n */\n align?: 'start' | 'center' | 'end';\n /**\n * Height for the embedded editor when details are provided.\n * Defaults to 300px.\n */\n editorHeightPx?: number;\n}\n\nexport function ToolErrorMessage(props: ToolErrorMessageProps) {\n const title = props.title ?? 'Tool rendering error';\n const align = props.align ?? 'start';\n const errorText = props.error != null ? String(props.error) : '';\n const editorHeightPx = props.editorHeightPx ?? 300;\n const hasDetails = props.details != null;\n const popoverOpen = useDisclosure();\n\n return (\n <Popover open={popoverOpen.isOpen} onOpenChange={popoverOpen.onToggle}>\n <PopoverTrigger asChild>\n <Button className=\"w-fit\" variant=\"ghost\" size=\"xs\">\n <TriangleAlertIcon />\n </Button>\n </PopoverTrigger>\n <PopoverContent align={align} style={{width: '600px', maxWidth: '80%'}}>\n <div className=\"flex flex-col gap-2\">\n <div className=\"border-b text-sm font-medium\">{title}</div>\n {errorText ? (\n <div className=\"whitespace-pre-wrap font-mono text-xs\">\n {errorText}\n </div>\n ) : null}\n {hasDetails && popoverOpen.isOpen ? (\n <div\n className=\"w-full overflow-hidden rounded-md border\"\n style={{height: editorHeightPx}}\n >\n <JsonMonacoEditor\n value={props.details as unknown as object | string | undefined}\n readOnly={true}\n options={{\n lineNumbers: 'off',\n minimap: {enabled: false},\n scrollBeyondLastLine: false,\n wordWrap: 'on',\n }}\n />\n </div>\n ) : null}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"]}
|
package/dist/hooks/useAiChat.js
CHANGED
|
@@ -77,7 +77,7 @@ export function useAiChat() {
|
|
|
77
77
|
return lastAssistantMessageIsCompleteWithToolCalls(options);
|
|
78
78
|
};
|
|
79
79
|
const initialMessages = useMemo(() => {
|
|
80
|
-
return completeIncompleteToolCalls(
|
|
80
|
+
return completeIncompleteToolCalls(currentSession?.uiMessages ?? []);
|
|
81
81
|
}, [sessionId, messagesRevision]);
|
|
82
82
|
const { messages, sendMessage, addToolResult, stop, status } = useChat({
|
|
83
83
|
id: `${sessionId}-${messagesRevision}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAiChat.js","sourceRoot":"","sources":["../../src/hooks/useAiChat.ts"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef} from 'react';\nimport {useChat} from '@ai-sdk/react';\nimport {\n DefaultChatTransport,\n lastAssistantMessageIsCompleteWithToolCalls,\n} from 'ai';\nimport type {UIMessage} from 'ai';\nimport {useStoreWithAi} from '../AiSlice';\nimport type {ToolCall} from '../chatTransport';\nimport {completeIncompleteToolCalls} from '../chatTransport';\n\nexport type AddToolResult = (\n options:\n | {tool: string; toolCallId: string; output: unknown}\n | {\n tool: string;\n toolCallId: string;\n state: 'output-error';\n errorText: string;\n },\n) => void;\n\n/**\n * Custom hook that provides AI chat functionality with automatic transport setup,\n * message syncing, and tool call handling.\n *\n * This hook encapsulates all the logic needed to integrate the AI SDK's useChat\n * with the AI slice state management.\n *\n * @returns An object containing messages and sendMessage from useChat\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {messages, sendMessage} = useAiChat();\n *\n * const handleSubmit = () => {\n * sendMessage({text: 'Hello!'});\n * };\n *\n * return (\n * <div>\n * {messages.map(msg => <div key={msg.id}>{msg.content}</div>)}\n * </div>\n * );\n * }\n * ```\n */\nexport function useAiChat() {\n // Get current session and configuration\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n const sessionId = currentSession?.id;\n const model = currentSession?.model;\n // Use messagesRevision to force reset only when messages are explicitly deleted\n const messagesRevision = currentSession?.messagesRevision ?? 0;\n\n // Get chat transport configuration\n const getLocalChatTransport = useStoreWithAi(\n (s) => s.ai.getLocalChatTransport,\n );\n const getRemoteChatTransport = useStoreWithAi(\n (s) => s.ai.getRemoteChatTransport,\n );\n const endPoint = useStoreWithAi((s) => s.ai.chatEndPoint);\n const headers = useStoreWithAi((s) => s.ai.chatHeaders);\n\n // Get chat handlers\n const onChatToolCall = useStoreWithAi((s) => s.ai.onChatToolCall);\n const onChatFinish = useStoreWithAi((s) => s.ai.onChatFinish);\n const onChatData = useStoreWithAi((s) => s.ai.onChatData);\n const onChatError = useStoreWithAi((s) => s.ai.onChatError);\n const setSessionUiMessages = useStoreWithAi((s) => s.ai.setSessionUiMessages);\n const setChatStop = useStoreWithAi((s) => s.ai.setChatStop);\n const setChatSendMessage = useStoreWithAi((s) => s.ai.setChatSendMessage);\n const setAddToolResult = useStoreWithAi((s) => s.ai.setAddToolResult);\n\n // Abort/auto-send guards\n const isAborted = useStoreWithAi(\n (s) => s.ai.analysisAbortController?.signal.aborted ?? false,\n );\n const isAbortedRef = useRef<boolean>(isAborted);\n // Keep a live ref so sendAutomaticallyWhen sees latest abort state even if useChat doesn't reinit\n useEffect(() => {\n isAbortedRef.current = isAborted;\n }, [isAborted]);\n\n // Create transport (recreate when model changes)\n const transport: DefaultChatTransport<UIMessage> = useMemo(() => {\n // Recreate transport when the model changes\n void model;\n const trimmed = (endPoint || '').trim();\n if (trimmed.length > 0) {\n return getRemoteChatTransport(trimmed, headers);\n }\n return getLocalChatTransport();\n }, [getLocalChatTransport, getRemoteChatTransport, headers, endPoint, model]);\n\n // Setup useChat with all configuration\n // Include messagesRevision in the id to force reset only when messages are explicitly deleted\n // Store addToolResult in a ref that can be captured by the onToolCall closure\n const addToolResultRef = useRef<AddToolResult>(null!);\n\n // Gate auto-send when analysis is aborted or cancelled, to prevent unintended follow-ups\n type SendAutoWhenArg = Parameters<\n typeof lastAssistantMessageIsCompleteWithToolCalls\n >[0];\n const shouldAutoSend = (options: SendAutoWhenArg) => {\n if (isAbortedRef.current) return false;\n return lastAssistantMessageIsCompleteWithToolCalls(options);\n };\n\n const initialMessages = useMemo(() => {\n return completeIncompleteToolCalls(\n ((currentSession?.uiMessages as unknown as UIMessage[]) ?? []),\n );\n }, [sessionId, messagesRevision]);\n\n const {messages, sendMessage, addToolResult, stop, status} = useChat({\n id: `${sessionId}-${messagesRevision}`,\n transport,\n messages: initialMessages,\n onToolCall: async (opts) => {\n const {toolCall} = opts as {toolCall: unknown};\n // Wrap the store's onChatToolCall to provide addToolResult\n // Use the captured addToolResult from the ref\n return onChatToolCall?.({\n toolCall: toolCall as ToolCall,\n addToolResult: addToolResultRef.current,\n });\n },\n onFinish: onChatFinish,\n onError: onChatError,\n onData: onChatData,\n // Automatically submit when all tool results are available\n // NOTE: When using sendAutomaticallyWhen, don't use await with addToolResult inside onChatToolCall as it can cause deadlocks.\n sendAutomaticallyWhen: shouldAutoSend,\n });\n\n // Capture addToolResult for use in onToolCall\n addToolResultRef.current = addToolResult;\n\n // If user aborts mid-stream, stop the local chat stream immediately\n useEffect(() => {\n if (isAbortedRef.current && status === 'streaming') {\n stop();\n }\n }, [status, stop, isAborted]);\n\n // Register stop with the store so cancelAnalysis can stop the stream\n useEffect(() => {\n setChatStop?.(stop);\n return () => setChatStop?.(undefined);\n }, [setChatStop, stop]);\n\n // Register sendMessage with the store so it can be accessed from the slice\n useEffect(() => {\n setChatSendMessage?.(sendMessage);\n return () => setChatSendMessage?.(undefined);\n }, [setChatSendMessage, sendMessage]);\n\n // Register addToolResult with the store so it can be accessed from the slice\n useEffect(() => {\n setAddToolResult?.(addToolResult);\n return () => setAddToolResult?.(undefined);\n }, [setAddToolResult, addToolResult]);\n\n // Sync streaming updates into the store so UiMessages renders incrementally\n useEffect(() => {\n if (!sessionId) return;\n setSessionUiMessages(sessionId, messages as UIMessage[]);\n }, [messages, sessionId, setSessionUiMessages]);\n\n return {\n messages,\n sendMessage,\n stop,\n status,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useAiChat.js","sourceRoot":"","sources":["../../src/hooks/useAiChat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AACtC,OAAO,EAEL,2CAA2C,GAC5C,MAAM,IAAI,CAAC;AAEZ,OAAO,EAAC,cAAc,EAAC,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAC,2BAA2B,EAAC,MAAM,kBAAkB,CAAC;AAa7D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,SAAS;IACvB,wCAAwC;IACxC,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,cAAc,EAAE,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,EAAE,KAAK,CAAC;IACpC,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,cAAc,EAAE,gBAAgB,IAAI,CAAC,CAAC;IAE/D,mCAAmC;IACnC,MAAM,qBAAqB,GAAG,cAAc,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,qBAAqB,CAClC,CAAC;IACF,MAAM,sBAAsB,GAAG,cAAc,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,CACnC,CAAC;IACF,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAExD,oBAAoB;IACpB,MAAM,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,oBAAoB,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;IAC1E,MAAM,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAEtE,yBAAyB;IACzB,MAAM,SAAS,GAAG,cAAc,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,uBAAuB,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,CAC7D,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,CAAU,SAAS,CAAC,CAAC;IAChD,kGAAkG;IAClG,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,GAAG,SAAS,CAAC;IACnC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,iDAAiD;IACjD,MAAM,SAAS,GAAoC,OAAO,CAAC,GAAG,EAAE;QAC9D,4CAA4C;QAC5C,KAAK,KAAK,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,qBAAqB,EAAE,CAAC;IACjC,CAAC,EAAE,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IAE9E,uCAAuC;IACvC,8FAA8F;IAC9F,8EAA8E;IAC9E,MAAM,gBAAgB,GAAG,MAAM,CAAgB,IAAK,CAAC,CAAC;IAMtD,MAAM,cAAc,GAAG,CAAC,OAAwB,EAAE,EAAE;QAClD,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACvC,OAAO,2CAA2C,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE;QACnC,OAAO,2BAA2B,CAC/B,cAAc,EAAE,UAAqC,IAAI,EAAE,CAC7D,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAElC,MAAM,EAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAC,GAAG,OAAO,CAAC;QACnE,EAAE,EAAE,GAAG,SAAS,IAAI,gBAAgB,EAAE;QACtC,SAAS;QACT,QAAQ,EAAE,eAAe;QACzB,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,EAAC,QAAQ,EAAC,GAAG,IAA2B,CAAC;YAC/C,2DAA2D;YAC3D,8CAA8C;YAC9C,OAAO,cAAc,EAAE,CAAC;gBACtB,QAAQ,EAAE,QAAoB;gBAC9B,aAAa,EAAE,gBAAgB,CAAC,OAAO;aACxC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,UAAU;QAClB,2DAA2D;QAC3D,8HAA8H;QAC9H,qBAAqB,EAAE,cAAc;KACtC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,gBAAgB,CAAC,OAAO,GAAG,aAAa,CAAC;IAEzC,oEAAoE;IACpE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,OAAO,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YACnD,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9B,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IAExB,2EAA2E;IAC3E,SAAS,CAAC,GAAG,EAAE;QACb,kBAAkB,EAAE,CAAC,WAAW,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC;IAEtC,6EAA6E;IAC7E,SAAS,CAAC,GAAG,EAAE;QACb,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC,CAAC;IAEtC,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,oBAAoB,CAAC,SAAS,EAAE,QAAuB,CAAC,CAAC;IAC3D,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAEhD,OAAO;QACL,QAAQ;QACR,WAAW;QACX,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC","sourcesContent":["import {useEffect, useMemo, useRef} from 'react';\nimport {useChat} from '@ai-sdk/react';\nimport {\n DefaultChatTransport,\n lastAssistantMessageIsCompleteWithToolCalls,\n} from 'ai';\nimport type {UIMessage} from 'ai';\nimport {useStoreWithAi} from '../AiSlice';\nimport type {ToolCall} from '../chatTransport';\nimport {completeIncompleteToolCalls} from '../chatTransport';\n\nexport type AddToolResult = (\n options:\n | {tool: string; toolCallId: string; output: unknown}\n | {\n tool: string;\n toolCallId: string;\n state: 'output-error';\n errorText: string;\n },\n) => void;\n\n/**\n * Custom hook that provides AI chat functionality with automatic transport setup,\n * message syncing, and tool call handling.\n *\n * This hook encapsulates all the logic needed to integrate the AI SDK's useChat\n * with the AI slice state management.\n *\n * @returns An object containing messages and sendMessage from useChat\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {messages, sendMessage} = useAiChat();\n *\n * const handleSubmit = () => {\n * sendMessage({text: 'Hello!'});\n * };\n *\n * return (\n * <div>\n * {messages.map(msg => <div key={msg.id}>{msg.content}</div>)}\n * </div>\n * );\n * }\n * ```\n */\nexport function useAiChat() {\n // Get current session and configuration\n const currentSession = useStoreWithAi((s) => s.ai.getCurrentSession());\n const sessionId = currentSession?.id;\n const model = currentSession?.model;\n // Use messagesRevision to force reset only when messages are explicitly deleted\n const messagesRevision = currentSession?.messagesRevision ?? 0;\n\n // Get chat transport configuration\n const getLocalChatTransport = useStoreWithAi(\n (s) => s.ai.getLocalChatTransport,\n );\n const getRemoteChatTransport = useStoreWithAi(\n (s) => s.ai.getRemoteChatTransport,\n );\n const endPoint = useStoreWithAi((s) => s.ai.chatEndPoint);\n const headers = useStoreWithAi((s) => s.ai.chatHeaders);\n\n // Get chat handlers\n const onChatToolCall = useStoreWithAi((s) => s.ai.onChatToolCall);\n const onChatFinish = useStoreWithAi((s) => s.ai.onChatFinish);\n const onChatData = useStoreWithAi((s) => s.ai.onChatData);\n const onChatError = useStoreWithAi((s) => s.ai.onChatError);\n const setSessionUiMessages = useStoreWithAi((s) => s.ai.setSessionUiMessages);\n const setChatStop = useStoreWithAi((s) => s.ai.setChatStop);\n const setChatSendMessage = useStoreWithAi((s) => s.ai.setChatSendMessage);\n const setAddToolResult = useStoreWithAi((s) => s.ai.setAddToolResult);\n\n // Abort/auto-send guards\n const isAborted = useStoreWithAi(\n (s) => s.ai.analysisAbortController?.signal.aborted ?? false,\n );\n const isAbortedRef = useRef<boolean>(isAborted);\n // Keep a live ref so sendAutomaticallyWhen sees latest abort state even if useChat doesn't reinit\n useEffect(() => {\n isAbortedRef.current = isAborted;\n }, [isAborted]);\n\n // Create transport (recreate when model changes)\n const transport: DefaultChatTransport<UIMessage> = useMemo(() => {\n // Recreate transport when the model changes\n void model;\n const trimmed = (endPoint || '').trim();\n if (trimmed.length > 0) {\n return getRemoteChatTransport(trimmed, headers);\n }\n return getLocalChatTransport();\n }, [getLocalChatTransport, getRemoteChatTransport, headers, endPoint, model]);\n\n // Setup useChat with all configuration\n // Include messagesRevision in the id to force reset only when messages are explicitly deleted\n // Store addToolResult in a ref that can be captured by the onToolCall closure\n const addToolResultRef = useRef<AddToolResult>(null!);\n\n // Gate auto-send when analysis is aborted or cancelled, to prevent unintended follow-ups\n type SendAutoWhenArg = Parameters<\n typeof lastAssistantMessageIsCompleteWithToolCalls\n >[0];\n const shouldAutoSend = (options: SendAutoWhenArg) => {\n if (isAbortedRef.current) return false;\n return lastAssistantMessageIsCompleteWithToolCalls(options);\n };\n\n const initialMessages = useMemo(() => {\n return completeIncompleteToolCalls(\n (currentSession?.uiMessages as unknown as UIMessage[]) ?? [],\n );\n }, [sessionId, messagesRevision]);\n\n const {messages, sendMessage, addToolResult, stop, status} = useChat({\n id: `${sessionId}-${messagesRevision}`,\n transport,\n messages: initialMessages,\n onToolCall: async (opts) => {\n const {toolCall} = opts as {toolCall: unknown};\n // Wrap the store's onChatToolCall to provide addToolResult\n // Use the captured addToolResult from the ref\n return onChatToolCall?.({\n toolCall: toolCall as ToolCall,\n addToolResult: addToolResultRef.current,\n });\n },\n onFinish: onChatFinish,\n onError: onChatError,\n onData: onChatData,\n // Automatically submit when all tool results are available\n // NOTE: When using sendAutomaticallyWhen, don't use await with addToolResult inside onChatToolCall as it can cause deadlocks.\n sendAutomaticallyWhen: shouldAutoSend,\n });\n\n // Capture addToolResult for use in onToolCall\n addToolResultRef.current = addToolResult;\n\n // If user aborts mid-stream, stop the local chat stream immediately\n useEffect(() => {\n if (isAbortedRef.current && status === 'streaming') {\n stop();\n }\n }, [status, stop, isAborted]);\n\n // Register stop with the store so cancelAnalysis can stop the stream\n useEffect(() => {\n setChatStop?.(stop);\n return () => setChatStop?.(undefined);\n }, [setChatStop, stop]);\n\n // Register sendMessage with the store so it can be accessed from the slice\n useEffect(() => {\n setChatSendMessage?.(sendMessage);\n return () => setChatSendMessage?.(undefined);\n }, [setChatSendMessage, sendMessage]);\n\n // Register addToolResult with the store so it can be accessed from the slice\n useEffect(() => {\n setAddToolResult?.(addToolResult);\n return () => setAddToolResult?.(undefined);\n }, [setAddToolResult, addToolResult]);\n\n // Sync streaming updates into the store so UiMessages renders incrementally\n useEffect(() => {\n if (!sessionId) return;\n setSessionUiMessages(sessionId, messages as UIMessage[]);\n }, [messages, sessionId, setSessionUiMessages]);\n\n return {\n messages,\n sendMessage,\n stop,\n status,\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantMessageParts.js","sourceRoot":"","sources":["../../src/hooks/useAssistantMessageParts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAI9B;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAmC,EACnC,gBAAwB;IAExB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,8CAA8C;QAC9C,IAAI,gBAAgB,GAAG,UAAU,CAAC,SAAS,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAC5D,CAAC;QAEF,2EAA2E;QAC3E,kEAAkE;QAClE,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBACnC,gBAAgB,GAAG,CAAC,CAAC;oBACrB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,gBAAgB,KAAK,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAED,0DAA0D;QAC1D,KAAK,IAAI,CAAC,GAAG,gBAAgB,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC9B,OAAO,GAAG,CAAC,KAAK,CAAC;YACnB,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,2DAA2D;gBAC3D,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import {useMemo} from 'react';\nimport type {UIMessage} from 'ai';\nimport type {UIMessagePart} from '@sqlrooms/ai-config';\n\n/**\n * Custom hook to extract assistant message parts for a given analysis result ID.\n * Handles the case where the analysis result ID matches a user message and finds\n * the corresponding assistant response. Also includes fallback logic for pending\n * results before the real ID is assigned (e.g., during streaming).\n *\n * @param uiMessages - Array of UI messages from the current session\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response, or empty array if not found\n */\nexport function useAssistantMessageParts(\n uiMessages: UIMessage[] | undefined,\n analysisResultId: string,\n): UIMessagePart[] {\n return useMemo(() => {\n if (!uiMessages) return [];\n\n // Find the user message with analysisResultId\n let userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n\n // If not found (e.g., pending result before onFinish assigns the real ID),\n // fall back to the last user message to enable streaming display.\n if (userMessageIndex === -1) {\n for (let i = uiMessages.length - 1; i >= 0; i--) {\n if (uiMessages[i]?.role === 'user') {\n userMessageIndex = i;\n break;\n }\n }\n if (userMessageIndex === -1) return [];\n }\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n }, [uiMessages, analysisResultId]);\n}\n
|
|
1
|
+
{"version":3,"file":"useAssistantMessageParts.js","sourceRoot":"","sources":["../../src/hooks/useAssistantMessageParts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAI9B;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAmC,EACnC,gBAAwB;IAExB,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAE3B,8CAA8C;QAC9C,IAAI,gBAAgB,GAAG,UAAU,CAAC,SAAS,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,gBAAgB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,CAC5D,CAAC;QAEF,2EAA2E;QAC3E,kEAAkE;QAClE,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;oBACnC,gBAAgB,GAAG,CAAC,CAAC;oBACrB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,gBAAgB,KAAK,CAAC,CAAC;gBAAE,OAAO,EAAE,CAAC;QACzC,CAAC;QAED,0DAA0D;QAC1D,KAAK,IAAI,CAAC,GAAG,gBAAgB,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC9B,OAAO,GAAG,CAAC,KAAK,CAAC;YACnB,CAAC;YACD,IAAI,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,2DAA2D;gBAC3D,MAAM;YACR,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import {useMemo} from 'react';\nimport type {UIMessage} from 'ai';\nimport type {UIMessagePart} from '@sqlrooms/ai-config';\n\n/**\n * Custom hook to extract assistant message parts for a given analysis result ID.\n * Handles the case where the analysis result ID matches a user message and finds\n * the corresponding assistant response. Also includes fallback logic for pending\n * results before the real ID is assigned (e.g., during streaming).\n *\n * @param uiMessages - Array of UI messages from the current session\n * @param analysisResultId - The ID of the analysis result (user message ID)\n * @returns Array of message parts from the assistant's response, or empty array if not found\n */\nexport function useAssistantMessageParts(\n uiMessages: UIMessage[] | undefined,\n analysisResultId: string,\n): UIMessagePart[] {\n return useMemo(() => {\n if (!uiMessages) return [];\n\n // Find the user message with analysisResultId\n let userMessageIndex = uiMessages.findIndex(\n (msg) => msg.id === analysisResultId && msg.role === 'user',\n );\n\n // If not found (e.g., pending result before onFinish assigns the real ID),\n // fall back to the last user message to enable streaming display.\n if (userMessageIndex === -1) {\n for (let i = uiMessages.length - 1; i >= 0; i--) {\n if (uiMessages[i]?.role === 'user') {\n userMessageIndex = i;\n break;\n }\n }\n if (userMessageIndex === -1) return [];\n }\n\n // Find the next assistant message after this user message\n for (let i = userMessageIndex + 1; i < uiMessages.length; i++) {\n const msg = uiMessages[i];\n if (msg?.role === 'assistant') {\n return msg.parts;\n }\n if (msg?.role === 'user') {\n // Hit next user message without finding assistant response\n break;\n }\n }\n return [];\n }, [uiMessages, analysisResultId]);\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,4 +25,5 @@ export { cleanupPendingAnalysisResults, ToolAbortError } from './utils';
|
|
|
25
25
|
export { convertToAiSDKTools, completeIncompleteToolCalls, } from './chatTransport';
|
|
26
26
|
export { processAgentStream, updateAgentToolCallData } from './agents/AgentUtils';
|
|
27
27
|
export type { AgentStreamResult, UIMessageChunk, AgentToolCall, AgentToolCallAdditionalData, } from './agents/AgentUtils';
|
|
28
|
+
export { ReasoningBox } from './components/ReasoningBox';
|
|
28
29
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAExD,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,mCAAmC,CAAC;AAC/D,YAAY,EAAC,WAAW,EAAC,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAC,gBAAgB,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAC,aAAa,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,6BAA6B,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAChF,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAExD,YAAY,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,mCAAmC,CAAC;AAC/D,YAAY,EAAC,WAAW,EAAC,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAC,gBAAgB,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAC,aAAa,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,6BAA6B,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAChF,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -22,4 +22,5 @@ export { AiThinkingDots } from './components/AiThinkingDots';
|
|
|
22
22
|
export { cleanupPendingAnalysisResults, ToolAbortError } from './utils';
|
|
23
23
|
export { convertToAiSDKTools, completeIncompleteToolCalls, } from './chatTransport';
|
|
24
24
|
export { processAgentStream, updateAgentToolCallData } from './agents/AgentUtils';
|
|
25
|
+
export { ReasoningBox } from './components/ReasoningBox';
|
|
25
26
|
//# 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;;;GAGG;AAEH,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAGxD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAC,aAAa,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,6BAA6B,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {createAiSlice, useStoreWithAi} from './AiSlice';\n\nexport type {AiSliceState} from './AiSlice';\nexport {AnalysisResultsContainer} from './components/AnalysisResultsContainer';\nexport {AnalysisResult} from './components/AnalysisResult';\nexport {useScrollToBottom} from './hooks/useScrollToBottom';\nexport {useAiChat} from './hooks/useAiChat';\n\nexport {PromptSuggestions} from './components/PromptSuggestions';\nexport {ModelSelector} from './components/ModelSelector';\nexport {SessionControls} from './components/SessionControls';\nexport {QueryControls} from './components/QueryControls';\nexport {DeleteSessionDialog} from './components/session/DeleteSessionDialog';\nexport {SessionActions} from './components/session/SessionActions';\nexport {SessionDropdown} from './components/session/SessionDropdown';\nexport {SessionTitle} from './components/session/SessionTitle';\nexport type {SessionType} from './components/session/SessionType';\nexport {ToolErrorMessage} from './components/tools/ToolErrorMessage';\nexport {ToolCallInfo} from './components/ToolCallInfo';\n\nexport {AiSliceConfig, createDefaultAiConfig} from '@sqlrooms/ai-config';\nexport {AiThinkingDots} from './components/AiThinkingDots';\nexport {cleanupPendingAnalysisResults, ToolAbortError} from './utils';\nexport {\n convertToAiSDKTools,\n completeIncompleteToolCalls,\n} from './chatTransport';\n\nexport {processAgentStream, updateAgentToolCallData} from './agents/AgentUtils';\nexport type {\n AgentStreamResult,\n UIMessageChunk,\n AgentToolCall,\n AgentToolCallAdditionalData,\n} from './agents/AgentUtils';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,WAAW,CAAC;AAGxD,OAAO,EAAC,wBAAwB,EAAC,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAC,cAAc,EAAC,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,mCAAmC,CAAC;AAE/D,OAAO,EAAC,gBAAgB,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAAC,aAAa,EAAE,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,6BAA6B,EAAE,cAAc,EAAC,MAAM,SAAS,CAAC;AACtE,OAAO,EACL,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAC,kBAAkB,EAAE,uBAAuB,EAAC,MAAM,qBAAqB,CAAC;AAOhF,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {createAiSlice, useStoreWithAi} from './AiSlice';\n\nexport type {AiSliceState} from './AiSlice';\nexport {AnalysisResultsContainer} from './components/AnalysisResultsContainer';\nexport {AnalysisResult} from './components/AnalysisResult';\nexport {useScrollToBottom} from './hooks/useScrollToBottom';\nexport {useAiChat} from './hooks/useAiChat';\n\nexport {PromptSuggestions} from './components/PromptSuggestions';\nexport {ModelSelector} from './components/ModelSelector';\nexport {SessionControls} from './components/SessionControls';\nexport {QueryControls} from './components/QueryControls';\nexport {DeleteSessionDialog} from './components/session/DeleteSessionDialog';\nexport {SessionActions} from './components/session/SessionActions';\nexport {SessionDropdown} from './components/session/SessionDropdown';\nexport {SessionTitle} from './components/session/SessionTitle';\nexport type {SessionType} from './components/session/SessionType';\nexport {ToolErrorMessage} from './components/tools/ToolErrorMessage';\nexport {ToolCallInfo} from './components/ToolCallInfo';\n\nexport {AiSliceConfig, createDefaultAiConfig} from '@sqlrooms/ai-config';\nexport {AiThinkingDots} from './components/AiThinkingDots';\nexport {cleanupPendingAnalysisResults, ToolAbortError} from './utils';\nexport {\n convertToAiSDKTools,\n completeIncompleteToolCalls,\n} from './chatTransport';\n\nexport {processAgentStream, updateAgentToolCallData} from './agents/AgentUtils';\nexport type {\n AgentStreamResult,\n UIMessageChunk,\n AgentToolCall,\n AgentToolCallAdditionalData,\n} from './agents/AgentUtils';\nexport {ReasoningBox} from './components/ReasoningBox';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/ai-core",
|
|
3
|
-
"version": "0.26.0",
|
|
3
|
+
"version": "0.26.1-rc.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -23,15 +23,15 @@
|
|
|
23
23
|
"@ai-sdk/react": "^2.0.44",
|
|
24
24
|
"@openassistant/utils": "1.0.0-alpha.0",
|
|
25
25
|
"@paralleldrive/cuid2": "^2.2.2",
|
|
26
|
-
"@sqlrooms/ai-config": "0.26.0",
|
|
27
|
-
"@sqlrooms/monaco-editor": "0.26.0",
|
|
28
|
-
"@sqlrooms/room-config": "0.26.0",
|
|
29
|
-
"@sqlrooms/room-store": "0.26.0",
|
|
30
|
-
"@sqlrooms/ui": "0.26.0",
|
|
31
|
-
"@sqlrooms/utils": "0.26.0",
|
|
26
|
+
"@sqlrooms/ai-config": "0.26.1-rc.0",
|
|
27
|
+
"@sqlrooms/monaco-editor": "0.26.1-rc.0",
|
|
28
|
+
"@sqlrooms/room-config": "0.26.1-rc.0",
|
|
29
|
+
"@sqlrooms/room-store": "0.26.1-rc.0",
|
|
30
|
+
"@sqlrooms/ui": "0.26.1-rc.0",
|
|
31
|
+
"@sqlrooms/utils": "0.26.1-rc.0",
|
|
32
32
|
"ai": "^5.0.44",
|
|
33
33
|
"immer": "^10.1.1",
|
|
34
|
-
"lucide-react": "^0.
|
|
34
|
+
"lucide-react": "^0.555.0",
|
|
35
35
|
"react-markdown": "^10.1.0",
|
|
36
36
|
"rehype-raw": "^7.0.0",
|
|
37
37
|
"remark-gfm": "^4.0.0",
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
"typecheck": "tsc --noEmit",
|
|
49
49
|
"typedoc": "typedoc"
|
|
50
50
|
},
|
|
51
|
-
"gitHead": "
|
|
52
|
-
}
|
|
51
|
+
"gitHead": "89c252c460ccd29d108cfabf7b34c4a679f85609"
|
|
52
|
+
}
|