@aigentyc/chat-sdk 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/{ChatInterface-BnVyOUG5.d.cts → ChatInterface-DrzYAWnG.d.cts} +1 -1
  2. package/dist/{ChatInterface-2MN5cpYB.d.ts → ChatInterface-qiVhkmx3.d.ts} +1 -1
  3. package/dist/{SlotsContext-BZBi51ZT.d.ts → SlotsContext-B_087V7B.d.ts} +11 -2
  4. package/dist/{SlotsContext-D_C7zlUA.d.cts → SlotsContext-DAQiASVu.d.cts} +11 -2
  5. package/dist/ai-elements.cjs +27 -27
  6. package/dist/ai-elements.js +2 -2
  7. package/dist/{chunk-KTYYLZN7.cjs → chunk-6CVBJ4EI.cjs} +4 -4
  8. package/dist/{chunk-KTYYLZN7.cjs.map → chunk-6CVBJ4EI.cjs.map} +1 -1
  9. package/dist/{chunk-3MP2EGEJ.cjs → chunk-72QJ2ORD.cjs} +4 -2
  10. package/dist/chunk-72QJ2ORD.cjs.map +1 -0
  11. package/dist/{chunk-P3RPAI4F.cjs → chunk-BYX6IOGX.cjs} +4 -4
  12. package/dist/{chunk-P3RPAI4F.cjs.map → chunk-BYX6IOGX.cjs.map} +1 -1
  13. package/dist/{chunk-5XF3NEFB.js → chunk-CNGIOCLR.js} +3 -3
  14. package/dist/{chunk-5XF3NEFB.js.map → chunk-CNGIOCLR.js.map} +1 -1
  15. package/dist/chunk-CNPYBLLT.js +81 -0
  16. package/dist/chunk-CNPYBLLT.js.map +1 -0
  17. package/dist/{chunk-FJZL33KP.js → chunk-CW6LCVNC.js} +3 -3
  18. package/dist/{chunk-FJZL33KP.js.map → chunk-CW6LCVNC.js.map} +1 -1
  19. package/dist/{chunk-7ESWDFF5.cjs → chunk-DTOOWY2S.cjs} +122 -46
  20. package/dist/chunk-DTOOWY2S.cjs.map +1 -0
  21. package/dist/{chunk-D75TDRBH.js → chunk-JAEXKKSE.js} +41 -35
  22. package/dist/chunk-JAEXKKSE.js.map +1 -0
  23. package/dist/{chunk-Q3UJEIBN.cjs → chunk-JEK2V5I3.cjs} +6 -6
  24. package/dist/{chunk-Q3UJEIBN.cjs.map → chunk-JEK2V5I3.cjs.map} +1 -1
  25. package/dist/{chunk-QYCEHFAB.js → chunk-LDQVDUUJ.js} +4 -2
  26. package/dist/chunk-LDQVDUUJ.js.map +1 -0
  27. package/dist/{chunk-BWWN5LSE.js → chunk-UTEGHMBN.js} +85 -10
  28. package/dist/chunk-UTEGHMBN.js.map +1 -0
  29. package/dist/{chunk-52ZHMTAA.cjs → chunk-UXVOUC2A.cjs} +41 -35
  30. package/dist/chunk-UXVOUC2A.cjs.map +1 -0
  31. package/dist/{chunk-IU7Q7O5G.js → chunk-VQPOUMBC.js} +3 -3
  32. package/dist/{chunk-IU7Q7O5G.js.map → chunk-VQPOUMBC.js.map} +1 -1
  33. package/dist/chunk-VYBHYFG3.cjs +87 -0
  34. package/dist/chunk-VYBHYFG3.cjs.map +1 -0
  35. package/dist/components.cjs +20 -19
  36. package/dist/components.cjs.map +1 -1
  37. package/dist/components.d.cts +2 -2
  38. package/dist/components.d.ts +2 -2
  39. package/dist/components.js +8 -7
  40. package/dist/components.js.map +1 -1
  41. package/dist/core.cjs +21 -82
  42. package/dist/core.cjs.map +1 -1
  43. package/dist/core.d.cts +2 -2
  44. package/dist/core.d.ts +2 -2
  45. package/dist/core.js +2 -78
  46. package/dist/core.js.map +1 -1
  47. package/dist/hooks.cjs +9 -8
  48. package/dist/hooks.cjs.map +1 -1
  49. package/dist/hooks.d.cts +2 -2
  50. package/dist/hooks.d.ts +2 -2
  51. package/dist/hooks.js +4 -3
  52. package/dist/hooks.js.map +1 -1
  53. package/dist/i18n.cjs +5 -5
  54. package/dist/i18n.d.cts +2 -2
  55. package/dist/i18n.d.ts +2 -2
  56. package/dist/i18n.js +1 -1
  57. package/dist/index.cjs +29 -24
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.cts +15 -5
  60. package/dist/index.d.ts +15 -5
  61. package/dist/index.js +11 -10
  62. package/dist/index.js.map +1 -1
  63. package/dist/llms-full.txt +10 -10
  64. package/dist/styles.css +1 -1
  65. package/dist/theme.cjs +4 -4
  66. package/dist/theme.d.cts +1 -1
  67. package/dist/theme.d.ts +1 -1
  68. package/dist/theme.js +2 -2
  69. package/dist/tools.cjs +6 -5
  70. package/dist/tools.d.cts +2 -2
  71. package/dist/tools.d.ts +2 -2
  72. package/dist/tools.js +3 -2
  73. package/dist/{types-bsR_-fq8.d.cts → types-DRa1zFlN.d.cts} +10 -1
  74. package/dist/{types-bsR_-fq8.d.ts → types-DRa1zFlN.d.ts} +10 -1
  75. package/package.json +2 -2
  76. package/dist/chunk-3MP2EGEJ.cjs.map +0 -1
  77. package/dist/chunk-52ZHMTAA.cjs.map +0 -1
  78. package/dist/chunk-7ESWDFF5.cjs.map +0 -1
  79. package/dist/chunk-BWWN5LSE.js.map +0 -1
  80. package/dist/chunk-D75TDRBH.js.map +0 -1
  81. package/dist/chunk-QYCEHFAB.js.map +0 -1
