@aigentyc/chat-sdk 0.1.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 (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/JsonRenderResult-Ftw4AKwb.d.cts +18 -0
  4. package/dist/JsonRenderResult-Ftw4AKwb.d.ts +18 -0
  5. package/dist/JsonRenderResult-GQOYPLVH.cjs +15 -0
  6. package/dist/JsonRenderResult-GQOYPLVH.cjs.map +1 -0
  7. package/dist/JsonRenderResult-ZFJ6VWMS.js +6 -0
  8. package/dist/JsonRenderResult-ZFJ6VWMS.js.map +1 -0
  9. package/dist/SlotsContext-CBtt36al.d.ts +148 -0
  10. package/dist/SlotsContext-CHvISDJT.d.cts +148 -0
  11. package/dist/VisualizationRenderer-FNFYNN66.js +5 -0
  12. package/dist/VisualizationRenderer-FNFYNN66.js.map +1 -0
  13. package/dist/VisualizationRenderer-VKMZXRUX.cjs +20 -0
  14. package/dist/VisualizationRenderer-VKMZXRUX.cjs.map +1 -0
  15. package/dist/ai-elements.cjs +4608 -0
  16. package/dist/ai-elements.cjs.map +1 -0
  17. package/dist/ai-elements.d.cts +897 -0
  18. package/dist/ai-elements.d.ts +897 -0
  19. package/dist/ai-elements.js +4363 -0
  20. package/dist/ai-elements.js.map +1 -0
  21. package/dist/chunk-3MP2EGEJ.cjs +270 -0
  22. package/dist/chunk-3MP2EGEJ.cjs.map +1 -0
  23. package/dist/chunk-3RW7O444.js +26 -0
  24. package/dist/chunk-3RW7O444.js.map +1 -0
  25. package/dist/chunk-42ARGQXE.js +51 -0
  26. package/dist/chunk-42ARGQXE.js.map +1 -0
  27. package/dist/chunk-4FBVV64J.js +257 -0
  28. package/dist/chunk-4FBVV64J.js.map +1 -0
  29. package/dist/chunk-4QT25AXI.js +21 -0
  30. package/dist/chunk-4QT25AXI.js.map +1 -0
  31. package/dist/chunk-525KS5HM.cjs +30 -0
  32. package/dist/chunk-525KS5HM.cjs.map +1 -0
  33. package/dist/chunk-5F3O3ZJH.js +299 -0
  34. package/dist/chunk-5F3O3ZJH.js.map +1 -0
  35. package/dist/chunk-5QSXB6UL.cjs +259 -0
  36. package/dist/chunk-5QSXB6UL.cjs.map +1 -0
  37. package/dist/chunk-5T4FJ2SR.js +664 -0
  38. package/dist/chunk-5T4FJ2SR.js.map +1 -0
  39. package/dist/chunk-7BNYTOTE.cjs +67 -0
  40. package/dist/chunk-7BNYTOTE.cjs.map +1 -0
  41. package/dist/chunk-AWAJOSFP.cjs +96 -0
  42. package/dist/chunk-AWAJOSFP.cjs.map +1 -0
  43. package/dist/chunk-BKDV2H6Z.js +224 -0
  44. package/dist/chunk-BKDV2H6Z.js.map +1 -0
  45. package/dist/chunk-FQN6OBGN.cjs +171 -0
  46. package/dist/chunk-FQN6OBGN.cjs.map +1 -0
  47. package/dist/chunk-FYPJSHCL.js +190 -0
  48. package/dist/chunk-FYPJSHCL.js.map +1 -0
  49. package/dist/chunk-J2H6MLQF.cjs +680 -0
  50. package/dist/chunk-J2H6MLQF.cjs.map +1 -0
  51. package/dist/chunk-J2K7EJYP.cjs +198 -0
  52. package/dist/chunk-J2K7EJYP.cjs.map +1 -0
  53. package/dist/chunk-JI5KCSOI.cjs +23 -0
  54. package/dist/chunk-JI5KCSOI.cjs.map +1 -0
  55. package/dist/chunk-JOO6C3XT.cjs +44 -0
  56. package/dist/chunk-JOO6C3XT.cjs.map +1 -0
  57. package/dist/chunk-KBGPBUTI.cjs +78 -0
  58. package/dist/chunk-KBGPBUTI.cjs.map +1 -0
  59. package/dist/chunk-MT2AMINB.js +75 -0
  60. package/dist/chunk-MT2AMINB.js.map +1 -0
  61. package/dist/chunk-MZQKGNWF.js +4 -0
  62. package/dist/chunk-MZQKGNWF.js.map +1 -0
  63. package/dist/chunk-NG7OTWXQ.cjs +226 -0
  64. package/dist/chunk-NG7OTWXQ.cjs.map +1 -0
  65. package/dist/chunk-NPJKLYLV.js +68 -0
  66. package/dist/chunk-NPJKLYLV.js.map +1 -0
  67. package/dist/chunk-NW2ESHRV.js +685 -0
  68. package/dist/chunk-NW2ESHRV.js.map +1 -0
  69. package/dist/chunk-NWF735F5.js +1631 -0
  70. package/dist/chunk-NWF735F5.js.map +1 -0
  71. package/dist/chunk-NYQSM3EB.cjs +305 -0
  72. package/dist/chunk-NYQSM3EB.cjs.map +1 -0
  73. package/dist/chunk-OU7OROOE.cjs +1643 -0
  74. package/dist/chunk-OU7OROOE.cjs.map +1 -0
  75. package/dist/chunk-PS3U7T37.js +42 -0
  76. package/dist/chunk-PS3U7T37.js.map +1 -0
  77. package/dist/chunk-Q7T3VAJV.cjs +687 -0
  78. package/dist/chunk-Q7T3VAJV.cjs.map +1 -0
  79. package/dist/chunk-QYCEHFAB.js +265 -0
  80. package/dist/chunk-QYCEHFAB.js.map +1 -0
  81. package/dist/chunk-RPDJXB3U.js +676 -0
  82. package/dist/chunk-RPDJXB3U.js.map +1 -0
  83. package/dist/chunk-UKEL7FWS.js +64 -0
  84. package/dist/chunk-UKEL7FWS.js.map +1 -0
  85. package/dist/chunk-VS3NZ7FX.js +164 -0
  86. package/dist/chunk-VS3NZ7FX.js.map +1 -0
  87. package/dist/chunk-WZLWAVSS.cjs +73 -0
  88. package/dist/chunk-WZLWAVSS.cjs.map +1 -0
  89. package/dist/chunk-X5YEOOPK.cjs +758 -0
  90. package/dist/chunk-X5YEOOPK.cjs.map +1 -0
  91. package/dist/chunk-X7R334SB.cjs +5 -0
  92. package/dist/chunk-X7R334SB.cjs.map +1 -0
  93. package/dist/chunk-XXNDL5SJ.cjs +432 -0
  94. package/dist/chunk-XXNDL5SJ.cjs.map +1 -0
  95. package/dist/chunk-YQELMJW5.js +429 -0
  96. package/dist/chunk-YQELMJW5.js.map +1 -0
  97. package/dist/components.cjs +551 -0
  98. package/dist/components.cjs.map +1 -0
  99. package/dist/components.d.cts +181 -0
  100. package/dist/components.d.ts +181 -0
  101. package/dist/components.js +483 -0
  102. package/dist/components.js.map +1 -0
  103. package/dist/core.cjs +283 -0
  104. package/dist/core.cjs.map +1 -0
  105. package/dist/core.d.cts +455 -0
  106. package/dist/core.d.ts +455 -0
  107. package/dist/core.js +241 -0
  108. package/dist/core.js.map +1 -0
  109. package/dist/hooks.cjs +324 -0
  110. package/dist/hooks.cjs.map +1 -0
  111. package/dist/hooks.d.cts +163 -0
  112. package/dist/hooks.d.ts +163 -0
  113. package/dist/hooks.js +277 -0
  114. package/dist/hooks.js.map +1 -0
  115. package/dist/i18n.cjs +26 -0
  116. package/dist/i18n.cjs.map +1 -0
  117. package/dist/i18n.d.cts +50 -0
  118. package/dist/i18n.d.ts +50 -0
  119. package/dist/i18n.js +5 -0
  120. package/dist/i18n.js.map +1 -0
  121. package/dist/index.cjs +466 -0
  122. package/dist/index.cjs.map +1 -0
  123. package/dist/index.d.cts +80 -0
  124. package/dist/index.d.ts +80 -0
  125. package/dist/index.js +438 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interaction-tracker-D9P1Oq4j.d.cts +83 -0
  128. package/dist/interaction-tracker-D9P1Oq4j.d.ts +83 -0
  129. package/dist/json-render.cjs +23 -0
  130. package/dist/json-render.cjs.map +1 -0
  131. package/dist/json-render.d.cts +857 -0
  132. package/dist/json-render.d.ts +857 -0
  133. package/dist/json-render.js +6 -0
  134. package/dist/json-render.js.map +1 -0
  135. package/dist/live-chat-transport-4XLOIPOE.js +4 -0
  136. package/dist/live-chat-transport-4XLOIPOE.js.map +1 -0
  137. package/dist/live-chat-transport-ALVRGWX7.cjs +13 -0
  138. package/dist/live-chat-transport-ALVRGWX7.cjs.map +1 -0
  139. package/dist/select-B4l9yoyn.d.cts +99 -0
  140. package/dist/select-B4l9yoyn.d.ts +99 -0
  141. package/dist/styles.css +2 -0
  142. package/dist/theme.cjs +18 -0
  143. package/dist/theme.cjs.map +1 -0
  144. package/dist/theme.d.cts +55 -0
  145. package/dist/theme.d.ts +55 -0
  146. package/dist/theme.js +5 -0
  147. package/dist/theme.js.map +1 -0
  148. package/dist/tools.cjs +32 -0
  149. package/dist/tools.cjs.map +1 -0
  150. package/dist/tools.d.cts +117 -0
  151. package/dist/tools.d.ts +117 -0
  152. package/dist/tools.js +11 -0
  153. package/dist/tools.js.map +1 -0
  154. package/dist/types-DKJ_-nbG.d.cts +349 -0
  155. package/dist/types-DKJ_-nbG.d.ts +349 -0
  156. package/dist/ui.cjs +667 -0
  157. package/dist/ui.cjs.map +1 -0
  158. package/dist/ui.d.cts +95 -0
  159. package/dist/ui.d.ts +95 -0
  160. package/dist/ui.js +414 -0
  161. package/dist/ui.js.map +1 -0
  162. package/package.json +255 -0
package/dist/core.cjs ADDED
@@ -0,0 +1,283 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkKBGPBUTI_cjs = require('./chunk-KBGPBUTI.cjs');
5
+ var chunkNG7OTWXQ_cjs = require('./chunk-NG7OTWXQ.cjs');
6
+ var chunkJOO6C3XT_cjs = require('./chunk-JOO6C3XT.cjs');
7
+ var chunk525KS5HM_cjs = require('./chunk-525KS5HM.cjs');
8
+
9
+ // src/core/message-store.ts
10
+ var STORAGE_PREFIX = "chat-messages-";
11
+ var MAX_SIZE_BYTES = 200 * 1024;
12
+ var MAX_AGE_MS = 24 * 60 * 60 * 1e3;
13
+ function getKey(projectId, sessionId) {
14
+ return `${STORAGE_PREFIX}${projectId}-${sessionId}`;
15
+ }
16
+ function loadMessages(projectId, sessionId) {
17
+ if (typeof window === "undefined") return [];
18
+ try {
19
+ const raw = localStorage.getItem(getKey(projectId, sessionId));
20
+ if (!raw) return [];
21
+ const data = JSON.parse(raw);
22
+ if (Date.now() - data.timestamp > MAX_AGE_MS) {
23
+ localStorage.removeItem(getKey(projectId, sessionId));
24
+ return [];
25
+ }
26
+ return data.messages || [];
27
+ } catch {
28
+ return [];
29
+ }
30
+ }
31
+ function saveMessages(projectId, sessionId, messages) {
32
+ if (typeof window === "undefined") return;
33
+ try {
34
+ let toStore = messages;
35
+ const data = { messages: toStore, timestamp: Date.now() };
36
+ let serialized = JSON.stringify(data);
37
+ if (serialized.length > MAX_SIZE_BYTES && toStore.length > 20) {
38
+ toStore = toStore.slice(-20);
39
+ data.messages = toStore;
40
+ serialized = JSON.stringify(data);
41
+ }
42
+ localStorage.setItem(getKey(projectId, sessionId), serialized);
43
+ } catch {
44
+ }
45
+ }
46
+ function clearMessages(projectId, sessionId) {
47
+ if (typeof window === "undefined") return;
48
+ try {
49
+ localStorage.removeItem(getKey(projectId, sessionId));
50
+ } catch {
51
+ }
52
+ }
53
+ function pruneExpiredMessages() {
54
+ if (typeof window === "undefined") return;
55
+ try {
56
+ const keysToRemove = [];
57
+ for (let i = 0; i < localStorage.length; i++) {
58
+ const key = localStorage.key(i);
59
+ if (!key?.startsWith(STORAGE_PREFIX)) continue;
60
+ try {
61
+ const raw = localStorage.getItem(key);
62
+ if (!raw) continue;
63
+ const data = JSON.parse(raw);
64
+ if (Date.now() - data.timestamp > MAX_AGE_MS) {
65
+ keysToRemove.push(key);
66
+ }
67
+ } catch {
68
+ keysToRemove.push(key);
69
+ }
70
+ }
71
+ for (const key of keysToRemove) {
72
+ localStorage.removeItem(key);
73
+ }
74
+ } catch {
75
+ }
76
+ }
77
+ var saveTimeout = null;
78
+ function debouncedSaveMessages(projectId, sessionId, messages, delay = 500) {
79
+ if (typeof window === "undefined") return;
80
+ if (saveTimeout) clearTimeout(saveTimeout);
81
+ saveTimeout = setTimeout(() => {
82
+ saveMessages(projectId, sessionId, messages);
83
+ }, delay);
84
+ }
85
+
86
+ // src/core/transport.ts
87
+ function minifyToolOutput(output) {
88
+ if (!output || typeof output !== "object") return output;
89
+ const obj = output;
90
+ if ("_displayData" in obj) {
91
+ const { _displayData: _, ...contextData } = obj;
92
+ return contextData;
93
+ }
94
+ if ("sources" in obj && Array.isArray(obj.sources)) {
95
+ return { _searched: true, totalResults: obj.totalResults };
96
+ }
97
+ const outputStr = JSON.stringify(obj);
98
+ if (outputStr.length > 1500) {
99
+ const summary = { _truncated: true };
100
+ if (Array.isArray(obj)) {
101
+ summary.itemCount = obj.length;
102
+ } else {
103
+ for (const [k, v] of Object.entries(obj)) {
104
+ if (typeof v === "string" && v.length < 100) summary[k] = v;
105
+ else if (typeof v === "number" || typeof v === "boolean") summary[k] = v;
106
+ }
107
+ }
108
+ return summary;
109
+ }
110
+ return output;
111
+ }
112
+ function prepareMessages(messages, maxMessages) {
113
+ let pruned = messages;
114
+ if (messages.length > maxMessages) {
115
+ pruned = [messages[0], ...messages.slice(-(maxMessages - 1))];
116
+ }
117
+ const cloned = JSON.parse(JSON.stringify(pruned));
118
+ for (const msg of cloned) {
119
+ if (msg.role === "assistant" && msg.parts) {
120
+ for (const part of msg.parts) {
121
+ if (part.type?.startsWith("tool-") && part.output !== void 0) {
122
+ part.output = minifyToolOutput(part.output);
123
+ }
124
+ }
125
+ }
126
+ }
127
+ return cloned;
128
+ }
129
+ async function createChatTransport(config, options = {}) {
130
+ const { DefaultChatTransport } = await import('ai');
131
+ const {
132
+ maxMessages = 20,
133
+ pageUrl,
134
+ pageTitle,
135
+ wpUserToken,
136
+ getAnalyticsMessageId,
137
+ getUserType,
138
+ getSessionId
139
+ } = options;
140
+ return new DefaultChatTransport({
141
+ api: `${config.apiEndpoint}/api/kb/chat`,
142
+ headers: () => {
143
+ const headers = {};
144
+ if (config.apiKey) {
145
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
146
+ }
147
+ return headers;
148
+ },
149
+ credentials: "include",
150
+ prepareSendMessagesRequest: ({ id, messages, trigger }) => {
151
+ const prepared = prepareMessages(messages, maxMessages);
152
+ return {
153
+ body: {
154
+ id,
155
+ messages: prepared,
156
+ trigger,
157
+ projectId: config.projectId,
158
+ sessionId: getSessionId?.() ?? options.sessionId,
159
+ analyticsMessageId: getAnalyticsMessageId?.() ?? null,
160
+ userType: getUserType?.() ?? options.userType ?? void 0,
161
+ pageUrl,
162
+ pageTitle,
163
+ ...wpUserToken ? { wpUserToken } : {}
164
+ }
165
+ };
166
+ }
167
+ });
168
+ }
169
+ function createChatTransportSync(DefaultChatTransport, config, options = {}) {
170
+ const {
171
+ maxMessages = 20,
172
+ pageUrl,
173
+ pageTitle,
174
+ wpUserToken,
175
+ getAnalyticsMessageId,
176
+ getUserType,
177
+ getSessionId
178
+ } = options;
179
+ return new DefaultChatTransport({
180
+ api: `${config.apiEndpoint}/api/kb/chat`,
181
+ headers: () => {
182
+ const headers = {};
183
+ if (config.apiKey) {
184
+ headers["Authorization"] = `Bearer ${config.apiKey}`;
185
+ }
186
+ return headers;
187
+ },
188
+ credentials: "include",
189
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
+ prepareSendMessagesRequest: ({ id, messages, trigger }) => {
191
+ const prepared = prepareMessages(messages, maxMessages);
192
+ return {
193
+ body: {
194
+ id,
195
+ messages: prepared,
196
+ trigger,
197
+ projectId: config.projectId,
198
+ sessionId: getSessionId?.() ?? options.sessionId,
199
+ analyticsMessageId: getAnalyticsMessageId?.() ?? null,
200
+ userType: getUserType?.() ?? options.userType ?? void 0,
201
+ pageUrl,
202
+ pageTitle,
203
+ ...wpUserToken ? { wpUserToken } : {}
204
+ }
205
+ };
206
+ }
207
+ });
208
+ }
209
+
210
+ // src/core/constants/user-types.ts
211
+ var USER_TYPES = [
212
+ {
213
+ id: "Guest",
214
+ label: "Guest",
215
+ description: "Just browsing",
216
+ icon: "User"
217
+ },
218
+ {
219
+ id: "Customer",
220
+ label: "Customer",
221
+ description: "Existing customer with questions",
222
+ icon: "Shield"
223
+ },
224
+ {
225
+ id: "Partner",
226
+ label: "Partner",
227
+ description: "Business partner or professional",
228
+ icon: "Zap"
229
+ }
230
+ ];
231
+ var USER_TYPE_LABEL_MAP = {
232
+ Guest: "Guest",
233
+ Customer: "Customer",
234
+ Partner: "Partner"
235
+ };
236
+ var INTERNAL_MESSAGE_PREFIX = "[internal]";
237
+ function isInternalMessage(text) {
238
+ return text.startsWith(INTERNAL_MESSAGE_PREFIX);
239
+ }
240
+
241
+ Object.defineProperty(exports, "generateSessionId", {
242
+ enumerable: true,
243
+ get: function () { return chunkKBGPBUTI_cjs.generateSessionId; }
244
+ });
245
+ Object.defineProperty(exports, "useInteractionTracker", {
246
+ enumerable: true,
247
+ get: function () { return chunkKBGPBUTI_cjs.useInteractionTracker; }
248
+ });
249
+ Object.defineProperty(exports, "LiveChatTransport", {
250
+ enumerable: true,
251
+ get: function () { return chunkNG7OTWXQ_cjs.LiveChatTransport; }
252
+ });
253
+ Object.defineProperty(exports, "processImagesInHtml", {
254
+ enumerable: true,
255
+ get: function () { return chunkJOO6C3XT_cjs.processImagesInHtml; }
256
+ });
257
+ Object.defineProperty(exports, "addUtmParams", {
258
+ enumerable: true,
259
+ get: function () { return chunk525KS5HM_cjs.addUtmParams; }
260
+ });
261
+ Object.defineProperty(exports, "cn", {
262
+ enumerable: true,
263
+ get: function () { return chunk525KS5HM_cjs.cn; }
264
+ });
265
+ Object.defineProperty(exports, "isSsr", {
266
+ enumerable: true,
267
+ get: function () { return chunk525KS5HM_cjs.isSsr; }
268
+ });
269
+ exports.INTERNAL_MESSAGE_PREFIX = INTERNAL_MESSAGE_PREFIX;
270
+ exports.USER_TYPES = USER_TYPES;
271
+ exports.USER_TYPE_LABEL_MAP = USER_TYPE_LABEL_MAP;
272
+ exports.clearMessages = clearMessages;
273
+ exports.createChatTransport = createChatTransport;
274
+ exports.createChatTransportSync = createChatTransportSync;
275
+ exports.debouncedSaveMessages = debouncedSaveMessages;
276
+ exports.isInternalMessage = isInternalMessage;
277
+ exports.loadMessages = loadMessages;
278
+ exports.minifyToolOutput = minifyToolOutput;
279
+ exports.prepareMessages = prepareMessages;
280
+ exports.pruneExpiredMessages = pruneExpiredMessages;
281
+ exports.saveMessages = saveMessages;
282
+ //# sourceMappingURL=core.cjs.map
283
+ //# sourceMappingURL=core.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/message-store.ts","../src/core/transport.ts","../src/core/constants/user-types.ts"],"names":[],"mappings":"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","file":"core.cjs","sourcesContent":["\"use client\";\n\n/**\n * Cross-page message persistence via `localStorage`.\n *\n * Preserves conversation UI across full page navigations without\n * re-POSTing to the backend.\n *\n * All storage access is guarded against SSR — every function is a safe\n * no-op when `window` / `localStorage` is unavailable.\n */\n\nconst STORAGE_PREFIX = \"chat-messages-\";\n\n/** Maximum payload size per session (200 KB). */\nconst MAX_SIZE_BYTES = 200 * 1024;\n\n/** Messages expire after 24 hours of inactivity. */\nconst MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\n/** Shape of a single persisted message. */\nexport interface StoredMessage {\n /** Message identifier */\n id: string;\n /** Role: user / assistant / system */\n role: string;\n /** Structured parts array (text, tool calls, etc.) */\n parts: unknown[];\n /** ISO-8601 creation timestamp */\n createdAt?: string;\n}\n\n/** Internal wrapper stored in localStorage. */\ninterface StoredData {\n messages: StoredMessage[];\n timestamp: number;\n}\n\n/**\n * Build the localStorage key for a given project + session pair.\n *\n * @internal\n */\nfunction getKey(projectId: string, sessionId: string): string {\n return `${STORAGE_PREFIX}${projectId}-${sessionId}`;\n}\n\n/**\n * Load persisted messages for a session.\n *\n * Returns an empty array when nothing is stored, the data is expired\n * or corrupted, or when running on the server.\n *\n * @param projectId - Aigentyc project ID\n * @param sessionId - Current chat session ID\n */\nexport function loadMessages(projectId: string, sessionId: string): StoredMessage[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const raw = localStorage.getItem(getKey(projectId, sessionId));\n if (!raw) return [];\n\n const data: StoredData = JSON.parse(raw);\n\n // Check expiry\n if (Date.now() - data.timestamp > MAX_AGE_MS) {\n localStorage.removeItem(getKey(projectId, sessionId));\n return [];\n }\n\n return data.messages || [];\n } catch {\n return [];\n }\n}\n\n/**\n * Save messages to localStorage.\n *\n * Trims to the last 20 messages if the serialized payload exceeds\n * `MAX_SIZE_BYTES`.\n *\n * @param projectId - Aigentyc project ID\n * @param sessionId - Current chat session ID\n * @param messages - Messages to persist\n */\nexport function saveMessages(\n projectId: string,\n sessionId: string,\n messages: StoredMessage[],\n): void {\n if (typeof window === \"undefined\") return;\n\n try {\n let toStore = messages;\n const data: StoredData = { messages: toStore, timestamp: Date.now() };\n let serialized = JSON.stringify(data);\n\n if (serialized.length > MAX_SIZE_BYTES && toStore.length > 20) {\n toStore = toStore.slice(-20);\n data.messages = toStore;\n serialized = JSON.stringify(data);\n }\n\n localStorage.setItem(getKey(projectId, sessionId), serialized);\n } catch {\n // localStorage full or unavailable — silently ignore\n }\n}\n\n/**\n * Clear stored messages for a session.\n *\n * @param projectId - Aigentyc project ID\n * @param sessionId - Current chat session ID\n */\nexport function clearMessages(projectId: string, sessionId: string): void {\n if (typeof window === \"undefined\") return;\n\n try {\n localStorage.removeItem(getKey(projectId, sessionId));\n } catch {\n // ignore\n }\n}\n\n/**\n * Prune all expired message entries from localStorage.\n *\n * Call once on widget / provider initialisation to prevent stale data\n * from accumulating.\n */\nexport function pruneExpiredMessages(): void {\n if (typeof window === \"undefined\") return;\n\n try {\n const keysToRemove: string[] = [];\n\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (!key?.startsWith(STORAGE_PREFIX)) continue;\n\n try {\n const raw = localStorage.getItem(key);\n if (!raw) continue;\n const data: StoredData = JSON.parse(raw);\n if (Date.now() - data.timestamp > MAX_AGE_MS) {\n keysToRemove.push(key);\n }\n } catch {\n keysToRemove.push(key!);\n }\n }\n\n for (const key of keysToRemove) {\n localStorage.removeItem(key);\n }\n } catch {\n // ignore\n }\n}\n\n/** Handle for the debounce timer. */\nlet saveTimeout: ReturnType<typeof setTimeout> | null = null;\n\n/**\n * Debounced save — call on every `messages` change.\n *\n * Coalesces rapid updates (e.g. during streaming) into a single write.\n *\n * @param projectId - Aigentyc project ID\n * @param sessionId - Current chat session ID\n * @param messages - Current messages array\n * @param delay - Debounce delay in ms (default `500`)\n */\nexport function debouncedSaveMessages(\n projectId: string,\n sessionId: string,\n messages: StoredMessage[],\n delay = 500,\n): void {\n if (typeof window === \"undefined\") return;\n\n if (saveTimeout) clearTimeout(saveTimeout);\n saveTimeout = setTimeout(() => {\n saveMessages(projectId, sessionId, messages);\n }, delay);\n}\n","\"use client\";\n\nimport type { ChatConfig } from \"./types\";\n\n/**\n * Options for creating a chat transport instance.\n */\nexport interface CreateChatTransportOptions {\n /** Maximum number of messages to include in a single request (default `20`) */\n maxMessages?: number;\n /** Current session identifier */\n sessionId?: string;\n /** Pre-set user type / persona key */\n userType?: string;\n /** Current page URL (for contextual answers) */\n pageUrl?: string;\n /** Current page title */\n pageTitle?: string;\n /** Signed WP user identity token */\n wpUserToken?: string;\n /**\n * Mutable ref-like getter for the analytics message ID.\n * Called inside `prepareSendMessagesRequest` to read the latest value.\n */\n getAnalyticsMessageId?: () => string | null;\n /**\n * Mutable ref-like getter for the current user type.\n * Called inside `prepareSendMessagesRequest` to read the latest value.\n */\n getUserType?: () => string | null;\n /**\n * Mutable ref-like getter for the current session ID.\n * Called inside `prepareSendMessagesRequest` in case it changes at runtime.\n */\n getSessionId?: () => string;\n}\n\n/**\n * Minify a tool output before sending it back to the LLM.\n *\n * Display tools use `_displayData` for the UI — the LLM only needs the\n * summary / context portion. Large outputs are truncated.\n *\n * @internal\n */\nexport function minifyToolOutput(output: unknown): unknown {\n if (!output || typeof output !== \"object\") return output;\n const obj = output as Record<string, unknown>;\n\n // 1. Display-only tools: strip _displayData, keep message/summary\n if (\"_displayData\" in obj) {\n const { _displayData: _, ...contextData } = obj;\n return contextData;\n }\n\n // 2. searchKnowledgeBase: LLM already used results, no need to resend\n if (\"sources\" in obj && Array.isArray(obj.sources)) {\n return { _searched: true, totalResults: obj.totalResults };\n }\n\n // 3. Fallback: truncate any large outputs (>1.5 KB)\n const outputStr = JSON.stringify(obj);\n if (outputStr.length > 1500) {\n const summary: Record<string, unknown> = { _truncated: true };\n if (Array.isArray(obj)) {\n summary.itemCount = obj.length;\n } else {\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === \"string\" && v.length < 100) summary[k] = v;\n else if (typeof v === \"number\" || typeof v === \"boolean\") summary[k] = v;\n }\n }\n return summary;\n }\n\n return output;\n}\n\n/**\n * Prune and minify a messages array for sending to the API.\n *\n * 1. Keeps the first message (system / context) and the last `maxMessages - 1`.\n * 2. Deep-clones messages so the local UI state is not mutated.\n * 3. Strips large tool outputs via `minifyToolOutput`.\n *\n * @internal\n */\nexport function prepareMessages(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n messages: any[],\n maxMessages: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any[] {\n let pruned = messages;\n\n if (messages.length > maxMessages) {\n pruned = [messages[0], ...messages.slice(-(maxMessages - 1))];\n }\n\n // Deep clone and minify tool outputs\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cloned = JSON.parse(JSON.stringify(pruned)) as any[];\n for (const msg of cloned) {\n if (msg.role === \"assistant\" && msg.parts) {\n for (const part of msg.parts) {\n if (part.type?.startsWith(\"tool-\") && part.output !== undefined) {\n part.output = minifyToolOutput(part.output);\n }\n }\n }\n }\n\n return cloned;\n}\n\n/**\n * Create a configured `DefaultChatTransport` instance from the AI SDK.\n *\n * The transport handles authentication, message pruning, tool-output\n * minification, and attaches project / session metadata to every request.\n *\n * Uses a dynamic `import(\"ai\")` so that `ai` stays an optional peer\n * dependency — the import is only resolved at call time.\n *\n * @param config - Chat backend configuration\n * @param options - Transport options\n * @returns A `DefaultChatTransport` instance ready for `useChat()`\n *\n * @example\n * ```ts\n * const transport = await createChatTransport(\n * { projectId: \"abc\", apiEndpoint: \"https://api.example.com\", apiKey: \"key\" },\n * { maxMessages: 20, getSessionId: () => sessionIdRef.current },\n * );\n * const { messages } = useChat({ transport });\n * ```\n */\nexport async function createChatTransport(\n config: ChatConfig,\n options: CreateChatTransportOptions = {},\n) {\n const { DefaultChatTransport } = await import(\"ai\");\n\n const {\n maxMessages = 20,\n pageUrl,\n pageTitle,\n wpUserToken,\n getAnalyticsMessageId,\n getUserType,\n getSessionId,\n } = options;\n\n return new DefaultChatTransport({\n api: `${config.apiEndpoint}/api/kb/chat`,\n headers: () => {\n const headers: Record<string, string> = {};\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n }\n return headers;\n },\n credentials: \"include\",\n prepareSendMessagesRequest: ({ id, messages, trigger }) => {\n const prepared = prepareMessages(messages, maxMessages);\n\n return {\n body: {\n id,\n messages: prepared,\n trigger,\n projectId: config.projectId,\n sessionId: getSessionId?.() ?? options.sessionId,\n analyticsMessageId: getAnalyticsMessageId?.() ?? null,\n userType: getUserType?.() ?? options.userType ?? undefined,\n pageUrl,\n pageTitle,\n ...(wpUserToken ? { wpUserToken } : {}),\n },\n };\n },\n });\n}\n\n/**\n * Synchronous variant of `createChatTransport` for use when `ai`\n * is already bundled (i.e. not dynamically imported).\n *\n * Requires the caller to pass in the `DefaultChatTransport` constructor.\n *\n * @param DefaultChatTransport - The `DefaultChatTransport` class from `\"ai\"`\n * @param config - Chat backend configuration\n * @param options - Transport options\n * @returns A configured `DefaultChatTransport` instance\n */\nexport function createChatTransportSync(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n DefaultChatTransport: any,\n config: ChatConfig,\n options: CreateChatTransportOptions = {},\n) {\n const {\n maxMessages = 20,\n pageUrl,\n pageTitle,\n wpUserToken,\n getAnalyticsMessageId,\n getUserType,\n getSessionId,\n } = options;\n\n return new DefaultChatTransport({\n api: `${config.apiEndpoint}/api/kb/chat`,\n headers: () => {\n const headers: Record<string, string> = {};\n if (config.apiKey) {\n headers[\"Authorization\"] = `Bearer ${config.apiKey}`;\n }\n return headers;\n },\n credentials: \"include\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n prepareSendMessagesRequest: ({ id, messages, trigger }: any) => {\n const prepared = prepareMessages(messages, maxMessages);\n\n return {\n body: {\n id,\n messages: prepared,\n trigger,\n projectId: config.projectId,\n sessionId: getSessionId?.() ?? options.sessionId,\n analyticsMessageId: getAnalyticsMessageId?.() ?? null,\n userType: getUserType?.() ?? options.userType ?? undefined,\n pageUrl,\n pageTitle,\n ...(wpUserToken ? { wpUserToken } : {}),\n },\n };\n },\n });\n}\n","\"use client\";\n\n/**\n * User type constants and helpers.\n *\n * Defines the available visitor personas that the `AgentDetection` tool\n * can assign. These are generic defaults — consumers can extend them via\n * configuration.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A visitor persona / user type definition.\n */\nexport interface UserType {\n /** Machine-readable identifier (e.g. `\"Guest\"`) */\n id: string;\n /** Human-readable label */\n label: string;\n /** Short description of this persona */\n description: string;\n /**\n * Icon identifier.\n *\n * In the SDK this is a string key (e.g. `\"User\"`, `\"Shield\"`, `\"Zap\"`)\n * rather than a Lucide component to avoid coupling core logic to a\n * specific icon library.\n */\n icon: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/**\n * Default user types available for the `AgentDetection` tool.\n */\nexport const USER_TYPES: UserType[] = [\n {\n id: \"Guest\",\n label: \"Guest\",\n description: \"Just browsing\",\n icon: \"User\",\n },\n {\n id: \"Customer\",\n label: \"Customer\",\n description: \"Existing customer with questions\",\n icon: \"Shield\",\n },\n {\n id: \"Partner\",\n label: \"Partner\",\n description: \"Business partner or professional\",\n icon: \"Zap\",\n },\n];\n\n/**\n * Map from display label to user-type ID.\n *\n * Used to normalise user-type strings that come from the AI\n * (which may use the label rather than the ID).\n */\nexport const USER_TYPE_LABEL_MAP: Record<string, string> = {\n Guest: \"Guest\",\n Customer: \"Customer\",\n Partner: \"Partner\",\n};\n\n/**\n * Prefix for internal / hidden messages.\n *\n * Messages starting with this string are never rendered in the UI.\n */\nexport const INTERNAL_MESSAGE_PREFIX = \"[internal]\";\n\n/**\n * Check whether a message should be hidden from the UI.\n *\n * @param text - The raw message text\n * @returns `true` if the message is internal\n */\nexport function isInternalMessage(text: string): boolean {\n return text.startsWith(INTERNAL_MESSAGE_PREFIX);\n}\n"]}