@aigentyc/chat-sdk 0.3.1 → 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.
Files changed (58) hide show
  1. package/AGENTS.md +24 -1
  2. package/claude-skill/aigentyc-chat-sdk/SKILL.md +1 -1
  3. package/context7.json +1 -1
  4. package/dist/{ChatInterface-f8ftS56n.d.ts → ChatInterface--yaDB5yp.d.ts} +1 -1
  5. package/dist/{ChatInterface-B0zbA3Lm.d.cts → ChatInterface-0rq8D5-8.d.cts} +1 -1
  6. package/dist/{SlotsContext-BjiX1mRx.d.ts → SlotsContext-CWTjP0mA.d.ts} +1 -1
  7. package/dist/{SlotsContext-CEOBjzfh.d.cts → SlotsContext-u5CFB7MS.d.cts} +1 -1
  8. package/dist/{chunk-FPQ3UCCJ.js → chunk-3EN3DMUL.js} +24 -5
  9. package/dist/chunk-3EN3DMUL.js.map +1 -0
  10. package/dist/{chunk-BPV66QNM.cjs → chunk-46MUOYPR.cjs} +24 -5
  11. package/dist/chunk-46MUOYPR.cjs.map +1 -0
  12. package/dist/{chunk-AD6XWKWB.js → chunk-6ZZTTD5E.js} +3 -3
  13. package/dist/{chunk-AD6XWKWB.js.map → chunk-6ZZTTD5E.js.map} +1 -1
  14. package/dist/{chunk-3HGOLNGG.cjs → chunk-AWRQSM42.cjs} +23 -3
  15. package/dist/chunk-AWRQSM42.cjs.map +1 -0
  16. package/dist/{chunk-M4YRNNGB.js → chunk-LSKOJ7SH.js} +23 -3
  17. package/dist/chunk-LSKOJ7SH.js.map +1 -0
  18. package/dist/{chunk-5XF7KH6B.cjs → chunk-LVWSWTI3.cjs} +22 -22
  19. package/dist/chunk-LVWSWTI3.cjs.map +1 -0
  20. package/dist/{chunk-7IFBPXT3.cjs → chunk-OEEDYJTV.cjs} +6 -6
  21. package/dist/{chunk-7IFBPXT3.cjs.map → chunk-OEEDYJTV.cjs.map} +1 -1
  22. package/dist/{chunk-YG2COKFR.js → chunk-RAQVW2D7.js} +7 -7
  23. package/dist/chunk-RAQVW2D7.js.map +1 -0
  24. package/dist/components.cjs +15 -15
  25. package/dist/components.d.cts +2 -2
  26. package/dist/components.d.ts +2 -2
  27. package/dist/components.js +4 -4
  28. package/dist/core.d.cts +2 -2
  29. package/dist/core.d.ts +2 -2
  30. package/dist/hooks.cjs +6 -6
  31. package/dist/hooks.d.cts +2 -2
  32. package/dist/hooks.d.ts +2 -2
  33. package/dist/hooks.js +2 -2
  34. package/dist/i18n.d.cts +1 -1
  35. package/dist/i18n.d.ts +1 -1
  36. package/dist/index.cjs +33 -22
  37. package/dist/index.cjs.map +1 -1
  38. package/dist/index.d.cts +4 -4
  39. package/dist/index.d.ts +4 -4
  40. package/dist/index.js +18 -7
  41. package/dist/index.js.map +1 -1
  42. package/dist/llms-full.txt +34 -11
  43. package/dist/theme.d.cts +1 -1
  44. package/dist/theme.d.ts +1 -1
  45. package/dist/tools.cjs +5 -5
  46. package/dist/tools.d.cts +2 -2
  47. package/dist/tools.d.ts +2 -2
  48. package/dist/tools.js +2 -2
  49. package/dist/{types-DlNwk-bG.d.cts → types-DQCjs81O.d.cts} +19 -1
  50. package/dist/{types-DlNwk-bG.d.ts → types-DQCjs81O.d.ts} +19 -1
  51. package/llms.txt +1 -1
  52. package/package.json +1 -1
  53. package/dist/chunk-3HGOLNGG.cjs.map +0 -1
  54. package/dist/chunk-5XF7KH6B.cjs.map +0 -1
  55. package/dist/chunk-BPV66QNM.cjs.map +0 -1
  56. package/dist/chunk-FPQ3UCCJ.js.map +0 -1
  57. package/dist/chunk-M4YRNNGB.js.map +0 -1
  58. package/dist/chunk-YG2COKFR.js.map +0 -1