package/dist/theme.cjs CHANGED
@@ -1,18 +1,18 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkP3RPAI4F_cjs = require('./chunk-P3RPAI4F.cjs');
5
- require('./chunk-3MP2EGEJ.cjs');
4
+ var chunkBYX6IOGX_cjs = require('./chunk-BYX6IOGX.cjs');
5
+ require('./chunk-72QJ2ORD.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "ThemeProvider", {
10
10
  enumerable: true,
11
- get: function () { return chunkP3RPAI4F_cjs.ThemeProvider; }
11
+ get: function () { return chunkBYX6IOGX_cjs.ThemeProvider; }
12
12
  });
13
13
  Object.defineProperty(exports, "useTheme", {
14
14
  enumerable: true,
15
- get: function () { return chunkP3RPAI4F_cjs.useTheme; }
15
+ get: function () { return chunkBYX6IOGX_cjs.useTheme; }
16
16
  });
17
17
  //# sourceMappingURL=theme.cjs.map
18
18
  //# sourceMappingURL=theme.cjs.map
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-bsR_-fq8.cjs';
3
+ export { i as ThemeConfig } from './types-DRa1zFlN.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-bsR_-fq8.js';
3
+ export { i as ThemeConfig } from './types-DRa1zFlN.js';
4
4
 
