@aigentyc/chat-sdk 0.3.0 → 0.4.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/AGENTS.md +24 -1
- package/claude-skill/aigentyc-chat-sdk/SKILL.md +1 -1
- package/context7.json +1 -1
- package/dist/{ChatInterface-f8ftS56n.d.ts → ChatInterface--yaDB5yp.d.ts} +1 -1
- package/dist/{ChatInterface-B0zbA3Lm.d.cts → ChatInterface-0rq8D5-8.d.cts} +1 -1
- package/dist/{JsonRenderResult-Ftw4AKwb.d.cts → JsonRenderResult-D6ogds0_.d.cts} +8 -1
- package/dist/{JsonRenderResult-Ftw4AKwb.d.ts → JsonRenderResult-D6ogds0_.d.ts} +8 -1
- package/dist/JsonRenderResult-GCNFMZYP.js +6 -0
- package/dist/{JsonRenderResult-ZFJ6VWMS.js.map → JsonRenderResult-GCNFMZYP.js.map} +1 -1
- package/dist/JsonRenderResult-II3IBENS.cjs +15 -0
- package/dist/{JsonRenderResult-GQOYPLVH.cjs.map → JsonRenderResult-II3IBENS.cjs.map} +1 -1
- package/dist/{SlotsContext-BjiX1mRx.d.ts → SlotsContext-CWTjP0mA.d.ts} +1 -1
- package/dist/{SlotsContext-CEOBjzfh.d.cts → SlotsContext-u5CFB7MS.d.cts} +1 -1
- package/dist/{chunk-FPQ3UCCJ.js → chunk-3EN3DMUL.js} +24 -5
- package/dist/chunk-3EN3DMUL.js.map +1 -0
- package/dist/{chunk-BPV66QNM.cjs → chunk-46MUOYPR.cjs} +24 -5
- package/dist/chunk-46MUOYPR.cjs.map +1 -0
- package/dist/{chunk-PQCGQ32Q.js → chunk-6ZZTTD5E.js} +12 -5
- package/dist/chunk-6ZZTTD5E.js.map +1 -0
- package/dist/{chunk-3HGOLNGG.cjs → chunk-AWRQSM42.cjs} +23 -3
- package/dist/chunk-AWRQSM42.cjs.map +1 -0
- package/dist/{chunk-J2H6MLQF.cjs → chunk-H7C3AGA2.cjs} +17 -6
- package/dist/chunk-H7C3AGA2.cjs.map +1 -0
- package/dist/{chunk-M4YRNNGB.js → chunk-LSKOJ7SH.js} +23 -3
- package/dist/chunk-LSKOJ7SH.js.map +1 -0
- package/dist/{chunk-PPCGZ5MP.cjs → chunk-LVWSWTI3.cjs} +22 -22
- package/dist/chunk-LVWSWTI3.cjs.map +1 -0
- package/dist/{chunk-TLGZSXTU.cjs → chunk-OEEDYJTV.cjs} +14 -7
- package/dist/chunk-OEEDYJTV.cjs.map +1 -0
- package/dist/{chunk-SWKWHBBN.js → chunk-RAQVW2D7.js} +7 -7
- package/dist/chunk-RAQVW2D7.js.map +1 -0
- package/dist/{chunk-RPDJXB3U.js → chunk-ZXP7IYRC.js} +17 -6
- package/dist/chunk-ZXP7IYRC.js.map +1 -0
- package/dist/components.cjs +15 -15
- package/dist/components.d.cts +2 -2
- package/dist/components.d.ts +2 -2
- package/dist/components.js +4 -4
- package/dist/core.d.cts +2 -2
- package/dist/core.d.ts +2 -2
- package/dist/hooks.cjs +6 -6
- package/dist/hooks.d.cts +2 -2
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +2 -2
- package/dist/i18n.d.cts +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/index.cjs +33 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +18 -7
- package/dist/index.js.map +1 -1
- package/dist/json-render.cjs +4 -4
- package/dist/json-render.d.cts +1 -1
- package/dist/json-render.d.ts +1 -1
- package/dist/json-render.js +1 -1
- package/dist/llms-full.txt +35 -12
- package/dist/theme.d.cts +1 -1
- package/dist/theme.d.ts +1 -1
- package/dist/tools.cjs +7 -7
- package/dist/tools.d.cts +3 -3
- package/dist/tools.d.ts +3 -3
- package/dist/tools.js +3 -3
- package/dist/{types-DlNwk-bG.d.cts → types-DQCjs81O.d.cts} +19 -1
- package/dist/{types-DlNwk-bG.d.ts → types-DQCjs81O.d.ts} +19 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
- package/dist/JsonRenderResult-GQOYPLVH.cjs +0 -15
- package/dist/JsonRenderResult-ZFJ6VWMS.js +0 -6
- package/dist/chunk-3HGOLNGG.cjs.map +0 -1
- package/dist/chunk-BPV66QNM.cjs.map +0 -1
- package/dist/chunk-FPQ3UCCJ.js.map +0 -1
- package/dist/chunk-J2H6MLQF.cjs.map +0 -1
- package/dist/chunk-M4YRNNGB.js.map +0 -1
- package/dist/chunk-PPCGZ5MP.cjs.map +0 -1
- package/dist/chunk-PQCGQ32Q.js.map +0 -1
- package/dist/chunk-RPDJXB3U.js.map +0 -1
- package/dist/chunk-SWKWHBBN.js.map +0 -1
- package/dist/chunk-TLGZSXTU.cjs.map +0 -1
package/AGENTS.md
CHANGED
|
@@ -40,7 +40,7 @@ export default function Page() {
|
|
|
40
40
|
return (
|
|
41
41
|
<Chat
|
|
42
42
|
projectId="YOUR_PROJECT_ID"
|
|
43
|
-
apiEndpoint="https://api.aigentyc.
|
|
43
|
+
apiEndpoint="https://api.aigentyc.ai"
|
|
44
44
|
apiKey="YOUR_API_KEY"
|
|
45
45
|
/>
|
|
46
46
|
)
|
|
@@ -140,6 +140,29 @@ Requires `socket.io-client`. Omit both props for AI-only mode.
|
|
|
140
140
|
|
|
141
141
|
---
|
|
142
142
|
|
|
143
|
+
## Page context (answering about the page the widget is on)
|
|
144
|
+
|
|
145
|
+
Tell the assistant where the visitor is standing, and it can answer "show me these in 22 AWG"
|
|
146
|
+
without being told which "these".
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
<ChatWidget
|
|
150
|
+
projectId="..." apiEndpoint="..."
|
|
151
|
+
pageUrl={url} // current page URL
|
|
152
|
+
pageTitle={title} // current page title
|
|
153
|
+
pageContext={{ category, filters }} // any JSON your project's system prompt reads
|
|
154
|
+
/>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
All three are read **fresh on every message**, so a single-page host can update them on route
|
|
158
|
+
change without remounting the widget — an in-flight stream survives the navigation.
|
|
159
|
+
|
|
160
|
+
`pageContext` is free-form: shape it to whatever your system prompt expects. Keep it small (it
|
|
161
|
+
is re-sent every turn), and note it is client-supplied — the backend renders it as data, never
|
|
162
|
+
as instructions.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
143
166
|
## Rules for agents editing consumer projects
|
|
144
167
|
|
|
145
168
|
**Do:**
|
|
@@ -24,7 +24,7 @@ Component props are identical between `<Chat>` and `<ChatWidget>` — swap freel
|
|
|
24
24
|
2. Import CSS once: `import "@aigentyc/chat-sdk/theme/styles.css"`
|
|
25
25
|
3. Pass **three** props: `projectId`, `apiEndpoint`, `apiKey`
|
|
26
26
|
|
|
27
|
-
**`apiKey` IS required for third-party domain embeds.** Without it, `/api/kb/chat` returns 401. The "no apiKey needed" path only works inside `app.aigentyc.
|
|
27
|
+
**`apiKey` IS required for third-party domain embeds.** Without it, `/api/kb/chat` returns 401. The "no apiKey needed" path only works inside `app.aigentyc.ai`. Get a project-scoped key from the dashboard (Settings → API Keys) with permission `Chat: Full` and add the embed domain to Allowed Origins.
|
|
28
28
|
|
|
29
29
|
Environment-variable pattern:
|
|
30
30
|
- Next.js: `NEXT_PUBLIC_AIGENTYC_API_KEY`
|
package/context7.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { Q as QuestionConfig } from './types-
|
|
2
|
+
import { Q as QuestionConfig } from './types-DQCjs81O.js';
|
|
3
3
|
|
|
4
4
|
interface ChatInterfaceProps {
|
|
5
5
|
/** Allow per-instance overrides of any context value */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { Q as QuestionConfig } from './types-
|
|
2
|
+
import { Q as QuestionConfig } from './types-DQCjs81O.cjs';
|
|
3
3
|
|
|
4
4
|
interface ChatInterfaceProps {
|
|
5
5
|
/** Allow per-instance overrides of any context value */
|
|
@@ -12,7 +12,14 @@ interface JsonRenderResultProps {
|
|
|
12
12
|
}>;
|
|
13
13
|
/** API key for authenticated requests (form submissions etc.) */
|
|
14
14
|
apiKey?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Same-origin guard for apiKey injection. `call_api` actions only
|
|
17
|
+
* attach the Bearer token when the target URL starts with this
|
|
18
|
+
* endpoint — prevents the key leaking to third-party URLs referenced
|
|
19
|
+
* in a tool spec (e.g. user-generated specs in data_store tools).
|
|
20
|
+
*/
|
|
21
|
+
apiEndpoint?: string;
|
|
15
22
|
}
|
|
16
|
-
declare function JsonRenderResult({ spec: rawSpec, data, onSendMessage, className, conversationMessages, apiKey, }: JsonRenderResultProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
declare function JsonRenderResult({ spec: rawSpec, data, onSendMessage, className, conversationMessages, apiKey, apiEndpoint, }: JsonRenderResultProps): react_jsx_runtime.JSX.Element;
|
|
17
24
|
|
|
18
25
|
export { JsonRenderResult as J };
|
|
@@ -12,7 +12,14 @@ interface JsonRenderResultProps {
|
|
|
12
12
|
}>;
|
|
13
13
|
/** API key for authenticated requests (form submissions etc.) */
|
|
14
14
|
apiKey?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Same-origin guard for apiKey injection. `call_api` actions only
|
|
17
|
+
* attach the Bearer token when the target URL starts with this
|
|
18
|
+
* endpoint — prevents the key leaking to third-party URLs referenced
|
|
19
|
+
* in a tool spec (e.g. user-generated specs in data_store tools).
|
|
20
|
+
*/
|
|
21
|
+
apiEndpoint?: string;
|
|
15
22
|
}
|
|
16
|
-
declare function JsonRenderResult({ spec: rawSpec, data, onSendMessage, className, conversationMessages, apiKey, }: JsonRenderResultProps): react_jsx_runtime.JSX.Element;
|
|
23
|
+
declare function JsonRenderResult({ spec: rawSpec, data, onSendMessage, className, conversationMessages, apiKey, apiEndpoint, }: JsonRenderResultProps): react_jsx_runtime.JSX.Element;
|
|
17
24
|
|
|
18
25
|
export { JsonRenderResult as J };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"JsonRenderResult-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"JsonRenderResult-GCNFMZYP.js"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkH7C3AGA2_cjs = require('./chunk-H7C3AGA2.cjs');
|
|
5
|
+
require('./chunk-Q7T3VAJV.cjs');
|
|
6
|
+
require('./chunk-525KS5HM.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Object.defineProperty(exports, "JsonRenderResult", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () { return chunkH7C3AGA2_cjs.JsonRenderResult; }
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=JsonRenderResult-II3IBENS.cjs.map
|
|
15
|
+
//# sourceMappingURL=JsonRenderResult-II3IBENS.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"JsonRenderResult-
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"JsonRenderResult-II3IBENS.cjs"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { RefObject, ComponentType } from 'react';
|
|
3
|
-
import { f as LiveChatState, e as LiveChatMessage, C as ChatProviderProps, c as ChatMessage, a as ChatConfig, b as ChatEventCallbacks } from './types-
|
|
3
|
+
import { f as LiveChatState, e as LiveChatMessage, C as ChatProviderProps, c as ChatMessage, a as ChatConfig, b as ChatEventCallbacks } from './types-DQCjs81O.js';
|
|
4
4
|
|
|
5
5
|
type ChatStatus$1 = "idle" | "streaming" | "error";
|
|
6
6
|
interface ActiveTool$1 {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { RefObject, ComponentType } from 'react';
|
|
3
|
-
import { f as LiveChatState, e as LiveChatMessage, C as ChatProviderProps, c as ChatMessage, a as ChatConfig, b as ChatEventCallbacks } from './types-
|
|
3
|
+
import { f as LiveChatState, e as LiveChatMessage, C as ChatProviderProps, c as ChatMessage, a as ChatConfig, b as ChatEventCallbacks } from './types-DQCjs81O.cjs';
|
|
4
4
|
|
|
5
5
|
type ChatStatus$1 = "idle" | "streaming" | "error";
|
|
6
6
|
interface ActiveTool$1 {
|
|
@@ -75,14 +75,33 @@ function ChatContextProvider({
|
|
|
75
75
|
callbacksRef.current = callbacks;
|
|
76
76
|
const initialMessages = useMemo(
|
|
77
77
|
() => loadPersistedMessages(projectId),
|
|
78
|
-
|
|
79
|
-
[]
|
|
78
|
+
[projectId, sessionId]
|
|
80
79
|
);
|
|
80
|
+
const pageRef = useRef({
|
|
81
|
+
pageUrl: config.pageUrl,
|
|
82
|
+
pageTitle: config.pageTitle,
|
|
83
|
+
pageContext: config.pageContext
|
|
84
|
+
});
|
|
85
|
+
pageRef.current = {
|
|
86
|
+
pageUrl: config.pageUrl,
|
|
87
|
+
pageTitle: config.pageTitle,
|
|
88
|
+
pageContext: config.pageContext
|
|
89
|
+
};
|
|
81
90
|
const transport = useMemo(
|
|
82
91
|
() => new DefaultChatTransport({
|
|
83
92
|
api: `${config.apiEndpoint || ""}/api/kb/chat`,
|
|
84
93
|
headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : void 0,
|
|
85
|
-
body
|
|
94
|
+
// A function body is resolved per request by the AI SDK transport.
|
|
95
|
+
body: () => {
|
|
96
|
+
const { pageUrl, pageTitle, pageContext } = pageRef.current;
|
|
97
|
+
return {
|
|
98
|
+
projectId: config.projectId,
|
|
99
|
+
sessionId,
|
|
100
|
+
...pageUrl ? { pageUrl } : {},
|
|
101
|
+
...pageTitle ? { pageTitle } : {},
|
|
102
|
+
...pageContext !== void 0 ? { pageContext } : {}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
86
105
|
}),
|
|
87
106
|
[config.apiEndpoint, config.apiKey, config.projectId, sessionId]
|
|
88
107
|
);
|
|
@@ -188,5 +207,5 @@ function useChatContext() {
|
|
|
188
207
|
}
|
|
189
208
|
|
|
190
209
|
export { ChatContext, ChatContextProvider, SlotsProvider, renderSlot, useChatContext, useSlot, useSlots };
|
|
191
|
-
//# sourceMappingURL=chunk-
|
|
192
|
-
//# sourceMappingURL=chunk-
|
|
210
|
+
//# sourceMappingURL=chunk-3EN3DMUL.js.map
|
|
211
|
+
//# sourceMappingURL=chunk-3EN3DMUL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/SlotsContext.tsx","../src/providers/ChatContext.tsx"],"names":["createContext","jsx","useContext"],"mappings":"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","file":"chunk-3EN3DMUL.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n createContext,\n useContext,\n type ReactNode,\n type ComponentType,\n} from \"react\";\n\n/**\n * All available slot names that can be overridden.\n */\nexport type SlotName =\n | \"header\"\n | \"footer\"\n | \"input\"\n | \"welcomePage\"\n | \"userMessage\"\n | \"assistantMessage\"\n | \"systemMessage\"\n | \"loader\"\n | \"feedback\"\n | \"tools\"\n | \"toolRenderers\"\n | \"liveChatPanel\"\n | \"satisfactionRating\"\n | \"visitorIdentityForm\"\n | \"floatingButton\"\n | \"emptyState\";\n\n/**\n * A slot component receives the default component as a prop alongside its own props.\n */\nexport type SlotComponent<P = Record<string, unknown>> = ComponentType<\n P & { DefaultComponent: ComponentType<P> }\n>;\n\n/**\n * Map of slot name to override component.\n */\nexport type SlotMap = Partial<Record<SlotName, SlotComponent<any>>>;\n\nconst SlotsContext = createContext<SlotMap>({});\n\n/** Props for the SlotsProvider component. */\nexport interface SlotsProviderProps {\n /** Slot overrides map */\n slots?: SlotMap;\n children: ReactNode;\n}\n\n/**\n * Provides slot overrides to descendant components.\n * Wrap your chat tree with this provider and pass a `slots` map\n * to replace built-in UI sections.\n */\nexport function SlotsProvider({ slots = {}, children }: SlotsProviderProps) {\n return (\n <SlotsContext.Provider value={slots}>{children}</SlotsContext.Provider>\n );\n}\n\n/**\n * Returns the full SlotMap from context.\n */\nexport function useSlots(): SlotMap {\n return useContext(SlotsContext);\n}\n\n/**\n * Returns the override component for the given slot name, or undefined if none is set.\n */\nexport function useSlot<P = Record<string, unknown>>(\n name: SlotName\n): SlotComponent<P> | undefined {\n const slots = useContext(SlotsContext);\n return slots[name] as SlotComponent<P> | undefined;\n}\n\n/**\n * Renders a slot: if an override exists, renders it with `{...props, DefaultComponent}`.\n * Otherwise renders the DefaultComponent with the given props.\n *\n * The generic `P` is NOT constrained to `Record<string, unknown>` so concrete\n * component prop types (e.g. `ChatHeaderProps`) flow through at call sites\n * without `as never` casts. Internal spreads are cast through\n * `Record<string, unknown>` — safe because JSX spread accepts any record.\n *\n * @param name - The slot name\n * @param props - Props to pass to the component\n * @param DefaultComponent - The built-in fallback component\n */\nexport function renderSlot<P>(\n name: SlotName,\n props: P,\n DefaultComponent: ComponentType<P>,\n slots: SlotMap\n): React.ReactElement {\n const spreadProps = props as unknown as Record<string, unknown>;\n const Override = slots[name] as\n | ComponentType<Record<string, unknown> & { DefaultComponent: ComponentType<P> }>\n | undefined;\n if (Override) {\n return <Override {...spreadProps} DefaultComponent={DefaultComponent} />;\n }\n const Default = DefaultComponent as ComponentType<Record<string, unknown>>;\n return <Default {...spreadProps} />;\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type {\n ChatConfig,\n ChatMessage,\n ChatEventCallbacks,\n} from \"../core/types\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\n\ntype ChatStatus = \"idle\" | \"streaming\" | \"error\";\n\ninterface ActiveTool {\n toolName: string;\n state: \"partial-call\" | \"call\" | \"output-available\";\n args: Record<string, unknown>;\n result?: unknown;\n renderMode: string;\n}\n\nconst SESSION_KEY_PREFIX = \"aigentyc-session-\";\nconst MESSAGE_KEY_PREFIX = \"aigentyc-messages-\";\n\nfunction getOrCreateSessionId(projectId: string): string {\n if (typeof window === \"undefined\") return crypto.randomUUID();\n const key = SESSION_KEY_PREFIX + projectId;\n try {\n const stored = sessionStorage.getItem(key);\n if (stored) return stored;\n const id = crypto.randomUUID();\n sessionStorage.setItem(key, id);\n return id;\n } catch {\n return crypto.randomUUID();\n }\n}\n\nfunction persistMessages(projectId: string, messages: unknown[]): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(MESSAGE_KEY_PREFIX + projectId, JSON.stringify(messages));\n } catch {\n // Quota or unavailable\n }\n}\n\nfunction loadPersistedMessages(projectId: string): ChatMessage[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = localStorage.getItem(MESSAGE_KEY_PREFIX + projectId);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n}\n\nfunction clearPersistedMessages(projectId: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(MESSAGE_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n}\n\nexport interface ChatContextValue {\n messages: ChatMessage[];\n status: ChatStatus;\n error: Error | undefined;\n sessionId: string;\n config: ChatConfig;\n activeTools: ActiveTool[];\n sendMessage: (content: string) => void;\n stopGeneration: () => void;\n newConversation: () => void;\n clearMessages: () => void;\n callbacks?: ChatEventCallbacks;\n}\n\nexport const ChatContext = createContext<ChatContextValue | null>(null);\n\nexport interface ChatContextProviderProps {\n config: ChatConfig;\n callbacks?: ChatEventCallbacks;\n children: ReactNode;\n}\n\n/**\n * Internal provider that manages chat state via @ai-sdk/react `useChat`.\n * Handles message persistence and session management.\n */\nexport function ChatContextProvider({\n config,\n callbacks,\n children,\n}: ChatContextProviderProps) {\n const projectId = config.projectId || \"default\";\n const [sessionId, setSessionId] = useState(() => getOrCreateSessionId(projectId));\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // Re-load persisted messages whenever the session changes (incl. after\n // newConversation()). Keying only on mount cached the original array, so\n // useChat would re-inject the OLD messages into the new sessionId — a real\n // \"new chat\" effectively kept the old conversation alive.\n const initialMessages = useMemo(\n () => loadPersistedMessages(projectId),\n [projectId, sessionId]\n );\n\n // Page context is whatever the host page looks like *right now*, so it is read\n // through a ref at send time rather than captured when the transport is built.\n // Rebuilding the transport on every navigation would remount `useChat` and\n // drop an in-flight stream — in a single-page host that is one route change.\n const pageRef = useRef({\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\n });\n pageRef.current = {\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\n };\n\n const transport = useMemo(\n () =>\n new DefaultChatTransport({\n api: `${config.apiEndpoint || \"\"}/api/kb/chat`,\n headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : undefined,\n // A function body is resolved per request by the AI SDK transport.\n body: () => {\n const { pageUrl, pageTitle, pageContext } = pageRef.current;\n return {\n projectId: config.projectId,\n sessionId,\n ...(pageUrl ? { pageUrl } : {}),\n ...(pageTitle ? { pageTitle } : {}),\n ...(pageContext !== undefined ? { pageContext } : {}),\n };\n },\n }),\n [config.apiEndpoint, config.apiKey, config.projectId, sessionId]\n );\n\n const {\n messages,\n sendMessage: sdkSendMessage,\n status: sdkStatus,\n error,\n stop,\n setMessages,\n } = useChat({\n id: sessionId,\n messages: initialMessages as never,\n transport,\n onFinish: (message) => {\n callbacksRef.current?.onMessageReceived?.(message as unknown as ChatMessage);\n },\n onError: (err) => {\n callbacksRef.current?.onError?.(err);\n },\n });\n\n const status: ChatStatus = error\n ? \"error\"\n : sdkStatus === \"streaming\" || sdkStatus === \"submitted\"\n ? \"streaming\"\n : \"idle\";\n\n useEffect(() => {\n persistMessages(projectId, messages);\n }, [messages, projectId]);\n\n const activeTools = useMemo<ActiveTool[]>(() => {\n if (messages.length === 0) return [];\n const last = messages[messages.length - 1] as { role: string; parts?: unknown[] };\n if (last.role !== \"assistant\" || !Array.isArray(last.parts)) return [];\n return (last.parts as Array<Record<string, unknown>>)\n .filter((p) => typeof p.type === \"string\" && (p.type as string).startsWith(\"tool-\"))\n .map((p) => ({\n toolName: (p.toolName as string) || (p.type as string).replace(\"tool-\", \"\"),\n state: (p.state as ActiveTool[\"state\"]) || \"output-available\",\n args: (p.args as Record<string, unknown>) || {},\n result: p.result,\n renderMode: (p.renderMode as string) || \"inline\",\n }));\n }, [messages]);\n\n const sendMessage = useCallback(\n (content: string) => {\n if (!content.trim()) return;\n callbacksRef.current?.onMessageSent?.({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n } as ChatMessage);\n sdkSendMessage({ text: content });\n },\n [sdkSendMessage]\n );\n\n const stopGeneration = useCallback(() => stop(), [stop]);\n\n const newConversation = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n if (typeof window !== \"undefined\") {\n try {\n sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n }\n setSessionId(getOrCreateSessionId(projectId));\n }, [projectId, setMessages]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n }, [projectId, setMessages]);\n\n const value = useMemo<ChatContextValue>(\n () => ({\n messages: messages as unknown as ChatMessage[],\n status,\n error: error as Error | undefined,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n callbacks: callbacksRef.current,\n }),\n [\n messages,\n status,\n error,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n ]\n );\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;\n}\n\n/**\n * Returns the chat context. Must be used within a `ChatContextProvider`.\n */\nexport function useChatContext(): ChatContextValue {\n const ctx = useContext(ChatContext);\n if (!ctx) {\n throw new Error(\n \"useChatContext must be used within a ChatProvider or ChatContextProvider\"\n );\n }\n return ctx;\n}\n"]}
|
|
@@ -77,14 +77,33 @@ function ChatContextProvider({
|
|
|
77
77
|
callbacksRef.current = callbacks;
|
|
78
78
|
const initialMessages = react.useMemo(
|
|
79
79
|
() => loadPersistedMessages(projectId),
|
|
80
|
-
|
|
81
|
-
[]
|
|
80
|
+
[projectId, sessionId]
|
|
82
81
|
);
|
|
82
|
+
const pageRef = react.useRef({
|
|
83
|
+
pageUrl: config.pageUrl,
|
|
84
|
+
pageTitle: config.pageTitle,
|
|
85
|
+
pageContext: config.pageContext
|
|
86
|
+
});
|
|
87
|
+
pageRef.current = {
|
|
88
|
+
pageUrl: config.pageUrl,
|
|
89
|
+
pageTitle: config.pageTitle,
|
|
90
|
+
pageContext: config.pageContext
|
|
91
|
+
};
|
|
83
92
|
const transport = react.useMemo(
|
|
84
93
|
() => new ai.DefaultChatTransport({
|
|
85
94
|
api: `${config.apiEndpoint || ""}/api/kb/chat`,
|
|
86
95
|
headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : void 0,
|
|
87
|
-
body
|
|
96
|
+
// A function body is resolved per request by the AI SDK transport.
|
|
97
|
+
body: () => {
|
|
98
|
+
const { pageUrl, pageTitle, pageContext } = pageRef.current;
|
|
99
|
+
return {
|
|
100
|
+
projectId: config.projectId,
|
|
101
|
+
sessionId,
|
|
102
|
+
...pageUrl ? { pageUrl } : {},
|
|
103
|
+
...pageTitle ? { pageTitle } : {},
|
|
104
|
+
...pageContext !== void 0 ? { pageContext } : {}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
88
107
|
}),
|
|
89
108
|
[config.apiEndpoint, config.apiKey, config.projectId, sessionId]
|
|
90
109
|
);
|
|
@@ -196,5 +215,5 @@ exports.renderSlot = renderSlot;
|
|
|
196
215
|
exports.useChatContext = useChatContext;
|
|
197
216
|
exports.useSlot = useSlot;
|
|
198
217
|
exports.useSlots = useSlots;
|
|
199
|
-
//# sourceMappingURL=chunk-
|
|
200
|
-
//# sourceMappingURL=chunk-
|
|
218
|
+
//# sourceMappingURL=chunk-46MUOYPR.cjs.map
|
|
219
|
+
//# sourceMappingURL=chunk-46MUOYPR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/SlotsContext.tsx","../src/providers/ChatContext.tsx"],"names":["createContext","useContext","jsx","useState","useRef","useMemo","DefaultChatTransport","useChat","useEffect","useCallback"],"mappings":"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","file":"chunk-46MUOYPR.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n createContext,\n useContext,\n type ReactNode,\n type ComponentType,\n} from \"react\";\n\n/**\n * All available slot names that can be overridden.\n */\nexport type SlotName =\n | \"header\"\n | \"footer\"\n | \"input\"\n | \"welcomePage\"\n | \"userMessage\"\n | \"assistantMessage\"\n | \"systemMessage\"\n | \"loader\"\n | \"feedback\"\n | \"tools\"\n | \"toolRenderers\"\n | \"liveChatPanel\"\n | \"satisfactionRating\"\n | \"visitorIdentityForm\"\n | \"floatingButton\"\n | \"emptyState\";\n\n/**\n * A slot component receives the default component as a prop alongside its own props.\n */\nexport type SlotComponent<P = Record<string, unknown>> = ComponentType<\n P & { DefaultComponent: ComponentType<P> }\n>;\n\n/**\n * Map of slot name to override component.\n */\nexport type SlotMap = Partial<Record<SlotName, SlotComponent<any>>>;\n\nconst SlotsContext = createContext<SlotMap>({});\n\n/** Props for the SlotsProvider component. */\nexport interface SlotsProviderProps {\n /** Slot overrides map */\n slots?: SlotMap;\n children: ReactNode;\n}\n\n/**\n * Provides slot overrides to descendant components.\n * Wrap your chat tree with this provider and pass a `slots` map\n * to replace built-in UI sections.\n */\nexport function SlotsProvider({ slots = {}, children }: SlotsProviderProps) {\n return (\n <SlotsContext.Provider value={slots}>{children}</SlotsContext.Provider>\n );\n}\n\n/**\n * Returns the full SlotMap from context.\n */\nexport function useSlots(): SlotMap {\n return useContext(SlotsContext);\n}\n\n/**\n * Returns the override component for the given slot name, or undefined if none is set.\n */\nexport function useSlot<P = Record<string, unknown>>(\n name: SlotName\n): SlotComponent<P> | undefined {\n const slots = useContext(SlotsContext);\n return slots[name] as SlotComponent<P> | undefined;\n}\n\n/**\n * Renders a slot: if an override exists, renders it with `{...props, DefaultComponent}`.\n * Otherwise renders the DefaultComponent with the given props.\n *\n * The generic `P` is NOT constrained to `Record<string, unknown>` so concrete\n * component prop types (e.g. `ChatHeaderProps`) flow through at call sites\n * without `as never` casts. Internal spreads are cast through\n * `Record<string, unknown>` — safe because JSX spread accepts any record.\n *\n * @param name - The slot name\n * @param props - Props to pass to the component\n * @param DefaultComponent - The built-in fallback component\n */\nexport function renderSlot<P>(\n name: SlotName,\n props: P,\n DefaultComponent: ComponentType<P>,\n slots: SlotMap\n): React.ReactElement {\n const spreadProps = props as unknown as Record<string, unknown>;\n const Override = slots[name] as\n | ComponentType<Record<string, unknown> & { DefaultComponent: ComponentType<P> }>\n | undefined;\n if (Override) {\n return <Override {...spreadProps} DefaultComponent={DefaultComponent} />;\n }\n const Default = DefaultComponent as ComponentType<Record<string, unknown>>;\n return <Default {...spreadProps} />;\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type {\n ChatConfig,\n ChatMessage,\n ChatEventCallbacks,\n} from \"../core/types\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\n\ntype ChatStatus = \"idle\" | \"streaming\" | \"error\";\n\ninterface ActiveTool {\n toolName: string;\n state: \"partial-call\" | \"call\" | \"output-available\";\n args: Record<string, unknown>;\n result?: unknown;\n renderMode: string;\n}\n\nconst SESSION_KEY_PREFIX = \"aigentyc-session-\";\nconst MESSAGE_KEY_PREFIX = \"aigentyc-messages-\";\n\nfunction getOrCreateSessionId(projectId: string): string {\n if (typeof window === \"undefined\") return crypto.randomUUID();\n const key = SESSION_KEY_PREFIX + projectId;\n try {\n const stored = sessionStorage.getItem(key);\n if (stored) return stored;\n const id = crypto.randomUUID();\n sessionStorage.setItem(key, id);\n return id;\n } catch {\n return crypto.randomUUID();\n }\n}\n\nfunction persistMessages(projectId: string, messages: unknown[]): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(MESSAGE_KEY_PREFIX + projectId, JSON.stringify(messages));\n } catch {\n // Quota or unavailable\n }\n}\n\nfunction loadPersistedMessages(projectId: string): ChatMessage[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = localStorage.getItem(MESSAGE_KEY_PREFIX + projectId);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n}\n\nfunction clearPersistedMessages(projectId: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(MESSAGE_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n}\n\nexport interface ChatContextValue {\n messages: ChatMessage[];\n status: ChatStatus;\n error: Error | undefined;\n sessionId: string;\n config: ChatConfig;\n activeTools: ActiveTool[];\n sendMessage: (content: string) => void;\n stopGeneration: () => void;\n newConversation: () => void;\n clearMessages: () => void;\n callbacks?: ChatEventCallbacks;\n}\n\nexport const ChatContext = createContext<ChatContextValue | null>(null);\n\nexport interface ChatContextProviderProps {\n config: ChatConfig;\n callbacks?: ChatEventCallbacks;\n children: ReactNode;\n}\n\n/**\n * Internal provider that manages chat state via @ai-sdk/react `useChat`.\n * Handles message persistence and session management.\n */\nexport function ChatContextProvider({\n config,\n callbacks,\n children,\n}: ChatContextProviderProps) {\n const projectId = config.projectId || \"default\";\n const [sessionId, setSessionId] = useState(() => getOrCreateSessionId(projectId));\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // Re-load persisted messages whenever the session changes (incl. after\n // newConversation()). Keying only on mount cached the original array, so\n // useChat would re-inject the OLD messages into the new sessionId — a real\n // \"new chat\" effectively kept the old conversation alive.\n const initialMessages = useMemo(\n () => loadPersistedMessages(projectId),\n [projectId, sessionId]\n );\n\n // Page context is whatever the host page looks like *right now*, so it is read\n // through a ref at send time rather than captured when the transport is built.\n // Rebuilding the transport on every navigation would remount `useChat` and\n // drop an in-flight stream — in a single-page host that is one route change.\n const pageRef = useRef({\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\n });\n pageRef.current = {\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\n };\n\n const transport = useMemo(\n () =>\n new DefaultChatTransport({\n api: `${config.apiEndpoint || \"\"}/api/kb/chat`,\n headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : undefined,\n // A function body is resolved per request by the AI SDK transport.\n body: () => {\n const { pageUrl, pageTitle, pageContext } = pageRef.current;\n return {\n projectId: config.projectId,\n sessionId,\n ...(pageUrl ? { pageUrl } : {}),\n ...(pageTitle ? { pageTitle } : {}),\n ...(pageContext !== undefined ? { pageContext } : {}),\n };\n },\n }),\n [config.apiEndpoint, config.apiKey, config.projectId, sessionId]\n );\n\n const {\n messages,\n sendMessage: sdkSendMessage,\n status: sdkStatus,\n error,\n stop,\n setMessages,\n } = useChat({\n id: sessionId,\n messages: initialMessages as never,\n transport,\n onFinish: (message) => {\n callbacksRef.current?.onMessageReceived?.(message as unknown as ChatMessage);\n },\n onError: (err) => {\n callbacksRef.current?.onError?.(err);\n },\n });\n\n const status: ChatStatus = error\n ? \"error\"\n : sdkStatus === \"streaming\" || sdkStatus === \"submitted\"\n ? \"streaming\"\n : \"idle\";\n\n useEffect(() => {\n persistMessages(projectId, messages);\n }, [messages, projectId]);\n\n const activeTools = useMemo<ActiveTool[]>(() => {\n if (messages.length === 0) return [];\n const last = messages[messages.length - 1] as { role: string; parts?: unknown[] };\n if (last.role !== \"assistant\" || !Array.isArray(last.parts)) return [];\n return (last.parts as Array<Record<string, unknown>>)\n .filter((p) => typeof p.type === \"string\" && (p.type as string).startsWith(\"tool-\"))\n .map((p) => ({\n toolName: (p.toolName as string) || (p.type as string).replace(\"tool-\", \"\"),\n state: (p.state as ActiveTool[\"state\"]) || \"output-available\",\n args: (p.args as Record<string, unknown>) || {},\n result: p.result,\n renderMode: (p.renderMode as string) || \"inline\",\n }));\n }, [messages]);\n\n const sendMessage = useCallback(\n (content: string) => {\n if (!content.trim()) return;\n callbacksRef.current?.onMessageSent?.({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n } as ChatMessage);\n sdkSendMessage({ text: content });\n },\n [sdkSendMessage]\n );\n\n const stopGeneration = useCallback(() => stop(), [stop]);\n\n const newConversation = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n if (typeof window !== \"undefined\") {\n try {\n sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n }\n setSessionId(getOrCreateSessionId(projectId));\n }, [projectId, setMessages]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n }, [projectId, setMessages]);\n\n const value = useMemo<ChatContextValue>(\n () => ({\n messages: messages as unknown as ChatMessage[],\n status,\n error: error as Error | undefined,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n callbacks: callbacksRef.current,\n }),\n [\n messages,\n status,\n error,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n ]\n );\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;\n}\n\n/**\n * Returns the chat context. Must be used within a `ChatContextProvider`.\n */\nexport function useChatContext(): ChatContextValue {\n const ctx = useContext(ChatContext);\n if (!ctx) {\n throw new Error(\n \"useChatContext must be used within a ChatProvider or ChatContextProvider\"\n );\n }\n return ctx;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useSlots, ChatContext } from './chunk-
|
|
2
|
+
import { useSlots, ChatContext } from './chunk-3EN3DMUL.js';
|
|
3
3
|
import { processImagesInHtml } from './chunk-PS3U7T37.js';
|
|
4
4
|
import { Spinner } from './chunk-4QT25AXI.js';
|
|
5
5
|
import { Card } from './chunk-NPJKLYLV.js';
|
|
@@ -375,6 +375,10 @@ function useSafeChatCallbacks() {
|
|
|
375
375
|
const ctx = useContext(ChatContext);
|
|
376
376
|
return ctx?.callbacks ?? {};
|
|
377
377
|
}
|
|
378
|
+
function useSafeChatConfig() {
|
|
379
|
+
const ctx = useContext(ChatContext);
|
|
380
|
+
return ctx?.config;
|
|
381
|
+
}
|
|
378
382
|
|
|
379
383
|
// src/tools/tool-registry.ts
|
|
380
384
|
var BUILTIN_NAMED_RENDERERS = {
|
|
@@ -390,7 +394,7 @@ var LazyVisualization = lazy(
|
|
|
390
394
|
}))
|
|
391
395
|
);
|
|
392
396
|
var LazyJsonRender = lazy(
|
|
393
|
-
() => import('./JsonRenderResult-
|
|
397
|
+
() => import('./JsonRenderResult-GCNFMZYP.js').then((m) => ({
|
|
394
398
|
default: m.JsonRenderResult
|
|
395
399
|
}))
|
|
396
400
|
);
|
|
@@ -426,6 +430,7 @@ function VisualizationWrapper(props) {
|
|
|
426
430
|
function JsonRenderWrapper(props) {
|
|
427
431
|
const spec = props.result?.jsonRenderSpec;
|
|
428
432
|
const payload = getDisplayData(props.result);
|
|
433
|
+
const chatConfig = useSafeChatConfig();
|
|
429
434
|
if (!spec) return null;
|
|
430
435
|
return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingFallback, { text: props.result?.loadingText }), children: /* @__PURE__ */ jsx(
|
|
431
436
|
LazyJsonRender,
|
|
@@ -433,7 +438,9 @@ function JsonRenderWrapper(props) {
|
|
|
433
438
|
spec,
|
|
434
439
|
data: payload,
|
|
435
440
|
onSendMessage: props.onSendMessage,
|
|
436
|
-
onAction: props.onAction
|
|
441
|
+
onAction: props.onAction,
|
|
442
|
+
apiKey: chatConfig?.apiKey,
|
|
443
|
+
apiEndpoint: chatConfig?.apiEndpoint
|
|
437
444
|
}
|
|
438
445
|
) });
|
|
439
446
|
}
|
|
@@ -572,5 +579,5 @@ function pickDefaultForMode(mode) {
|
|
|
572
579
|
}
|
|
573
580
|
|
|
574
581
|
export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer };
|
|
575
|
-
//# sourceMappingURL=chunk-
|
|
576
|
-
//# sourceMappingURL=chunk-
|
|
582
|
+
//# sourceMappingURL=chunk-6ZZTTD5E.js.map
|
|
583
|
+
//# sourceMappingURL=chunk-6ZZTTD5E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/SearchKnowledgeBaseRenderer.tsx","../src/tools/ComponentRenderer.tsx","../src/tools/useSafeChatCallbacks.ts","../src/tools/tool-registry.ts","../src/tools/ToolRenderer.tsx"],"names":["useState","jsxs","jsx","useEffect"],"mappings":"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","file":"chunk-6ZZTTD5E.js","sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Card } from \"../ui/card\";\nimport type { ToolRendererProps } from \"../core/types\";\n\ninterface KbSource {\n rank?: number;\n id?: number | string;\n content?: string;\n documentName?: string;\n sourceUrl?: string | null;\n similarity?: number;\n pageTitle?: string | null;\n summary?: string | null;\n relevance?: string;\n}\n\ninterface KbResult {\n found?: boolean;\n totalResults?: number;\n generatedQueries?: string[];\n sources?: KbSource[];\n}\n\nfunction truncate(text: string, max = 220) {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + \"…\";\n}\n\nexport function SearchKnowledgeBaseRenderer(props: ToolRendererProps) {\n const data = (props.result?._displayData ?? props.result?.data) as KbResult | undefined;\n const [expanded, setExpanded] = useState(false);\n\n if (!data || !data.found || !Array.isArray(data.sources) || data.sources.length === 0) {\n return null;\n }\n\n const sources = data.sources;\n const visible = expanded ? sources : sources.slice(0, 3);\n\n return (\n <Card className=\"p-3 text-sm\">\n <div className=\"mb-2 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n Found <strong className=\"text-foreground\">{data.totalResults ?? sources.length}</strong>{\" \"}\n source{(data.totalResults ?? sources.length) === 1 ? \"\" : \"s\"}\n {data.generatedQueries?.length\n ? ` for \"${data.generatedQueries.join(\", \")}\"`\n : \"\"}\n </span>\n </div>\n\n <ul className=\"flex flex-col gap-2\">\n {visible.map((s, i) => {\n const snippet = truncate((s.summary || s.content || \"\").replace(/\\s+/g, \" \").trim());\n const title = s.documentName || s.pageTitle || `Source ${s.rank ?? i + 1}`;\n return (\n <li\n key={`${s.id ?? i}`}\n className=\"rounded-md border border-border/60 bg-muted/20 p-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium truncate\">{title}</span>\n {typeof s.similarity === \"number\" && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {(s.similarity * 100).toFixed(0)}%\n </span>\n )}\n </div>\n {snippet && (\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n {snippet}\n </p>\n )}\n {s.sourceUrl && (\n <a\n href={s.sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-block text-xs text-primary hover:underline\"\n >\n Open source ↗\n </a>\n )}\n </li>\n );\n })}\n </ul>\n\n {sources.length > 3 && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n {expanded ? \"Show less\" : `Show ${sources.length - 3} more`}\n </button>\n )}\n </Card>\n );\n}\n\nexport default SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ComponentRenderer — renders a \"legacy\" tool result that ships custom\n * HTML + CSS with Handlebars-style `{{field}}` template variables.\n *\n * Supports single objects and arrays with a responsive grid and a\n * show-more pagination fold. All window access is SSR-guarded.\n */\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { processImagesInHtml } from \"../core/image-utils\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribeToResize(cb: () => void) {\n if (typeof window === \"undefined\") return () => {};\n window.addEventListener(\"resize\", cb);\n return () => window.removeEventListener(\"resize\", cb);\n}\n\nfunction getIsMobile() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\n/** Props for `ComponentRenderer`. */\nexport interface ComponentRendererProps {\n /** Raw HTML template with `{{field}}` placeholders. */\n htmlCode: string;\n /** Scoped CSS for the template. */\n cssCode: string;\n /** Data payload — object (single render) or array (grid). */\n data: unknown;\n /** Columns on mobile when `data` is an array. Default: 1 */\n mobileGridCols?: number;\n /** Columns on desktop when `data` is an array. Default: 3 */\n desktopGridCols?: number;\n /** Optional interaction tracker. */\n onInteraction?: (params: {\n type: string;\n target: string;\n label: string;\n metadata?: Record<string, unknown>;\n messageId?: string;\n eventId?: string;\n }) => void;\n messageId?: string;\n eventId?: string;\n /** Items per page on mobile (default: 4). */\n mobilePageSize?: number;\n /** Items per page on desktop (default: 4). */\n desktopPageSize?: number;\n}\n\n/**\n * Renders a tool-provided HTML/CSS template against data. Strings such as\n * `{{user.name}}` and `{{#each items}}...{{/each}}` are resolved before\n * insertion.\n */\nexport function ComponentRenderer({\n htmlCode,\n cssCode,\n data,\n mobileGridCols = 1,\n desktopGridCols = 3,\n onInteraction,\n messageId,\n eventId,\n mobilePageSize = 4,\n desktopPageSize = 4,\n}: ComponentRendererProps) {\n const containerId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const isMobile = useSyncExternalStore(\n subscribeToResize,\n getIsMobile,\n () => true\n );\n\n const pageSize = isMobile ? mobilePageSize : desktopPageSize;\n\n const isArray = Array.isArray(data);\n const totalItems = isArray ? (data as unknown[]).length : 1;\n const totalPages = isArray ? Math.ceil(totalItems / pageSize) : 1;\n const hasPagination = isArray && totalItems > pageSize;\n\n useEffect(() => {\n setCurrentPage((p) => Math.min(p, Math.max(0, totalPages - 1)));\n }, [totalPages]);\n\n const displayData =\n isArray && hasPagination\n ? (data as unknown[]).slice(\n currentPage * pageSize,\n (currentPage + 1) * pageSize\n )\n : data;\n\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof document === \"undefined\") return;\n\n let processedHtml = \"\";\n\n if (Array.isArray(displayData)) {\n const gridId = `grid-${containerId}`;\n const items = displayData\n .map((item, idx) => {\n let rendered = replaceTemplateVariables(htmlCode, item);\n rendered = processImagesInHtml(rendered);\n const globalIndex = currentPage * pageSize + idx;\n return `<div class=\"grid-item\" data-item-index=\"${globalIndex}\">${rendered}</div>`;\n })\n .join(\"\");\n processedHtml = `<div class=\"grid-container\" id=\"${gridId}\">${items}</div>`;\n } else {\n processedHtml = replaceTemplateVariables(htmlCode, displayData);\n processedHtml = processImagesInHtml(processedHtml);\n }\n\n containerRef.current.innerHTML = processedHtml;\n\n const styleId = `component-style-${containerId}`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n let finalCss = cssCode;\n if (Array.isArray(displayData)) {\n const gridCss = `\n#${containerId} .grid-container {\n display: grid;\n grid-template-columns: repeat(${mobileGridCols}, 1fr);\n gap: 1rem;\n width: 100%;\n}\n\n#${containerId} .grid-item {\n width: 100%;\n}\n\n@media (min-width: 768px) {\n #${containerId} .grid-container {\n grid-template-columns: repeat(${desktopGridCols}, 1fr);\n }\n}\n`;\n finalCss = `${cssCode}\\n${gridCss}`;\n }\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = finalCss;\n containerRef.current.appendChild(style);\n\n const images = containerRef.current.querySelectorAll(\"img\");\n images.forEach((img) => {\n if (!img.hasAttribute(\"loading\")) {\n img.setAttribute(\"loading\", \"lazy\");\n }\n });\n\n const links = containerRef.current.querySelectorAll(\"a\");\n links.forEach((link) => {\n link.setAttribute(\"target\", \"_blank\");\n link.setAttribute(\"rel\", \"noopener noreferrer\");\n });\n }, [\n htmlCode,\n cssCode,\n displayData,\n mobileGridCols,\n desktopGridCols,\n containerId,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n ]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onInteraction) return;\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\");\n const button = target.closest(\"button\");\n\n if (link?.href) {\n onInteraction({\n type: \"link_click\",\n target: link.href,\n label: link.textContent || link.href,\n metadata: { url: link.href, text: link.textContent },\n messageId,\n eventId,\n });\n } else if (button && !button.hasAttribute(\"data-no-track\")) {\n onInteraction({\n type: \"button_click\",\n target: button.textContent || \"button\",\n label: button.textContent || \"button\",\n metadata: { buttonText: button.textContent },\n messageId,\n eventId,\n });\n }\n };\n\n return (\n <div className=\"component-renderer-wrapper\">\n <div\n ref={containerRef}\n id={containerId}\n className=\"component-render w-full rounded\"\n onClick={handleClick}\n style={{ display: \"block\" }}\n />\n\n {hasPagination && (\n <div className=\"flex items-center justify-center gap-2 mt-4\" dir=\"ltr\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n disabled={currentPage === 0}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Previous page\"\n >\n {\"‹\"}\n </button>\n\n <span className=\"text-sm text-gray-600 px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n\n <button\n onClick={() =>\n setCurrentPage((p) => Math.min(totalPages - 1, p + 1))\n }\n disabled={currentPage >= totalPages - 1}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Next page\"\n >\n {\"›\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default ComponentRenderer;\n\n// ---------------------------------------------------------------------------\n// Template engine\n// ---------------------------------------------------------------------------\n\n/**\n * Replace `{{template}}` variables in HTML with actual data values.\n *\n * Supported patterns:\n * • `{{field}}`, `{{nested.field}}`, `{{arr[0].name}}` — interpolation\n * • `{{#each field}}...{{/each}}` — loop over an array\n * • `{{this}}` / `{{this.field}}` — current scope (inside each)\n * • `{{#if field}}...{{/if}}` — render block when field is truthy\n * • `{{#if field}}...{{else}}...{{/if}}` — truthy / falsy branches\n * • `{{#unless field}}...{{/unless}}` — render block when field is falsy\n * • `{{#ifEquals field \"value\"}}...{{/ifEquals}}` — equality branch\n *\n * Truthiness: non-empty array, non-empty string, non-zero number, true.\n */\nfunction replaceTemplateVariables(html: string, data: unknown): string {\n // Control-flow blocks first. Order matters: #each can contain #if, #if can\n // contain #each, so we pass the data through both repeatedly. Two passes\n // covers realistic nesting; the recursion inside each handler covers deeper.\n let processed = processIfBlocks(html, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n processed = processEachBlocks(processed, data);\n // Second pass — conditionals emitted from inside an #each may need resolving.\n processed = processIfBlocks(processed, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n\n // Strip any leftover block markers we don't recognize (defensive).\n processed = processed.replace(/\\{\\{[#/][^}]+\\}\\}/g, \"\");\n\n processed = processed.replace(/\\{\\{this\\}\\}/g, () =>\n data !== undefined && data !== null ? String(data) : \"\"\n );\n\n processed = processed.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n\n return processed.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path: string) => {\n try {\n const trimmedPath = path.trim();\n const value = getNestedValue(data, trimmedPath);\n\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } catch {\n return match;\n }\n });\n}\n\n/** Truthy check used by all conditional helpers. */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) return false;\n if (typeof value === \"string\") return value.length > 0;\n if (typeof value === \"number\") return value !== 0 && !Number.isNaN(value);\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\n return Boolean(value);\n}\n\n/** Split a conditional body on the first top-level `{{else}}`. */\nfunction splitOnElse(body: string): [string, string | null] {\n // Find the first {{else}} that's NOT nested inside another #if/#each block.\n const re = /\\{\\{(#(?:if|unless|each|ifEquals)\\s+[^}]+|\\/(?:if|unless|each|ifEquals)|else)\\}\\}/g;\n let depth = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(body)) !== null) {\n if (m[1].startsWith(\"#\")) depth++;\n else if (m[1].startsWith(\"/\")) depth--;\n else if (m[1] === \"else\" && depth === 0) {\n return [body.slice(0, m.index), body.slice(m.index + \"{{else}}\".length)];\n }\n }\n return [body, null];\n}\n\nfunction processIfBlocks(html: string, data: unknown): string {\n const ifRegex = /\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n return html.replace(ifRegex, (_match, field: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes : no ?? \"\";\n });\n}\n\nfunction processUnlessBlocks(html: string, data: unknown): string {\n const unlessRegex = /\\{\\{#unless\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/unless\\}\\}/g;\n return html.replace(unlessRegex, (_match, field: string, body: string) => {\n const [no, yes] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes ?? \"\" : no;\n });\n}\n\nfunction processIfEqualsBlocks(html: string, data: unknown): string {\n // {{#ifEquals field \"value\"}} or {{#ifEquals field 'value'}} or {{#ifEquals field 42}}\n const re = /\\{\\{#ifEquals\\s+([^\\s\"'}]+)\\s+(?:\"([^\"]*)\"|'([^']*)'|([^\\s}]+))\\}\\}([\\s\\S]*?)\\{\\{\\/ifEquals\\}\\}/g;\n return html.replace(re, (_match, field: string, dq: string, sq: string, raw: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const expected = dq ?? sq ?? raw;\n const value = getNestedValue(data, field.trim());\n const matches = String(value) === String(expected);\n return matches ? yes : no ?? \"\";\n });\n}\n\nfunction processEachBlocks(html: string, data: unknown): string {\n const eachRegex = /\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n return html.replace(eachRegex, (_match, field: string, content: string) => {\n const trimmedField = field.trim();\n const array = getNestedValue(data, trimmedField);\n if (!Array.isArray(array)) return \"\";\n\n return array\n .map((item) => {\n // Process nested control flow in this item's scope.\n let itemHtml = processEachBlocks(content, item);\n itemHtml = processIfBlocks(itemHtml, item);\n itemHtml = processUnlessBlocks(itemHtml, item);\n itemHtml = processIfEqualsBlocks(itemHtml, item);\n\n if (typeof item !== \"object\" || item === null) {\n itemHtml = itemHtml.replace(/\\{\\{this\\}\\}/g, String(item));\n return itemHtml;\n }\n\n itemHtml = itemHtml.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n itemHtml = itemHtml.replace(/\\{\\{([^}]+)\\}\\}/g, (m, path: string) => {\n const trimmedPath = path.trim();\n if (trimmedPath.startsWith(\"#\") || trimmedPath.startsWith(\"/\"))\n return m;\n const value = getNestedValue(item, trimmedPath);\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n });\n\n return itemHtml;\n })\n .join(\"\");\n });\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!path || obj === null || obj === undefined) return undefined;\n\n const parts = path.split(/\\.(?![^[]*\\])/);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n\n const arrayMatch = part.match(/^([^[]+)\\[([^\\]]+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = (current as Record<string, unknown>)[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n }\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ChatContext } from \"../providers/ChatContext\";\nimport type { ChatConfig, ChatEventCallbacks } from \"../core/types\";\n\n/**\n * Read chat event callbacks from ChatContext if available, otherwise return\n * an empty object. Safe to call from components that may render outside a\n * ChatProvider (e.g. standalone tool previews).\n */\nexport function useSafeChatCallbacks(): ChatEventCallbacks {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.callbacks ?? {};\n}\n\n/**\n * Read the chat config (projectId, apiEndpoint, apiKey, clientName) from\n * ChatContext if available. Returns `undefined` when the component renders\n * outside a ChatProvider so callers can decide how to degrade (e.g. tool\n * result renderers in standalone previews skip auth-required actions).\n */\nexport function useSafeChatConfig(): ChatConfig | undefined {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.config;\n}\n","\"use client\";\n\n/**\n * Built-in tool renderer registry.\n *\n * The `ToolRenderer` router consults these maps after slot overrides and\n * before falling back to a generic JSON preview.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ToolRendererProps } from \"../core/types\";\nimport { SearchKnowledgeBaseRenderer } from \"./SearchKnowledgeBaseRenderer\";\n\n/**\n * Map of built-in renderers keyed by the tool result's `uiRenderMode`.\n *\n * Entries are populated lazily by `ToolRenderer` (via `React.lazy`) so the\n * heavy renderers (recharts, JSON-render catalog) don't end up in the core\n * bundle unless used. This map is intentionally empty at module scope — look\n * at `ToolRenderer.tsx` for the actual dispatch logic.\n */\nexport const BUILTIN_TOOL_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n visualization: null,\n json_render: null,\n legacy: null,\n preset: null,\n none: null,\n};\n\n/**\n * Built-in renderers addressed by tool *name* (not render mode).\n *\n * A `null` value signals \"render nothing\" — useful for tools whose side\n * effects are handled elsewhere (e.g. `requestHumanChat` is consumed by the\n * `LiveChatProvider` and must not produce UI inside the message stream).\n */\nexport const BUILTIN_NAMED_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n requestHumanChat: null,\n // Hidden by default — knowledge-base searches are context for the assistant,\n // not content for the user. Opt in via:\n // slots: { tools: { searchKnowledgeBase: SearchKnowledgeBaseRenderer } }\n searchKnowledgeBase: null,\n};\n// Keep the component reachable even though the default is null.\nvoid SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ToolRenderer — the main dispatcher for tool invocations in the chat stream.\n *\n * Resolution order:\n * 1. `slots.tools[toolName]` — per-tool-name slot override\n * 2. `slots.toolRenderers[result.uiRenderMode]` — per-render-mode slot override\n * 3. `BUILTIN_NAMED_RENDERERS[toolName]` — special named built-ins\n * 4. `BUILTIN_TOOL_RENDERERS[result.uiRenderMode]` — built-in mode dispatch\n * 5. Fallback — clean JSON preview inside a Card\n *\n * Heavy renderers (`VisualizationRenderer`, `JsonRenderResult`) are loaded\n * lazily via `React.lazy` + `Suspense` to keep the core bundle small.\n */\n\nimport {\n lazy,\n Suspense,\n useEffect,\n useMemo,\n type ComponentType,\n} from \"react\";\nimport { useSlots } from \"../providers/SlotsContext\";\nimport { Card } from \"../ui/card\";\nimport { Spinner } from \"../ui/spinner\";\nimport type {\n ComponentAction,\n ToolRendererProps,\n ToolResult,\n} from \"../core/types\";\n// ToolRenderer may be rendered outside a ChatContext (e.g. standalone\n// previews), so we read the context defensively via a safe hook.\nimport { useSafeChatCallbacks, useSafeChatConfig } from \"./useSafeChatCallbacks\";\nimport {\n BUILTIN_NAMED_RENDERERS,\n BUILTIN_TOOL_RENDERERS,\n} from \"./tool-registry\";\nimport { ComponentRenderer } from \"./ComponentRenderer\";\n\n// ---------------------------------------------------------------------------\n// Lazy renderers\n// ---------------------------------------------------------------------------\n\nconst LazyVisualization = lazy(() =>\n import(\"./VisualizationRenderer\").then((m) => ({\n default: m.VisualizationRenderer,\n }))\n);\n\nconst LazyJsonRender = lazy(() =>\n import(\"../json-render/JsonRenderResult\").then((m) => ({\n default: m.JsonRenderResult as unknown as ComponentType<Record<string, unknown>>,\n }))\n);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Return the best display payload for a tool result, preferring `_displayData`\n * (which the server strips before sending back to the LLM) over `data`.\n */\nfunction getDisplayData(result: ToolResult | undefined): unknown {\n if (!result) return undefined;\n if (result._displayData !== undefined) return result._displayData;\n return result.data;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default (fallback) renderers\n// ---------------------------------------------------------------------------\n\nfunction LoadingFallback({ text }: { text?: string }) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"h-4 w-4\" />\n <span>{text || \"Working...\"}</span>\n </div>\n );\n}\n\nfunction PresetPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined || payload === null) return null;\n return (\n <Card className=\"p-3\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\nfunction VisualizationWrapper(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n // Accept either a full spec or `{ spec: ... }`.\n const spec =\n payload && typeof payload === \"object\" && \"type\" in (payload as object)\n ? (payload as Record<string, unknown>)\n : (payload as { spec?: Record<string, unknown> })?.spec;\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <LazyVisualization spec={spec as any} />\n </Suspense>\n );\n}\n\nfunction JsonRenderWrapper(props: ToolRendererProps) {\n const spec = props.result?.jsonRenderSpec;\n const payload = getDisplayData(props.result);\n // Pull apiKey from the chat config so `call_api` actions in the spec\n // (e.g. form-submit buttons hitting /api/kb/form-submit) can attach the\n // project's Bearer token. Without this, third-party-domain embeds hit\n // 401 on submit — the matching headline bug.\n const chatConfig = useSafeChatConfig();\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n <LazyJsonRender\n spec={spec}\n data={payload}\n onSendMessage={props.onSendMessage}\n onAction={props.onAction}\n apiKey={chatConfig?.apiKey}\n apiEndpoint={chatConfig?.apiEndpoint}\n />\n </Suspense>\n );\n}\n\nfunction LegacyWrapper(props: ToolRendererProps) {\n const result = props.result;\n const payload = getDisplayData(result);\n const config = result?.customComponent;\n // `customComponent` in core/types is declared as `string`, but when used by\n // the legacy render mode the server inlines the `{ htmlCode, cssCode, ... }`\n // object. Widen the type locally.\n const cfg =\n typeof config === \"object\" && config !== null\n ? (config as {\n htmlCode?: string;\n cssCode?: string;\n mobileGridCols?: number;\n desktopGridCols?: number;\n mobilePageSize?: number;\n desktopPageSize?: number;\n })\n : null;\n if (!cfg?.htmlCode) return null;\n\n return (\n <ComponentRenderer\n htmlCode={cfg.htmlCode}\n cssCode={cfg.cssCode || \"\"}\n data={payload}\n mobileGridCols={cfg.mobileGridCols}\n desktopGridCols={cfg.desktopGridCols}\n mobilePageSize={cfg.mobilePageSize}\n desktopPageSize={cfg.desktopPageSize}\n />\n );\n}\n\nfunction FallbackPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined) return null;\n return (\n <Card className=\"p-3 bg-muted/30\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\n/**\n * Main tool renderer. Place one of these per tool invocation inside the\n * assistant message stream.\n */\ninterface PublicSlotMap {\n loader?: ComponentType<{ text?: string }>;\n tools?: Record<string, ComponentType<ToolRendererProps>>;\n toolRenderers?: Record<string, ComponentType<ToolRendererProps>>;\n}\n\n// Known render modes — used to detect tool-name typos in slots.toolRenderers.\nconst KNOWN_RENDER_MODES = new Set([\n \"visualization\",\n \"json_render\",\n \"json\",\n \"legacy\",\n \"display\",\n \"preset\",\n \"text\",\n \"none\",\n \"hidden\",\n]);\n\n// Track tool names we've already warned about to avoid log spam.\nconst warnedToolNames = new Set<string>();\n\nexport function ToolRenderer(props: ToolRendererProps) {\n const { toolName, state, result } = props;\n const slots = useSlots() as unknown as PublicSlotMap;\n const callbacks = useSafeChatCallbacks();\n\n // ----- Fire analytics callbacks -----\n useEffect(() => {\n if (state === \"output-available\" && result) {\n (callbacks as { onToolResult?: (...args: unknown[]) => void } | undefined)?.onToolResult?.(toolName, result, result.uiRenderMode);\n }\n }, [state, toolName, result, callbacks]);\n\n // ----- Dev warning: did the caller confuse `tools` and `toolRenderers`? -----\n // `toolRenderers` is keyed by render MODE. If a key looks like a tool name\n // (not a known mode) AND there's a tool result with that name, it's almost\n // certainly a mistake — the override will never fire.\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n const modeKeys = Object.keys(slots.toolRenderers || {});\n for (const key of modeKeys) {\n if (!KNOWN_RENDER_MODES.has(key) && key === toolName && !warnedToolNames.has(key)) {\n warnedToolNames.add(key);\n console.warn(\n `[aigentyc-chat-sdk] slots.toolRenderers[\"${key}\"] looks like a tool name, ` +\n `but toolRenderers is keyed by render MODE (visualization | json_render | ` +\n `legacy | preset | text). Did you mean slots.tools[\"${key}\"]?`,\n );\n }\n }\n }, [slots.toolRenderers, toolName]);\n\n // Wrap onAction to also forward to callbacks.onToolAction.\n const onAction = useMemo(() => {\n const userOnAction = props.onAction;\n return (action: ComponentAction, itemData?: unknown) => {\n (callbacks as { onToolAction?: (...args: unknown[]) => void } | undefined)?.onToolAction?.(action, itemData);\n userOnAction?.(action);\n };\n }, [callbacks, props.onAction]);\n\n // Build a prop-forwarding wrapper that swaps `onAction`.\n const forwardedProps: ToolRendererProps = { ...props, onAction };\n\n // ----- Pending / in-flight states -----\n if (state === \"partial-call\" || state === \"call\") {\n const slotLoader = (slots as { loader?: ComponentType<unknown> }).loader;\n if (slotLoader) {\n const L = slotLoader as ComponentType<{ text?: string }>;\n return <L text={result?.loadingText} />;\n }\n return <LoadingFallback text={result?.loadingText} />;\n }\n\n // Output-available — nothing to show if the result explicitly hides itself\n const mode = (result?.uiRenderMode as string | undefined) ?? \"preset\";\n if (mode === \"none\" || mode === \"hidden\") {\n // Still check named overrides in case a host wants to render a\n // side-effect-y tool.\n const named = slots.tools?.[toolName];\n if (named) {\n return renderWithDefault(named, forwardedProps, FallbackPreview);\n }\n return null;\n }\n\n // 1. per-tool slot override\n const toolSlot = slots.tools?.[toolName];\n if (toolSlot) {\n return renderWithDefault(toolSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 2. per-render-mode slot override\n const modeSlot = slots.toolRenderers?.[mode];\n if (modeSlot) {\n return renderWithDefault(modeSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 3. named built-in\n const namedBuiltin = BUILTIN_NAMED_RENDERERS[toolName];\n if (namedBuiltin === null && toolName in BUILTIN_NAMED_RENDERERS) {\n // explicit \"render nothing\" for this tool\n return null;\n }\n if (namedBuiltin) {\n const N = namedBuiltin;\n return <N {...forwardedProps} />;\n }\n\n // 4. built-in by render mode\n switch (mode) {\n case \"visualization\":\n return <VisualizationWrapper {...forwardedProps} />;\n case \"json_render\":\n case \"json\":\n return <JsonRenderWrapper {...forwardedProps} />;\n case \"legacy\":\n case \"display\":\n return <LegacyWrapper {...forwardedProps} />;\n case \"preset\":\n case \"text\":\n return <PresetPreview {...forwardedProps} />;\n default:\n // 5. fallback JSON card\n return <FallbackPreview {...forwardedProps} />;\n }\n}\n\nexport default ToolRenderer;\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/**\n * Render a slot override and inject the matching `DefaultComponent` so the\n * override can fall back to the built-in rendering.\n */\nfunction renderWithDefault(\n Override: ComponentType<ToolRendererProps & { DefaultComponent?: ComponentType<ToolRendererProps> }>,\n props: ToolRendererProps,\n Default: ComponentType<ToolRendererProps>\n) {\n return <Override {...props} DefaultComponent={Default} />;\n}\n\nfunction pickDefaultForMode(mode: string): ComponentType<ToolRendererProps> {\n switch (mode) {\n case \"visualization\":\n return VisualizationWrapper;\n case \"json_render\":\n case \"json\":\n return JsonRenderWrapper;\n case \"legacy\":\n case \"display\":\n return LegacyWrapper;\n case \"preset\":\n case \"text\":\n return PresetPreview;\n default:\n return FallbackPreview;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports for convenience\n// ---------------------------------------------------------------------------\n\nexport type { ToolRendererProps, ToolResult, ComponentAction };\n"]}
|
|
@@ -91,11 +91,31 @@ function useAigentycChat(options) {
|
|
|
91
91
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
92
92
|
[]
|
|
93
93
|
);
|
|
94
|
+
const pageRef = react.useRef({
|
|
95
|
+
pageUrl: options.pageUrl,
|
|
96
|
+
pageTitle: options.pageTitle,
|
|
97
|
+
pageContext: options.pageContext
|
|
98
|
+
});
|
|
99
|
+
pageRef.current = {
|
|
100
|
+
pageUrl: options.pageUrl,
|
|
101
|
+
pageTitle: options.pageTitle,
|
|
102
|
+
pageContext: options.pageContext
|
|
103
|
+
};
|
|
94
104
|
const transport = react.useMemo(
|
|
95
105
|
() => new ai.DefaultChatTransport({
|
|
96
106
|
api: `${apiEndpoint || ""}/api/kb/chat`,
|
|
97
107
|
headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : void 0,
|
|
98
|
-
body
|
|
108
|
+
// A function body is resolved per request by the AI SDK transport.
|
|
109
|
+
body: () => {
|
|
110
|
+
const { pageUrl, pageTitle, pageContext } = pageRef.current;
|
|
111
|
+
return {
|
|
112
|
+
projectId: safeProjectId,
|
|
113
|
+
sessionId,
|
|
114
|
+
...pageUrl ? { pageUrl } : {},
|
|
115
|
+
...pageTitle ? { pageTitle } : {},
|
|
116
|
+
...pageContext !== void 0 ? { pageContext } : {}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
99
119
|
}),
|
|
100
120
|
[apiEndpoint, apiKey, safeProjectId, sessionId]
|
|
101
121
|
);
|
|
@@ -264,5 +284,5 @@ function useAigentycChat(options) {
|
|
|
264
284
|
}
|
|
265
285
|
|
|
266
286
|
exports.useAigentycChat = useAigentycChat;
|
|
267
|
-
//# sourceMappingURL=chunk-
|
|
268
|
-
//# sourceMappingURL=chunk-
|
|
287
|
+
//# sourceMappingURL=chunk-AWRQSM42.cjs.map
|
|
288
|
+
//# sourceMappingURL=chunk-AWRQSM42.cjs.map
|