@@ -209,7 +209,7 @@ export default function Page() {
209
209
  return (
210
210
  <Chat
211
211
  projectId="YOUR_PROJECT_ID"
212
- apiEndpoint="https://api.aigentyc.com"
212
+ apiEndpoint="https://api.aigentyc.ai"
213
213
  apiKey="YOUR_API_KEY"
214
214
  />
215
215
  )
@@ -309,6 +309,29 @@ Requires `socket.io-client`. Omit both props for AI-only mode.
309
309
 
310
310
  ---
311
311
 
312
+ ## Page context (answering about the page the widget is on)
313
+
314
+ Tell the assistant where the visitor is standing, and it can answer "show me these in 22 AWG"
315
+ without being told which "these".
316
+
317
+ ```tsx
318
+ <ChatWidget
319
+ projectId="..." apiEndpoint="..."
320
+ pageUrl={url} // current page URL
321
+ pageTitle={title} // current page title
322
+ pageContext={{ category, filters }} // any JSON your project's system prompt reads
323
+ />
324
+ ```
325
+
326
+ All three are read **fresh on every message**, so a single-page host can update them on route
327
+ change without remounting the widget — an in-flight stream survives the navigation.
328
+
329
+ `pageContext` is free-form: shape it to whatever your system prompt expects. Keep it small (it
330
+ is re-sent every turn), and note it is client-supplied — the backend renders it as data, never
331
+ as instructions.
332
+
333
+ ---
334
+
312
335
  ## Rules for agents editing consumer projects
313
336
 
314
337
  **Do:**
@@ -823,7 +846,7 @@ The built-in tool dispatcher already wraps each tool in a boundary, so a single
823
846
  | Symptom | Likely cause | Fix |
824
847
  | --- | --- | --- |
825
848
  | Unstyled / broken layout | Missing CSS import | `import "@aigentyc/chat-sdk/theme/styles.css"` |
826
- | 401 / "Missing Authorization" on embed | No `apiKey` passed — required for all third-party domain embeds | Pass `apiKey` prop (or `NEXT_PUBLIC_AIGENTYC_API_KEY` / `VITE_AIGENTYC_API_KEY` env var). The "no apiKey needed" path only works inside `app.aigentyc.com` itself (session cookie). |
849
+ | 401 / "Missing Authorization" on embed | No `apiKey` passed — required for all third-party domain embeds | Pass `apiKey` prop (or `NEXT_PUBLIC_AIGENTYC_API_KEY` / `VITE_AIGENTYC_API_KEY` env var). The "no apiKey needed" path only works inside `app.aigentyc.ai` itself (session cookie). |
827
850
  | 403 / invalid origin | API key's Allowed Origins list doesn't include your embed domain | Dashboard → Settings → API Keys → edit → add domain |
828
851
  | CORS error in browser | Allowed Origins on API key doesn't include current URL | Add `http://localhost:5173` (Vite) or `http://localhost:3000` (Next) to the key's Allowed Origins |
829
852
  | Slot override doesn't render | Using `toolRenderers` keyed by tool name | Use `tools` for per-tool overrides; `toolRenderers` is per render mode. Dev console warns automatically. |
@@ -865,15 +888,15 @@ Each entry below shows the typed exports for one subpath of the package. Use the
865
888
  ### `@aigentyc/chat-sdk` — Main exports — Chat, ChatWidget, ChatProvider, useAigentycChat
866
889
 
867
890
  ```ts
868
- export { a as ChatConfig, b as ChatEventCallbacks, c as ChatMessage, d as ComponentAction, L as Language, e as LiveChatMessage, f as LiveChatState, Q as QuestionConfig, S as SlotMap, T as ThemeConfig, g as ToolRendererProps, h as ToolResult } from './types-DlNwk-bG.js';
891
+ export { a as ChatConfig, b as ChatEventCallbacks, c as ChatMessage, d as ComponentAction, L as Language, e as LiveChatMessage, f as LiveChatState, Q as QuestionConfig, S as SlotMap, T as ThemeConfig, g as ToolRendererProps, h as ToolResult } from './types-DQCjs81O.js';
869
892
 
870
- export { L as LiveChatReturn, S as SlotComponent, a as SlotName, U as UseAigentycChatOptions, b as UseAigentycChatReturn, r as renderSlot, u as useAigentycChat, c as useChatContext, d as useLiveChat, e as useSlot, f as useSlots } from './SlotsContext-BjiX1mRx.js';
893
+ export { L as LiveChatReturn, S as SlotComponent, a as SlotName, U as UseAigentycChatOptions, b as UseAigentycChatReturn, r as renderSlot, u as useAigentycChat, c as useChatContext, d as useLiveChat, e as useSlot, f as useSlots } from './SlotsContext-CWTjP0mA.js';
871
894
 
872
895
  export { useTheme } from './theme.js';
873
896
 
874
897
  export { useI18n } from './i18n.js';
875
898
 
876
- export { A as AssistantMessageSlotProps, C as ChatInterfaceProps, U as UserMessageSlotProps } from './ChatInterface-f8ftS56n.js';
899
+ export { A as AssistantMessageSlotProps, C as ChatInterfaceProps, U as UserMessageSlotProps } from './ChatInterface--yaDB5yp.js';
877
900
 
878
901
  export { g as getToolDisplayData, n as normalizeToolRows } from './normalize-KzCLLqpU.js';
879
902
 
@@ -886,7 +909,7 @@ export { Chat, ChatErrorBoundary, type ChatProps, ChatProvider, ChatProviderProp
886
909
  ### `@aigentyc/chat-sdk/hooks` — Hooks — useAigentycChat, useChatContext, useTheme, useI18n, useLiveChat, useSlots
887
910
 
888
911
  ```ts
889
- export { L as LiveChatReturn, U as UseAigentycChatOptions, b as UseAigentycChatReturn, u as useAigentycChat, c as useChatContext, d as useLiveChat, e as useSlot, f as useSlots } from './SlotsContext-BjiX1mRx.js';
912
+ export { L as LiveChatReturn, U as UseAigentycChatOptions, b as UseAigentycChatReturn, u as useAigentycChat, c as useChatContext, d as useLiveChat, e as useSlot, f as useSlots } from './SlotsContext-CWTjP0mA.js';
890
913
 
891
914
  export { useTheme } from './theme.js';
892
915
 
@@ -901,7 +924,7 @@ export { useImageLoader, useIsMobile, useMultiImageLoader, useMultiOrderTracking
901
924
  ### `@aigentyc/chat-sdk/components` — Granular components — ChatInterface, ChatInput, ChatHeader, etc.
902
925
 
903
926
  ```ts
904
- export { a as ChatInterface } from './ChatInterface-f8ftS56n.js';
927
+ export { a as ChatInterface } from './ChatInterface--yaDB5yp.js';
905
928
 
906
929
  export { CartDrawer, ChatDrawer, ChatFooter, ChatHeader, ChatInput, ChatInputWithAttachments, FloatingButton, LiveChatHeader, LiveChatPanel, LiveChatQueueBanner, PreviewEmbedPanel, QuickQuestions, SatisfactionRating, SystemMessage, VisitorIdentityForm, WelcomePage };
907
930
  ```
@@ -910,7 +933,7 @@ export { CartDrawer, ChatDrawer, ChatFooter, ChatHeader, ChatInput, ChatInputWit
910
933
  ### `@aigentyc/chat-sdk/tools` — Tool rendering — ToolRenderer, SearchKnowledgeBaseRenderer
911
934
 
912
935
  ```ts
913
- export { d as ComponentAction, h as ToolResult } from './types-DlNwk-bG.js';
936
+ export { d as ComponentAction, h as ToolResult } from './types-DQCjs81O.js';
914
937
 
915
938
  export { J as JsonRenderResult } from './JsonRenderResult-D6ogds0_.js';
916
939
 
@@ -923,7 +946,7 @@ export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer, ToolRende
923
946
  ### `@aigentyc/chat-sdk/theme` — Theming — ThemeProvider
924
947
 
925
948
  ```ts
926
- export { T as ThemeConfig } from './types-DlNwk-bG.js';
949
+ export { T as ThemeConfig } from './types-DQCjs81O.js';
927
950
 
928
951
  export { ThemeProvider, useTheme };
929
952
  ```
@@ -932,7 +955,7 @@ export { ThemeProvider, useTheme };
932
955
  ### `@aigentyc/chat-sdk/i18n` — Internationalization — addLanguage
933
956
 
934
957
  ```ts
935
- export { L as Language } from './types-DlNwk-bG.js';
958
+ export { L as Language } from './types-DQCjs81O.js';
936
959
 
937
960
  export { I18nProvider, type I18nProviderProps, type TranslationKeys, type TranslationMap, addLanguage, isRTL, useI18n };
938
961
  ```
@@ -941,7 +964,7 @@ export { I18nProvider, type I18nProviderProps, type TranslationKeys, type Transl
941
964
  ### `@aigentyc/chat-sdk/core` — Core types and utilities
942
965
 
943
966
  ```ts
944
- export { b as ChatEventCallbacks, c as ChatMessage, C as ChatProviderProps, d as ComponentAction, L as Language, e as LiveChatMessage, f as LiveChatState, Q as QuestionConfig, S as SlotMap, i as SlotProps, T as ThemeConfig, g as ToolRendererProps, h as ToolResult } from './types-DlNwk-bG.js';
967
+ export { b as ChatEventCallbacks, c as ChatMessage, C as ChatProviderProps, d as ComponentAction, L as Language, e as LiveChatMessage, f as LiveChatState, Q as QuestionConfig, S as SlotMap, i as SlotProps, T as ThemeConfig, g as ToolRendererProps, h as ToolResult } from './types-DQCjs81O.js';
945
968
 
946
969
  export { I as InteractionMetadata, a as InteractionType, T as TrackInteractionParams, U as UseInteractionTrackerOptions, g as generateSessionId, u as useInteractionTracker } from './interaction-tracker-D9P1Oq4j.js';
947
970
 
package/dist/theme.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- export { T as ThemeConfig } from './types-DlNwk-bG.cjs';
3
+ export { T as ThemeConfig } from './types-DQCjs81O.cjs';
4
4
 
5
5
  /**
6
6
  * Theme configuration for the chat widget.
package/dist/theme.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode } from 'react';
3
- export { T as ThemeConfig } from './types-DlNwk-bG.js';
3
+ export { T as ThemeConfig } from './types-DQCjs81O.js';
4
4
 
5
5
  /**
6
6
  * Theme configuration for the chat widget.
package/dist/tools.cjs CHANGED
@@ -2,8 +2,8 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk7AZMWPKX_cjs = require('./chunk-7AZMWPKX.cjs');
5
- var chunk7IFBPXT3_cjs = require('./chunk-7IFBPXT3.cjs');
6
- require('./chunk-BPV66QNM.cjs');
5
+ var chunkOEEDYJTV_cjs = require('./chunk-OEEDYJTV.cjs');
6
+ require('./chunk-46MUOYPR.cjs');
7
7
  require('./chunk-JOO6C3XT.cjs');
8
8
  var chunkH7C3AGA2_cjs = require('./chunk-H7C3AGA2.cjs');
9
9
  var chunkQ7T3VAJV_cjs = require('./chunk-Q7T3VAJV.cjs');
@@ -23,15 +23,15 @@ Object.defineProperty(exports, "normalizeToolRows", {
23
23
  });
24
24
  Object.defineProperty(exports, "ComponentRenderer", {
25
25
  enumerable: true,
26
- get: function () { return chunk7IFBPXT3_cjs.ComponentRenderer; }
26
+ get: function () { return chunkOEEDYJTV_cjs.ComponentRenderer; }
27
27
  });
28
28
  Object.defineProperty(exports, "SearchKnowledgeBaseRenderer", {
29
29
  enumerable: true,
30
- get: function () { return chunk7IFBPXT3_cjs.SearchKnowledgeBaseRenderer; }
30
+ get: function () { return chunkOEEDYJTV_cjs.SearchKnowledgeBaseRenderer; }
31
31
  });
32
32
  Object.defineProperty(exports, "ToolRenderer", {
33
33
  enumerable: true,
34
- get: function () { return chunk7IFBPXT3_cjs.ToolRenderer; }
34
+ get: function () { return chunkOEEDYJTV_cjs.ToolRenderer; }
35
35
  });
36
36
  Object.defineProperty(exports, "JsonRenderResult", {
37
37
  enumerable: true,
package/dist/tools.d.cts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { g as ToolRendererProps } from './types-DlNwk-bG.cjs';
3
- export { d as ComponentAction, h as ToolResult } from './types-DlNwk-bG.cjs';
2
+ import { g as ToolRendererProps } from './types-DQCjs81O.cjs';
3
+ export { d as ComponentAction, h as ToolResult } from './types-DQCjs81O.cjs';
4
4
  export { J as JsonRenderResult } from './JsonRenderResult-D6ogds0_.cjs';
5
5
  export { g as getToolDisplayData, n as normalizeToolRows } from './normalize-KzCLLqpU.cjs';
6
6
  import 'react';
package/dist/tools.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { g as ToolRendererProps } from './types-DlNwk-bG.js';
3
- export { d as ComponentAction, h as ToolResult } from './types-DlNwk-bG.js';
2
+ import { g as ToolRendererProps } from './types-DQCjs81O.js';
3
+ export { d as ComponentAction, h as ToolResult } from './types-DQCjs81O.js';
4
4
  export { J as JsonRenderResult } from './JsonRenderResult-D6ogds0_.js';
5
5
  export { g as getToolDisplayData, n as normalizeToolRows } from './normalize-KzCLLqpU.js';
6
6
  import 'react';
package/dist/tools.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  export { getToolDisplayData, normalizeToolRows } from './chunk-XEAAB5ZM.js';
3
- export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer } from './chunk-AD6XWKWB.js';
4
- import './chunk-FPQ3UCCJ.js';
3
+ export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer } from './chunk-6ZZTTD5E.js';
4
+ import './chunk-3EN3DMUL.js';
5
5
  import './chunk-PS3U7T37.js';
6
6
  export { JsonRenderResult } from './chunk-ZXP7IYRC.js';
7
7
  export { VisualizationRenderer } from './chunk-5T4FJ2SR.js';
@@ -80,12 +80,30 @@ interface QuestionConfig {
80
80
  interface ChatConfig {
81
81
  /** Project identifier on the Aigentyc platform */
82
82
  projectId: string;
83
- /** Base URL of the API (e.g. `"https://api.aigentyc.com"`) */
83
+ /** Base URL of the API (e.g. `"https://api.aigentyc.ai"`) */
84
84
  apiEndpoint: string;
85
85
  /** Bearer API key for authentication (alternative to session cookies) */
86
86
  apiKey?: string;
87
87
  /** Human-readable client / brand name shown in the header */
88
88
  clientName?: string;
89
+ /**
90
+ * URL of the page the widget is embedded in. Sent with every message so the
91
+ * assistant can answer in the context of what the visitor is looking at.
92
+ *
93
+ * Read fresh on each send, so a single-page app may update it on navigation
94
+ * without remounting the widget.
95
+ */
96
+ pageUrl?: string;
97
+ /** Title of the page the widget is embedded in. Sent with every message. */
98
+ pageTitle?: string;
99
+ /**
100
+ * Free-form structured context about the host page — the active category, the
101
+ * filters the visitor has applied, the product they are viewing. Sent verbatim
102
+ * with every message; the backend renders it into the system prompt as data.
103
+ *
104
+ * Shape is up to the host app. Keep it small: it is re-sent on every turn.
105
+ */
106
+ pageContext?: unknown;
89
107
  }
90
108
  /**
91
109
  * Props passed to every slot component so it can delegate to the default.
@@ -80,12 +80,30 @@ interface QuestionConfig {
80
80
  interface ChatConfig {
81
81
  /** Project identifier on the Aigentyc platform */
82
82
  projectId: string;
83
- /** Base URL of the API (e.g. `"https://api.aigentyc.com"`) */
83
+ /** Base URL of the API (e.g. `"https://api.aigentyc.ai"`) */
84
84
  apiEndpoint: string;
85
85
  /** Bearer API key for authentication (alternative to session cookies) */
86
86
  apiKey?: string;
87
87
  /** Human-readable client / brand name shown in the header */
88
88
  clientName?: string;
89
+ /**
90
+ * URL of the page the widget is embedded in. Sent with every message so the
91
+ * assistant can answer in the context of what the visitor is looking at.
92
+ *
93
+ * Read fresh on each send, so a single-page app may update it on navigation
94
+ * without remounting the widget.
95
+ */
96
+ pageUrl?: string;
97
+ /** Title of the page the widget is embedded in. Sent with every message. */
98
+ pageTitle?: string;
99
+ /**
100
+ * Free-form structured context about the host page — the active category, the
101
+ * filters the visitor has applied, the product they are viewing. Sent verbatim
102
+ * with every message; the backend renders it into the system prompt as data.
103
+ *
104
+ * Shape is up to the host app. Keep it small: it is re-sent on every turn.
105
+ */
106
+ pageContext?: unknown;
89
107
  }
90
108
  /**
91
109
  * Props passed to every slot component so it can delegate to the default.
package/llms.txt CHANGED
@@ -460,7 +460,7 @@ The built-in tool dispatcher already wraps each tool in a boundary, so a single
460
460
  | Symptom | Likely cause | Fix |
461
461
  | --- | --- | --- |
462
462
  | Unstyled / broken layout | Missing CSS import | `import "@aigentyc/chat-sdk/theme/styles.css"` |
463
- | 401 / "Missing Authorization" on embed | No `apiKey` passed — required for all third-party domain embeds | Pass `apiKey` prop (or `NEXT_PUBLIC_AIGENTYC_API_KEY` / `VITE_AIGENTYC_API_KEY` env var). The "no apiKey needed" path only works inside `app.aigentyc.com` itself (session cookie). |
463
+ | 401 / "Missing Authorization" on embed | No `apiKey` passed — required for all third-party domain embeds | Pass `apiKey` prop (or `NEXT_PUBLIC_AIGENTYC_API_KEY` / `VITE_AIGENTYC_API_KEY` env var). The "no apiKey needed" path only works inside `app.aigentyc.ai` itself (session cookie). |
464
464
  | 403 / invalid origin | API key's Allowed Origins list doesn't include your embed domain | Dashboard → Settings → API Keys → edit → add domain |
465
465
  | CORS error in browser | Allowed Origins on API key doesn't include current URL | Add `http://localhost:5173` (Vite) or `http://localhost:3000` (Next) to the key's Allowed Origins |
466
466
  | Slot override doesn't render | Using `toolRenderers` keyed by tool name | Use `tools` for per-tool overrides; `toolRenderers` is per render mode. Dev console warns automatically. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aigentyc/chat-sdk",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "React SDK for building AI-powered chat interfaces connected to the Aigentyc platform",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/hooks/use-aigentyc-chat.ts"],"names":["useRef","useState","useMemo","DefaultChatTransport","useChat","useEffect","useCallback","transport","LiveChatTransport"],"mappings":"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","file":"chunk-3HGOLNGG.cjs","sourcesContent":["\"use client\";\n\nimport {\n useState,\n useCallback,\n useRef,\n useMemo,\n useEffect,\n type RefObject,\n} from \"react\";\nimport type {\n ChatProviderProps,\n ChatMessage,\n ChatEventCallbacks,\n LiveChatState,\n LiveChatMessage,\n} from \"../core/types\";\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// NOTE: @ai-sdk/react and ai are optional peer dependencies.\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { LiveChatTransport } from \"../core/live-chat-transport\";\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 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 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 // Ignore.\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\n/** Options for the headless `useAigentycChat` hook (same shape as ChatProviderProps). */\nexport type UseAigentycChatOptions = Omit<ChatProviderProps, \"children\" | \"slots\" | \"theme\">;\n\n/** Live chat sub-object returned by the hook. */\nexport interface LiveChatReturn {\n state: LiveChatState;\n messages: LiveChatMessage[];\n operatorName: string;\n queuePosition: number;\n showIdentityForm: boolean;\n initiate: (visitorName?: string, visitorEmail?: string) => Promise<void>;\n send: (content: string) => void;\n end: () => void;\n cancel: () => void;\n submitRating: (rating: \"positive\" | \"negative\", comment?: string) => void;\n returnToAI: () => void;\n requestManualHandoff: () => void;\n setShowIdentityForm: (show: boolean) => void;\n}\n\n/** Return value of `useAigentycChat`. */\nexport interface UseAigentycChatReturn {\n messages: ChatMessage[];\n status: ChatStatus;\n error: Error | undefined;\n sessionId: string;\n sendMessage: (content: string) => void;\n stopGeneration: () => void;\n newConversation: () => void;\n clearMessages: () => void;\n activeTools: ActiveTool[];\n liveChat: LiveChatReturn;\n chatRef: RefObject<HTMLDivElement | null>;\n}\n\nconst CALLBACK_KEYS: (keyof ChatEventCallbacks)[] = [\n \"onReady\",\n \"onSessionStart\",\n \"onSessionRestore\",\n \"onMessageSent\",\n \"onMessageReceived\",\n \"onStreamStart\",\n \"onStreamEnd\",\n \"onToolCall\",\n \"onToolResult\",\n \"onToolAction\",\n \"onLiveChatRequested\",\n \"onLiveChatConnected\",\n \"onLiveChatEnded\",\n \"onError\",\n \"onNewConversation\",\n \"onStopGeneration\",\n \"onClearMessages\",\n \"onInteraction\",\n];\n\nfunction pickCallbacks(opts: Record<string, unknown>): ChatEventCallbacks {\n const out: Record<string, unknown> = {};\n for (const key of CALLBACK_KEYS) {\n if (opts[key] !== undefined) out[key] = opts[key];\n }\n return out as ChatEventCallbacks;\n}\n\n/**\n * Standalone headless hook for Aigentyc Chat. No provider needed.\n *\n * Creates its own transport, session, and persistence internally. Use this\n * when you want full control over the UI but still want all SDK features\n * (chat, tools, live chat, persistence).\n */\nexport function useAigentycChat(options: UseAigentycChatOptions): UseAigentycChatReturn {\n const {\n projectId,\n apiEndpoint,\n apiKey,\n enableLiveChat = false,\n chatServiceUrl,\n persistMessages: shouldPersist = true,\n } = options;\n\n const callbacks = pickCallbacks(options as unknown as Record<string, unknown>);\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n const safeProjectId = projectId || \"default\";\n const [sessionId, setSessionId] = useState(() => getOrCreateSessionId(safeProjectId));\n const chatRef = useRef<HTMLDivElement | null>(null);\n\n const initialMessages = useMemo(\n () => (shouldPersist ? loadPersistedMessages(safeProjectId) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const transport = useMemo(\n () =>\n new DefaultChatTransport({\n api: `${apiEndpoint || \"\"}/api/kb/chat`,\n headers: apiKey ? { Authorization: `Bearer ${apiKey}` } : undefined,\n body: { projectId: safeProjectId, sessionId },\n }),\n [apiEndpoint, apiKey, safeProjectId, 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 // Persist messages\n useEffect(() => {\n if (shouldPersist) persistMessages(safeProjectId, messages);\n }, [messages, safeProjectId, shouldPersist]);\n\n // Derive active tools from the latest assistant message\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(() => {\n stop();\n callbacksRef.current?.onStopGeneration?.();\n }, [stop]);\n\n const newConversation = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(safeProjectId);\n if (typeof window !== \"undefined\") {\n try {\n sessionStorage.removeItem(SESSION_KEY_PREFIX + safeProjectId);\n } catch {\n // Ignore.\n }\n }\n const nextSessionId = getOrCreateSessionId(safeProjectId);\n setSessionId(nextSessionId);\n callbacksRef.current?.onNewConversation?.(nextSessionId);\n }, [safeProjectId, setMessages]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(safeProjectId);\n callbacksRef.current?.onClearMessages?.();\n }, [safeProjectId, setMessages]);\n\n // --- Live Chat (self-contained) ---\n const [lcState, setLcState] = useState<LiveChatState>(\"ai\");\n const [lcMessages, setLcMessages] = useState<LiveChatMessage[]>([]);\n const [lcOperator, setLcOperator] = useState(\"\");\n const [lcQueue, setLcQueue] = useState(0);\n const [lcShowIdentity, setLcShowIdentity] = useState(false);\n const lcTransportRef = useRef<LiveChatTransport | null>(null);\n\n const lcResetState = useCallback(() => {\n lcTransportRef.current?.disconnect?.();\n lcTransportRef.current = null;\n setLcState(\"ai\");\n setLcMessages([]);\n setLcOperator(\"\");\n setLcQueue(0);\n setLcShowIdentity(false);\n }, []);\n\n const lcInitiate = useCallback(\n async (visitorName?: string, visitorEmail?: string) => {\n if (!enableLiveChat || lcTransportRef.current) return;\n const url = chatServiceUrl ?? apiEndpoint;\n if (!url || !apiKey) return;\n try {\n const transport = new LiveChatTransport({\n chatServiceUrl: url,\n apiKey,\n projectId: safeProjectId,\n visitorSessionId: sessionId,\n });\n transport.on(\"state-change\", (s: LiveChatState) => setLcState(s));\n transport.on(\"queued\", (data: { position: number }) => setLcQueue(data.position));\n transport.on(\"queue-update\", (data: { position: number }) => setLcQueue(data.position));\n transport.on(\"accepted\", (data: { operatorName: string }) => setLcOperator(data.operatorName));\n transport.on(\"message\", (data: LiveChatMessage) =>\n setLcMessages((prev) => [...prev, data])\n );\n transport.on(\"ended\", () => setLcState(\"ended\"));\n lcTransportRef.current = transport;\n await transport.connect();\n await transport.requestHandoff({\n visitorName,\n visitorEmail,\n aiChatHistory: [],\n });\n callbacksRef.current?.onLiveChatRequested?.();\n } catch (err) {\n callbacksRef.current?.onError?.(err as Error);\n setLcState(\"ai\");\n }\n },\n [enableLiveChat, chatServiceUrl, apiEndpoint, apiKey, safeProjectId, sessionId]\n );\n\n const liveChat = useMemo<LiveChatReturn>(\n () => ({\n state: lcState,\n messages: lcMessages,\n operatorName: lcOperator,\n queuePosition: lcQueue,\n showIdentityForm: lcShowIdentity,\n initiate: lcInitiate,\n send: (content: string) => {\n if (!content.trim()) return;\n lcTransportRef.current?.sendMessage?.(content);\n setLcMessages((prev) => [\n ...prev,\n {\n id: Date.now(),\n content,\n senderType: \"visitor\",\n timestamp: new Date().toISOString(),\n },\n ]);\n },\n end: () => lcTransportRef.current?.endChat?.(),\n cancel: () => lcResetState(),\n submitRating: (rating, comment) =>\n lcTransportRef.current?.submitRating?.(rating, comment),\n returnToAI: () => lcResetState(),\n requestManualHandoff: () => setLcShowIdentity(true),\n setShowIdentityForm: setLcShowIdentity,\n }),\n [lcState, lcMessages, lcOperator, lcQueue, lcShowIdentity, lcInitiate, lcResetState]\n );\n\n return {\n messages: messages as unknown as ChatMessage[],\n status,\n error: error as Error | undefined,\n sessionId,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n activeTools,\n liveChat,\n chatRef,\n };\n}\n"]}