5
5
  /**
6
6
  * Theme configuration for the chat widget.
package/dist/theme.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- export { ThemeProvider, useTheme } from './chunk-IU7Q7O5G.js';
3
- import './chunk-QYCEHFAB.js';
2
+ export { ThemeProvider, useTheme } from './chunk-VQPOUMBC.js';
3
+ import './chunk-LDQVDUUJ.js';
4
4
  //# sourceMappingURL=theme.js.map
5
5
  //# sourceMappingURL=theme.js.map
package/dist/tools.cjs CHANGED
@@ -2,8 +2,9 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk7AZMWPKX_cjs = require('./chunk-7AZMWPKX.cjs');
5
- var chunkQ3UJEIBN_cjs = require('./chunk-Q3UJEIBN.cjs');
6
- require('./chunk-52ZHMTAA.cjs');
5
+ var chunkJEK2V5I3_cjs = require('./chunk-JEK2V5I3.cjs');
6
+ require('./chunk-UXVOUC2A.cjs');
7
+ require('./chunk-VYBHYFG3.cjs');
7
8
  require('./chunk-JOO6C3XT.cjs');
8
9
  var chunkH7C3AGA2_cjs = require('./chunk-H7C3AGA2.cjs');
9
10
  var chunkQ7T3VAJV_cjs = require('./chunk-Q7T3VAJV.cjs');
@@ -23,15 +24,15 @@ Object.defineProperty(exports, "normalizeToolRows", {
23
24
  });
24
25
  Object.defineProperty(exports, "ComponentRenderer", {
25
26
  enumerable: true,
26
- get: function () { return chunkQ3UJEIBN_cjs.ComponentRenderer; }
27
+ get: function () { return chunkJEK2V5I3_cjs.ComponentRenderer; }
27
28
  });
28
29
  Object.defineProperty(exports, "SearchKnowledgeBaseRenderer", {
29
30
  enumerable: true,
30
- get: function () { return chunkQ3UJEIBN_cjs.SearchKnowledgeBaseRenderer; }
31
+ get: function () { return chunkJEK2V5I3_cjs.SearchKnowledgeBaseRenderer; }
31
32
  });
32
33
  Object.defineProperty(exports, "ToolRenderer", {
33
34
  enumerable: true,
34
- get: function () { return chunkQ3UJEIBN_cjs.ToolRenderer; }
35
+ get: function () { return chunkJEK2V5I3_cjs.ToolRenderer; }
35
36
  });
36
37
  Object.defineProperty(exports, "JsonRenderResult", {
37
38
  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 { h as ToolRendererProps } from './types-bsR_-fq8.cjs';
3
- export { e as ComponentAction, i as ToolResult } from './types-bsR_-fq8.cjs';
2
+ import { T as ToolRendererProps } from './types-DRa1zFlN.cjs';
3
+ export { C as ComponentAction, a as ToolResult } from './types-DRa1zFlN.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 { h as ToolRendererProps } from './types-bsR_-fq8.js';
3
- export { e as ComponentAction, i as ToolResult } from './types-bsR_-fq8.js';
2
+ import { T as ToolRendererProps } from './types-DRa1zFlN.js';
3
+ export { C as ComponentAction, a as ToolResult } from './types-DRa1zFlN.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,8 @@
1
1
  "use client";
2
2
  export { getToolDisplayData, normalizeToolRows } from './chunk-XEAAB5ZM.js';
3
- export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer } from './chunk-FJZL33KP.js';
4
- import './chunk-D75TDRBH.js';
3
+ export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer } from './chunk-CW6LCVNC.js';
4
+ import './chunk-JAEXKKSE.js';
5
+ import './chunk-CNPYBLLT.js';
5
6
  import './chunk-PS3U7T37.js';
6
7
  export { JsonRenderResult } from './chunk-ZXP7IYRC.js';
7
8
  export { VisualizationRenderer } from './chunk-5T4FJ2SR.js';
@@ -178,6 +178,15 @@ interface SlotMap {
178
178
  floatingButton?: ComponentType<SlotProps>;
179
179
  /** Custom empty-state shown when no messages exist */
180
180
  emptyState?: ComponentType<SlotProps>;
181
+ /**
182
+ * Custom failure card, shown in place of the answer when a turn is refused
183
+ * or the stream dies. Receives `{ error, onRetry, onNewConversation }`.
184
+ *
185
+ * Override it to match the host's styling — but a host that renders nothing
186
+ * here brings back the failure mode this slot exists to end: a refused turn
187
+ * that looks exactly like a turn nobody sent.
188
+ */
189
+ error?: ComponentType<SlotProps>;
181
190
  }
182
191
  /**
183
192
  * Describes a follow-up action attached to a tool invocation result.
@@ -417,4 +426,4 @@ interface ChatAttachmentInput {
417
426
  filename?: string;
418
427
  }
419
428
 
420
- export type { ChatProviderProps as C, Language as L, QuestionConfig as Q, SlotMap as S, ThemeConfig as T, ChatAttachmentInput as a, ChatConfig as b, ChatEventCallbacks as c, ChatMessage as d, ComponentAction as e, LiveChatMessage as f, LiveChatState as g, ToolRendererProps as h, ToolResult as i, SlotProps as j };
429
+ export type { ComponentAction as C, Language as L, QuestionConfig as Q, SlotMap as S, ToolRendererProps as T, ToolResult as a, ChatProviderProps as b, ChatAttachmentInput as c, ChatConfig as d, ChatEventCallbacks as e, ChatMessage as f, LiveChatMessage as g, LiveChatState as h, ThemeConfig as i, SlotProps as j };
@@ -178,6 +178,15 @@ interface SlotMap {
178
178
  floatingButton?: ComponentType<SlotProps>;
179
179
  /** Custom empty-state shown when no messages exist */
180
180
  emptyState?: ComponentType<SlotProps>;
181
+ /**
182
+ * Custom failure card, shown in place of the answer when a turn is refused
183
+ * or the stream dies. Receives `{ error, onRetry, onNewConversation }`.
184
+ *
185
+ * Override it to match the host's styling — but a host that renders nothing
186
+ * here brings back the failure mode this slot exists to end: a refused turn
187
+ * that looks exactly like a turn nobody sent.
188
+ */
189
+ error?: ComponentType<SlotProps>;
181
190
  }
182
191
  /**
183
192
  * Describes a follow-up action attached to a tool invocation result.
@@ -417,4 +426,4 @@ interface ChatAttachmentInput {
417
426
  filename?: string;
418
427
  }
419
428
 
420
- export type { ChatProviderProps as C, Language as L, QuestionConfig as Q, SlotMap as S, ThemeConfig as T, ChatAttachmentInput as a, ChatConfig as b, ChatEventCallbacks as c, ChatMessage as d, ComponentAction as e, LiveChatMessage as f, LiveChatState as g, ToolRendererProps as h, ToolResult as i, SlotProps as j };
429
+ export type { ComponentAction as C, Language as L, QuestionConfig as Q, SlotMap as S, ToolRendererProps as T, ToolResult as a, ChatProviderProps as b, ChatAttachmentInput as c, ChatConfig as d, ChatEventCallbacks as e, ChatMessage as f, LiveChatMessage as g, LiveChatState as h, ThemeConfig as i, SlotProps as j };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aigentyc/chat-sdk",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "React SDK for building AI-powered chat interfaces connected to the Aigentyc platform",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -123,7 +123,7 @@
123
123
  "LICENSE"
124
124
  ],
125
125
  "bin": {
126
- "aigentyc": "./bin/aigentyc.mjs"
126
+ "aigentyc": "bin/aigentyc.mjs"
127
127
  },
128
128
  "homepage": "https://www.npmjs.com/package/@aigentyc/chat-sdk",
129
129
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/providers/I18nProvider.tsx"],"names":["createContext","useState","useCallback","useMemo","jsx","useContext"],"mappings":"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","file":"chunk-3MP2EGEJ.cjs","sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n type ReactNode,\n} from \"react\";\n\n/**\n * All supported translation keys.\n */\nexport type TranslationKeys =\n | \"welcomeTitle\"\n | \"welcomeSubtitle\"\n | \"searchKnowledgeBase\"\n | \"searchingFor\"\n | \"processing\"\n | \"thinking\"\n | \"newConversation\"\n | \"backToStart\"\n | \"closeChat\"\n | \"alwaysVerify\"\n | \"poweredBy\"\n | \"startNewConversation\"\n | \"somethingWentWrong\"\n | \"conversationTooLong\"\n | \"conversationTooLongDesc\"\n | \"somethingWentWrongDesc\"\n | \"typeMessage\"\n | \"send\"\n | \"aboutUs\"\n | \"aboutUsDesc\"\n | \"support\"\n | \"supportDesc\"\n | \"features\"\n | \"featuresDesc\"\n | \"search\"\n | \"searchDesc\"\n | \"greeting\"\n | \"guest\"\n | \"guestDesc\"\n | \"customer\"\n | \"customerDesc\"\n | \"partner\"\n | \"partnerDesc\"\n | \"aboutUsQuery\"\n | \"supportQuery\"\n | \"featuresQuery\"\n | \"searchQuery\"\n | \"whatWentWrong\"\n | \"wrongAnswer\"\n | \"partialAnswer\"\n | \"hallucination\"\n | \"inappropriateTone\"\n | \"addDetails\"\n | \"submitting\"\n | \"submitFeedback\"\n | \"helpful\"\n | \"notHelpful\"\n | \"copyResponse\"\n | \"searchingProducts\"\n | \"searchingProductsFor\"\n | \"sendingVerification\"\n | \"verifyingOrders\"\n | \"generatingLogin\"\n | \"noProductsFound\"\n | \"noOrdersFound\"\n | \"inStock\"\n | \"outOfStock\"\n | \"backorder\"\n | \"sale\"\n | \"addToCart\"\n | \"addedToCart\"\n | \"addToCartError\"\n | \"loginToStore\"\n | \"enterEmail\"\n | \"sendCode\"\n | \"otpSentTo\"\n | \"verifyCode\"\n | \"verifiedSuccess\"\n | \"resendCode\"\n | \"invalidCode\"\n | \"selectVariation\"\n | \"orderStatus_completed\"\n | \"orderStatus_processing\"\n | \"orderStatus_on-hold\"\n | \"orderStatus_pending\"\n | \"orderStatus_cancelled\"\n | \"orderStatus_failed\"\n | \"orderStatus_refunded\"\n | \"cart\"\n | \"yourCart\"\n | \"cartItems\"\n | \"cartEmpty\"\n | \"checkout\"\n | \"cartTotal\"\n | \"removeItem\"\n | \"liveChatConnecting\"\n | \"liveChatPosition\"\n | \"liveChatCancel\"\n | \"liveChatChattingWith\"\n | \"liveChatEndChat\"\n | \"liveChatRateTitle\"\n | \"liveChatRateThank\"\n | \"liveChatBackToAI\"\n | \"liveChatSubmit\"\n | \"liveChatSkip\"\n | \"liveChatFeedbackPlaceholder\"\n | \"liveChatTalkToHuman\"\n | \"liveChatIdentityTitle\"\n | \"liveChatIdentityName\"\n | \"liveChatIdentityEmail\"\n | \"liveChatIdentityConnect\"\n | \"liveChatIdentityContinue\"\n | \"liveChatRateExperience\"\n | \"liveChatEnded\";\n\n/** A complete set of translations for a language. */\nexport type TranslationMap = Record<TranslationKeys, string>;\n\n/** Built-in English translations. */\nconst en: TranslationMap = {\n welcomeTitle: \"Welcome to {clientName}\",\n welcomeSubtitle: \"How can I assist you today? Select a topic or type your message below.\",\n searchKnowledgeBase: \"Searching knowledge base...\",\n searchingFor: 'Searching for \"{query}\"...',\n processing: \"Processing...\",\n thinking: \"Thinking...\",\n newConversation: \"New conversation\",\n backToStart: \"Back to start\",\n closeChat: \"Close chat\",\n alwaysVerify: \"Always verify AI responses\",\n poweredBy: \"powered by\",\n startNewConversation: \"Start New Conversation\",\n somethingWentWrong: \"Something Went Wrong\",\n conversationTooLong: \"Conversation Too Long\",\n conversationTooLongDesc: \"The conversation has become too long to continue.\",\n somethingWentWrongDesc: \"We encountered an issue. Please try again or start fresh.\",\n typeMessage: \"Type a message...\",\n send: \"Send\",\n aboutUs: \"About Us\",\n aboutUsDesc: \"Learn more about our services\",\n support: \"Support\",\n supportDesc: \"Get help with your questions\",\n features: \"Features\",\n featuresDesc: \"Discover what we can do\",\n search: \"Search\",\n searchDesc: \"Find specific information\",\n greeting: \"Hi there 👋 How can I help you today?\",\n guest: \"Guest\",\n guestDesc: \"Just browsing\",\n customer: \"Customer\",\n customerDesc: \"Existing customer with questions\",\n partner: \"Partner\",\n partnerDesc: \"Business partner or professional\",\n aboutUsQuery: \"Tell me about About Us\",\n supportQuery: \"Tell me about Support\",\n featuresQuery: \"Tell me about Features\",\n searchQuery: \"Tell me about Search\",\n whatWentWrong: \"What went wrong?\",\n wrongAnswer: \"Wrong answer\",\n partialAnswer: \"Partial answer\",\n hallucination: \"Hallucination\",\n inappropriateTone: \"Inappropriate tone\",\n addDetails: \"Add details (optional)...\",\n submitting: \"Submitting...\",\n submitFeedback: \"Submit Feedback\",\n helpful: \"Helpful\",\n notHelpful: \"Not helpful\",\n copyResponse: \"Copy response\",\n searchingProducts: \"Searching products...\",\n searchingProductsFor: 'Searching products: \"{query}\"...',\n sendingVerification: \"Sending verification code...\",\n verifyingOrders: \"Verifying and fetching orders...\",\n generatingLogin: \"Generating login link...\",\n noProductsFound: \"No products found\",\n noOrdersFound: \"No orders found\",\n inStock: \"In stock\",\n outOfStock: \"Out of stock\",\n backorder: \"Backorder\",\n sale: \"Sale\",\n addToCart: \"Add to Cart\",\n addedToCart: \"Added to cart!\",\n addToCartError: \"Failed to add to cart\",\n loginToStore: \"Login to Store\",\n enterEmail: \"Enter your email to verify\",\n sendCode: \"Send verification code\",\n otpSentTo: \"Verification code sent to {email}\",\n verifyCode: \"Verify\",\n verifiedSuccess: \"Verified successfully!\",\n resendCode: \"Resend code\",\n invalidCode: \"Invalid code, please try again\",\n selectVariation: \"Select\",\n orderStatus_completed: \"Completed\",\n orderStatus_processing: \"Processing\",\n \"orderStatus_on-hold\": \"On Hold\",\n orderStatus_pending: \"Pending\",\n orderStatus_cancelled: \"Cancelled\",\n orderStatus_failed: \"Failed\",\n orderStatus_refunded: \"Refunded\",\n cart: \"Cart\",\n yourCart: \"Your Cart\",\n cartItems: \"{count} items\",\n cartEmpty: \"Your cart is empty\",\n checkout: \"Checkout\",\n cartTotal: \"Total\",\n removeItem: \"Remove\",\n liveChatConnecting: \"Connecting you with an operator...\",\n liveChatPosition: \"Position #{position}\",\n liveChatCancel: \"Cancel\",\n liveChatChattingWith: \"Chatting with {name}\",\n liveChatEndChat: \"End Chat\",\n liveChatRateTitle: \"How was your experience?\",\n liveChatRateThank: \"Thank you for your feedback!\",\n liveChatBackToAI: \"Back to AI Assistant\",\n liveChatSubmit: \"Submit\",\n liveChatSkip: \"Skip\",\n liveChatFeedbackPlaceholder: \"Any additional feedback? (optional)\",\n liveChatTalkToHuman: \"Talk to an operator\",\n liveChatIdentityTitle: \"Please provide your details to connect with an operator\",\n liveChatIdentityName: \"Your name\",\n liveChatIdentityEmail: \"Your email\",\n liveChatIdentityConnect: \"Connect\",\n liveChatIdentityContinue: \"Continue\",\n liveChatRateExperience: \"Rate your experience\",\n liveChatEnded: \"Chat ended\",\n};\n\n/** Built-in Hebrew translations. */\nconst he: TranslationMap = {\n welcomeTitle: \"ברוכים הבאים ל-{clientName}\",\n welcomeSubtitle: \"איך אוכל לעזור היום? בחרו נושא או הקלידו הודעה למטה.\",\n searchKnowledgeBase: \"מחפש במאגר הידע...\",\n searchingFor: 'מחפש את \"{query}\"...',\n processing: \"מעבד...\",\n thinking: \"חושב...\",\n newConversation: \"שיחה חדשה\",\n backToStart: \"חזרה להתחלה\",\n closeChat: \"סגור צ'אט\",\n alwaysVerify: \"תמיד כדאי לוודא את תשובות ה-AI\",\n poweredBy: \"מופעל על ידי\",\n startNewConversation: \"התחל שיחה חדשה\",\n somethingWentWrong: \"משהו השתבש\",\n conversationTooLong: \"השיחה ארוכה מדי\",\n conversationTooLongDesc: \"השיחה הפכה לארוכה מדי בשביל להמשיך.\",\n somethingWentWrongDesc: \"נתקלנו בבעיה. אנא נסו שוב או התחילו מחדש.\",\n typeMessage: \"הקלד הודעה...\",\n send: \"שלח\",\n aboutUs: \"אודותינו\",\n aboutUsDesc: \"למדו עוד על השירותים שלנו\",\n support: \"תמיכה\",\n supportDesc: \"קבלו עזרה עם השאלות שלכם\",\n features: \"פיצ'רים\",\n featuresDesc: \"גלו מה אנחנו יכולים לעשות\",\n search: \"חיפוש\",\n searchDesc: \"מצאו מידע ספציפי\",\n greeting: \"שלום 👋 איך אוכל לעזור לכם היום?\",\n guest: \"אורח\",\n guestDesc: \"רק גולש\",\n customer: \"לקוח\",\n customerDesc: \"לקוח קיים עם שאלות\",\n partner: \"שותף\",\n partnerDesc: \"שותף עסקי או איש מקצוע\",\n aboutUsQuery: \"ספר לי על אודותינו\",\n supportQuery: \"ספר לי על תמיכה\",\n featuresQuery: \"ספר לי על פיצ'רים\",\n searchQuery: \"ספר לי על חיפוש\",\n whatWentWrong: \"מה השתבש?\",\n wrongAnswer: \"תשובה לא נכונה\",\n partialAnswer: \"תשובה חלקית\",\n hallucination: \"הזיה (מידע מומצא)\",\n inappropriateTone: \"טון לא הולם\",\n addDetails: \"הוסיפו פרטים (אופציונלי)...\",\n submitting: \"שולח...\",\n submitFeedback: \"שלח משוב\",\n helpful: \"עוזר\",\n notHelpful: \"לא עוזר\",\n copyResponse: \"העתק תשובה\",\n searchingProducts: \"מחפש מוצרים...\",\n searchingProductsFor: 'מחפש מוצרים: \"{query}\"...',\n sendingVerification: \"שולח קוד אימות...\",\n verifyingOrders: \"מאמת ומביא הזמנות...\",\n generatingLogin: \"מייצר קישור התחברות...\",\n noProductsFound: \"לא נמצאו מוצרים\",\n noOrdersFound: \"לא נמצאו הזמנות\",\n inStock: \"במלאי\",\n outOfStock: \"אזל מהמלאי\",\n backorder: \"בהזמנה מראש\",\n sale: \"מבצע\",\n addToCart: \"הוסף לסל\",\n addedToCart: \"נוסף לסל!\",\n addToCartError: \"שגיאה בהוספה לסל\",\n loginToStore: \"התחבר לחנות\",\n enterEmail: \"הזינו אימייל לאימות\",\n sendCode: \"שלח קוד אימות\",\n otpSentTo: \"קוד אימות נשלח ל-{email}\",\n verifyCode: \"אמת\",\n verifiedSuccess: \"אומת בהצלחה!\",\n resendCode: \"שלח שוב\",\n invalidCode: \"קוד שגוי, נסו שוב\",\n selectVariation: \"בחר\",\n orderStatus_completed: \"הושלמה\",\n orderStatus_processing: \"בטיפול\",\n \"orderStatus_on-hold\": \"בהמתנה\",\n orderStatus_pending: \"ממתינה\",\n orderStatus_cancelled: \"בוטלה\",\n orderStatus_failed: \"נכשלה\",\n orderStatus_refunded: \"הוחזרה\",\n cart: \"סל\",\n yourCart: \"הסל שלך\",\n cartItems: \"{count} פריטים\",\n cartEmpty: \"הסל ריק\",\n checkout: \"לתשלום\",\n cartTotal: \"סה״כ\",\n removeItem: \"הסר\",\n liveChatConnecting: \"מחבר אותך לנציג...\",\n liveChatPosition: \"מיקום #{position}\",\n liveChatCancel: \"ביטול\",\n liveChatChattingWith: \"משוחח עם {name}\",\n liveChatEndChat: \"סיום שיחה\",\n liveChatRateTitle: \"איך היה השירות?\",\n liveChatRateThank: \"תודה על המשוב!\",\n liveChatBackToAI: \"חזרה לעוזר AI\",\n liveChatSubmit: \"שלח\",\n liveChatSkip: \"דלג\",\n liveChatFeedbackPlaceholder: \"משוב נוסף (אופציונלי)...\",\n liveChatTalkToHuman: \"דבר עם נציג\",\n liveChatIdentityTitle: \"אנא מלא/י את הפרטים כדי להתחבר לנציג\",\n liveChatIdentityName: \"שם\",\n liveChatIdentityEmail: \"אימייל\",\n liveChatIdentityConnect: \"התחבר\",\n liveChatIdentityContinue: \"המשך\",\n liveChatRateExperience: \"דרגו את החוויה שלכם\",\n liveChatEnded: \"השיחה הסתיימה\",\n};\n\n/** Built-in translation registry. */\nconst builtInTranslations: Record<string, TranslationMap> = { en, he };\n\n/** Registry for dynamically added languages. */\nconst customTranslations: Record<string, TranslationMap> = {};\n\n/**\n * Register a new language at runtime. Merges with any existing translations.\n *\n * @param code - Language code (e.g. \"fr\", \"es\")\n * @param translations - Full or partial translation map\n */\nexport function addLanguage(\n code: string,\n translations: Partial<TranslationMap>\n): void {\n const base = customTranslations[code] || builtInTranslations[code] || en;\n customTranslations[code] = { ...base, ...translations };\n}\n\n/** Resolve a translation string for the given language and key. */\nfunction resolve(\n language: string,\n key: TranslationKeys,\n overrides?: Partial<TranslationMap>,\n params?: Record<string, string>\n): string {\n // Priority: overrides > custom > built-in > fallback to English\n let text =\n overrides?.[key] ||\n customTranslations[language]?.[key] ||\n builtInTranslations[language]?.[key] ||\n builtInTranslations[\"en\"][key] ||\n key;\n\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(`{${k}}`, v);\n });\n }\n return text;\n}\n\n/** RTL language codes. */\nconst RTL_LANGUAGES = new Set([\"he\", \"ar\", \"fa\", \"ur\"]);\n\n/** Returns true if the given language code is RTL. */\nexport function isRTL(language: string): boolean {\n return RTL_LANGUAGES.has(language);\n}\n\ninterface I18nContextValue {\n /** Translate a key, with optional interpolation params. */\n t: (key: TranslationKeys, params?: Record<string, string>) => string;\n /** Current language code. */\n language: string;\n /** Change the active language at runtime. */\n setLanguage: (lang: string) => void;\n /** Current text direction. */\n direction: \"ltr\" | \"rtl\";\n}\n\nconst I18nContext = createContext<I18nContextValue | null>(null);\n\n/** Props for the I18nProvider component. */\nexport interface I18nProviderProps {\n /** Active language code. Defaults to \"en\". */\n language?: string;\n /** Per-key translation overrides applied on top of built-in strings. */\n translations?: Partial<TranslationMap>;\n children: ReactNode;\n}\n\n/**\n * Provides i18n context to descendant components.\n * Supports built-in \"en\" and \"he\", dynamic languages via `addLanguage()`,\n * and per-instance overrides via the `translations` prop.\n */\nexport function I18nProvider({\n language: initialLanguage = \"en\",\n translations: overrides,\n children,\n}: I18nProviderProps) {\n const [language, setLanguage] = useState(initialLanguage);\n\n const t = useCallback(\n (key: TranslationKeys, params?: Record<string, string>) =>\n resolve(language, key, overrides, params),\n [language, overrides]\n );\n\n const direction = isRTL(language) ? \"rtl\" : \"ltr\";\n\n const value = useMemo<I18nContextValue>(\n () => ({ t, language, setLanguage, direction }),\n [t, language, direction]\n );\n\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n\n/**\n * Returns the i18n context: `t()` translation function, current language, and `setLanguage`.\n * Must be used within an `I18nProvider`.\n */\nexport function useI18n(): I18nContextValue {\n const ctx = useContext(I18nContext);\n if (!ctx) {\n throw new Error(\"useI18n must be used within an I18nProvider\");\n }\n return ctx;\n}\n"]}
@@ -1 +0,0 @@
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-52ZHMTAA.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 ChatAttachmentInput,\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 /**\n * Sends a user turn. `files` travel with it as message parts; a turn carrying\n * files may have empty text — an image on its own is a question.\n */\n sendMessage: (content: string, files?: ChatAttachmentInput[]) => 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, files?: ChatAttachmentInput[]) => {\n // An attachment is a message on its own, so an empty string only blocks\n // the send when nothing else is going with it.\n if (!content.trim() && (!files || files.length === 0)) return;\n callbacksRef.current?.onMessageSent?.({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n } as ChatMessage);\n sdkSendMessage({\n text: content,\n ...(files && files.length > 0\n ? { files: files.map((f) => ({ ...f, type: \"file\" as const })) }\n : {}),\n });\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"]}