@gengage/assistant-fe 0.1.5 → 0.1.7

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 (91) hide show
  1. package/README.md +100 -0
  2. package/dist/assistant-fe.css +1 -1
  3. package/dist/chat/components/AIGroupingCards.d.ts.map +1 -1
  4. package/dist/chat/components/AITopPicks.d.ts.map +1 -1
  5. package/dist/chat/components/ChatDrawer.d.ts +12 -4
  6. package/dist/chat/components/ChatDrawer.d.ts.map +1 -1
  7. package/dist/chat/components/ComparisonTable.d.ts +2 -7
  8. package/dist/chat/components/ComparisonTable.d.ts.map +1 -1
  9. package/dist/chat/components/productMentionLinker.d.ts.map +1 -1
  10. package/dist/chat/index.d.ts +14 -1
  11. package/dist/chat/index.d.ts.map +1 -1
  12. package/dist/chat/locales/en.d.ts.map +1 -1
  13. package/dist/chat/locales/tr.d.ts.map +1 -1
  14. package/dist/chat/panel-manager.d.ts +6 -2
  15. package/dist/chat/panel-manager.d.ts.map +1 -1
  16. package/dist/chat/session-persistence.d.ts +1 -0
  17. package/dist/chat/session-persistence.d.ts.map +1 -1
  18. package/dist/chat/types.d.ts +4 -2
  19. package/dist/chat/types.d.ts.map +1 -1
  20. package/dist/chat.cjs +1 -1
  21. package/dist/chat.iife.js +29 -29
  22. package/dist/chat.iife.js.map +1 -1
  23. package/dist/chat.js +2 -2
  24. package/dist/common/events.d.ts.map +1 -1
  25. package/dist/common/index.d.ts +2 -0
  26. package/dist/common/index.d.ts.map +1 -1
  27. package/dist/common/indexed-db.d.ts +2 -0
  28. package/dist/common/indexed-db.d.ts.map +1 -1
  29. package/dist/common/native-webview.d.ts +61 -0
  30. package/dist/common/native-webview.d.ts.map +1 -0
  31. package/dist/common/overlay.d.ts +5 -0
  32. package/dist/common/overlay.d.ts.map +1 -1
  33. package/dist/common/v1-protocol-adapter.d.ts.map +1 -1
  34. package/dist/common.cjs +1 -1
  35. package/dist/common.cjs.map +1 -1
  36. package/dist/common.js +197 -426
  37. package/dist/common.js.map +1 -1
  38. package/dist/index-1yPxOqAw.cjs +13 -0
  39. package/dist/index-1yPxOqAw.cjs.map +1 -0
  40. package/dist/index-BH-V2lWn.js +510 -0
  41. package/dist/index-BH-V2lWn.js.map +1 -0
  42. package/dist/index-BelS6Vnv.cjs +2 -0
  43. package/dist/index-BelS6Vnv.cjs.map +1 -0
  44. package/dist/index-CERWfDdF.js +4571 -0
  45. package/dist/index-CERWfDdF.js.map +1 -0
  46. package/dist/index.cjs +1 -1
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +55 -50
  50. package/dist/index.js.map +1 -1
  51. package/dist/native/index.d.ts +3 -0
  52. package/dist/native/index.d.ts.map +1 -0
  53. package/dist/native.cjs +2 -0
  54. package/dist/native.cjs.map +1 -0
  55. package/dist/native.iife.js +97 -0
  56. package/dist/native.iife.js.map +1 -0
  57. package/dist/native.js +9 -0
  58. package/dist/native.js.map +1 -0
  59. package/dist/qna/components/TextInput.d.ts.map +1 -1
  60. package/dist/qna/components/renderUISpec.d.ts.map +1 -1
  61. package/dist/qna/index.d.ts +1 -0
  62. package/dist/qna/index.d.ts.map +1 -1
  63. package/dist/qna/types.d.ts +1 -1
  64. package/dist/qna/types.d.ts.map +1 -1
  65. package/dist/qna.cjs +1 -1
  66. package/dist/qna.cjs.map +1 -1
  67. package/dist/qna.css +1 -1
  68. package/dist/qna.iife.js +20 -20
  69. package/dist/qna.iife.js.map +1 -1
  70. package/dist/qna.js +92 -80
  71. package/dist/qna.js.map +1 -1
  72. package/dist/schemas-DHzfUzwA.cjs +86 -0
  73. package/dist/schemas-DHzfUzwA.cjs.map +1 -0
  74. package/dist/{schemas-B9GN-J3e.js → schemas-yF4IOEUi.js} +1088 -987
  75. package/dist/schemas-yF4IOEUi.js.map +1 -0
  76. package/dist/simrel/components/ProductCard.d.ts.map +1 -1
  77. package/dist/simrel.cjs +1 -1
  78. package/dist/simrel.cjs.map +1 -1
  79. package/dist/simrel.css +1 -1
  80. package/dist/simrel.iife.js +20 -20
  81. package/dist/simrel.iife.js.map +1 -1
  82. package/dist/simrel.js +218 -214
  83. package/dist/simrel.js.map +1 -1
  84. package/package.json +9 -2
  85. package/dist/index-eefqsSOT.cjs +0 -13
  86. package/dist/index-eefqsSOT.cjs.map +0 -1
  87. package/dist/index-kp84NL1R.js +0 -4399
  88. package/dist/index-kp84NL1R.js.map +0 -1
  89. package/dist/schemas-B9GN-J3e.js.map +0 -1
  90. package/dist/schemas-tCxs1sED.cjs +0 -86
  91. package/dist/schemas-tCxs1sED.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.iife.js","sources":["../src/common/renderer/dom.ts","../src/common/renderer/registry.ts","../src/common/analytics-events.ts","../src/common/events.ts","../src/common/context.ts","../src/common/ui-theme.ts","../src/common/global-error-toast.ts","../src/common/widget-base.ts","../src/common/uuidv7.ts","../src/common/communication-bridge.ts","../src/common/action-router.ts","../src/common/safe-html.ts","../src/chat/attachment-utils.ts","../src/common/streaming.ts","../src/common/v1-protocol-adapter.ts","../src/common/api-paths.ts","../src/chat/api.ts","../src/chat/locales/tr.ts","../src/chat/locales/en.ts","../src/chat/locales/index.ts","../src/common/voice-input.ts","../src/chat/components/KvkkBanner.ts","../src/chat/components/PanelTopBar.ts","../src/chat/components/ThumbnailsColumn.ts","../src/chat/components/ChatDrawer.ts","../src/chat/components/Launcher.ts","../src/chat/components/ProactivePopup.ts","../src/common/activity-tracker.ts","../src/common/tts-player.ts","../src/chat/heartbeat.ts","../src/common/price-formatter.ts","../src/chat/components/ComparisonTable.ts","../src/chat/components/ReviewHighlights.ts","../src/common/product-utils.ts","../src/chat/components/AITopPicks.ts","../src/chat/components/GroundingReviewCard.ts","../src/chat/components/AIGroupingCards.ts","../src/chat/components/AISuggestedSearchCards.ts","../src/chat/components/FloatingComparisonButton.ts","../src/chat/components/ProsAndCons.ts","../src/chat/components/CategoriesContainer.ts","../src/chat/components/HandoffNotice.ts","../src/chat/components/ProductSummaryCard.ts","../src/common/quantity-stepper.ts","../src/chat/components/renderUISpec.ts","../src/chat/components/typewriter.ts","../src/chat/components/productMentionLinker.ts","../src/chat/components/actionClassifier.ts","../src/chat/components/ChoicePrompter.ts","../src/common/indexed-db.ts","../src/chat/extendedModeManager.ts","../src/chat/panel-manager.ts","../src/chat/session-persistence.ts","../src/chat/kvkk.ts","../src/common/ga-datalayer.ts","../node_modules/zod/v4/core/core.js","../node_modules/zod/v4/core/util.js","../node_modules/zod/v4/core/errors.js","../node_modules/zod/v4/core/parse.js","../node_modules/zod/v4/core/regexes.js","../node_modules/zod/v4/core/checks.js","../node_modules/zod/v4/core/doc.js","../node_modules/zod/v4/core/versions.js","../node_modules/zod/v4/core/schemas.js","../node_modules/zod/v4/core/registries.js","../node_modules/zod/v4/core/api.js","../node_modules/zod/v4/core/to-json-schema.js","../node_modules/zod/v4/core/json-schema-processors.js","../node_modules/zod/v4/classic/iso.js","../node_modules/zod/v4/classic/errors.js","../node_modules/zod/v4/classic/parse.js","../node_modules/zod/v4/classic/schemas.js","../src/chat/index.ts","../src/qna/api.ts","../src/qna/components/ButtonRow.ts","../src/qna/components/TextInput.ts","../src/qna/components/renderUISpec.ts","../src/qna/locales/tr.ts","../src/qna/locales/en.ts","../src/qna/locales/index.ts","../src/qna/index.ts","../src/simrel/api.ts","../src/simrel/components/ProductCard.ts","../src/simrel/components/ProductGrid.ts","../src/simrel/components/GroupTabs.ts","../src/simrel/components/renderUISpec.ts","../src/simrel/locales/tr.ts","../src/simrel/locales/en.ts","../src/simrel/locales/index.ts","../src/simrel/index.ts","../src/common/config-schema.ts","../src/common/overlay.ts","../src/common/native-webview.ts"],"sourcesContent":["import type { UISpecDomUnknownRenderer, RenderUISpecWithRegistryOptions } from './types.js';\n\nexport const defaultUnknownUISpecRenderer: UISpecDomUnknownRenderer<unknown> = ({ element, renderElement }) => {\n if (!element.children || element.children.length === 0) {\n return null;\n }\n\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function renderUISpecWithRegistry<TContext>(options: RenderUISpecWithRegistryOptions<TContext>): HTMLElement {\n const container = document.createElement('div');\n container.className = options.containerClassName;\n\n const rootEl = options.spec.elements[options.spec.root];\n if (!rootEl) return container;\n\n const unknownRenderer =\n options.unknownRenderer ?? (defaultUnknownUISpecRenderer as UISpecDomUnknownRenderer<TContext>);\n\n const renderElement = (elementId: string): HTMLElement | null => {\n const element = options.spec.elements[elementId];\n if (!element) return null;\n\n const renderer = options.registry[element.type];\n if (renderer) {\n return renderer({\n elementId,\n element,\n spec: options.spec,\n context: options.context,\n renderElement,\n });\n }\n\n return unknownRenderer({\n elementId,\n element,\n spec: options.spec,\n context: options.context,\n renderElement,\n });\n };\n\n const rendered = renderElement(options.spec.root);\n if (rendered) container.appendChild(rendered);\n return container;\n}\n","import type { UISpecDomRegistry } from './types.js';\n\nexport function mergeUISpecRegistry<TContext>(\n base: UISpecDomRegistry<TContext>,\n overrides?: Partial<UISpecDomRegistry<TContext>>,\n): UISpecDomRegistry<TContext> {\n if (!overrides) return base;\n\n const merged: UISpecDomRegistry<TContext> = { ...base };\n for (const [componentName, renderer] of Object.entries(overrides)) {\n if (!renderer) continue;\n merged[componentName] = renderer;\n }\n return merged;\n}\n","import type { AnalyticsInput } from './analytics.js';\n\n// Context shared across all events in a page session\nexport interface AnalyticsContext {\n account_id: string;\n session_id: string;\n correlation_id: string;\n view_id?: string;\n user_id?: string;\n page_type?: string;\n sku?: string;\n ab_test_variant?: string;\n ab_test_experiment_id?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Stream Lifecycle\n// ---------------------------------------------------------------------------\n\nexport function streamStartEvent(\n ctx: AnalyticsContext,\n payload: {\n endpoint: string;\n request_id: string;\n widget?: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'stream.start',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n endpoint: payload.endpoint,\n request_id: payload.request_id,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (payload.widget !== undefined) event.widget = payload.widget;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function streamChunkEvent(\n ctx: AnalyticsContext,\n payload: {\n request_id: string;\n chunk_index: number;\n latency_ms?: number;\n widget?: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const eventPayload: Record<string, unknown> = {\n request_id: payload.request_id,\n chunk_index: payload.chunk_index,\n };\n if (payload.latency_ms !== undefined) eventPayload.latency_ms = payload.latency_ms;\n\n const event: AnalyticsInput = {\n event_name: 'stream.chunk',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: eventPayload,\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (payload.widget !== undefined) event.widget = payload.widget;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function streamUiSpecEvent(\n ctx: AnalyticsContext,\n payload: {\n request_id: string;\n chunk_index: number;\n component_type: string;\n widget?: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'stream.ui_spec',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n request_id: payload.request_id,\n chunk_index: payload.chunk_index,\n component_type: payload.component_type,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (payload.widget !== undefined) event.widget = payload.widget;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function streamDoneEvent(\n ctx: AnalyticsContext,\n payload: {\n request_id: string;\n latency_ms: number;\n chunk_count: number;\n widget?: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'stream.done',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n request_id: payload.request_id,\n latency_ms: payload.latency_ms,\n chunk_count: payload.chunk_count,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (payload.widget !== undefined) event.widget = payload.widget;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function streamErrorEvent(\n ctx: AnalyticsContext,\n payload: {\n request_id: string;\n error_code: string;\n error_message: string;\n widget?: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'stream.error',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n request_id: payload.request_id,\n error_code: payload.error_code,\n error_message: payload.error_message,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (payload.widget !== undefined) event.widget = payload.widget;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\n// ---------------------------------------------------------------------------\n// LLM Usage\n// ---------------------------------------------------------------------------\n\nexport function llmUsageEvent(\n ctx: AnalyticsContext,\n payload: {\n model: string;\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n provider?: string;\n },\n): AnalyticsInput {\n const eventPayload: Record<string, unknown> = {\n model: payload.model,\n prompt_tokens: payload.prompt_tokens,\n completion_tokens: payload.completion_tokens,\n total_tokens: payload.total_tokens,\n };\n if (payload.provider !== undefined) eventPayload.provider = payload.provider;\n\n const event: AnalyticsInput = {\n event_name: 'llm.usage',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: eventPayload,\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\n// ---------------------------------------------------------------------------\n// Metering\n// ---------------------------------------------------------------------------\n\nexport function meteringIncrementEvent(\n ctx: AnalyticsContext,\n payload: {\n meter_key: string;\n quantity: number;\n unit: string;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'metering.increment',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n meter_key: payload.meter_key,\n quantity: payload.quantity,\n unit: payload.unit,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function meteringSummaryEvent(\n ctx: AnalyticsContext,\n payload: {\n meter_key: string;\n quantity: number;\n unit: string;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'metering.summary',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n meter_key: payload.meter_key,\n quantity: payload.quantity,\n unit: payload.unit,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\n// ---------------------------------------------------------------------------\n// Chat and Widget Histories\n// ---------------------------------------------------------------------------\n\nexport function chatHistorySnapshotEvent(\n ctx: AnalyticsContext,\n payload: {\n message_count: number;\n history_ref: string;\n redaction_level: string;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'chat.history.snapshot',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n payload: {\n message_count: payload.message_count,\n history_ref: payload.history_ref,\n redaction_level: payload.redaction_level,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function widgetHistorySnapshotEvent(\n ctx: AnalyticsContext,\n payload: {\n message_count: number;\n history_ref: string;\n redaction_level: string;\n widget: 'chat' | 'qna' | 'simrel';\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'widget.history.snapshot',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n widget: payload.widget,\n payload: {\n message_count: payload.message_count,\n history_ref: payload.history_ref,\n redaction_level: payload.redaction_level,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\n// ---------------------------------------------------------------------------\n// Commerce Attribution\n// ---------------------------------------------------------------------------\n\nexport function basketAddEvent(\n ctx: AnalyticsContext,\n payload: {\n attribution_source: 'chat' | 'qna' | 'simrel';\n attribution_action_id: string;\n cart_value: number;\n currency: string;\n line_items: number;\n sku: string;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'basket.add',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n widget: payload.attribution_source,\n payload: {\n attribution_source: payload.attribution_source,\n attribution_action_id: payload.attribution_action_id,\n cart_value: payload.cart_value,\n currency: payload.currency,\n line_items: payload.line_items,\n sku: payload.sku,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function checkoutStartEvent(\n ctx: AnalyticsContext,\n payload: {\n attribution_source: 'chat' | 'qna' | 'simrel';\n attribution_action_id: string;\n cart_value: number;\n currency: string;\n line_items: number;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'checkout.start',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n widget: payload.attribution_source,\n payload: {\n attribution_source: payload.attribution_source,\n attribution_action_id: payload.attribution_action_id,\n cart_value: payload.cart_value,\n currency: payload.currency,\n line_items: payload.line_items,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n\nexport function checkoutCompleteEvent(\n ctx: AnalyticsContext,\n payload: {\n attribution_source: 'chat' | 'qna' | 'simrel';\n attribution_action_id: string;\n cart_value: number;\n currency: string;\n line_items: number;\n },\n): AnalyticsInput {\n const event: AnalyticsInput = {\n event_name: 'checkout.complete',\n account_id: ctx.account_id,\n session_id: ctx.session_id,\n correlation_id: ctx.correlation_id,\n widget: payload.attribution_source,\n payload: {\n attribution_source: payload.attribution_source,\n attribution_action_id: payload.attribution_action_id,\n cart_value: payload.cart_value,\n currency: payload.currency,\n line_items: payload.line_items,\n },\n };\n if (ctx.view_id !== undefined) event.view_id = ctx.view_id;\n if (ctx.user_id !== undefined) event.user_id = ctx.user_id;\n if (ctx.page_type !== undefined) event.page_type = ctx.page_type;\n if (ctx.sku !== undefined) event.sku = ctx.sku;\n return event;\n}\n","/**\n * Cross-widget event bus utilities.\n *\n * All Gengage widgets communicate through window CustomEvents following\n * the naming convention: gengage:<widget>:<action>\n *\n * This creates a loosely-coupled event bus — widgets don't import each other,\n * host pages can intercept any event, and third-party analytics can hook in.\n */\n\nimport type { GengageEventDetailMap, GengageEventName } from './types.js';\nimport type { ActionPayload } from './types.js';\n\n/**\n * Dispatch a typed Gengage event on window.\n *\n * @example\n * dispatch('gengage:qna:action', { title: 'About shipping', type: 'query', payload: 'shipping' });\n */\nexport function dispatch<K extends GengageEventName>(name: K, detail: GengageEventDetailMap[K]): void {\n window.dispatchEvent(new CustomEvent(name, { detail, bubbles: false }));\n}\n\n/**\n * Listen for a typed Gengage event on window.\n * Returns an unsubscribe function.\n *\n * @example\n * const off = listen('gengage:qna:action', (detail) => {\n * window.gengage?.chat?.openWithAction(detail);\n * });\n * // Later:\n * off();\n */\nexport function listen<K extends GengageEventName>(\n name: K,\n handler: (detail: GengageEventDetailMap[K]) => void,\n): () => void {\n const listener = (e: Event) => {\n handler((e as CustomEvent<GengageEventDetailMap[K]>).detail);\n };\n window.addEventListener(name, listener);\n return () => window.removeEventListener(name, listener);\n}\n\nexport interface WireQNAToChatOptions {\n onChatUnavailable?: () => void;\n}\n\ninterface WireableChatAPI {\n open?: (options?: { state?: 'full' | 'half'; initialMessage?: string }) => void;\n openWithAction?: (action: ActionPayload) => void;\n sendMessage?: (text: string) => void;\n}\n\nfunction extractFreeTextActionMessage(action: ActionPayload): string | null {\n if (action.type !== 'user_message' && action.type !== 'inputText') return null;\n\n if (typeof action.payload === 'string' && action.payload.trim().length > 0) {\n return action.payload.trim();\n }\n\n if (\n typeof action.payload === 'object' &&\n action.payload !== null &&\n typeof (action.payload as Record<string, unknown>).text === 'string'\n ) {\n const text = String((action.payload as Record<string, unknown>).text).trim();\n if (text.length > 0) return text;\n }\n\n if (typeof action.title === 'string' && action.title.trim().length > 0) {\n return action.title.trim();\n }\n\n return null;\n}\n\n/**\n * Convenience: wire QNA → Chat automatically.\n * Call this once after both widgets are initialised.\n *\n * Listens for 'gengage:qna:action' and forwards to window.gengage.chat.openWithAction().\n * Listens for 'gengage:qna:open-chat' and forwards to window.gengage.chat.open().\n *\n * If chat is not available at dispatch time, emits a one-time console.warn and\n * calls options.onChatUnavailable (every time) if provided.\n *\n * @returns unsubscribe function that removes both listeners.\n */\nexport function wireQNAToChat(options?: WireQNAToChatOptions): () => void {\n let warnedOnce = false;\n const pendingActions: ActionPayload[] = [];\n let pendingOpenCount = 0;\n let pollTimer: number | null = null;\n let pollStartedAt = 0;\n const pollIntervalMs = 100;\n const pollTimeoutMs = 5000;\n\n function getChat(): WireableChatAPI | null {\n return (window.gengage?.chat as WireableChatAPI | undefined) ?? null;\n }\n\n function notifyUnavailable(): void {\n if (!warnedOnce) {\n console.warn(\n '[gengage] QNA tried to open chat, but chat widget is not initialized. ' +\n 'Ensure GengageChat is initialized before calling wireQNAToChat().',\n );\n warnedOnce = true;\n }\n options?.onChatUnavailable?.();\n }\n\n function routeActionToChat(chat: WireableChatAPI, action: ActionPayload): void {\n const freeText = extractFreeTextActionMessage(action);\n if (freeText && chat.sendMessage) {\n chat.open?.();\n chat.sendMessage(freeText);\n return;\n }\n chat.openWithAction?.(action);\n }\n\n function clearPollTimer(): void {\n if (pollTimer !== null) {\n window.clearInterval(pollTimer);\n pollTimer = null;\n }\n }\n\n function flushPendingToChat(): boolean {\n const chat = getChat();\n if (!chat) return false;\n\n if (pendingOpenCount > 0) {\n chat.open?.();\n pendingOpenCount = 0;\n }\n\n if (pendingActions.length > 0) {\n const queued = pendingActions.splice(0, pendingActions.length);\n for (const action of queued) {\n routeActionToChat(chat, action);\n }\n }\n\n clearPollTimer();\n return true;\n }\n\n function ensurePollTimer(): void {\n if (pollTimer !== null) return;\n pollStartedAt = Date.now();\n pollTimer = window.setInterval(() => {\n if (flushPendingToChat()) return;\n if (Date.now() - pollStartedAt >= pollTimeoutMs) {\n pendingActions.length = 0;\n pendingOpenCount = 0;\n clearPollTimer();\n }\n }, pollIntervalMs);\n }\n\n const offAction = listen('gengage:qna:action', (action) => {\n const chat = getChat();\n if (chat) {\n routeActionToChat(chat, action);\n return;\n }\n\n notifyUnavailable();\n if (pendingActions.length >= 20) pendingActions.shift();\n pendingActions.push(action);\n ensurePollTimer();\n });\n\n const offOpen = listen('gengage:qna:open-chat', () => {\n const chat = getChat();\n if (chat) {\n chat.open?.();\n return;\n }\n\n notifyUnavailable();\n pendingOpenCount += 1;\n ensurePollTimer();\n });\n\n return () => {\n offAction();\n offOpen();\n pendingActions.length = 0;\n pendingOpenCount = 0;\n clearPollTimer();\n };\n}\n\n/**\n * Convenience: wire Similar Products → Chat for cross-page session continuity.\n * Call this once after both widgets are initialised.\n *\n * When the user navigates to a product page, the chat widget can restore\n * the conversation where it left off using saveSession().\n *\n * @returns unsubscribe function.\n */\nexport function wireSimilarToChat(): () => void {\n return listen('gengage:similar:product-click', ({ sku, url, sessionId }) => {\n if (sessionId) {\n window.gengage?.chat?.saveSession(sessionId, sku);\n }\n window.location.href = url;\n });\n}\n","/**\n * Page context management.\n *\n * Best practice for passing page context to widgets:\n *\n * ## SSR / Static pages\n * Set window.gengage.pageContext before widget scripts load:\n *\n * <script>\n * window.gengage = {\n * pageContext: {\n * pageType: 'pdp',\n * sku: '{{ product.sku }}',\n * price: '{{ product.price }}',\n * categoryTree: {{ product.categories | json }},\n * }\n * };\n * </script>\n * <script src=\"https://cdn.gengage.ai/widgets/latest/chat.iife.js\"></script>\n *\n * ## CSR / SPA (React, Vue, Next.js, etc.)\n * Call widget.update() after each navigation:\n *\n * router.afterEach((to) => {\n * chatWidget.update({\n * pageType: to.meta.pageType,\n * sku: to.params.sku,\n * });\n * });\n *\n * ## Event-based (loosest coupling)\n * Dispatch 'gengage:context:update' from anywhere:\n *\n * window.dispatchEvent(new CustomEvent('gengage:context:update', {\n * detail: { pageType: 'pdp', sku: '12345' }\n * }));\n */\n\nimport type { PageContext, SessionContext } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Session bootstrap\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the shared session ID for this browser tab session.\n * Creates and persists it on first call.\n *\n * Call this once at page load and share the result with all widget configs:\n *\n * const sessionId = bootstrapSession();\n * chatWidget.init({ ..., session: { sessionId } });\n * qnaWidget.init({ ..., session: { sessionId } });\n */\nexport function bootstrapSession(): string {\n const existing = window.__gengageSessionId ?? sessionStorage.getItem('gengage_session_id') ?? null;\n\n const sessionId = existing ?? crypto.randomUUID();\n\n window.__gengageSessionId = sessionId;\n sessionStorage.setItem('gengage_session_id', sessionId);\n\n if (!window.gengage) window.gengage = {};\n window.gengage.sessionId = sessionId;\n\n return sessionId;\n}\n\n// ---------------------------------------------------------------------------\n// Page context resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Reads the current page context from window.gengage.pageContext.\n * Returns null if not set.\n */\nexport function getWindowPageContext(): PageContext | null {\n return window.gengage?.pageContext ?? null;\n}\n\n/**\n * Merges a partial context update into the current window.gengage.pageContext.\n * Dispatches 'gengage:context:update' so all listening widgets update.\n */\nexport function updatePageContext(patch: Partial<PageContext>): void {\n if (!window.gengage) window.gengage = {};\n window.gengage.pageContext = {\n pageType: 'other',\n ...window.gengage.pageContext,\n ...patch,\n };\n\n window.dispatchEvent(new CustomEvent('gengage:context:update', { detail: patch }));\n}\n\n/**\n * Resolves the session context, bootstrapping if necessary.\n * Merges provided overrides with auto-generated session ID.\n */\nexport function resolveSession(overrides?: Partial<SessionContext>): SessionContext {\n const sessionId = overrides?.sessionId ?? bootstrapSession();\n return {\n sessionId,\n ...overrides,\n };\n}\n","import type { WidgetTheme } from './types.js';\n\n/**\n * Shared SDK-wide visual tokens.\n *\n * Applied to every widget root by default so account customizations only\n * override what they need.\n */\nexport const DEFAULT_WIDGET_THEME_TOKENS: WidgetTheme = {\n '--gengage-chat-offset': '20px',\n '--gengage-chat-launcher-size': '56px',\n '--gengage-chat-width': '400px',\n '--gengage-chat-shell-radius': '12px',\n '--gengage-chat-header-height': '60px',\n '--gengage-chat-conversation-width': '396px',\n '--gengage-chat-panel-min-width': '320px',\n '--gengage-chat-panel-max-width': '860px',\n '--gengage-chat-input-height': '48px',\n\n '--gengage-qna-pill-radius': '999px',\n '--gengage-qna-input-radius': '14px',\n\n '--gengage-simrel-card-radius': '14px',\n};\n\nexport function withDefaultWidgetTheme(theme?: WidgetTheme): WidgetTheme {\n if (!theme) {\n return { ...DEFAULT_WIDGET_THEME_TOKENS };\n }\n return { ...DEFAULT_WIDGET_THEME_TOKENS, ...theme };\n}\n","import type { GengageEventDetailMap } from './types.js';\nimport { listen } from './events.js';\n\nconst ROOT_ID = 'gengage-global-toast-root';\nconst STYLE_ID = 'gengage-global-toast-style';\nconst ROOT_VISIBLE_CLASS = 'gengage-global-toast-root--visible';\nconst DEFAULT_DURATION_MS = 4200;\nconst MIN_DURATION_MS = 1500;\nconst MAX_DURATION_MS = 15000;\n\nlet listenerRegistered = false;\nlet dismissTimer: ReturnType<typeof setTimeout> | null = null;\n\nexport function getGlobalErrorMessage(locale?: string): string {\n if (typeof locale === 'string' && locale.toLowerCase().startsWith('tr')) {\n return 'Baglanti sorunu olustu. Lutfen tekrar deneyin.';\n }\n return 'Connection issue. Please try again.';\n}\n\nexport function registerGlobalErrorToastListener(): void {\n if (listenerRegistered || typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n listenerRegistered = true;\n listen('gengage:global:error', (detail) => {\n showGlobalErrorToast(detail);\n });\n}\n\nexport function showGlobalErrorToast(detail: GengageEventDetailMap['gengage:global:error']): void {\n if (typeof document === 'undefined') return;\n const message = detail.message.trim();\n if (!message) return;\n\n ensureStyles();\n const root = ensureRoot();\n root.innerHTML = '';\n\n const toast = document.createElement('section');\n toast.className = 'gengage-global-toast gengage-global-toast--error';\n toast.setAttribute('role', 'status');\n toast.setAttribute('aria-live', 'polite');\n\n const title = document.createElement('div');\n title.className = 'gengage-global-toast-title';\n title.textContent = sourceTitle(detail.source);\n\n const body = document.createElement('div');\n body.className = 'gengage-global-toast-message';\n body.textContent = message;\n\n toast.appendChild(title);\n toast.appendChild(body);\n root.appendChild(toast);\n root.classList.add(ROOT_VISIBLE_CLASS);\n\n if (dismissTimer) {\n clearTimeout(dismissTimer);\n dismissTimer = null;\n }\n\n dismissTimer = setTimeout(() => {\n dismissGlobalErrorToast();\n }, clampDuration(detail.durationMs));\n}\n\nexport function dismissGlobalErrorToast(): void {\n if (typeof document === 'undefined') return;\n const root = document.getElementById(ROOT_ID);\n if (!root) return;\n\n root.classList.remove(ROOT_VISIBLE_CLASS);\n root.innerHTML = '';\n\n if (dismissTimer) {\n clearTimeout(dismissTimer);\n dismissTimer = null;\n }\n}\n\nfunction sourceTitle(source: GengageEventDetailMap['gengage:global:error']['source']): string {\n switch (source) {\n case 'chat':\n return 'Chat warning';\n case 'qna':\n return 'QnA warning';\n case 'simrel':\n return 'Widget warning';\n default:\n return 'Connection warning';\n }\n}\n\nfunction ensureRoot(): HTMLElement {\n const existing = document.getElementById(ROOT_ID);\n if (existing instanceof HTMLElement) return existing;\n\n const root = document.createElement('div');\n root.id = ROOT_ID;\n root.className = 'gengage-global-toast-root';\n document.body.appendChild(root);\n return root;\n}\n\nfunction clampDuration(durationMs?: number): number {\n if (typeof durationMs !== 'number' || !Number.isFinite(durationMs)) {\n return DEFAULT_DURATION_MS;\n }\n return Math.min(MAX_DURATION_MS, Math.max(MIN_DURATION_MS, Math.round(durationMs)));\n}\n\nfunction ensureStyles(): void {\n if (document.getElementById(STYLE_ID)) return;\n\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = `\n#${ROOT_ID} {\n position: fixed;\n top: 16px;\n right: 16px;\n z-index: 2147483646;\n pointer-events: none;\n}\n#${ROOT_ID}.${ROOT_VISIBLE_CLASS} {\n pointer-events: auto;\n}\n#${ROOT_ID} .gengage-global-toast {\n min-width: 260px;\n max-width: min(92vw, 420px);\n border-radius: 12px;\n border: 1px solid #f5c2c7;\n border-left: 4px solid #d93025;\n background: #fff9f9;\n color: #4a1f21;\n box-shadow: 0 10px 30px rgba(38, 18, 18, 0.18);\n padding: 10px 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 13px;\n line-height: 1.4;\n animation: gengage-global-toast-in 180ms ease-out forwards;\n}\n#${ROOT_ID} .gengage-global-toast-title {\n margin: 0 0 4px;\n font-size: 12px;\n font-weight: 700;\n}\n#${ROOT_ID} .gengage-global-toast-message {\n margin: 0;\n font-weight: 500;\n}\n@keyframes gengage-global-toast-in {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n`;\n document.head.appendChild(style);\n}\n","/**\n * Abstract base class for all Gengage widgets.\n *\n * Provides:\n * - Lifecycle management (init → update → show/hide → destroy)\n * - Typed event emitter\n * - Theme application via CSS custom properties\n * - SPA context-update listener (gengage:context:update)\n * - Mount target resolution (selector string or HTMLElement)\n *\n * Subclasses must implement:\n * - protected onInit(config): Promise<void>\n * - protected onUpdate(context): void\n * - protected onShow(): void\n * - protected onHide(): void\n * - protected onDestroy(): void\n */\n\nimport type { BaseWidgetConfig, GengageWidget, PageContext, WidgetTheme } from './types.js';\nimport type { AnalyticsInput } from './analytics.js';\nimport type { AnalyticsContext } from './analytics-events.js';\nimport { checkoutStartEvent, checkoutCompleteEvent, meteringSummaryEvent } from './analytics-events.js';\nimport { listen } from './events.js';\nimport { resolveSession } from './context.js';\nimport { withDefaultWidgetTheme } from './ui-theme.js';\nimport { registerGlobalErrorToastListener } from './global-error-toast.js';\n\ntype AnyHandler = (...args: unknown[]) => void;\n\nexport abstract class BaseWidget<\n TConfig extends BaseWidgetConfig = BaseWidgetConfig,\n> implements GengageWidget<TConfig> {\n protected config!: TConfig;\n protected root!: HTMLElement;\n protected isVisible = false;\n protected isInitialised = false;\n\n private readonly _handlers = new Map<string, Set<AnyHandler>>();\n private readonly _cleanups: Array<() => void> = [];\n private _ownsRoot = false;\n private _destroying = false;\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n async init(config: TConfig): Promise<void> {\n if (this.isInitialised) {\n console.warn('[gengage] Widget already initialised. Call update() instead.');\n return;\n }\n\n const mergedTheme = withDefaultWidgetTheme(config.theme);\n\n this.config = {\n ...config,\n theme: mergedTheme,\n session: resolveSession(config.session),\n };\n\n this.root = this._resolveMount(config.mountTarget);\n this._applyTheme(mergedTheme);\n registerGlobalErrorToastListener();\n\n // Listen for context updates dispatched by the host page\n const off = listen('gengage:context:update', (patch) => this.update(patch));\n this._cleanups.push(off);\n\n try {\n await this.onInit(this.config);\n } catch (err) {\n this.destroy();\n throw err;\n }\n this.isInitialised = true;\n this.emit('ready');\n }\n\n update(context: Partial<PageContext>): void {\n if (!this.isInitialised) return;\n if (this.config.pageContext) {\n this.config = {\n ...this.config,\n pageContext: { ...this.config.pageContext, ...context },\n };\n } else if (context.pageType !== undefined) {\n // Only create a new pageContext when pageType is present (required field)\n this.config = { ...this.config, pageContext: context as PageContext };\n }\n this.onUpdate(context);\n this.emit('context-update', this.config.pageContext);\n }\n\n show(): void {\n if (this.isVisible) return;\n this.isVisible = true;\n this.root.style.display = '';\n this.onShow();\n this.emit('show');\n }\n\n hide(): void {\n if (!this.isVisible) return;\n this.isVisible = false;\n this.root.style.display = 'none';\n this.onHide();\n this.emit('hide');\n }\n\n destroy(): void {\n if (this._destroying) return;\n this._destroying = true;\n this.emit('destroy');\n this._cleanups.forEach((fn) => fn());\n this._cleanups.length = 0;\n this._handlers.clear();\n this.onDestroy();\n this.config.analyticsClient?.destroy();\n if (this._ownsRoot) {\n this.root.remove();\n } else {\n this.root.innerHTML = '';\n }\n this.isInitialised = false;\n }\n\n on(event: string, handler: AnyHandler): () => void {\n if (!this._handlers.has(event)) this._handlers.set(event, new Set());\n this._handlers.get(event)!.add(handler);\n return () => this._handlers.get(event)?.delete(handler);\n }\n\n /** Track a checkout start event. Called by host page to attribute checkout to widget interaction. */\n trackCheckout(\n type: 'start' | 'complete',\n data: {\n attribution_source: 'chat' | 'qna' | 'simrel';\n attribution_action_id: string;\n cart_value: number;\n currency: string;\n line_items: number;\n },\n ): void {\n const builder = type === 'start' ? checkoutStartEvent : checkoutCompleteEvent;\n this.track(builder(this.analyticsContext(), data));\n }\n\n /** Track a metering summary event. Called by host page for session-level aggregation. */\n flushMeteringSummary(data: { meter_key: string; quantity: number; unit: string }): void {\n this.track(meteringSummaryEvent(this.analyticsContext(), data));\n }\n\n // ---------------------------------------------------------------------------\n // Protected — subclasses implement these\n // ---------------------------------------------------------------------------\n\n protected abstract onInit(config: TConfig): Promise<void>;\n protected abstract onUpdate(context: Partial<PageContext>): void;\n protected abstract onShow(): void;\n protected abstract onHide(): void;\n protected abstract onDestroy(): void;\n\n // ---------------------------------------------------------------------------\n // Protected helpers\n // ---------------------------------------------------------------------------\n\n /** Emit a widget event to all registered handlers. */\n protected emit(event: string, ...args: unknown[]): void {\n this._handlers.get(event)?.forEach((h) => h(...args));\n }\n\n /** Register a cleanup function to run on destroy(). */\n protected addCleanup(fn: () => void): void {\n this._cleanups.push(fn);\n }\n\n /** Track an analytics event (no-op if analyticsClient is not configured). */\n protected track(input: AnalyticsInput): void {\n this.config.analyticsClient?.track(input);\n }\n\n /** Build the shared analytics context from widget config. */\n protected analyticsContext(): AnalyticsContext {\n const ctx: AnalyticsContext = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n };\n if (this.config.session?.viewId !== undefined) ctx.view_id = this.config.session.viewId;\n if (this.config.session?.userId !== undefined) ctx.user_id = this.config.session.userId;\n if (this.config.pageContext?.pageType !== undefined) ctx.page_type = this.config.pageContext.pageType;\n if (this.config.pageContext?.sku !== undefined) ctx.sku = this.config.pageContext.sku;\n if (this.config.session?.abTestVariant !== undefined) ctx.ab_test_variant = this.config.session.abTestVariant;\n if (this.config.session?.abTestExperimentId !== undefined)\n ctx.ab_test_experiment_id = this.config.session.abTestExperimentId;\n return ctx;\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private _resolveMount(target?: HTMLElement | string): HTMLElement {\n if (target instanceof HTMLElement) return target;\n if (typeof target === 'string') {\n const el = document.querySelector<HTMLElement>(target);\n if (!el) throw new Error(`[gengage] Mount target not found: \"${target}\"`);\n return el;\n }\n // Default: create a div appended to body — widget owns it and will remove on destroy\n const div = document.createElement('div');\n div.dataset['gengageWidget'] = this.constructor.name.toLowerCase();\n document.body.appendChild(div);\n this._ownsRoot = true;\n return div;\n }\n\n private _applyTheme(theme?: WidgetTheme): void {\n if (!theme) return;\n for (const [key, value] of Object.entries(theme)) {\n if (value !== undefined) {\n const prop = key.startsWith('--') ? key : `--gengage-${toKebab(key)}`;\n this.root.style.setProperty(prop, value);\n }\n }\n }\n}\n\nfunction toKebab(str: string): string {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n// ---------------------------------------------------------------------------\n// Chat widget public API (exposed on window.gengage.chat)\n// ---------------------------------------------------------------------------\n\nexport interface ChatPublicAPI {\n open(options?: { state?: 'full' | 'half'; initialMessage?: string }): void;\n openWithAction(action: import('./types.js').ActionPayload, options?: { sku?: string; state?: 'full' | 'half' }): void;\n /** Send a user message programmatically (same as typing + submit). */\n sendMessage(text: string): void;\n /** Send a backend action programmatically. */\n sendAction(action: import('./types.js').ActionPayload, options?: { silent?: boolean }): void;\n close(): void;\n saveSession(sessionId: string, sku: string): void;\n readonly isOpen: boolean;\n on(\n event: 'open' | 'close' | 'ready' | 'message' | 'error' | 'context-update' | 'destroy',\n handler: (...args: unknown[]) => void,\n ): () => void;\n trackCheckout(\n type: 'start' | 'complete',\n data: {\n attribution_source: 'chat' | 'qna' | 'simrel';\n attribution_action_id: string;\n cart_value: number;\n currency: string;\n line_items: number;\n },\n ): void;\n flushMeteringSummary(data: { meter_key: string; quantity: number; unit: string }): void;\n /**\n * Register a callback for a GA4 event name.\n * When the widget fires that event, the callback is invoked with the event detail.\n * Callbacks that return `false` or throw signal failure — the widget reacts accordingly\n * (e.g. showing an error message for add-to-cart failures).\n *\n * @returns unsubscribe function\n */\n addCallback(eventName: string, callback: (detail: Record<string, unknown>) => boolean | Promise<boolean>): () => void;\n}\n","/**\n * Zero-dependency UUIDv7 generator.\n *\n * 48-bit Unix-ms timestamp + random bits, version nibble 0x7, variant 0b10.\n * Lexicographically sortable — critical for thread ordering (threadA < threadB).\n */\n\nexport function uuidv7(): string {\n const now = Date.now();\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // 48-bit timestamp (big-endian) in bytes 0–5\n bytes[0] = (now / 2 ** 40) & 0xff;\n bytes[1] = (now / 2 ** 32) & 0xff;\n bytes[2] = (now / 2 ** 24) & 0xff;\n bytes[3] = (now / 2 ** 16) & 0xff;\n bytes[4] = (now / 2 ** 8) & 0xff;\n bytes[5] = now & 0xff;\n\n // Version 7: set high nibble of byte 6\n bytes[6] = (bytes[6]! & 0x0f) | 0x70;\n\n // Variant 10xx: set high bits of byte 8\n bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n","/**\n * Two-way communication bridge between the host page and embedded widgets.\n *\n * Host -> Widget: The host sends `window.postMessage({ gengage, type, payload })`.\n * The bridge validates the origin, checks the namespace, and routes to handlers.\n *\n * Widget -> Host: The bridge dispatches a `CustomEvent('gengage:bridge:message')`\n * on window so the host can listen without tight coupling.\n *\n * Built-in message types:\n * - 'addToCart' -- host confirms cart addition\n * - 'navigate' -- host navigates to URL\n * - 'openChat' -- programmatic open\n * - 'closeChat' -- programmatic close\n * - 'getContext' -- host requests current context\n */\n\nexport interface BridgeMessage {\n type: string;\n payload?: unknown;\n}\n\nexport interface CommunicationBridgeOptions {\n /** Widget namespace for message identification (e.g. 'chat', 'qna'). */\n namespace: string;\n /** Allowed origins for postMessage security (default: ['*']). */\n allowedOrigins?: string[];\n /** Callback when a message is received from the host. */\n onMessage?: (msg: BridgeMessage) => void;\n}\n\ntype BridgeHandler = (payload: unknown) => void;\n\nexport class CommunicationBridge {\n private readonly _namespace: string;\n private readonly _allowedOrigins: readonly string[];\n private readonly _onMessage: ((msg: BridgeMessage) => void) | undefined;\n private readonly _handlers = new Map<string, Set<BridgeHandler>>();\n private readonly _messageListener: (event: MessageEvent) => void;\n private _destroyed = false;\n\n constructor(options: CommunicationBridgeOptions) {\n this._namespace = options.namespace;\n // KNOWN TECH DEBT [SECURITY]: Default wildcard origin ['*'] silently accepts\n // postMessages from any cross-origin iframe in production. An attacker on an\n // unrelated domain can send { gengage: 'chat', type: 'openChat' } to trigger\n // widget actions. Tracked for fix: default to [location.origin] and require\n // explicit opt-in for wildcard. Risk is mitigated by: (1) message shape\n // validation (gengage namespace + type), (2) no destructive actions exposed\n // through bridge, (3) host page typically controls all iframes.\n this._allowedOrigins = options.allowedOrigins ?? ['*'];\n this._onMessage = options.onMessage;\n\n if (this._allowedOrigins.includes('*') && import.meta.env?.DEV) {\n console.warn('[gengage] Wildcard origin \"*\" disables postMessage security. Set allowedOrigins in production.');\n }\n\n this._messageListener = (event: MessageEvent) => this._handlePostMessage(event);\n window.addEventListener('message', this._messageListener);\n }\n\n /** Send a message to the host page via CustomEvent on window. */\n send(type: string, payload?: unknown): void {\n if (this._destroyed) return;\n\n const detail: { namespace: string; type: string; payload?: unknown } = {\n namespace: this._namespace,\n type,\n };\n if (payload !== undefined) {\n detail.payload = payload;\n }\n\n window.dispatchEvent(\n new CustomEvent('gengage:bridge:message', {\n detail,\n bubbles: false,\n }),\n );\n }\n\n /**\n * Register a handler for a specific message type.\n * Returns an unsubscribe function.\n */\n on(type: string, handler: BridgeHandler): () => void {\n if (!this._handlers.has(type)) {\n this._handlers.set(type, new Set());\n }\n // The Map.get is guaranteed non-null after the set above\n const handlers = this._handlers.get(type)!;\n handlers.add(handler);\n\n return () => {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this._handlers.delete(type);\n }\n };\n }\n\n /** Clean up all event listeners and handlers. */\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n window.removeEventListener('message', this._messageListener);\n this._handlers.clear();\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private _handlePostMessage(event: MessageEvent): void {\n if (this._destroyed) return;\n\n // Validate origin\n if (!this._isOriginAllowed(event.origin)) return;\n\n // Validate message shape: must be an object with { gengage, type }\n const data: unknown = event.data;\n if (!isValidBridgeData(data)) return;\n\n // Only process messages targeting this namespace\n if (data.gengage !== this._namespace) return;\n\n const msg: BridgeMessage = { type: data.type };\n if (data.payload !== undefined) {\n msg.payload = data.payload;\n }\n\n // Invoke the general onMessage callback\n this._onMessage?.(msg);\n\n // Route to type-specific handlers\n const handlers = this._handlers.get(msg.type);\n if (handlers) {\n for (const handler of handlers) {\n handler(msg.payload);\n }\n }\n }\n\n private _isOriginAllowed(origin: string): boolean {\n if (this._allowedOrigins.includes('*')) return true;\n return this._allowedOrigins.includes(origin);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Shape guard for incoming postMessage data. */\nfunction isValidBridgeData(data: unknown): data is { gengage: string; type: string; payload?: unknown } {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n return typeof obj['gengage'] === 'string' && typeof obj['type'] === 'string';\n}\n","import type { UnknownActionPolicy } from './config-schema.js';\nimport type { ActionPayload, StreamEventAction } from './types.js';\n\nexport interface HostActionHandlers {\n openChat?: (payload?: ActionPayload | unknown) => void;\n navigate?: (params: { url: string; newTab?: boolean }) => void;\n saveSession?: (params: { sessionId: string; sku: string }) => void;\n addToCart?: (params: { sku: string; quantity: number; cartCode: string }) => void;\n scriptCall?: (params: { name: string; payload?: Record<string, unknown> }) => void;\n unknown?: (action: StreamEventAction['action']) => void;\n}\n\nexport interface ActionRouterOptions {\n allowScriptCall?: boolean;\n unknownActionPolicy?: UnknownActionPolicy;\n logger?: Pick<Console, 'warn' | 'error' | 'debug'>;\n}\n\nconst defaultLogger: Pick<Console, 'warn' | 'error' | 'debug'> = console;\n\nexport function routeStreamAction(\n event: StreamEventAction,\n handlers: HostActionHandlers,\n options: ActionRouterOptions = {},\n): void {\n const action = event.action;\n const logger = options.logger ?? defaultLogger;\n\n switch (action.kind) {\n case 'open_chat': {\n handlers.openChat?.(action.payload);\n return;\n }\n case 'navigate': {\n if (typeof action.url !== 'string') {\n handleUnknownAction(action, handlers, options, logger);\n return;\n }\n const newTab = typeof action.newTab === 'boolean' ? action.newTab : undefined;\n if (handlers.navigate) {\n if (newTab !== undefined) {\n handlers.navigate({ url: action.url, newTab });\n } else {\n handlers.navigate({ url: action.url });\n }\n return;\n }\n defaultNavigate(action.url, newTab);\n return;\n }\n case 'save_session': {\n if (typeof action.sessionId !== 'string' || typeof action.sku !== 'string') {\n handleUnknownAction(action, handlers, options, logger);\n return;\n }\n handlers.saveSession?.({ sessionId: action.sessionId, sku: action.sku });\n return;\n }\n case 'add_to_cart': {\n if (\n typeof action.sku !== 'string' ||\n typeof action.quantity !== 'number' ||\n typeof action.cartCode !== 'string'\n ) {\n handleUnknownAction(action, handlers, options, logger);\n return;\n }\n handlers.addToCart?.({\n sku: action.sku,\n quantity: action.quantity,\n cartCode: action.cartCode,\n });\n return;\n }\n case 'script_call': {\n if (options.allowScriptCall === false) {\n handleUnknownAction(action, handlers, options, logger);\n return;\n }\n if (typeof action.name !== 'string') {\n handleUnknownAction(action, handlers, options, logger);\n return;\n }\n const payload = isRecord(action.payload) ? action.payload : undefined;\n if (payload !== undefined) {\n handlers.scriptCall?.({ name: action.name, payload });\n } else {\n handlers.scriptCall?.({ name: action.name });\n }\n return;\n }\n default: {\n handleUnknownAction(action, handlers, options, logger);\n }\n }\n}\n\nfunction handleUnknownAction(\n action: StreamEventAction['action'],\n handlers: HostActionHandlers,\n options: ActionRouterOptions,\n logger: Pick<Console, 'warn' | 'error' | 'debug'>,\n): void {\n const policy = options.unknownActionPolicy ?? 'log-and-ignore';\n if (policy === 'delegate') {\n handlers.unknown?.(action);\n if (!handlers.unknown) {\n logger.warn('[gengage] Unknown action received without delegate handler', action);\n }\n return;\n }\n\n if (policy === 'throw') {\n throw new Error(`[gengage] Unknown action kind: ${(action as { kind?: unknown }).kind}`);\n }\n\n logger.warn('[gengage] Unknown action ignored', action);\n}\n\nfunction defaultNavigate(url: string, newTab?: boolean): void {\n if (typeof window === 'undefined') return;\n if (newTab) {\n window.open(url, '_blank', 'noopener,noreferrer');\n return;\n }\n window.location.href = url;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","/**\n * DOMParser-based HTML sanitizer.\n *\n * Backend sends HTML in assistant messages (e.g. KVKK notice).\n * This module strips dangerous elements/attributes while preserving\n * safe formatting tags.\n *\n * WARNING: Any new injection point that uses innerHTML must call this function first.\n */\n\nconst ALLOWED_TAGS = new Set([\n 'p',\n 'br',\n 'a',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'span',\n 'div',\n 'table',\n 'thead',\n 'tbody',\n 'tr',\n 'th',\n 'td',\n 'hr',\n 'code',\n 'pre',\n 'blockquote',\n 'img',\n 'sup',\n 'sub',\n]);\n\n/** Elements removed entirely (children NOT promoted). */\nconst DISALLOWED_TAGS = new Set([\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'form',\n 'input',\n 'textarea',\n 'select',\n 'button',\n 'style',\n 'link',\n 'meta',\n]);\n\n/**\n * Attributes allowed per-tag. `'*'` means any allowed tag.\n *\n * KNOWN TECH DEBT [SECURITY]: `style` attribute on div/span/p enables CSS-based XSS vectors:\n * - `style=\"background:url(javascript:alert(1))\"` bypasses hasJavascriptProtocol\n * (which checks the raw attribute value, not nested CSS url() arguments)\n * - `style=\"expression(alert(1))\"` on legacy IE\n * - `style=\"-moz-binding:url(...)\"` on older Firefox\n * Tracked for fix: either remove `style` from ALLOWED_ATTRS entirely, or implement\n * a CSS property sanitizer that allowlists specific properties and validates values.\n * Also add `<template>` to DISALLOWED_TAGS for defense-in-depth.\n * Risk is mitigated by: (1) modern browsers block javascript: in CSS url(),\n * (2) backend is trusted first-party, (3) only relevant if backend is compromised.\n */\nconst ALLOWED_ATTRS: Record<string, Set<string>> = {\n '*': new Set(['class']),\n a: new Set(['href', 'target', 'rel']),\n img: new Set(['src', 'alt', 'width', 'height']),\n div: new Set(['style']),\n span: new Set(['style']),\n p: new Set(['style']),\n};\n\nfunction hasJavascriptProtocol(value: string): boolean {\n // Normalize whitespace + case then check\n return /^\\s*javascript\\s*:/i.test(value);\n}\n\nfunction sanitizeNode(node: Node, parent: Node): void {\n if (node.nodeType === Node.TEXT_NODE) return;\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n node.parentNode?.removeChild(node);\n return;\n }\n\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n\n // Disallowed: remove entirely (including children)\n if (DISALLOWED_TAGS.has(tag)) {\n el.parentNode?.removeChild(el);\n return;\n }\n\n // Unknown: unwrap (promote children to parent)\n if (!ALLOWED_TAGS.has(tag)) {\n const children = Array.from(el.childNodes);\n for (const child of children) {\n parent.insertBefore(child, el);\n }\n parent.removeChild(el);\n // Sanitize promoted children\n for (const child of children) {\n sanitizeNode(child, parent);\n }\n return;\n }\n\n // Sanitize attributes\n const globalAllowed = ALLOWED_ATTRS['*'] ?? new Set();\n const tagAllowed = ALLOWED_ATTRS[tag] ?? new Set();\n const attrs = Array.from(el.attributes);\n\n for (const attr of attrs) {\n const name = attr.name.toLowerCase();\n\n if (!globalAllowed.has(name) && !tagAllowed.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Strip javascript: protocol from any attribute value\n if (hasJavascriptProtocol(attr.value)) {\n el.removeAttribute(attr.name);\n continue;\n }\n }\n\n // Validate specific attribute values\n if (tag === 'a') {\n const href = el.getAttribute('href');\n if (href !== null) {\n const trimmed = href.trim().toLowerCase();\n if (!trimmed.startsWith('http://') && !trimmed.startsWith('https://') && !trimmed.startsWith('mailto:')) {\n el.removeAttribute('href');\n }\n }\n // Force safe link behavior\n el.setAttribute('target', '_blank');\n el.setAttribute('rel', 'noopener noreferrer');\n }\n\n if (tag === 'img') {\n const src = el.getAttribute('src');\n if (src !== null) {\n const trimmed = src.trim().toLowerCase();\n if (!trimmed.startsWith('https://')) {\n el.removeAttribute('src');\n }\n }\n }\n\n // Recurse into children (snapshot the list since we may mutate)\n const children = Array.from(el.childNodes);\n for (const child of children) {\n sanitizeNode(child, el);\n }\n}\n\n/**\n * Sanitize an HTML string for safe insertion via innerHTML.\n *\n * - Allowed tags are preserved; disallowed tags are removed entirely.\n * - Unknown tags are unwrapped (children promoted).\n * - `<a>` tags are forced to `target=\"_blank\" rel=\"noopener noreferrer\"`.\n * - Only `https://` is allowed for `<img src>`.\n */\nconst SAFE_URL_PROTOCOLS = ['http:', 'https:'];\n\n/** Check if a URL uses a safe protocol (http or https). */\nexport function isSafeImageUrl(url: string): boolean {\n try {\n return SAFE_URL_PROTOCOLS.includes(new URL(url).protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a URL is safe for use in href/src attributes.\n * Allows http:, https:, and relative paths (starting with `/`).\n */\nexport function isSafeUrl(url: string): boolean {\n // Allow relative paths but reject protocol-relative URLs (//evil.com/...)\n if (url.startsWith('/') && !url.startsWith('//')) return true;\n try {\n const parsed = new URL(url);\n return SAFE_URL_PROTOCOLS.includes(parsed.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Safely set an attribute on an element.\n * For `href` and `src` attributes, validates the URL against safe protocols.\n */\nexport function safeSetAttribute(el: HTMLElement, attr: string, value: string): void {\n if (attr === 'href' || attr === 'src') {\n if (!isSafeUrl(value)) return;\n }\n el.setAttribute(attr, value);\n}\n\nexport function sanitizeHtml(raw: string): string {\n if (!raw) return '';\n\n const doc = new DOMParser().parseFromString(raw, 'text/html');\n const body = doc.body;\n\n const children = Array.from(body.childNodes);\n for (const child of children) {\n sanitizeNode(child, body);\n }\n\n return body.innerHTML;\n}\n","export const ALLOWED_MIME_TYPES = ['image/jpeg', 'image/png', 'image/webp'] as const;\nexport const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5 MB\n\nexport type ValidationResult = { ok: true } | { ok: false; reason: 'invalid_type' | 'too_large' };\n\nexport function validateImageFile(file: File): ValidationResult {\n if (!(ALLOWED_MIME_TYPES as readonly string[]).includes(file.type)) {\n return { ok: false, reason: 'invalid_type' };\n }\n if (file.size > MAX_FILE_SIZE) {\n return { ok: false, reason: 'too_large' };\n }\n return { ok: true };\n}\n","/**\n * Wire protocol streaming utilities.\n *\n * The Gengage backend streams responses as Newline-Delimited JSON (NDJSON)\n * over a single HTTP response. This module provides utilities to consume\n * that stream and parse events in real time.\n *\n * Protocol shape:\n * {\"type\":\"metadata\",\"sessionId\":\"...\",\"model\":\"...\"}\n * {\"type\":\"text_chunk\",\"content\":\"Hello \"}\n * {\"type\":\"text_chunk\",\"content\":\"there!\",\"final\":true}\n * {\"type\":\"ui_spec\",\"widget\":\"chat\",\"spec\":{...}}\n * {\"type\":\"action\",\"action\":{\"kind\":\"navigate\",\"url\":\"...\"}}\n * {\"type\":\"done\"}\n */\n\nimport type { StreamEvent } from './types.js';\n\nexport type StreamEventHandler = (event: StreamEvent) => void;\n\n/** Lightweight runtime check: parsed object must have a string `type` field. */\nfunction isMinimalStreamEvent(value: unknown): value is StreamEvent {\n return typeof value === 'object' && value !== null && typeof (value as Record<string, unknown>)['type'] === 'string';\n}\n\n/**\n * Split a string of concatenated JSON objects into individual JSON strings.\n * Handles nested braces and strings correctly.\n *\n * Example: '{\"a\":1}{\"b\":2}' → ['{\"a\":1}', '{\"b\":2}']\n */\nfunction splitConcatenatedJson(text: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let inString = false;\n let escape = false;\n let start = 0;\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n if (escape) {\n escape = false;\n continue;\n }\n if (ch === '\\\\' && inString) {\n escape = true;\n continue;\n }\n if (ch === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n if (ch === '{') depth++;\n if (ch === '}') {\n depth--;\n if (depth === 0) {\n parts.push(text.slice(start, i + 1));\n start = i + 1;\n }\n }\n }\n return parts.length > 0 ? parts : [text];\n}\n\nexport interface StreamOptions {\n /** Called for each parsed StreamEvent. */\n onEvent: StreamEventHandler;\n /** Called once when the stream closes normally. */\n onDone?: () => void;\n /** Called if the stream errors or the response is non-2xx. */\n onError?: (err: Error) => void;\n /** AbortController signal to cancel mid-stream. */\n signal?: AbortSignal;\n /**\n * Max milliseconds to wait between chunks before treating the stream as dead.\n * Prevents the UI from hanging indefinitely when the backend stops sending\n * data without closing the connection. Default: 60_000 (60 s).\n */\n idleTimeoutMs?: number;\n}\n\n/**\n * Process a single line from the stream buffer. Returns true if 'done' event was received.\n * Handles SSE prefix, concatenated JSON, and malformed lines gracefully.\n */\nfunction processLine(line: string, options: StreamOptions): boolean {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) return false;\n\n const jsonStr = trimmed.startsWith('data: ') ? trimmed.slice(6) : trimmed;\n if (jsonStr === '[DONE]') return true;\n\n // Try direct parse first (fast path for well-formed NDJSON)\n try {\n const event = JSON.parse(jsonStr) as StreamEvent;\n if (!isMinimalStreamEvent(event)) {\n if (import.meta.env?.DEV) {\n console.warn('[gengage] Skipping event without valid type:', jsonStr.slice(0, 100));\n }\n return false;\n }\n options.onEvent(event);\n if (event.type === 'done') {\n options.onDone?.();\n return true;\n }\n return false;\n } catch {\n // Direct parse failed — try splitting concatenated JSON objects\n // (backend may send multiple objects without newline separators)\n const parts = splitConcatenatedJson(jsonStr);\n if (parts.length > 1) {\n for (const part of parts) {\n try {\n const event = JSON.parse(part) as StreamEvent;\n if (!isMinimalStreamEvent(event)) continue;\n options.onEvent(event);\n if (event.type === 'done') {\n options.onDone?.();\n return true;\n }\n } catch {\n if (import.meta.env?.DEV) {\n console.warn('[gengage] Skipping malformed stream fragment:', part.slice(0, 100));\n }\n }\n }\n return false;\n }\n\n if (import.meta.env?.DEV) {\n console.warn('[gengage] Skipping malformed stream line:', jsonStr.slice(0, 100));\n }\n return false;\n }\n}\n\n/**\n * Consume an NDJSON streaming response and call onEvent for each line.\n *\n * Usage:\n * const controller = new AbortController();\n * await consumeStream(response, {\n * onEvent: (event) => { ... },\n * signal: controller.signal,\n * });\n */\nexport async function consumeStream(response: Response, options: StreamOptions): Promise<void> {\n if (!response.ok) {\n options.onError?.(new Error(`HTTP ${response.status}: ${response.statusText}`));\n return;\n }\n\n if (!response.body) {\n options.onError?.(new Error('Response body is null — streaming not supported'));\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n const idleTimeout = options.idleTimeoutMs ?? 60_000;\n\n const IDLE_TIMEOUT_SENTINEL = Symbol('idle-timeout');\n let readerCancelled = false;\n\n try {\n while (true) {\n // Race reader against an idle timeout so the UI never hangs indefinitely\n // when the backend stops sending data without closing the connection.\n const readPromise = reader.read();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const result = await (idleTimeout > 0\n ? Promise.race([\n readPromise.then((r) => {\n clearTimeout(timer);\n return r;\n }),\n new Promise<typeof IDLE_TIMEOUT_SENTINEL>((resolve) => {\n timer = setTimeout(() => resolve(IDLE_TIMEOUT_SENTINEL), idleTimeout);\n }),\n ])\n : readPromise);\n\n if (result === IDLE_TIMEOUT_SENTINEL) {\n // Timeout won the race — reader.read() is still pending.\n // Cancel the reader to release the underlying stream body.\n readerCancelled = true;\n await reader.cancel();\n break;\n }\n\n const { done, value } = result;\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process all complete lines in the buffer\n const lines = buffer.split('\\n');\n // Last element may be an incomplete line — keep it in the buffer\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (processLine(line, options)) return;\n }\n }\n\n // Process remaining buffer (final line without trailing newline).\n // Check return value — if a 'done' event was in the trailing buffer,\n // processLine already called onDone; returning here prevents a second fire.\n if (buffer.trim()) {\n if (processLine(buffer, options)) return;\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n options.onError?.(err instanceof Error ? err : new Error(String(err)));\n } finally {\n // reader.releaseLock() throws if a read is pending; cancel() above handles\n // the timeout case (cancel releases the lock implicitly).\n if (!readerCancelled) {\n reader.releaseLock();\n }\n }\n\n options.onDone?.();\n}\n\n/**\n * Convenience: POST to a streaming endpoint and consume the response.\n *\n * @returns an AbortController that cancels the stream when aborted.\n */\nexport function streamPost(\n url: string,\n body: unknown,\n options: StreamOptions & { headers?: Record<string, string> },\n): AbortController {\n const controller = new AbortController();\n const signal = options.signal ? anySignal([options.signal, controller.signal]) : controller.signal;\n\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: JSON.stringify(body),\n signal,\n })\n .then((response) => consumeStream(response, { ...options, signal }))\n .catch((err) => {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n options.onError?.(err instanceof Error ? err : new Error(String(err)));\n });\n\n return controller;\n}\n\n/**\n * Merge multiple AbortSignals — fires when any one aborts.\n * (Native AbortSignal.any() not universally available yet.)\n */\nfunction anySignal(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n const cleanups: Array<() => void> = [];\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort(signal.reason);\n return controller.signal;\n }\n const handler = () => controller.abort(signal.reason);\n signal.addEventListener('abort', handler, { once: true });\n cleanups.push(() => signal.removeEventListener('abort', handler));\n }\n\n // When the merged controller aborts, clean up listeners on all source signals\n controller.signal.addEventListener(\n 'abort',\n () => {\n for (const cleanup of cleanups) cleanup();\n },\n { once: true },\n );\n\n return controller.signal;\n}\n","/**\n * v1 wire protocol adapter.\n *\n * Backend emits NDJSON events with `type` values like\n * `outputText`, `suggestedActions`, `productList`, etc.\n *\n * This module translates those v1 events into the SDK's normalized\n * `StreamEvent` model.\n *\n * Also handles JSON-mode responses from `similar_products` and\n * `product_groupings` endpoints.\n */\n\nimport type {\n StreamEvent,\n StreamEventMetadata,\n StreamEventTextChunk,\n StreamEventUISpec,\n StreamEventAction,\n StreamEventDone,\n StreamEventError,\n UIElement,\n} from './types.js';\n\ntype WidgetName = 'chat' | 'qna' | 'simrel';\n\ninterface V1RequestDetails {\n type?: string;\n payload?: unknown;\n [key: string]: unknown;\n}\n\ninterface V1ProductSuggestionsLabel {\n label?: string;\n sentiment?: string;\n [key: string]: unknown;\n}\n\ninterface V1ReviewHighlightItem {\n review_class?: string;\n review_text?: string;\n review_rating?: string | number;\n review_tag?: string;\n [key: string]: unknown;\n}\n\ninterface V1OutputText {\n type: 'outputText';\n payload: {\n text?: string;\n plain_text?: string;\n is_error?: boolean;\n [key: string]: unknown;\n };\n}\n\ninterface V1SuggestedActionItem {\n title?: string;\n icon?: string;\n image?: string | null;\n requestDetails?: V1RequestDetails;\n [key: string]: unknown;\n}\n\ninterface V1SuggestedActions {\n type: 'suggestedActions';\n payload: {\n actions?: V1SuggestedActionItem[];\n [key: string]: unknown;\n };\n}\n\nexport interface V1Product {\n sku: string;\n name: string;\n brand?: string;\n images?: string[];\n price?: number;\n price_discounted?: number;\n price_currency?: string;\n discount_reason?: string;\n url?: string;\n rating?: number;\n review_count?: number;\n cart_code?: string;\n in_stock?: boolean;\n category_ids?: string[];\n category_names?: string[];\n variants?: Array<Record<string, unknown>>;\n facet_hits?: Record<string, unknown> | null;\n promotions?: string[];\n}\n\ninterface V1ProductList {\n type: 'productList';\n payload: {\n product_list?: V1Product[];\n source?: string;\n title?: string;\n offset?: number;\n page_size?: number;\n end_of_list?: boolean;\n [key: string]: unknown;\n };\n}\n\ninterface V1ProductDetails {\n type: 'productDetails';\n payload: { productDetails?: V1Product; [key: string]: unknown };\n}\n\ninterface V1ProductDetailsSimilars {\n type: 'productDetailsSimilars';\n payload: { similarProducts?: V1Product[]; [key: string]: unknown };\n}\n\ninterface V1ComparisonTable {\n type: 'comparisonTable';\n payload: {\n multiple_product_details?: V1Product[];\n table?: Record<string, string[] | Record<string, unknown>>;\n features_list?: string[];\n product_comparison_framework?: {\n key_differences?: string[];\n recommended_choice?: string;\n recommended_choice_sku?: string;\n special_considerations?: string[];\n criteria_view?: Record<string, string>;\n criteria_view_short?: Record<string, string>;\n compared_field_names?: string[];\n winner_product?: Array<{ sku?: string; name?: string; product_detail?: { sku?: string } }>;\n winner_hits?: Record<string, { positive?: string[]; negative?: string[] }>;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n };\n}\n\ninterface V1Context {\n type: 'context';\n payload: {\n panel?: Record<string, unknown>;\n messages?: Array<{ role?: string; content?: string }>;\n message_id?: string;\n [key: string]: unknown;\n };\n}\n\ninterface V1ChatStreamEnd {\n type: 'chatStreamEnd';\n payload?: Record<string, unknown>;\n}\n\ninterface V1Loading {\n type: 'loading';\n payload: {\n text?: string;\n is_dynamic?: boolean;\n thinking_messages?: string[];\n [key: string]: unknown;\n };\n}\n\ninterface V1PanelLoading {\n type: 'panelLoading';\n payload?: { text?: string; pending_type?: string; [key: string]: unknown };\n}\n\ninterface V1SimilarLoading {\n type: 'similarLoading';\n payload?: { text?: string; pending_type?: string; [key: string]: unknown };\n}\n\ninterface V1Redirect {\n type: 'redirect';\n payload: { url?: string; new_tab?: boolean; to?: string; [key: string]: unknown };\n}\n\ninterface V1Error {\n type: 'error';\n payload?: {\n text?: string;\n message?: string;\n error?: string;\n [key: string]: unknown;\n };\n}\n\ninterface V1Noop {\n type: 'dummy';\n payload?: Record<string, unknown>;\n}\n\ninterface V1LauncherAction {\n type: 'launcherAction';\n payload?: Record<string, unknown>;\n}\n\ninterface V1LauncherText {\n type: 'text';\n payload: {\n type?: string;\n text?: string;\n payload?: Record<string, unknown>;\n theme?: string;\n [key: string]: unknown;\n };\n}\n\ninterface V1ProductItem {\n type: 'productItem';\n payload: V1Product & { group_id?: string; [key: string]: unknown };\n}\n\ninterface V1LauncherTextImage {\n type: 'text_image';\n payload: {\n type?: string;\n text?: string;\n image_url?: string;\n theme?: string;\n action?: V1RequestDetails;\n [key: string]: unknown;\n };\n}\n\ninterface V1LauncherQuickQna {\n type: 'quick_qna';\n payload: {\n type?: string;\n theme?: string;\n action_list?: V1SuggestedActionItem[];\n [key: string]: unknown;\n };\n}\n\ninterface V1ReviewHighlights {\n type: 'reviewHighlights';\n payload: {\n sku?: string;\n reviews?: V1ReviewHighlightItem[];\n [key: string]: unknown;\n };\n}\n\nexport interface V1ProsAndCons {\n type: 'prosAndCons';\n payload: { pros?: string[]; cons?: string[]; product_name?: string; [key: string]: unknown };\n}\n\ninterface V1VisitorDataResponse {\n type: 'visitorDataResponse';\n payload: Record<string, unknown>;\n}\n\ninterface V1AiProductSuggestion {\n sku?: string;\n short_name?: string;\n role?: string;\n labels?: V1ProductSuggestionsLabel[];\n reason?: string;\n expert_quality_score?: number;\n review_highlight?: string;\n product_item?: V1Product;\n requestDetails?: V1RequestDetails;\n [key: string]: unknown;\n}\n\ninterface V1AiProductSuggestions {\n type: 'aiProductSuggestions';\n payload: {\n product_suggestions?: V1AiProductSuggestion[];\n [key: string]: unknown;\n };\n}\n\ninterface V1AiProductGrouping {\n name?: string;\n image?: string;\n labels?: string[];\n sku?: string;\n requestDetails?: V1RequestDetails;\n [key: string]: unknown;\n}\n\ninterface V1AiProductGroupings {\n type: 'aiProductGroupings';\n payload: {\n product_groupings?: V1AiProductGrouping[];\n [key: string]: unknown;\n };\n}\n\ninterface V1AiSuggestedSearch {\n short_name?: string;\n detailed_user_message?: string;\n why_different?: string;\n chosen_attribute?: string;\n representative_product_sku?: string;\n group_skus?: string[];\n sku?: string;\n image?: string;\n requestDetails?: V1RequestDetails;\n [key: string]: unknown;\n}\n\ninterface V1AiSuggestedSearches {\n type: 'aiSuggestedSearches';\n payload: {\n suggested_searches?: V1AiSuggestedSearch[];\n [key: string]: unknown;\n };\n}\n\ninterface V1GetGroundingReview {\n type: 'getGroundingReview';\n payload: {\n title?: string;\n text?: string;\n review_count?: string;\n requestDetails?: V1RequestDetails;\n [key: string]: unknown;\n };\n}\n\ninterface V1Voice {\n type: 'voice';\n payload: {\n text?: string;\n audio_base64?: string;\n content_type?: string;\n [key: string]: unknown;\n };\n}\n\ninterface V1GroupList {\n type: 'groupList';\n payload: {\n group_list?: Array<{ group_name?: string; product_list?: V1Product[] }>;\n filter_tags?: Array<{ title?: string; requestDetails?: V1RequestDetails }>;\n [key: string]: unknown;\n };\n}\n\ninterface V1FormEvent {\n type: 'formGetInfo' | 'formTestDrive' | 'formServiceRequest' | 'launchFormPage';\n payload?: Record<string, unknown>;\n}\n\ninterface V1LauncherContent {\n type: 'launcherContent';\n payload?: Record<string, unknown>;\n}\n\ninterface V1Handoff {\n type: 'handoff';\n payload?: {\n summary?: string;\n products_discussed?: string[];\n user_sentiment?: string;\n [key: string]: unknown;\n };\n}\n\ntype V1StreamEvent =\n | V1OutputText\n | V1SuggestedActions\n | V1ProductList\n | V1ProductDetails\n | V1ProductDetailsSimilars\n | V1ComparisonTable\n | V1Context\n | V1ChatStreamEnd\n | V1Loading\n | V1PanelLoading\n | V1SimilarLoading\n | V1Redirect\n | V1Error\n | V1Noop\n | V1LauncherAction\n | V1LauncherText\n | V1ProductItem\n | V1LauncherTextImage\n | V1LauncherQuickQna\n | V1ReviewHighlights\n | V1AiProductSuggestions\n | V1AiProductGroupings\n | V1AiSuggestedSearches\n | V1GetGroundingReview\n | V1Voice\n | V1GroupList\n | V1FormEvent\n | V1LauncherContent\n | V1Handoff\n | { type: string; payload?: unknown; [key: string]: unknown };\n\nexport function adaptV1Event(raw: Record<string, unknown>): StreamEvent | null {\n const type = raw['type'];\n if (typeof type !== 'string') return null;\n\n if (isNormalizedStreamEvent(raw)) {\n return raw as unknown as StreamEvent;\n }\n\n const event = raw as V1StreamEvent;\n\n switch (event.type) {\n case 'outputText':\n return adaptOutputText(event as V1OutputText);\n case 'suggestedActions':\n return adaptSuggestedActions(event as V1SuggestedActions);\n case 'productList':\n return adaptProductList(event as V1ProductList);\n case 'productDetails':\n return adaptProductDetails(event as V1ProductDetails);\n case 'productDetailsSimilars':\n return adaptProductDetailsSimilars(event as V1ProductDetailsSimilars);\n case 'comparisonTable':\n return adaptComparisonTable(event as V1ComparisonTable);\n case 'context':\n return adaptContext(event as V1Context);\n case 'chatStreamEnd':\n return adaptChatStreamEnd();\n case 'loading':\n return adaptLoading(event as V1Loading);\n case 'panelLoading':\n return adaptPanelLoading(event as V1PanelLoading);\n case 'similarLoading':\n return adaptSimilarLoading(event as V1SimilarLoading);\n case 'redirect':\n return adaptRedirect(event as V1Redirect);\n case 'error':\n return adaptV1Error(event as V1Error);\n case 'dummy':\n return adaptNoop(event as V1Noop);\n case 'launcherAction':\n return adaptLauncherAction(event as V1LauncherAction);\n case 'text':\n return adaptLauncherText(event as V1LauncherText);\n case 'productItem':\n return adaptProductItem(event as V1ProductItem);\n case 'text_image':\n return adaptLauncherTextImage(event as V1LauncherTextImage);\n case 'quick_qna':\n return adaptLauncherQuickQna(event as V1LauncherQuickQna);\n case 'reviewHighlights':\n return adaptReviewHighlights(event as V1ReviewHighlights);\n case 'aiProductSuggestions':\n return adaptAiProductSuggestions(event as V1AiProductSuggestions);\n case 'aiProductGroupings':\n return adaptAiProductGroupings(event as V1AiProductGroupings);\n case 'aiSuggestedSearches':\n return adaptAiSuggestedSearches(event as V1AiSuggestedSearches);\n case 'prosAndCons':\n return adaptProsAndCons(event as V1ProsAndCons);\n case 'getGroundingReview':\n return adaptGetGroundingReview(event as V1GetGroundingReview);\n case 'voice':\n return adaptVoice(event as V1Voice);\n case 'visitorDataResponse':\n return adaptVisitorDataResponse(event as V1VisitorDataResponse);\n case 'productListPreview':\n return adaptProductListPreview();\n case 'groupList':\n return adaptGroupList(event as V1GroupList);\n case 'formGetInfo':\n case 'formTestDrive':\n case 'formServiceRequest':\n case 'launchFormPage':\n return adaptFormEvent(event as V1FormEvent);\n case 'launcherContent':\n return adaptLauncherContent(event as V1LauncherContent);\n case 'handoff':\n return adaptHandoff(event as V1Handoff);\n default:\n if (import.meta.env?.DEV) {\n console.warn('[gengage:v1-protocol] Unknown v1 event type:', event.type);\n }\n return null;\n }\n}\n\nfunction isNormalizedStreamEvent(raw: Record<string, unknown>): boolean {\n const type = raw['type'];\n if (typeof type !== 'string') return false;\n\n switch (type) {\n case 'metadata':\n return typeof raw['sessionId'] === 'string' && typeof raw['model'] === 'string';\n case 'text_chunk':\n return typeof raw['content'] === 'string';\n case 'ui_spec': {\n const widget = raw['widget'];\n if (widget !== 'chat' && widget !== 'qna' && widget !== 'simrel') return false;\n const spec = asRecord(raw['spec']);\n if (!spec) return false;\n return typeof spec['root'] === 'string' && asRecord(spec['elements']) !== null;\n }\n case 'action': {\n const action = asRecord(raw['action']);\n return action !== null && typeof action['kind'] === 'string';\n }\n case 'error':\n return typeof raw['code'] === 'string' && typeof raw['message'] === 'string';\n case 'done':\n return true;\n default:\n return false;\n }\n}\n\nfunction adaptOutputText(event: V1OutputText): StreamEventTextChunk | StreamEventError {\n const renderText = firstNonEmptyString(event.payload.text, event.payload.plain_text) ?? '';\n const plainText = firstNonEmptyString(event.payload.plain_text, event.payload.text) ?? renderText;\n if (event.payload.is_error) {\n return {\n type: 'error',\n code: 'BACKEND_ERROR',\n message: plainText || 'Backend returned an error',\n };\n }\n const result: StreamEventTextChunk = {\n type: 'text_chunk',\n content: renderText,\n final: true,\n };\n\n // Pass through product mentions for in-text linking\n const mentions = event.payload['product_mentions'];\n if (Array.isArray(mentions) && mentions.length > 0) {\n result.productMentions = mentions.filter(\n (m): m is { sku: string; short_name: string } =>\n typeof m === 'object' && m !== null && typeof m['sku'] === 'string' && typeof m['short_name'] === 'string',\n );\n }\n\n const skuMap = event.payload['sku_to_product_item'];\n if (skuMap && typeof skuMap === 'object' && !Array.isArray(skuMap)) {\n result.skuToProductItem = skuMap as Record<string, Record<string, unknown>>;\n }\n\n const convMode = event.payload['conversation_mode'];\n if (typeof convMode === 'string' && convMode) {\n result.conversationMode = convMode;\n }\n\n return result;\n}\n\nfunction adaptSuggestedActions(event: V1SuggestedActions): StreamEventUISpec {\n const entries = (event.payload.actions ?? []).map((action) => {\n const label = firstNonEmptyString(action.title) ?? '';\n const actionPayload = requestDetailsToAction(action.requestDetails, label);\n const result: ButtonEntry | null = actionPayload\n ? {\n label,\n action: actionPayload,\n }\n : null;\n if (!result) return null;\n if (typeof action.icon === 'string') result.icon = action.icon;\n if (typeof action.image === 'string') result.image = action.image;\n return result;\n });\n return buildActionButtonsUISpec(entries.filter(isNonNullable), 'chat');\n}\n\nfunction adaptProductList(event: V1ProductList): StreamEventUISpec {\n const spec = buildProductGridUISpec(event.payload.product_list ?? [], 'chat');\n spec.panelHint = 'panel';\n // Pass pagination fields and backend-provided title\n const root = spec.spec.elements[spec.spec.root];\n if (root) {\n if (typeof event.payload.offset === 'number') root.props = { ...root.props, offset: event.payload.offset };\n if (typeof event.payload.end_of_list === 'boolean')\n root.props = { ...root.props, endOfList: event.payload.end_of_list };\n if (typeof event.payload.title === 'string') root.props = { ...root.props, panelTitle: event.payload.title };\n }\n return spec;\n}\n\nfunction adaptProductDetails(event: V1ProductDetails): StreamEventUISpec {\n const product = event.payload.productDetails;\n if (!product) {\n return buildEmptyUISpec('chat');\n }\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ProductDetailsPanel',\n props: { product: productToNormalized(product) },\n },\n },\n },\n panelHint: 'panel',\n };\n}\n\nfunction adaptProductDetailsSimilars(event: V1ProductDetailsSimilars): StreamEventUISpec {\n const base = buildProductGridUISpec(event.payload.similarProducts ?? [], 'chat');\n // Mark for panel append rather than replace\n const root = base.spec.elements[base.spec.root];\n if (root) root.props = { ...root.props, similarsAppend: true };\n return { ...base, panelHint: 'panel' };\n}\n\nfunction adaptComparisonTable(event: V1ComparisonTable): StreamEventUISpec {\n const products = event.payload.multiple_product_details ?? [];\n const payloadRecord = event.payload as Record<string, unknown>;\n const framework = {\n key_differences: payloadRecord['key_differences'],\n recommended_choice: payloadRecord['recommended_choice'],\n recommended_choice_sku: payloadRecord['recommended_choice_sku'],\n special_considerations: payloadRecord['special_considerations'],\n criteria_view: payloadRecord['criteria_view'],\n criteria_view_short: payloadRecord['criteria_view_short'],\n compared_field_names: payloadRecord['compared_field_names'],\n winner_product: payloadRecord['winner_product'],\n winner_hits: payloadRecord['winner_hits'],\n ...(event.payload.product_comparison_framework ?? {}),\n } as NonNullable<V1ComparisonTable['payload']['product_comparison_framework']>;\n const table = event.payload.table;\n const featuresList = event.payload.features_list;\n\n // Normalize products\n const normalizedProducts: Array<Record<string, unknown>> = [];\n for (const p of products) {\n const norm = productToNormalized(p);\n normalizedProducts.push(norm as unknown as Record<string, unknown>);\n }\n\n const attributes = buildComparisonAttributes(table, normalizedProducts, framework, featuresList);\n\n // Find recommended product\n let recommendedSku: string | undefined;\n if (framework?.recommended_choice_sku) {\n recommendedSku = framework.recommended_choice_sku;\n } else if (framework?.winner_product && framework.winner_product.length > 0) {\n // Legacy structure wraps sku in product_detail; fall back to flat sku\n recommendedSku = framework.winner_product[0]?.product_detail?.sku ?? framework.winner_product[0]?.sku;\n }\n\n // Find recommended product object\n const recommended = recommendedSku\n ? (normalizedProducts.find((p) => p['sku'] === recommendedSku) ?? normalizedProducts[0])\n : normalizedProducts[0];\n\n // Extract highlights (key differences)\n const highlights: string[] = [];\n if (Array.isArray(framework?.key_differences)) {\n for (const diff of framework.key_differences) {\n if (typeof diff === 'string') highlights.push(diff);\n }\n }\n\n // Extract special cases\n const specialCases = normalizeStringList(framework?.special_considerations);\n\n // Build recommended choice explanation\n const recommendedText = framework?.recommended_choice;\n\n // Build winner hits per product\n const winnerHits = framework?.winner_hits;\n\n // Build product actions for \"View Product\" buttons\n const productActions: Record<string, Record<string, unknown>> = {};\n for (const p of normalizedProducts) {\n const sku = p['sku'] as string;\n if (sku) {\n productActions[sku] = {\n title: (p['name'] as string) ?? sku,\n type: 'launchSingleProduct',\n payload: { sku },\n };\n }\n }\n\n const props: Record<string, unknown> = {\n products: normalizedProducts,\n attributes,\n highlights,\n productActions,\n };\n\n if (recommended) props['recommended'] = recommended;\n if (specialCases.length > 0) props['specialCases'] = specialCases;\n if (recommendedText) props['recommendedText'] = recommendedText;\n if (winnerHits) props['winnerHits'] = winnerHits;\n\n // key_differences may be a single HTML string — pass raw for formatted rendering\n if (typeof framework?.key_differences === 'string') {\n props['keyDifferencesHtml'] = framework.key_differences;\n }\n\n // Pass special_considerations as structured data\n if (framework?.special_considerations) {\n props['specialConsiderations'] = framework.special_considerations;\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ComparisonTable',\n props,\n },\n },\n },\n panelHint: 'panel',\n };\n}\n\nfunction buildComparisonAttributes(\n table: V1ComparisonTable['payload']['table'],\n products: Array<Record<string, unknown>>,\n framework: NonNullable<V1ComparisonTable['payload']['product_comparison_framework']>,\n featuresList?: string[],\n): Array<{ label: string; values: string[] }> {\n if (!table) return [];\n\n const entries = Object.entries(table);\n if (entries.length === 0) return [];\n\n const firstValue = entries[0]?.[1];\n if (Array.isArray(firstValue)) {\n const displayNames = framework.criteria_view ?? framework.criteria_view_short ?? {};\n const fieldOrder = framework.compared_field_names ?? Object.keys(table);\n const attributes: Array<{ label: string; values: string[] }> = [];\n for (const fieldName of fieldOrder) {\n const values = table[fieldName];\n if (!values || !Array.isArray(values)) continue;\n const label = displayNames[fieldName] ?? fieldName;\n attributes.push({ label, values: values.map((v) => (typeof v === 'string' ? v : String(v ?? ''))) });\n }\n return attributes;\n }\n\n const rowMap = table as Record<string, Record<string, unknown>>;\n const orderedSkus = products.map((product) => String(product['sku'] ?? '')).filter((sku) => sku.length > 0);\n const displayNames = framework.criteria_view ?? framework.criteria_view_short ?? {};\n const rawFieldOrder =\n featuresList && featuresList.length > 0\n ? featuresList\n : framework.compared_field_names && framework.compared_field_names.length > 0\n ? framework.compared_field_names\n : collectComparisonFields(rowMap);\n\n const fieldOrder = rawFieldOrder.filter(\n (field) => field !== 'name' && field !== 'name_short' && !field.endsWith('_short'),\n );\n const attributes: Array<{ label: string; values: string[] }> = [];\n\n for (const fieldName of fieldOrder) {\n const values = orderedSkus.map((sku) => {\n const row = rowMap[sku];\n if (!row || typeof row !== 'object') return '';\n const shortValue = row[`${fieldName}_short`];\n const longValue = row[fieldName];\n return stringifyComparisonValue(shortValue ?? longValue);\n });\n if (values.every((value) => value.length === 0)) continue;\n const label = displayNames[fieldName] ?? fieldName;\n attributes.push({ label, values });\n }\n\n return attributes;\n}\n\nfunction collectComparisonFields(rowMap: Record<string, Record<string, unknown>>): string[] {\n const fields: string[] = [];\n const seen = new Set<string>();\n for (const row of Object.values(rowMap)) {\n if (!row || typeof row !== 'object') continue;\n for (const key of Object.keys(row)) {\n if (seen.has(key)) continue;\n seen.add(key);\n fields.push(key);\n }\n }\n return fields;\n}\n\nfunction stringifyComparisonValue(value: unknown): string {\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return '';\n}\n\nfunction adaptContext(event: V1Context): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n panel: event.payload.panel,\n messages: event.payload.messages,\n message_id: event.payload.message_id,\n },\n };\n}\n\nfunction adaptChatStreamEnd(): StreamEventDone {\n return { type: 'done' };\n}\n\nfunction adaptLoading(event: V1Loading): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n loading: true,\n loadingText: event.payload.text,\n thinkingMessages: event.payload.thinking_messages,\n dynamicLoading: event.payload.is_dynamic === true,\n },\n };\n}\n\nfunction adaptPanelLoading(event: V1PanelLoading): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n loading: true,\n panelLoading: true,\n panelPendingType: event.payload?.pending_type,\n loadingText: event.payload?.text,\n },\n };\n}\n\nfunction adaptSimilarLoading(event: V1SimilarLoading): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n loading: true,\n similarPanelLoading: true,\n panelPendingType: event.payload?.pending_type,\n loadingText: event.payload?.text,\n },\n };\n}\n\nfunction adaptRedirect(event: V1Redirect): StreamEventAction | StreamEventMetadata {\n const url = firstNonEmptyString(event.payload.url);\n if (url) {\n return {\n type: 'action',\n action: {\n kind: 'navigate',\n url,\n newTab: event.payload.new_tab === true,\n },\n };\n }\n\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n redirect: event.payload,\n redirectTarget: firstNonEmptyString(event.payload.to),\n },\n };\n}\n\nfunction adaptV1Error(event: V1Error): StreamEventError {\n const message =\n firstNonEmptyString(event.payload?.text, event.payload?.message, event.payload?.error) ??\n 'Backend returned an error';\n return {\n type: 'error',\n code: 'BACKEND_ERROR',\n message,\n };\n}\n\nfunction adaptNoop(_event: V1Noop): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n noop: true,\n },\n };\n}\n\nfunction adaptLauncherAction(event: V1LauncherAction): StreamEvent {\n const payload = event.payload ?? {};\n\n const hasActionList = Array.isArray(payload['action_list']);\n if (hasActionList) {\n const quickQnaPayload: V1LauncherQuickQna['payload'] = {\n action_list: payload['action_list'] as V1SuggestedActionItem[],\n };\n const launcherType = typeof payload['type'] === 'string' ? payload['type'] : undefined;\n const theme = typeof payload['theme'] === 'string' ? payload['theme'] : undefined;\n if (launcherType !== undefined) quickQnaPayload.type = launcherType;\n if (theme !== undefined) quickQnaPayload.theme = theme;\n\n return adaptLauncherQuickQna({\n type: 'quick_qna',\n payload: quickQnaPayload,\n });\n }\n\n const action = asRecord(payload['action']);\n if (action) {\n const textImagePayload: V1LauncherTextImage['payload'] = {\n action,\n };\n const text = typeof payload['text'] === 'string' ? payload['text'] : undefined;\n const imageUrl = typeof payload['image_url'] === 'string' ? payload['image_url'] : undefined;\n const theme = typeof payload['theme'] === 'string' ? payload['theme'] : undefined;\n if (text !== undefined) textImagePayload.text = text;\n if (imageUrl !== undefined) textImagePayload.image_url = imageUrl;\n if (theme !== undefined) textImagePayload.theme = theme;\n\n return adaptLauncherTextImage({\n type: 'text_image',\n payload: textImagePayload,\n });\n }\n\n const text = typeof payload['text'] === 'string' ? payload['text'] : '';\n if (text) {\n const launcherTextPayload: V1LauncherText['payload'] = { text };\n const launcherType = typeof payload['type'] === 'string' ? payload['type'] : undefined;\n const theme = typeof payload['theme'] === 'string' ? payload['theme'] : undefined;\n const payloadObj = asRecord(payload['payload']) ?? undefined;\n if (launcherType !== undefined) launcherTextPayload.type = launcherType;\n if (payloadObj !== undefined) launcherTextPayload.payload = payloadObj;\n if (theme !== undefined) launcherTextPayload.theme = theme;\n\n return adaptLauncherText({\n type: 'text',\n payload: launcherTextPayload,\n });\n }\n\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n launcherAction: payload,\n },\n };\n}\n\nfunction adaptLauncherText(event: V1LauncherText): StreamEventUISpec {\n const props: Record<string, unknown> = {\n text: firstNonEmptyString(event.payload.text) ?? '',\n };\n if (typeof event.payload.theme === 'string') props['theme'] = event.payload.theme;\n if (event.payload.payload !== undefined) props['payload'] = event.payload.payload;\n\n return {\n type: 'ui_spec',\n widget: 'qna',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'QuestionHeading',\n props,\n },\n },\n },\n };\n}\n\nfunction adaptProductItem(event: V1ProductItem): StreamEventUISpec {\n return buildSingleProductUISpec(event.payload, 'qna');\n}\n\nfunction adaptLauncherTextImage(event: V1LauncherTextImage): StreamEventUISpec {\n const label = firstNonEmptyString(event.payload.text) ?? '';\n const action = requestDetailsToAction(event.payload.action, label);\n if (action) {\n const props: Record<string, unknown> = {\n label: label || action.title,\n action,\n };\n if (typeof event.payload.image_url === 'string') props['image'] = event.payload.image_url;\n if (typeof event.payload.theme === 'string') props['theme'] = event.payload.theme;\n\n return {\n type: 'ui_spec',\n widget: 'qna',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ActionButton',\n props,\n },\n },\n },\n };\n }\n\n const fallbackPayload: V1LauncherText['payload'] = {\n text: label,\n };\n if (typeof event.payload.theme === 'string') fallbackPayload.theme = event.payload.theme;\n\n return adaptLauncherText({\n type: 'text',\n payload: fallbackPayload,\n });\n}\n\nfunction adaptLauncherQuickQna(event: V1LauncherQuickQna): StreamEventUISpec {\n const entries = (event.payload.action_list ?? []).map((action) => {\n const label = firstNonEmptyString(action.title) ?? '';\n const actionPayload = requestDetailsToAction(action.requestDetails, label);\n const result: ButtonEntry | null = actionPayload\n ? {\n label,\n action: actionPayload,\n }\n : null;\n if (!result) return null;\n if (typeof action.icon === 'string') result.icon = action.icon;\n if (typeof action.image === 'string') result.image = action.image;\n return result;\n });\n\n return buildActionButtonsUISpec(entries.filter(isNonNullable), 'qna');\n}\n\nfunction adaptReviewHighlights(event: V1ReviewHighlights): StreamEventUISpec {\n const reviews = (event.payload.reviews ?? []).map((item) => {\n const review: Record<string, unknown> = {};\n if (typeof item.review_class === 'string') review['review_class'] = item.review_class;\n if (typeof item.review_text === 'string') review['review_text'] = item.review_text;\n if (typeof item.review_rating === 'string' || typeof item.review_rating === 'number') {\n review['review_rating'] = item.review_rating;\n }\n if (typeof item.review_tag === 'string') review['review_tag'] = item.review_tag;\n return review;\n });\n\n const props: Record<string, unknown> = { reviews };\n if (typeof event.payload.sku === 'string') props['sku'] = event.payload.sku;\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ReviewHighlights',\n props,\n },\n },\n },\n };\n}\n\nfunction adaptProsAndCons(event: V1ProsAndCons): StreamEventUISpec {\n const props: Record<string, unknown> = {};\n if (Array.isArray(event.payload.pros)) props['pros'] = event.payload.pros;\n if (Array.isArray(event.payload.cons)) props['cons'] = event.payload.cons;\n if (typeof event.payload.product_name === 'string') props['productName'] = event.payload.product_name;\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ProsAndCons',\n props,\n },\n },\n },\n };\n}\n\nfunction adaptVisitorDataResponse(event: V1VisitorDataResponse): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n visitorDataResponse: event.payload,\n },\n };\n}\n\nfunction adaptAiProductSuggestions(event: V1AiProductSuggestions): StreamEventUISpec | StreamEventMetadata {\n const suggestions = event.payload.product_suggestions ?? [];\n const items: Record<string, unknown>[] = [];\n\n for (let i = 0; i < suggestions.length; i++) {\n const suggestion = suggestions[i];\n if (!suggestion) continue;\n\n const product = suggestionToNormalizedProduct(suggestion);\n if (!product) continue;\n\n const item: Record<string, unknown> = { product };\n\n const action = requestDetailsToAction(suggestion.requestDetails, product.name);\n if (action) item['action'] = action;\n if (typeof suggestion.role === 'string') item['role'] = suggestion.role;\n if (typeof suggestion.reason === 'string') item['reason'] = suggestion.reason;\n if (typeof suggestion.review_highlight === 'string') item['reviewHighlight'] = suggestion.review_highlight;\n if (Array.isArray(suggestion.labels)) item['labels'] = suggestion.labels;\n if (typeof suggestion.expert_quality_score === 'number')\n item['expertQualityScore'] = suggestion.expert_quality_score;\n\n items.push(item);\n }\n\n if (items.length === 0) {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n aiProductSuggestions: event.payload.product_suggestions ?? [],\n },\n };\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'AITopPicks',\n props: { suggestions: items },\n },\n },\n },\n };\n}\n\nfunction adaptAiProductGroupings(event: V1AiProductGroupings): StreamEventUISpec | StreamEventMetadata {\n const payloadGroupings = event.payload.product_groupings ?? [];\n const entries: Array<Record<string, unknown>> = [];\n\n for (let i = 0; i < payloadGroupings.length; i++) {\n const grouping = payloadGroupings[i];\n if (!grouping) continue;\n const label = firstNonEmptyString(grouping.name) ?? '';\n const fallbackRequest: V1RequestDetails | undefined =\n grouping.sku && grouping.sku.length > 0 ? { type: 'findSimilar', payload: { sku: grouping.sku } } : undefined;\n const action = requestDetailsToAction(grouping.requestDetails ?? fallbackRequest, label);\n if (!action) continue;\n\n const entry: Record<string, unknown> = { name: label, action };\n if (Array.isArray(grouping.labels)) {\n const filteredLabels = grouping.labels.filter((x) => typeof x === 'string');\n if (filteredLabels.length > 0) entry['labels'] = filteredLabels;\n }\n if (typeof grouping.image === 'string') entry['image'] = grouping.image;\n entries.push(entry);\n }\n\n if (entries.length === 0) {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n aiProductGroupings: event.payload.product_groupings ?? [],\n },\n };\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'AIGroupingCards',\n props: { entries },\n },\n },\n },\n };\n}\n\nfunction adaptAiSuggestedSearches(event: V1AiSuggestedSearches): StreamEventUISpec | StreamEventMetadata {\n const searches = event.payload.suggested_searches ?? [];\n const entries: Array<Record<string, unknown>> = [];\n\n for (let i = 0; i < searches.length; i++) {\n const search = searches[i];\n if (!search) continue;\n\n const shortName =\n firstNonEmptyString(search.short_name, search.chosen_attribute, search.detailed_user_message) ?? `Arama ${i + 1}`;\n const fallbackPayload: Record<string, unknown> = {};\n const text = firstNonEmptyString(search.detailed_user_message);\n if (text) fallbackPayload['text'] = text;\n const requestDetailsRecord = asRecord(search.requestDetails);\n const requestPayload = asRecord(requestDetailsRecord?.['payload']);\n const requestGroupSkus = requestPayload?.['group_skus'];\n if (search.group_skus && Array.isArray(search.group_skus)) {\n fallbackPayload['group_skus'] = search.group_skus;\n } else if (Array.isArray(requestGroupSkus)) {\n fallbackPayload['group_skus'] = requestGroupSkus.filter((sku): sku is string => typeof sku === 'string');\n }\n const sku = firstNonEmptyString(search.sku, search.representative_product_sku, requestPayload?.['sku']);\n if (sku) fallbackPayload['sku'] = sku;\n fallbackPayload['is_suggested_text'] = 1;\n\n const fallbackRequest: V1RequestDetails = { type: 'inputText', payload: fallbackPayload };\n const requestedAction = requestDetailsToAction(search.requestDetails, shortName);\n const action =\n requestedAction?.type === 'findSimilar' && typeof fallbackPayload['text'] === 'string'\n ? requestDetailsToAction(fallbackRequest, shortName)\n : (requestedAction ?? requestDetailsToAction(fallbackRequest, shortName));\n if (!action) continue;\n\n const entry: Record<string, unknown> = { shortName, action };\n const detailedMessage = firstNonEmptyString(search.detailed_user_message);\n if (detailedMessage && detailedMessage !== shortName) entry['detailedMessage'] = detailedMessage;\n const whyDifferent = firstNonEmptyString(search.why_different);\n if (whyDifferent) entry['whyDifferent'] = whyDifferent;\n if (typeof search.image === 'string') entry['image'] = search.image;\n entries.push(entry);\n }\n\n if (entries.length === 0) {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n aiSuggestedSearches: event.payload.suggested_searches ?? [],\n },\n };\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'AISuggestedSearchCards',\n props: { entries },\n },\n },\n },\n };\n}\n\nfunction adaptGetGroundingReview(event: V1GetGroundingReview): StreamEventUISpec | StreamEventMetadata {\n const action = requestDetailsToAction(\n event.payload.requestDetails,\n firstNonEmptyString(event.payload.review_count, event.payload.text, event.payload.title) ??\n 'Urun yorumlarini goster',\n );\n if (!action) {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n groundingReview: event.payload,\n },\n };\n }\n\n const props: Record<string, unknown> = { action };\n if (event.payload.title) props['title'] = event.payload.title;\n if (event.payload.text) props['text'] = event.payload.text;\n if (event.payload.review_count) props['reviewCount'] = event.payload.review_count;\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'GroundingReviewCard',\n props,\n },\n },\n },\n };\n}\n\nfunction adaptProductListPreview(): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n analyzeAnimation: true,\n },\n };\n}\n\nfunction adaptVoice(event: V1Voice): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n voice: event.payload,\n },\n };\n}\n\nfunction adaptGroupList(event: V1GroupList): StreamEventUISpec {\n const groupList = event.payload.group_list ?? [];\n const groups: Array<{ groupName: string; products: NormalizedProduct[] }> = [];\n\n for (const group of groupList) {\n const groupName = group.group_name ?? '';\n const products = (group.product_list ?? []).map(productToNormalized);\n groups.push({ groupName, products });\n }\n\n const filterTags: Array<{ title: string; action?: { title: string; type: string; payload?: unknown } }> = [];\n for (const tag of event.payload.filter_tags ?? []) {\n const title = tag.title ?? '';\n if (!title) continue;\n const action = requestDetailsToAction(tag.requestDetails, title);\n const entry: (typeof filterTags)[number] = { title };\n if (action) entry.action = action;\n filterTags.push(entry);\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'CategoriesContainer',\n props: { groups, filterTags },\n },\n },\n },\n panelHint: 'panel',\n };\n}\n\nfunction adaptFormEvent(event: V1FormEvent): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n formType: event.type,\n formPayload: event.payload ?? {},\n },\n };\n}\n\nfunction adaptHandoff(event: V1Handoff): StreamEventUISpec {\n const props: Record<string, unknown> = {};\n if (typeof event.payload?.summary === 'string') props['summary'] = event.payload.summary;\n if (Array.isArray(event.payload?.products_discussed)) {\n props['products_discussed'] = event.payload.products_discussed;\n }\n if (typeof event.payload?.user_sentiment === 'string') {\n props['user_sentiment'] = event.payload.user_sentiment;\n }\n\n return {\n type: 'ui_spec',\n widget: 'chat',\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'HandoffNotice',\n props,\n },\n },\n },\n };\n}\n\nfunction adaptLauncherContent(event: V1LauncherContent): StreamEventMetadata {\n return {\n type: 'metadata',\n sessionId: '',\n model: '',\n meta: {\n launcherContent: event.payload ?? {},\n },\n };\n}\n\ninterface ButtonEntry {\n label: string;\n action: { title: string; type: string; payload?: unknown };\n icon?: string;\n image?: string;\n description?: string;\n}\n\nfunction buildActionButtonsUISpec(entries: ButtonEntry[], widget: WidgetName): StreamEventUISpec {\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n\n for (let i = 0; i < entries.length; i++) {\n const entry = entries[i];\n if (!entry) continue;\n const id = `action-${i}`;\n childIds.push(id);\n const props: Record<string, unknown> = {\n label: entry.label,\n action: entry.action,\n };\n if (entry.icon !== undefined) props['icon'] = entry.icon;\n if (entry.image !== undefined) props['image'] = entry.image;\n if (entry.description !== undefined) props['description'] = entry.description;\n\n elements[id] = {\n type: 'ActionButton',\n props,\n };\n }\n\n elements['root'] = {\n type: 'ActionButtons',\n props: {\n buttons: entries.map((entry) => {\n const btn: Record<string, unknown> = {\n label: entry.label,\n action: entry.action,\n };\n if (entry.image !== undefined) btn['image'] = entry.image;\n if (entry.description !== undefined) btn['description'] = entry.description;\n if (entry.icon !== undefined) btn['icon'] = entry.icon;\n return btn;\n }),\n },\n children: childIds,\n };\n\n return {\n type: 'ui_spec',\n widget,\n spec: { root: 'root', elements },\n };\n}\n\nfunction buildProductGridUISpec(products: V1Product[], widget: WidgetName): StreamEventUISpec {\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n\n for (let i = 0; i < products.length; i++) {\n const product = products[i];\n if (!product) continue;\n const id = `product-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ProductCard',\n props: { product: productToNormalized(product), index: i },\n };\n }\n\n elements['root'] = {\n type: 'ProductGrid',\n props: { layout: 'grid' },\n children: childIds,\n };\n\n return {\n type: 'ui_spec',\n widget,\n spec: { root: 'root', elements },\n };\n}\n\nfunction buildSingleProductUISpec(product: V1Product, widget: WidgetName): StreamEventUISpec {\n return {\n type: 'ui_spec',\n widget,\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ProductCard',\n props: { product: productToNormalized(product), index: 0 },\n },\n },\n },\n };\n}\n\nfunction buildEmptyUISpec(widget: WidgetName): StreamEventUISpec {\n return {\n type: 'ui_spec',\n widget,\n spec: {\n root: 'root',\n elements: {\n root: {\n type: 'ActionButtons',\n props: { buttons: [] },\n children: [],\n },\n },\n },\n };\n}\n\nfunction suggestionToNormalizedProduct(suggestion: V1AiProductSuggestion): NormalizedProduct | null {\n const fallbackSku = firstNonEmptyString(suggestion.sku);\n const fallbackName = firstNonEmptyString(suggestion.short_name);\n const productObj = asRecord(suggestion.product_item) ?? (suggestion as Record<string, unknown>);\n return productRecordToNormalized(productObj, fallbackSku, fallbackName);\n}\n\nfunction productRecordToNormalized(\n raw: Record<string, unknown>,\n fallbackSku?: string,\n fallbackName?: string,\n): NormalizedProduct | null {\n const sku = firstNonEmptyString(raw['sku'], fallbackSku);\n const name = firstNonEmptyString(raw['name'], fallbackName);\n if (!sku || !name) return null;\n\n const product: V1Product = {\n sku,\n name,\n };\n\n const brand = firstNonEmptyString(raw['brand']);\n if (brand) product.brand = brand;\n\n const url = firstNonEmptyString(raw['url']);\n if (url) product.url = url;\n\n const images = stringArray(raw['images']);\n if (images.length > 0) {\n product.images = images;\n } else {\n const image = firstNonEmptyString(raw['image'], raw['image_url'], raw['imageUrl']);\n if (image) product.images = [image];\n }\n\n const priceDiscounted = toNumber(raw['price_discounted']);\n if (priceDiscounted !== undefined) product.price_discounted = priceDiscounted;\n const price = toNumber(raw['price']);\n if (price !== undefined) product.price = price;\n const rating = toNumber(raw['rating']);\n if (rating !== undefined) product.rating = rating;\n const reviewCount = toNumber(raw['review_count']) ?? toNumber(raw['reviewCount']);\n if (reviewCount !== undefined) product.review_count = reviewCount;\n const cartCode = firstNonEmptyString(raw['cart_code'], raw['cartCode']);\n if (cartCode) product.cart_code = cartCode;\n if (typeof raw['in_stock'] === 'boolean') product.in_stock = raw['in_stock'];\n if (typeof raw['inStock'] === 'boolean') product.in_stock = raw['inStock'];\n\n return productToNormalized(product);\n}\n\nfunction requestDetailsToAction(\n requestDetails: unknown,\n label: string,\n): { title: string; type: string; payload?: unknown } | null {\n const details = asRecord(requestDetails);\n if (!details) return null;\n\n const type = details['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const action: { title: string; type: string; payload?: unknown } = {\n title: label || type,\n type,\n };\n if (details['payload'] !== undefined) action.payload = details['payload'];\n return action;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction firstNonEmptyString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed.length > 0) return trimmed;\n }\n }\n return undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is string => typeof item === 'string' && item.length > 0);\n}\n\nfunction normalizeStringList(value: unknown): string[] {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed ? [trimmed] : [];\n }\n if (!Array.isArray(value)) return [];\n return value\n .filter((item): item is string => typeof item === 'string')\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string') {\n // Handle Turkish number format: \"1.299,99\" → \"1299.99\"\n // If the string contains both '.' and ',', treat '.' as thousands separator and ',' as decimal\n let normalized: string;\n if (value.includes('.') && value.includes(',')) {\n normalized = value.replace(/\\./g, '').replace(',', '.');\n } else {\n normalized = value.replace(',', '.');\n }\n const parsed = Number(normalized);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n}\n\nfunction isNonNullable<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nexport interface NormalizedProduct {\n sku: string;\n name: string;\n imageUrl?: string;\n images?: string[];\n price?: string;\n originalPrice?: string;\n discountPercent?: number;\n url: string;\n brand?: string;\n rating?: number;\n reviewCount?: number;\n cartCode?: string;\n inStock?: boolean;\n variants?: Array<Record<string, unknown>>;\n discountReason?: string;\n promotions?: string[];\n}\n\nexport function productToNormalized(p: V1Product): NormalizedProduct {\n const price = p.price_discounted != null && p.price_discounted > 0 ? p.price_discounted : p.price;\n const originalPrice = p.price_discounted != null && p.price_discounted > 0 && p.price != null ? p.price : undefined;\n\n let discountPercent: number | undefined;\n if (originalPrice != null && price != null && originalPrice > 0) {\n discountPercent = Math.round(((originalPrice - price) / originalPrice) * 100);\n }\n\n const brand = firstNonEmptyString(p.brand);\n const name = firstNonEmptyString(p.name) ?? p.sku;\n const normalizedName = brand && !name.toLowerCase().startsWith(brand.toLowerCase()) ? `${brand} ${name}` : name;\n\n const result: NormalizedProduct = {\n sku: p.sku,\n name: normalizedName,\n url: firstNonEmptyString(p.url) ?? '',\n };\n\n const image = p.images?.[0];\n if (image) result.imageUrl = image;\n if (p.images && p.images.length > 1) result.images = p.images;\n if (price != null) result.price = String(price);\n if (originalPrice != null) result.originalPrice = String(originalPrice);\n if (discountPercent !== undefined) result.discountPercent = discountPercent;\n if (brand !== undefined) result.brand = brand;\n if (p.rating !== undefined) result.rating = p.rating;\n if (p.review_count !== undefined) result.reviewCount = p.review_count;\n if (p.cart_code !== undefined) result.cartCode = p.cart_code;\n if (p.in_stock !== undefined) result.inStock = p.in_stock;\n if (p.variants && p.variants.length > 0) result.variants = p.variants;\n if (p.discount_reason !== undefined) result.discountReason = p.discount_reason;\n if (p.promotions && p.promotions.length > 0) result.promotions = p.promotions;\n\n return result;\n}\n\nexport interface SimilarProductsJsonResponse {\n results: V1Product[];\n count: number;\n source_sku?: string;\n}\n\nexport interface ProductGroupingsJsonResponse {\n intro_message?: string;\n product_groupings: Array<{\n name: string;\n description?: string;\n highlight?: string;\n repr_sku?: string;\n repr_image?: string;\n group_skus?: string[];\n group_products?: V1Product[];\n }>;\n count: number;\n}\n\nexport function normalizeSimilarProductsResponse(json: SimilarProductsJsonResponse): NormalizedProduct[] {\n return json.results.map(productToNormalized);\n}\n\nexport function normalizeProductGroupingsResponse(json: ProductGroupingsJsonResponse): Array<{\n name: string;\n highlight?: string;\n products: NormalizedProduct[];\n}> {\n return json.product_groupings.map((group) => {\n const result: { name: string; highlight?: string; products: NormalizedProduct[] } = {\n name: group.name,\n products: (group.group_products ?? []).map(productToNormalized),\n };\n if (group.highlight !== undefined) result.highlight = group.highlight;\n return result;\n });\n}\n","/**\n * Endpoint path helpers.\n *\n * All endpoints use `/chat/*` prefix. API versioning is handled via\n * request-level compatibility params or feature-toggle params.\n */\n\nexport type ChatEndpointName =\n | 'process_action'\n | 'launcher_action'\n | 'similar_products'\n | 'product_groupings'\n | 'proactive_action';\n\nexport type BackendType = 'v1' | 'acap';\n\nexport interface ChatTransportConfig {\n middlewareUrl: string;\n attachment?: File;\n /** Backend type: 'v1' (default) or 'acap'. */\n backendType?: BackendType;\n /** Account ID — required for ACAP backend (used in URL path). */\n accountId?: string;\n}\n\nconst CHAT_ENDPOINT_PATHS: Record<ChatEndpointName, `/${string}`> = {\n process_action: '/process_action',\n launcher_action: '/launcher_action',\n similar_products: '/similar_products',\n product_groupings: '/product_groupings',\n proactive_action: '/proactive_action',\n};\n\n/**\n * ACAP endpoint mapping.\n * ACAP uses /api/chat/:accountId/message for all actions.\n */\nconst ACAP_ENDPOINT_MAP: Partial<Record<ChatEndpointName, string>> = {\n process_action: '/message',\n launcher_action: '/message',\n};\n\nexport function normalizeMiddlewareUrl(input?: string): string {\n if (input === undefined) {\n throw new Error('[gengage] middlewareUrl is required. Pass your Gengage backend URL in widget config.');\n }\n const raw = input.trim();\n if (raw === '') return '';\n return raw.replace(/\\/+$/, '');\n}\n\nexport function buildChatEndpointUrl(endpoint: ChatEndpointName, config: ChatTransportConfig): string {\n const baseUrl = normalizeMiddlewareUrl(config?.middlewareUrl);\n\n if (config.backendType === 'acap') {\n const accountId = config.accountId ?? '';\n const acapPath = ACAP_ENDPOINT_MAP[endpoint];\n if (acapPath) {\n return `${baseUrl}/api/chat/${accountId}${acapPath}`;\n }\n // Fallback: unsupported ACAP endpoints use v1 path\n }\n\n return `${baseUrl}/chat${CHAT_ENDPOINT_PATHS[endpoint]}`;\n}\n","import { consumeStream } from '../common/streaming.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport type { StreamEvent, UISpec, PageContext } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface BackendRequestMeta {\n outputLanguage: string;\n parentUrl: string;\n windowWidth: string;\n windowHeight: string;\n selfUrl: string;\n id: string;\n userId: string;\n appId: string;\n threads: unknown[];\n createdAt: string;\n kvkkApproved: boolean;\n voiceEnabled: boolean;\n threadId: string;\n isControlGroup: boolean;\n isMobile: boolean;\n viewId?: string;\n}\n\nexport interface ProcessActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n user_id?: string;\n view_id?: string;\n\n /**\n * @deprecated Use top-level `type` and `payload` instead.\n * Kept for one release cycle of backward compatibility.\n */\n action?: {\n title: string;\n type: string;\n payload?: unknown;\n };\n\n /** Backend action type identifier (preferred over `action.type`). */\n type?: string;\n /** Arbitrary action data passed to the backend (preferred over `action.payload`). */\n payload?: unknown;\n\n sku?: string;\n page_type?: string;\n locale?: string;\n meta?: BackendRequestMeta;\n context?: {\n messages?: Array<{ role: string; content: string }>;\n [key: string]: unknown;\n };\n}\n\nexport interface ActionEnrichmentContext {\n pageContext?: PageContext | undefined;\n backendContext?: import('../common/types.js').BackendContext | null | undefined;\n isMobile?: boolean | undefined;\n}\n\n/**\n * Enriches action payloads with fields the v1 backend expects.\n * Only adds fields that are not already present in the payload.\n */\nexport function enrichActionPayload(\n action: { title: string; type: string; payload?: unknown },\n ctx: ActionEnrichmentContext,\n): { title: string; type: string; payload?: unknown } {\n const type = action.type;\n const existing =\n action.payload != null && typeof action.payload === 'object' && !Array.isArray(action.payload)\n ? (action.payload as Record<string, unknown>)\n : {};\n\n // Helper: only set if not already present\n const merge = (additions: Record<string, unknown>): Record<string, unknown> => {\n const result = { ...existing };\n for (const [key, value] of Object.entries(additions)) {\n if (!(key in result)) {\n result[key] = value;\n }\n }\n return result;\n };\n\n switch (type) {\n case 'inputText': {\n const additions: Record<string, unknown> = {\n is_launcher: 0,\n };\n if (ctx.pageContext?.extra) additions['page_details'] = ctx.pageContext.extra;\n // is_suggested_text may already be set by adapter — don't overwrite\n if (!('is_suggested_text' in existing)) additions['is_suggested_text'] = 0;\n return { ...action, payload: merge(additions) };\n }\n\n case 'findSimilar': {\n const additions: Record<string, unknown> = {\n is_launcher: 0,\n };\n if (action.title) additions['text'] = action.title;\n if (action.title) additions['input'] = action.title;\n return { ...action, payload: merge(additions) };\n }\n\n case 'getComparisonTable': {\n // sku_list should already be set; no-op if present\n return action;\n }\n\n case 'addToCart': {\n const additions: Record<string, unknown> = {};\n if (!('error_message' in existing)) additions['error_message'] = '';\n return { ...action, payload: merge(additions) };\n }\n\n case 'reviewSummary': {\n const additions: Record<string, unknown> = {};\n if (ctx.pageContext?.sku && !('sku' in existing)) {\n additions['sku'] = ctx.pageContext.sku;\n }\n if (Object.keys(additions).length === 0) return action;\n return { ...action, payload: merge(additions) };\n }\n\n default:\n return action;\n }\n}\n\nexport interface StreamCallbacks {\n onTextChunk: (\n content: string,\n isFinal: boolean,\n extra?: {\n productMentions?: Array<{ sku: string; short_name: string }> | undefined;\n skuToProductItem?: Record<string, Record<string, unknown>> | undefined;\n conversationMode?: string | undefined;\n },\n ) => void;\n onUISpec: (spec: UISpec, widget: string, panelHint?: 'panel') => void;\n onAction: (event: StreamEvent) => void;\n onMetadata: (event: StreamEvent) => void;\n onError: (err: Error) => void;\n onDone: () => void;\n}\n\n/**\n * Action type mapping.\n * The backend's ActionType enum uses `inputText` for user messages,\n * while the frontend uses `user_message`. Map at the boundary.\n */\nconst ACTION_TYPE_MAP: Record<string, string> = {\n user_message: 'inputText',\n};\n\n/**\n * Builds the request body for `/chat/process_action` (v1 backend).\n *\n * Backend expects `type` and `payload` at the top level —\n * matching chat_api.py's current schema.\n */\nfunction buildRequestBody(request: ProcessActionRequest): string {\n const { action, type: flatType, payload: flatPayload, ...rest } = request;\n // Prefer top-level type/payload; fall back to deprecated action wrapper.\n const rawType = flatType ?? action?.type ?? 'inputText';\n const rawPayload = flatPayload ?? action?.payload;\n const mappedType = ACTION_TYPE_MAP[rawType] ?? rawType;\n const body: Record<string, unknown> = {\n ...rest,\n type: mappedType,\n };\n if (rawPayload !== undefined) {\n // Backend expects payload as an object. Wrap string payloads for compatibility.\n body.payload = typeof rawPayload === 'string' ? { text: rawPayload } : rawPayload;\n }\n return JSON.stringify(body);\n}\n\n/**\n * Builds the request body for ACAP backend (`/api/chat/:siteId/message`).\n *\n * ACAP expects: { message, session_id, user_id, output_language, screen_context }\n */\nfunction buildAcapRequestBody(request: ProcessActionRequest): string {\n const rawType = request.type ?? request.action?.type ?? 'inputText';\n const rawPayload = request.payload ?? request.action?.payload;\n\n // Extract user message text from various payload shapes\n let message = request.action?.title ?? '';\n if (rawType === 'inputText' || rawType === 'user_message') {\n if (typeof rawPayload === 'string') {\n message = rawPayload;\n } else if (rawPayload && typeof rawPayload === 'object' && 'text' in rawPayload) {\n message = String((rawPayload as Record<string, unknown>).text);\n }\n }\n\n const body: Record<string, unknown> = {\n message,\n session_id: request.session_id,\n };\n\n if (request.user_id) body.user_id = request.user_id;\n if (request.locale) body.output_language = request.locale;\n if (request.meta?.outputLanguage) body.output_language = request.meta.outputLanguage;\n\n // Map page context to ACAP screen_context\n if (request.sku || request.page_type) {\n const screenContext: Record<string, unknown> = {};\n if (request.page_type) screenContext.screen_type = request.page_type;\n if (request.sku) screenContext.sku_list = [request.sku];\n body.screen_context = screenContext;\n }\n\n // For non-message actions, send the action type and payload\n if (rawType !== 'inputText' && rawType !== 'user_message') {\n body.action_type = rawType;\n if (rawPayload !== undefined) {\n body.action_payload = typeof rawPayload === 'string' ? { text: rawPayload } : rawPayload;\n }\n }\n\n return JSON.stringify(body);\n}\n\nexport function sendChatMessage(\n request: ProcessActionRequest,\n callbacks: StreamCallbacks,\n transport: ChatTransportConfig,\n): AbortController {\n const url = buildChatEndpointUrl('process_action', transport);\n const controller = new AbortController();\n\n const run = async (): Promise<void> => {\n try {\n const requestBody = transport.backendType === 'acap' ? buildAcapRequestBody(request) : buildRequestBody(request);\n\n // Use FormData only when an attachment is present; otherwise send JSON.\n const useFormData = transport.attachment !== undefined;\n\n let fetchInit: RequestInit;\n if (useFormData) {\n const formData = new FormData();\n formData.append('request', requestBody);\n if (transport.attachment !== undefined) {\n formData.append('attachment', transport.attachment);\n }\n fetchInit = {\n method: 'POST',\n body: formData,\n signal: controller.signal,\n };\n } else {\n fetchInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: requestBody,\n signal: controller.signal,\n };\n }\n\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n let detail = response.statusText;\n try {\n const body = await response.json();\n const msg =\n (body as Record<string, unknown>).detail ??\n (body as Record<string, unknown>).message ??\n (body as Record<string, unknown>).error;\n if (typeof msg === 'string') detail = msg;\n } catch {\n /* body not JSON — keep statusText */\n }\n callbacks.onError(new Error(`HTTP ${response.status}: ${detail}`));\n return;\n }\n\n // Guard against double-fire: onDone must fire exactly once\n let doneFired = false;\n const fireDone = () => {\n if (doneFired) return;\n doneFired = true;\n callbacks.onDone();\n };\n\n await consumeStream(response, {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n switch (normalized.type) {\n case 'text_chunk':\n callbacks.onTextChunk(normalized.content, normalized.final === true, {\n productMentions: normalized.productMentions,\n skuToProductItem: normalized.skuToProductItem,\n conversationMode: normalized.conversationMode,\n });\n break;\n case 'ui_spec':\n callbacks.onUISpec(normalized.spec, normalized.widget, normalized.panelHint);\n break;\n case 'action':\n callbacks.onAction(normalized);\n break;\n case 'metadata':\n callbacks.onMetadata(normalized);\n break;\n case 'error':\n callbacks.onError(new Error(normalized.message));\n break;\n case 'done':\n fireDone();\n break;\n }\n },\n onError: callbacks.onError,\n signal: controller.signal,\n });\n\n // Fallback: if stream completed without a chatStreamEnd event (backend\n // bug or truncated response), ensure onDone fires so the widget doesn't\n // get stuck with a spinning typing indicator.\n fireDone();\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n callbacks.onError(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n void run();\n return controller;\n}\n\nexport async function fetchProactiveAction(\n request: { account_id: string; sku?: string; page_type?: string; output_language?: string; mode?: string },\n transport: ChatTransportConfig,\n): Promise<{ title?: string; question?: string; actions?: unknown[] } | null> {\n const url = buildChatEndpointUrl('proactive_action', transport);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n if (!res.ok) return null;\n return (await res.json()) as { title?: string; question?: string; actions?: unknown[] };\n } catch {\n return null;\n }\n}\n","import type { ChatI18n } from '../types.js';\n\nexport const CHAT_I18N_TR: ChatI18n = {\n headerTitle: 'Ürün Uzmanı',\n inputPlaceholder: 'Ürün ara, soru sor',\n sendButton: 'Gönder',\n closeButton: 'Kapat',\n openButton: 'Sohbeti aç',\n newChatButton: 'Yeni sohbet',\n poweredBy: 'Powered by Gengage',\n errorMessage: 'Bir hata oluştu. Lütfen tekrar deneyin.',\n retryButton: 'Tekrar Dene',\n loadingMessage: 'Düşünüyorum...',\n productCtaLabel: 'İncele',\n attachImageButton: 'Resim ekle',\n removeAttachmentButton: 'Resmi kaldır',\n invalidFileType: 'Sadece JPEG, PNG ve WebP dosyaları destekleniyor.',\n fileTooLarge: \"Dosya boyutu 5 MB'dan küçük olmalıdır.\",\n aiTopPicksTitle: 'Sizin İçin En İyiler',\n roleWinner: 'En Beğendiğim',\n roleBestValue: 'En Uygun Fiyatlı',\n roleBestAlternative: 'En İyi Alternatif',\n viewDetails: 'Detayları Gör',\n groundingReviewCta: 'Yorumları Oku',\n groundingReviewSubtitle: '{count} yorum mevcut',\n variantsLabel: 'Varyantlar',\n sortRelated: 'Önerilen',\n sortPriceAsc: 'Fiyat ↑',\n sortPriceDesc: 'Fiyat ↓',\n compareSelected: 'Karşılaştır',\n panelTitleProductDetails: 'Ürün Detayı',\n panelTitleSimilarProducts: 'Benzer Ürünler',\n panelTitleComparisonResults: 'Karşılaştırma Sonuçları',\n panelTitleCategories: 'Kategoriler',\n panelTitleSearchResults: 'Arama Sonuçları',\n inStockLabel: 'Stokta',\n outOfStockLabel: 'Tükendi',\n findSimilarLabel: 'Benzerlerini Bul',\n choicePrompterHeading: 'Kararsız mı kaldın?',\n choicePrompterSuggestion: 'Ürünleri seçip karşılaştırabilirsin',\n choicePrompterCta: 'Seç ve Karşılaştır',\n viewMoreLabel: 'Daha Fazla Göster',\n similarProductsLabel: 'Benzer Ürünler',\n addToCartButton: 'Sepete Ekle',\n shareButton: 'Paylaş',\n productInfoTab: 'Ürün Bilgileri',\n specificationsTab: 'Teknik Özellikler',\n recommendedChoiceLabel: 'Önerilen Seçim',\n highlightsLabel: 'Öne Çıkan Özellikler',\n keyDifferencesLabel: 'Temel Farklar',\n specialCasesLabel: 'Özel Durumlar İçin',\n emptyReviewsMessage: 'Yorum özeti bulunamadı.',\n closeAriaLabel: 'Kapat',\n startChatLabel: 'Sohbete Başla',\n voiceButton: 'Sesli giriş',\n voiceListening: 'Dinleniyor...',\n voiceNotSupported: 'Sesli giriş bu tarayıcıda desteklenmiyor.',\n voicePermissionDenied: 'Mikrofon erişimi reddedildi.',\n voiceError: 'Sesli giriş hatası.',\n handoffHeading: 'Destek temsilcisine aktarılıyor',\n productNotFoundMessage: 'Bu ürün bilgisi şu an kullanılamıyor. Başka bir konuda yardımcı olabilirim.',\n};\n","import type { ChatI18n } from '../types.js';\n\nexport const CHAT_I18N_EN: ChatI18n = {\n headerTitle: 'Product Expert',\n inputPlaceholder: 'Search products, ask questions',\n sendButton: 'Send',\n closeButton: 'Close',\n openButton: 'Open chat',\n newChatButton: 'New chat',\n poweredBy: 'Powered by Gengage',\n errorMessage: 'Something went wrong. Please try again.',\n retryButton: 'Retry',\n loadingMessage: 'Thinking...',\n productCtaLabel: 'View',\n attachImageButton: 'Attach image',\n removeAttachmentButton: 'Remove image',\n invalidFileType: 'Only JPEG, PNG and WebP files are supported.',\n fileTooLarge: 'File must be smaller than 5 MB.',\n aiTopPicksTitle: 'Top Picks for You',\n roleWinner: 'Top Pick',\n roleBestValue: 'Best Value',\n roleBestAlternative: 'Best Alternative',\n viewDetails: 'View Details',\n groundingReviewCta: 'Read Reviews',\n groundingReviewSubtitle: '{count} reviews available',\n variantsLabel: 'Variants',\n sortRelated: 'Related',\n sortPriceAsc: 'Price ↑',\n sortPriceDesc: 'Price ↓',\n compareSelected: 'Compare',\n panelTitleProductDetails: 'Product Details',\n panelTitleSimilarProducts: 'Similar Products',\n panelTitleComparisonResults: 'Comparison Results',\n panelTitleCategories: 'Categories',\n panelTitleSearchResults: 'Search Results',\n inStockLabel: 'In Stock',\n outOfStockLabel: 'Out of Stock',\n findSimilarLabel: 'Find Similar',\n choicePrompterHeading: \"Can't decide?\",\n choicePrompterSuggestion: 'Select products to compare them',\n choicePrompterCta: 'Select & Compare',\n viewMoreLabel: 'Show More',\n similarProductsLabel: 'Similar Products',\n addToCartButton: 'Add to Cart',\n shareButton: 'Share',\n productInfoTab: 'Product Info',\n specificationsTab: 'Specifications',\n recommendedChoiceLabel: 'Recommended Choice',\n highlightsLabel: 'Key Highlights',\n keyDifferencesLabel: 'Key Differences',\n specialCasesLabel: 'For Special Cases',\n emptyReviewsMessage: 'No review summary found.',\n closeAriaLabel: 'Close',\n startChatLabel: 'Start Chat',\n voiceButton: 'Voice input',\n voiceListening: 'Listening...',\n voiceNotSupported: 'Voice input is not supported in this browser.',\n voicePermissionDenied: 'Microphone access denied.',\n voiceError: 'Voice input error.',\n handoffHeading: 'Transferring to a support agent',\n productNotFoundMessage: 'Product information is currently unavailable. I can help with something else.',\n};\n","import type { ChatI18n } from '../types.js';\nimport { CHAT_I18N_TR } from './tr.js';\nimport { CHAT_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveChatLocale(locale?: string): ChatI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return CHAT_I18N_EN;\n default:\n return CHAT_I18N_TR;\n }\n}\n\nexport { CHAT_I18N_TR, CHAT_I18N_EN };\n","/**\n * Browser-native Web Speech API voice input.\n *\n * Uses the SpeechRecognition API for real-time speech-to-text.\n * The frontend sends transcribed text directly — no audio blobs\n * are sent to the backend. This replaces server-side Groq Whisper.\n *\n * Supports:\n * - Real-time transcription with interim results\n * - Turkish (`tr-TR`) and English (`en-US`) language support\n * - Auto-submit on silence (configurable timeout)\n * - Microphone permission handling with descriptive errors\n *\n * Browser support:\n * - Chrome 33+, Edge 79+, Safari 14.1+ (via webkitSpeechRecognition)\n * - Firefox: NOT SUPPORTED (no SpeechRecognition API)\n */\n\n// ---------------------------------------------------------------------------\n// Web Speech API types (not in lib.dom.d.ts for all TS targets)\n// ---------------------------------------------------------------------------\n\ninterface SpeechRecognitionEvent extends Event {\n readonly resultIndex: number;\n readonly results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n readonly isFinal: boolean;\n readonly length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n}\n\ninterface SpeechRecognitionAlternative {\n readonly transcript: string;\n readonly confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n readonly error: string;\n readonly message: string;\n}\n\ninterface SpeechRecognitionConstructor {\n new (): SpeechRecognitionInstance;\n}\n\ninterface SpeechRecognitionInstance extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n maxAlternatives: number;\n onresult: ((event: SpeechRecognitionEvent) => void) | null;\n onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;\n onend: (() => void) | null;\n onstart: (() => void) | null;\n onspeechend: (() => void) | null;\n onaudiostart: (() => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type VoiceInputState = 'idle' | 'listening' | 'error';\n\nexport type VoiceInputErrorCode =\n | 'not-supported'\n | 'not-allowed'\n | 'no-microphone'\n | 'no-speech'\n | 'network'\n | 'aborted'\n | 'unknown';\n\nexport interface VoiceInputCallbacks {\n /** Called with interim transcript while the user speaks. */\n onInterim?: (text: string) => void;\n /** Called with final transcript when a phrase is recognized. */\n onFinal?: (text: string) => void;\n /** Called when auto-submit fires (silence timeout reached with final text). */\n onAutoSubmit?: (text: string) => void;\n /** Called when voice input state changes. */\n onStateChange?: (state: VoiceInputState) => void;\n /** Called on recognition error. */\n onError?: (code: VoiceInputErrorCode, message: string) => void;\n}\n\nexport interface VoiceInputOptions {\n /** BCP 47 language tag. Default: 'tr-TR'. */\n lang?: string;\n /** Silence duration in ms before auto-submit. Default: 1500. */\n silenceTimeoutMs?: number;\n /** Whether to auto-submit on silence. Default: true. */\n autoSubmit?: boolean;\n}\n\n/**\n * Check whether the browser supports the Web Speech API.\n */\nexport function isVoiceInputSupported(): boolean {\n return getSpeechRecognitionConstructor() !== null;\n}\n\nfunction getSpeechRecognitionConstructor(): SpeechRecognitionConstructor | null {\n const w = globalThis as unknown as Record<string, unknown>;\n return (w.SpeechRecognition ?? w.webkitSpeechRecognition ?? null) as SpeechRecognitionConstructor | null;\n}\n\nexport class VoiceInput {\n private recognition: SpeechRecognitionInstance | null = null;\n private _state: VoiceInputState = 'idle';\n private silenceTimer: ReturnType<typeof setTimeout> | null = null;\n private accumulatedTranscript = '';\n private readonly callbacks: VoiceInputCallbacks;\n private readonly lang: string;\n private readonly silenceTimeoutMs: number;\n private readonly autoSubmit: boolean;\n private intentionalStop = false;\n\n constructor(callbacks: VoiceInputCallbacks, options?: VoiceInputOptions) {\n this.callbacks = callbacks;\n this.lang = options?.lang ?? 'tr-TR';\n this.silenceTimeoutMs = options?.silenceTimeoutMs ?? 1500;\n this.autoSubmit = options?.autoSubmit ?? true;\n }\n\n get state(): VoiceInputState {\n return this._state;\n }\n\n /**\n * Start listening. Requests microphone permission on first call.\n */\n start(): void {\n if (this._state === 'listening') return;\n\n const Ctor = getSpeechRecognitionConstructor();\n if (!Ctor) {\n this.setState('error');\n this.callbacks.onError?.('not-supported', 'Web Speech API is not supported in this browser.');\n return;\n }\n\n // Require secure context (HTTPS)\n if (typeof globalThis.isSecureContext !== 'undefined' && !globalThis.isSecureContext) {\n this.setState('error');\n this.callbacks.onError?.('not-allowed', 'Voice input requires HTTPS.');\n return;\n }\n\n this.accumulatedTranscript = '';\n this.intentionalStop = false;\n\n const recognition = new Ctor();\n recognition.continuous = true;\n recognition.interimResults = true;\n recognition.lang = this.lang;\n recognition.maxAlternatives = 1;\n\n recognition.onstart = () => {\n this.setState('listening');\n };\n\n recognition.onresult = (event: SpeechRecognitionEvent) => {\n this.clearSilenceTimer();\n\n let interim = '';\n let latestFinal = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n if (!result) continue;\n const alt = result[0];\n if (!alt) continue;\n if (result.isFinal) {\n latestFinal += alt.transcript;\n } else {\n interim += alt.transcript;\n }\n }\n\n if (latestFinal) {\n this.accumulatedTranscript += latestFinal;\n this.callbacks.onFinal?.(this.accumulatedTranscript);\n }\n\n if (interim) {\n this.callbacks.onInterim?.(this.accumulatedTranscript + interim);\n }\n\n // Start silence timer for auto-submit\n if (this.autoSubmit && this.accumulatedTranscript) {\n this.startSilenceTimer();\n }\n };\n\n recognition.onerror = (event: SpeechRecognitionErrorEvent) => {\n const code = mapErrorCode(event.error);\n // 'no-speech' and 'aborted' during intentional stop are not real errors\n if (this.intentionalStop && (event.error === 'no-speech' || event.error === 'aborted')) {\n return;\n }\n this.setState('error');\n this.callbacks.onError?.(code, event.message || event.error);\n };\n\n recognition.onend = () => {\n this.clearSilenceTimer();\n // Auto-restart if still in listening state (browser may stop recognition arbitrarily)\n if (this._state === 'listening' && !this.intentionalStop) {\n try {\n recognition.start();\n } catch {\n this.setState('idle');\n }\n return;\n }\n this.setState('idle');\n };\n\n this.recognition = recognition;\n\n try {\n recognition.start();\n } catch {\n this.setState('error');\n this.callbacks.onError?.('unknown', 'Failed to start speech recognition.');\n }\n }\n\n /**\n * Stop listening. Returns the accumulated transcript.\n */\n stop(): string {\n this.intentionalStop = true;\n this.clearSilenceTimer();\n if (this.recognition) {\n try {\n this.recognition.stop();\n } catch {\n // Already stopped\n }\n this.recognition = null;\n }\n this.setState('idle');\n return this.accumulatedTranscript;\n }\n\n /**\n * Abort listening. Discards any accumulated transcript.\n */\n abort(): void {\n this.intentionalStop = true;\n this.clearSilenceTimer();\n this.accumulatedTranscript = '';\n if (this.recognition) {\n try {\n this.recognition.abort();\n } catch {\n // Already aborted\n }\n this.recognition = null;\n }\n this.setState('idle');\n }\n\n /** Destroy the instance and release resources. */\n destroy(): void {\n this.abort();\n }\n\n private setState(state: VoiceInputState): void {\n if (this._state !== state) {\n this._state = state;\n this.callbacks.onStateChange?.(state);\n }\n }\n\n private startSilenceTimer(): void {\n this.clearSilenceTimer();\n this.silenceTimer = setTimeout(() => {\n const text = this.stop();\n if (text.trim()) {\n this.callbacks.onAutoSubmit?.(text.trim());\n }\n }, this.silenceTimeoutMs);\n }\n\n private clearSilenceTimer(): void {\n if (this.silenceTimer !== null) {\n clearTimeout(this.silenceTimer);\n this.silenceTimer = null;\n }\n }\n}\n\nfunction mapErrorCode(error: string): VoiceInputErrorCode {\n switch (error) {\n case 'not-allowed':\n return 'not-allowed';\n case 'no-speech':\n return 'no-speech';\n case 'audio-capture':\n return 'no-microphone';\n case 'network':\n return 'network';\n case 'aborted':\n return 'aborted';\n default:\n return 'unknown';\n }\n}\n","import { sanitizeHtml } from '../../common/safe-html.js';\n\nexport interface KvkkBannerOptions {\n htmlContent: string;\n onDismiss: () => void;\n closeAriaLabel?: string;\n}\n\nexport function createKvkkBanner(options: KvkkBannerOptions): HTMLElement {\n const banner = document.createElement('div');\n banner.className = 'gengage-chat-kvkk-banner';\n banner.setAttribute('role', 'alert');\n\n const content = document.createElement('div');\n content.className = 'gengage-chat-kvkk-content';\n content.innerHTML = sanitizeHtml(options.htmlContent);\n banner.appendChild(content);\n\n const dismiss = document.createElement('button');\n dismiss.className = 'gengage-chat-kvkk-dismiss';\n dismiss.type = 'button';\n dismiss.setAttribute('aria-label', options.closeAriaLabel ?? 'KVKK bildirimini kapat');\n dismiss.textContent = '\\u00D7';\n dismiss.addEventListener('click', options.onDismiss);\n banner.appendChild(dismiss);\n\n return banner;\n}\n","/**\n * PanelTopBar — navigation bar at the top of the panel pane.\n *\n * Shows back/forward arrow buttons and a title derived from the current\n * panel content type.\n */\n\nexport interface PanelTopBarOptions {\n onBack: () => void;\n onForward: () => void;\n}\n\nexport class PanelTopBar {\n private _el: HTMLElement;\n private _backBtn: HTMLButtonElement;\n private _forwardBtn: HTMLButtonElement;\n private _titleEl: HTMLElement;\n\n constructor(options: PanelTopBarOptions) {\n this._el = document.createElement('div');\n this._el.className = 'gengage-chat-panel-topbar';\n\n this._backBtn = document.createElement('button');\n this._backBtn.className = 'gengage-chat-panel-topbar-back';\n this._backBtn.type = 'button';\n this._backBtn.disabled = true;\n this._backBtn.setAttribute('aria-label', 'Back');\n this._backBtn.textContent = '\\u2190'; // ←\n this._backBtn.addEventListener('click', () => options.onBack());\n\n this._titleEl = document.createElement('span');\n this._titleEl.className = 'gengage-chat-panel-topbar-title';\n\n this._forwardBtn = document.createElement('button');\n this._forwardBtn.className = 'gengage-chat-panel-topbar-forward';\n this._forwardBtn.type = 'button';\n this._forwardBtn.disabled = true;\n this._forwardBtn.setAttribute('aria-label', 'Forward');\n this._forwardBtn.textContent = '\\u2192'; // →\n this._forwardBtn.addEventListener('click', () => options.onForward());\n\n this._el.appendChild(this._backBtn);\n this._el.appendChild(this._titleEl);\n this._el.appendChild(this._forwardBtn);\n }\n\n update(canBack: boolean, canForward: boolean, title: string): void {\n this._backBtn.disabled = !canBack;\n this._forwardBtn.disabled = !canForward;\n this._titleEl.textContent = title;\n }\n\n getElement(): HTMLElement {\n return this._el;\n }\n}\n","/**\n * Vertical strip of product thumbnails along the right edge of the panel (results) pane.\n *\n * Clicking a thumbnail dispatches a rollback to the thread where that product was shown.\n */\n\nimport { isSafeImageUrl } from '../../common/safe-html.js';\n\nexport interface ThumbnailEntry {\n sku: string;\n imageUrl: string;\n threadId: string;\n}\n\nexport interface ThumbnailsColumnOptions {\n onThumbnailClick: (threadId: string) => void;\n}\n\nexport class ThumbnailsColumn {\n private readonly _el: HTMLElement;\n private readonly _onThumbnailClick: (threadId: string) => void;\n\n constructor(options: ThumbnailsColumnOptions) {\n this._onThumbnailClick = options.onThumbnailClick;\n\n this._el = document.createElement('div');\n this._el.className = 'gengage-chat-thumbnails-column';\n this._el.style.display = 'none';\n }\n\n getElement(): HTMLElement {\n return this._el;\n }\n\n setEntries(entries: ThumbnailEntry[]): void {\n // Deduplicate by SKU (keep first occurrence)\n const seen = new Set<string>();\n const unique: ThumbnailEntry[] = [];\n for (const entry of entries) {\n if (!seen.has(entry.sku)) {\n seen.add(entry.sku);\n unique.push(entry);\n }\n }\n\n this._el.innerHTML = '';\n\n for (const entry of unique) {\n const thumb = document.createElement('button');\n thumb.type = 'button';\n thumb.className = 'gengage-chat-thumbnail-btn';\n thumb.title = entry.sku;\n\n if (isSafeImageUrl(entry.imageUrl)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-thumbnail-img';\n img.src = entry.imageUrl;\n img.alt = entry.sku;\n img.width = 40;\n img.height = 40;\n thumb.appendChild(img);\n }\n\n thumb.addEventListener('click', () => {\n this._onThumbnailClick(entry.threadId);\n });\n\n this._el.appendChild(thumb);\n }\n }\n\n show(): void {\n this._el.style.display = '';\n }\n\n hide(): void {\n this._el.style.display = 'none';\n }\n}\n","import type { ChatI18n, ChatMessage } from '../types.js';\nimport { sanitizeHtml, isSafeImageUrl } from '../../common/safe-html.js';\nimport { CHAT_I18N_TR } from '../locales/index.js';\nimport { VoiceInput, isVoiceInputSupported } from '../../common/voice-input.js';\nimport { createKvkkBanner } from './KvkkBanner.js';\nimport { PanelTopBar } from './PanelTopBar.js';\nimport { ThumbnailsColumn } from './ThumbnailsColumn.js';\nimport type { ThumbnailEntry } from './ThumbnailsColumn.js';\n\n/** SVG icon map for suggested action chips/pills. Keys match backend icon names. */\nconst SUGGESTED_ACTION_ICONS: Record<string, string> = {\n search:\n '<svg viewBox=\"0 0 16 16\" class=\"gengage-chat-icon\"><circle cx=\"6.5\" cy=\"6.5\" r=\"5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><line x1=\"10\" y1=\"10\" x2=\"15\" y2=\"15\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n review:\n '<svg viewBox=\"0 0 16 16\" class=\"gengage-chat-icon\"><polygon points=\"8,1 10,6 15,6 11,9 12.5,14 8,11 3.5,14 5,9 1,6 6,6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n info: '<svg viewBox=\"0 0 16 16\" class=\"gengage-chat-icon\"><circle cx=\"8\" cy=\"8\" r=\"7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\"/><circle cx=\"8\" cy=\"4.5\" r=\"0.8\" fill=\"currentColor\"/></svg>',\n similar:\n '<svg viewBox=\"0 0 16 16\" class=\"gengage-chat-icon\"><rect x=\"1\" y=\"3\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><rect x=\"9\" y=\"3\" width=\"6\" height=\"6\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/></svg>',\n};\n\nexport { SUGGESTED_ACTION_ICONS };\n\nexport interface ChatDrawerOptions {\n i18n: ChatI18n;\n onSend: (text: string, attachment?: File) => void;\n onClose: () => void;\n onAttachment?: (file: File) => void;\n onPanelToggle?: () => void;\n onRollback?: (messageId: string) => void;\n headerTitle?: string | undefined;\n headerAvatarUrl?: string | undefined;\n headerBadge?: string | undefined;\n /** URL for the cart icon link in the header (e.g. \"/sepetim\"). */\n headerCartUrl?: string | undefined;\n /** Show a favorites (heart) toggle button in the header. */\n headerFavoritesToggle?: boolean | undefined;\n onFavoritesClick?: (() => void) | undefined;\n /** Callback fired when the panel back button is clicked. */\n onPanelBack?: (() => void) | undefined;\n /** Callback fired when the panel forward button is clicked. */\n onPanelForward?: (() => void) | undefined;\n /** Callback fired when a product thumbnail is clicked (for thread rollback). */\n onThumbnailClick?: ((threadId: string) => void) | undefined;\n /** Callback fired when a link in bot HTML is clicked. */\n onLinkClick?: ((url: string) => void) | undefined;\n /** Enable voice input (Web Speech API STT). Default: false. */\n voiceEnabled?: boolean | undefined;\n /** BCP 47 language for speech recognition. Default: 'tr-TR'. */\n voiceLang?: string | undefined;\n}\n\nconst DEFAULT_I18N: ChatI18n = CHAT_I18N_TR;\n\nexport class ChatDrawer {\n private root: HTMLElement;\n private messagesEl: HTMLElement;\n private inputEl: HTMLTextAreaElement;\n private sendBtn: HTMLButtonElement;\n private i18n: ChatI18n;\n private onSend: (text: string, attachment?: File) => void;\n private _panelEl: HTMLElement;\n private _panelVisible = false;\n private _panelCollapsed = false;\n private _dividerEl: HTMLElement;\n private _onPanelToggle: (() => void) | undefined = undefined;\n private _pendingAttachment: File | null = null;\n private _fileInput: HTMLInputElement;\n private _previewStrip: HTMLElement;\n private _previewName: HTMLElement;\n private _onAttachment: ((file: File) => void) | undefined = undefined;\n private _onRollback: ((messageId: string) => void) | undefined = undefined;\n private _onLinkClick: ((url: string) => void) | undefined = undefined;\n private _pillsEl: HTMLElement;\n private _kvkkSlot: HTMLElement;\n private _panelTopBar: PanelTopBar;\n private _userScrolledUp = false;\n private _scrollLockedUntil = 0;\n private _inputChipsEl: HTMLElement;\n private _thumbnailsColumn: ThumbnailsColumn;\n private _thinkingSteps: string[] = [];\n private _firstBotMessageIds: Set<string> = new Set();\n private _voiceInput: VoiceInput | null = null;\n private _micBtn: HTMLButtonElement | null = null;\n private _voiceEnabled = false;\n private _voiceLang = 'tr-TR';\n private _ignoreNextDividerClick = false;\n\n constructor(container: HTMLElement, options: ChatDrawerOptions) {\n this.i18n = { ...DEFAULT_I18N, ...options.i18n };\n this.onSend = options.onSend;\n if (options.onPanelToggle !== undefined) {\n this._onPanelToggle = options.onPanelToggle;\n }\n if (options.onAttachment !== undefined) {\n this._onAttachment = options.onAttachment;\n }\n if (options.onRollback !== undefined) {\n this._onRollback = options.onRollback;\n }\n if (options.onLinkClick !== undefined) {\n this._onLinkClick = options.onLinkClick;\n }\n if (options.voiceEnabled) {\n this._voiceEnabled = true;\n }\n if (options.voiceLang !== undefined) {\n this._voiceLang = options.voiceLang;\n }\n\n this.root = document.createElement('div');\n this.root.className = 'gengage-chat-drawer';\n this.root.setAttribute('role', 'dialog');\n this.root.setAttribute('aria-label', this.i18n.headerTitle ?? 'Chat');\n this.root.setAttribute('aria-modal', 'true');\n\n // Header — branded dark bar\n const header = document.createElement('div');\n header.className = 'gengage-chat-header';\n\n const headerLeft = document.createElement('div');\n headerLeft.className = 'gengage-chat-header-left';\n\n if (options.headerAvatarUrl) {\n const avatar = document.createElement('img');\n avatar.className = 'gengage-chat-header-avatar';\n avatar.src = options.headerAvatarUrl;\n avatar.alt = options.headerTitle ?? 'Assistant';\n headerLeft.appendChild(avatar);\n }\n\n const headerInfo = document.createElement('div');\n headerInfo.className = 'gengage-chat-header-info';\n\n const titleRow = document.createElement('div');\n titleRow.className = 'gengage-chat-header-title-row';\n const title = document.createElement('span');\n title.className = 'gengage-chat-header-title';\n title.textContent = options.headerTitle ?? this.i18n.headerTitle ?? 'Gengage Asistan\\u0131';\n titleRow.appendChild(title);\n\n if (options.headerBadge) {\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-header-badge';\n badge.textContent = options.headerBadge;\n titleRow.appendChild(badge);\n }\n headerInfo.appendChild(titleRow);\n\n const powered = document.createElement('a');\n powered.className = 'gengage-chat-header-powered';\n powered.href = 'https://gengage.ai/';\n powered.target = '_blank';\n powered.rel = 'noopener noreferrer';\n powered.innerHTML = `<svg viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M8 1a7 7 0 110 14A7 7 0 018 1zm0 1.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM7 4.5h2v4H7v-4zm0 5h2v2H7v-2z\"/></svg>Powered by Gengage`;\n headerInfo.appendChild(powered);\n\n headerLeft.appendChild(headerInfo);\n header.appendChild(headerLeft);\n\n const headerRight = document.createElement('div');\n headerRight.className = 'gengage-chat-header-right';\n\n // Cart link (optional — production shows cart icon → /sepetim)\n if (options.headerCartUrl) {\n const cartLink = document.createElement('a');\n cartLink.className = 'gengage-chat-header-btn';\n cartLink.href = options.headerCartUrl;\n cartLink.target = '_blank';\n cartLink.rel = 'noopener noreferrer';\n cartLink.setAttribute('aria-label', 'Sepetim');\n cartLink.innerHTML = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"9\" cy=\"21\" r=\"1\"/><circle cx=\"20\" cy=\"21\" r=\"1\"/><path d=\"M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6\"/></svg>`;\n headerRight.appendChild(cartLink);\n }\n\n // Favorites heart toggle (optional)\n if (options.headerFavoritesToggle) {\n const favBtn = document.createElement('button');\n favBtn.className = 'gengage-chat-header-btn';\n favBtn.type = 'button';\n favBtn.setAttribute('aria-label', 'Favorilerim');\n favBtn.innerHTML = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"/></svg>`;\n favBtn.addEventListener('click', () => options.onFavoritesClick?.());\n headerRight.appendChild(favBtn);\n }\n\n const closeBtn = document.createElement('button');\n closeBtn.className = 'gengage-chat-close';\n closeBtn.type = 'button';\n closeBtn.setAttribute('aria-label', this.i18n.closeButton);\n closeBtn.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\n closeBtn.addEventListener('click', options.onClose);\n headerRight.appendChild(closeBtn);\n header.appendChild(headerRight);\n\n // Body: flex container for panel + conversation\n const body = document.createElement('div');\n body.className = 'gengage-chat-body';\n\n // Panel (hidden by default)\n this._panelEl = document.createElement('div');\n this._panelEl.className = 'gengage-chat-panel';\n\n // Panel top bar (navigation)\n this._panelTopBar = new PanelTopBar({\n onBack: () => options.onPanelBack?.(),\n onForward: () => options.onPanelForward?.(),\n });\n this._panelEl.appendChild(this._panelTopBar.getElement());\n\n body.appendChild(this._panelEl);\n\n // Divider between panel and conversation\n this._dividerEl = document.createElement('div');\n this._dividerEl.className = 'gengage-chat-panel-divider gengage-chat-panel-divider--hidden';\n this._dividerEl.setAttribute('role', 'separator');\n this._dividerEl.setAttribute('aria-label', 'Toggle panel');\n const chevron = document.createElement('button');\n chevron.className = 'gengage-chat-panel-divider-toggle';\n chevron.type = 'button';\n chevron.setAttribute('aria-label', 'Toggle panel');\n chevron.textContent = '\\u00BB'; // » (collapse right)\n chevron.addEventListener('click', () => {\n if (this._ignoreNextDividerClick) {\n this._ignoreNextDividerClick = false;\n return;\n }\n this.togglePanel();\n this._onPanelToggle?.();\n });\n let touchStartX: number | null = null;\n let touchStartY: number | null = null;\n const swipeThreshold = 24;\n this._dividerEl.addEventListener(\n 'touchstart',\n (event) => {\n if (window.innerWidth > 768) return;\n const touch = event.changedTouches?.[0];\n if (!touch) return;\n touchStartX = touch.clientX;\n touchStartY = touch.clientY;\n },\n { passive: true },\n );\n this._dividerEl.addEventListener(\n 'touchend',\n (event) => {\n if (window.innerWidth > 768) return;\n if (touchStartX === null || touchStartY === null) return;\n const touch = event.changedTouches?.[0];\n if (!touch) return;\n\n const deltaX = touch.clientX - touchStartX;\n const deltaY = touch.clientY - touchStartY;\n touchStartX = null;\n touchStartY = null;\n\n // Vertical swipe only. Swipe up collapses panel, swipe down expands.\n if (Math.abs(deltaY) < swipeThreshold || Math.abs(deltaY) < Math.abs(deltaX)) return;\n const nextCollapsed = deltaY < 0;\n if (nextCollapsed === this._panelCollapsed) return;\n\n this._ignoreNextDividerClick = true;\n this.setPanelCollapsed(nextCollapsed);\n this._onPanelToggle?.();\n },\n { passive: true },\n );\n this._dividerEl.appendChild(chevron);\n body.appendChild(this._dividerEl);\n\n // Conversation wrapper — header lives inside so it only spans chat width\n const conversation = document.createElement('div');\n conversation.className = 'gengage-chat-conversation';\n conversation.appendChild(header);\n\n // KVKK banner slot (inserted above messages)\n this._kvkkSlot = document.createElement('div');\n this._kvkkSlot.className = 'gengage-chat-kvkk-slot';\n conversation.appendChild(this._kvkkSlot);\n\n // Messages area\n this.messagesEl = document.createElement('div');\n this.messagesEl.className = 'gengage-chat-messages';\n this.messagesEl.setAttribute('role', 'log');\n this.messagesEl.setAttribute('aria-live', 'polite');\n this.messagesEl.setAttribute('aria-label', 'Chat messages');\n\n // Track user scroll position to avoid auto-scrolling when reading history\n let scrollRafPending = false;\n this.messagesEl.addEventListener(\n 'scroll',\n () => {\n if (scrollRafPending) return;\n scrollRafPending = true;\n requestAnimationFrame(() => {\n scrollRafPending = false;\n const { scrollTop, scrollHeight, clientHeight } = this.messagesEl;\n this._userScrolledUp = scrollHeight - scrollTop - clientHeight > 10;\n });\n },\n { passive: true },\n );\n\n conversation.appendChild(this.messagesEl);\n\n // Thumbnails column (right edge of panel — quick-scroll shortcuts for search results)\n this._thumbnailsColumn = new ThumbnailsColumn({\n onThumbnailClick: (threadId) => options.onThumbnailClick?.(threadId),\n });\n this._panelEl.appendChild(this._thumbnailsColumn.getElement());\n\n // Suggestion pills row (between messages and input)\n this._pillsEl = document.createElement('div');\n this._pillsEl.className = 'gengage-chat-pills';\n this._pillsEl.setAttribute('role', 'toolbar');\n this._pillsEl.setAttribute('aria-label', 'Suggestions');\n this._pillsEl.style.display = 'none';\n\n const pillsScroll = document.createElement('div');\n pillsScroll.className = 'gengage-chat-pills-scroll';\n this._pillsEl.appendChild(pillsScroll);\n\n const pillsArrow = document.createElement('button');\n pillsArrow.className = 'gengage-chat-pills-arrow';\n pillsArrow.type = 'button';\n pillsArrow.setAttribute('aria-label', 'More suggestions');\n pillsArrow.textContent = '\\u203A'; // › single right-pointing angle\n pillsArrow.addEventListener('click', () => {\n pillsScroll.scrollBy({ left: 150, behavior: 'smooth' });\n });\n this._pillsEl.appendChild(pillsArrow);\n\n // Hide arrow when fully scrolled\n let pillsRafPending = false;\n pillsScroll.addEventListener(\n 'scroll',\n () => {\n if (pillsRafPending) return;\n pillsRafPending = true;\n requestAnimationFrame(() => {\n pillsRafPending = false;\n const atEnd = pillsScroll.scrollLeft + pillsScroll.clientWidth >= pillsScroll.scrollWidth - 4;\n pillsArrow.style.display = atEnd ? 'none' : '';\n });\n },\n { passive: true },\n );\n\n conversation.appendChild(this._pillsEl);\n\n // Input-area chips (compact chips above input for search/info/review/similar)\n this._inputChipsEl = document.createElement('div');\n this._inputChipsEl.className = 'gengage-chat-input-chips';\n this._inputChipsEl.style.display = 'none';\n conversation.appendChild(this._inputChipsEl);\n\n // Input area\n const inputArea = document.createElement('div');\n inputArea.className = 'gengage-chat-input-area';\n\n this.inputEl = document.createElement('textarea');\n this.inputEl.className = 'gengage-chat-input';\n this.inputEl.rows = 1;\n this.inputEl.placeholder = this.i18n.inputPlaceholder;\n\n // Auto-expand on desktop as user types (capped at 120px)\n this.inputEl.addEventListener('input', () => {\n requestAnimationFrame(() => {\n this.inputEl.style.height = 'auto';\n this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 120)}px`;\n });\n });\n\n // Enter submits; Shift+Enter inserts newline on desktop only\n this.inputEl.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n const isMobile = window.innerWidth < 768;\n if (isMobile || !e.shiftKey) {\n e.preventDefault();\n this._submit();\n }\n // else: Shift+Enter on desktop → natural newline (no preventDefault)\n }\n });\n\n this.inputEl.addEventListener('paste', (e) => {\n const file = e.clipboardData?.files[0];\n if (file && file.type.startsWith('image/')) {\n e.preventDefault();\n if (this._onAttachment) {\n this._onAttachment(file);\n } else {\n this.stageAttachment(file);\n }\n }\n });\n\n // Hidden file input\n this._fileInput = document.createElement('input');\n this._fileInput.type = 'file';\n this._fileInput.accept = 'image/jpeg,image/png,image/webp';\n this._fileInput.style.display = 'none';\n this._fileInput.addEventListener('change', () => {\n const file = this._fileInput.files?.[0];\n if (file) {\n if (this._onAttachment) {\n this._onAttachment(file);\n } else {\n this.stageAttachment(file);\n }\n }\n this._fileInput.value = '';\n });\n\n // Attach button with camera SVG\n const attachBtn = document.createElement('button');\n attachBtn.className = 'gengage-chat-attach-btn';\n attachBtn.type = 'button';\n attachBtn.setAttribute('aria-label', this.i18n.attachImageButton);\n attachBtn.innerHTML = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\"/><circle cx=\"12\" cy=\"13\" r=\"4\"/></svg>`;\n attachBtn.addEventListener('click', () => this._fileInput.click());\n\n // Attachment preview strip (hidden by default)\n this._previewStrip = document.createElement('div');\n this._previewStrip.className = 'gengage-chat-attachment-preview gengage-chat-attachment-preview--hidden';\n const previewThumb = document.createElement('img');\n previewThumb.className = 'gengage-chat-attachment-preview-thumb';\n previewThumb.alt = '';\n this._previewName = document.createElement('span');\n this._previewName.className = 'gengage-chat-attachment-name';\n const removeBtn = document.createElement('button');\n removeBtn.className = 'gengage-chat-attachment-remove';\n removeBtn.type = 'button';\n removeBtn.setAttribute('aria-label', this.i18n.removeAttachmentButton);\n removeBtn.textContent = '\\u00D7'; // multiplication sign (x)\n removeBtn.addEventListener('click', () => this.clearAttachment());\n this._previewStrip.appendChild(previewThumb);\n this._previewStrip.appendChild(this._previewName);\n this._previewStrip.appendChild(removeBtn);\n\n this.sendBtn = document.createElement('button');\n this.sendBtn.className = 'gengage-chat-send';\n this.sendBtn.type = 'button';\n this.sendBtn.setAttribute('aria-label', this.i18n.sendButton);\n this.sendBtn.innerHTML = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/></svg>`;\n this.sendBtn.addEventListener('click', () => this._submit());\n\n // Drag-and-drop on input area\n inputArea.addEventListener('dragover', (e) => {\n e.preventDefault();\n inputArea.classList.add('gengage-chat-input-area--dragover');\n });\n inputArea.addEventListener('dragleave', () => {\n inputArea.classList.remove('gengage-chat-input-area--dragover');\n });\n inputArea.addEventListener('drop', (e) => {\n e.preventDefault();\n inputArea.classList.remove('gengage-chat-input-area--dragover');\n const file = e.dataTransfer?.files[0];\n if (file) {\n if (this._onAttachment) {\n this._onAttachment(file);\n } else {\n this.stageAttachment(file);\n }\n }\n });\n\n // Build pill container: [camera] [input] [mic?] [send]\n const pill = document.createElement('div');\n pill.className = 'gengage-chat-input-pill';\n pill.appendChild(attachBtn);\n pill.appendChild(this.inputEl);\n\n // Voice input mic button (Web Speech API STT)\n if (this._voiceEnabled && isVoiceInputSupported()) {\n this._micBtn = document.createElement('button');\n this._micBtn.className = 'gengage-chat-mic-btn';\n this._micBtn.type = 'button';\n this._micBtn.setAttribute('aria-label', this.i18n.voiceButton);\n this._micBtn.innerHTML =\n '<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/>' +\n '<path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>' +\n '<line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/>' +\n '<line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/>' +\n '</svg>';\n this._micBtn.addEventListener('click', () => this._toggleVoice());\n pill.appendChild(this._micBtn);\n\n this._voiceInput = new VoiceInput(\n {\n onInterim: (text) => {\n this.inputEl.value = text;\n this.inputEl.style.height = 'auto';\n this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 120)}px`;\n },\n onFinal: (text) => {\n this.inputEl.value = text;\n },\n onAutoSubmit: (text) => {\n this.inputEl.value = text;\n this._micBtn?.classList.remove('gengage-chat-mic-btn--active');\n this._submit();\n },\n onStateChange: (state) => {\n if (state === 'listening') {\n this._micBtn?.classList.add('gengage-chat-mic-btn--active');\n } else {\n this._micBtn?.classList.remove('gengage-chat-mic-btn--active');\n }\n },\n onError: (_code, _message) => {\n this._micBtn?.classList.remove('gengage-chat-mic-btn--active');\n },\n },\n { lang: this._voiceLang },\n );\n }\n\n pill.appendChild(this.sendBtn);\n\n inputArea.appendChild(this._previewStrip);\n inputArea.appendChild(this._fileInput);\n inputArea.appendChild(pill);\n conversation.appendChild(inputArea);\n\n body.appendChild(conversation);\n this.root.appendChild(body);\n\n // Footer\n const footer = document.createElement('div');\n footer.className = 'gengage-chat-footer';\n footer.textContent = this.i18n.poweredBy;\n this.root.appendChild(footer);\n\n // Escape key to close drawer\n this.root.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n options.onClose();\n }\n });\n\n this._trapFocus();\n\n container.appendChild(this.root);\n }\n\n addMessage(message: ChatMessage): void {\n const bubble = document.createElement('div');\n bubble.className = `gengage-chat-bubble gengage-chat-bubble--${message.role}`;\n bubble.dataset['messageId'] = message.id;\n if (message.threadId) {\n bubble.dataset['threadId'] = message.threadId;\n }\n\n if (this._firstBotMessageIds.has(message.id)) {\n bubble.classList.add('gengage-chat-bubble--first');\n }\n\n if (message.attachment) {\n const thumbEl = document.createElement('img');\n thumbEl.className = 'gengage-chat-attachment-thumb';\n const blobUrl = URL.createObjectURL(message.attachment);\n thumbEl.src = blobUrl;\n thumbEl.alt = message.attachment.name;\n // Revoke blob URL once image loads (or errors) to free memory\n thumbEl.addEventListener('load', () => URL.revokeObjectURL(blobUrl), { once: true });\n thumbEl.addEventListener('error', () => URL.revokeObjectURL(blobUrl), { once: true });\n bubble.insertBefore(thumbEl, bubble.firstChild);\n }\n\n if (message.content) {\n const text = document.createElement('div');\n text.className = 'gengage-chat-bubble-text';\n if (message.role === 'assistant') {\n text.innerHTML = sanitizeHtml(message.content);\n // Intercept all links in bot HTML\n if (this._onLinkClick) {\n const links = text.querySelectorAll('a[href]');\n for (const link of links) {\n link.addEventListener('click', (e) => {\n e.preventDefault();\n const href = link.getAttribute('href');\n if (href) {\n this._onLinkClick?.(href);\n }\n });\n }\n }\n } else {\n text.textContent = message.content; // User messages: always safe textContent\n }\n bubble.appendChild(text);\n }\n\n // Add rollback button to user message bubbles\n if (message.role === 'user' && this._onRollback) {\n const rollbackBtn = document.createElement('button');\n rollbackBtn.className = 'gengage-chat-rollback-btn';\n rollbackBtn.type = 'button';\n rollbackBtn.setAttribute('aria-label', 'Rollback to this message');\n rollbackBtn.innerHTML = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"/><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"/></svg>`;\n rollbackBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n this._onRollback?.(message.id);\n });\n bubble.appendChild(rollbackBtn);\n }\n\n this.messagesEl.appendChild(bubble);\n this._scrollToBottom(message.role === 'user');\n }\n\n showTypingIndicator(searchText?: string): void {\n this.removeTypingIndicator();\n const container = document.createElement('div');\n container.className = 'gengage-chat-typing';\n container.dataset['typing'] = 'true';\n\n if (this._thinkingSteps.length > 0) {\n // Render accumulated thinking steps\n this._renderThinkingStepsInto(container);\n } else {\n // Default 3-dot animation\n const indicator = document.createElement('div');\n indicator.className = 'gengage-chat-typing-dots';\n for (let i = 0; i < 3; i++) indicator.appendChild(document.createElement('span'));\n container.appendChild(indicator);\n if (searchText) {\n const sparkle = document.createElement('span');\n sparkle.className = 'gengage-chat-typing-sparkle';\n sparkle.textContent = '\\u2728'; // sparkle\n container.appendChild(sparkle);\n\n const text = document.createElement('span');\n text.className = 'gengage-chat-typing-text';\n text.textContent = searchText;\n container.appendChild(text);\n }\n }\n\n this.messagesEl.appendChild(container);\n this._scrollToBottom(true);\n }\n\n /** Accumulate a new thinking step (shown as a checklist in the typing indicator). */\n addThinkingStep(text: string): void {\n this._thinkingSteps.push(text);\n this._renderThinkingSteps();\n }\n\n removeTypingIndicator(): void {\n const existing = this.messagesEl.querySelector('.gengage-chat-typing');\n existing?.remove();\n this._thinkingSteps = [];\n }\n\n showError(message?: string, onRetry?: () => void): void {\n const errEl = document.createElement('div');\n errEl.className = 'gengage-chat-error';\n const textEl = document.createElement('span');\n textEl.textContent = message ?? this.i18n.errorMessage;\n errEl.appendChild(textEl);\n\n if (onRetry) {\n const retryBtn = document.createElement('button');\n retryBtn.className = 'gengage-chat-error-retry';\n retryBtn.textContent = this.i18n.retryButton ?? 'Retry';\n retryBtn.addEventListener('click', () => {\n errEl.remove();\n onRetry();\n });\n errEl.appendChild(retryBtn);\n }\n\n this.messagesEl.appendChild(errEl);\n this._scrollToBottom(true);\n }\n\n clearMessages(): void {\n this.messagesEl.innerHTML = '';\n }\n\n /** Replace suggestion pills. Pass empty array to hide. */\n setPills(\n pills: Array<{ label: string; onAction: () => void; icon?: string; image?: string; description?: string }>,\n ): void {\n const scroll = this._pillsEl.querySelector('.gengage-chat-pills-scroll');\n if (!scroll) return;\n while (scroll.firstChild) scroll.removeChild(scroll.firstChild);\n\n if (pills.length === 0) {\n this._pillsEl.style.display = 'none';\n return;\n }\n\n this._pillsEl.style.display = '';\n for (const pill of pills) {\n const btn = document.createElement('button');\n btn.className = pill.image ? 'gengage-chat-pill gengage-chat-pill--rich' : 'gengage-chat-pill';\n btn.type = 'button';\n\n if (pill.icon) {\n const svgHtml = SUGGESTED_ACTION_ICONS[pill.icon];\n if (svgHtml) {\n const iconSpan = document.createElement('span');\n iconSpan.className = 'gengage-chat-pill-icon';\n iconSpan.innerHTML = svgHtml;\n btn.appendChild(iconSpan);\n }\n }\n\n if (pill.image && isSafeImageUrl(pill.image)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-pill-img';\n img.src = pill.image;\n img.alt = '';\n btn.appendChild(img);\n }\n\n const textWrap = document.createElement('span');\n textWrap.className = 'gengage-chat-pill-text';\n textWrap.textContent = pill.label;\n btn.appendChild(textWrap);\n\n if (pill.description) {\n const desc = document.createElement('span');\n desc.className = 'gengage-chat-pill-desc';\n desc.textContent = pill.description;\n btn.appendChild(desc);\n }\n\n btn.addEventListener('click', () => pill.onAction());\n scroll.appendChild(btn);\n }\n\n // Show/hide arrow based on overflow\n const arrow = this._pillsEl.querySelector('.gengage-chat-pills-arrow') as HTMLElement | null;\n if (arrow) {\n requestAnimationFrame(() => {\n arrow.style.display = scroll.scrollWidth > scroll.clientWidth ? '' : 'none';\n });\n }\n }\n\n focusInput(): void {\n this.inputEl.focus();\n }\n\n showKvkkBanner(html: string, onDismiss: () => void): void {\n this._kvkkSlot.innerHTML = '';\n const banner = createKvkkBanner({ htmlContent: html, onDismiss });\n this._kvkkSlot.appendChild(banner);\n }\n\n hideKvkkBanner(): void {\n this._kvkkSlot.innerHTML = '';\n }\n\n getElement(): HTMLElement {\n return this.root;\n }\n\n /** Stage a file attachment for sending. Shows preview. */\n stageAttachment(file: File): void {\n this._pendingAttachment = file;\n this._previewName.textContent = file.name;\n const thumb = this._previewStrip.querySelector('.gengage-chat-attachment-preview-thumb') as HTMLImageElement;\n if (thumb) {\n // Revoke previous blob URL to prevent memory leak\n if (thumb.src && thumb.src.startsWith('blob:')) {\n URL.revokeObjectURL(thumb.src);\n }\n thumb.src = URL.createObjectURL(file);\n }\n this._previewStrip.classList.remove('gengage-chat-attachment-preview--hidden');\n }\n\n /** Remove the staged attachment and hide preview. */\n clearAttachment(): void {\n const thumb = this._previewStrip.querySelector('.gengage-chat-attachment-preview-thumb') as HTMLImageElement;\n if (thumb?.src) {\n URL.revokeObjectURL(thumb.src);\n thumb.src = '';\n }\n this._pendingAttachment = null;\n this._previewStrip.classList.add('gengage-chat-attachment-preview--hidden');\n }\n\n /** Get the currently staged attachment file, or null. */\n getPendingAttachment(): File | null {\n return this._pendingAttachment;\n }\n\n /** Replace panel content and show the panel. */\n setPanelContent(el: HTMLElement): void {\n this._panelEl.innerHTML = '';\n this._panelEl.appendChild(this._panelTopBar.getElement());\n this._panelEl.appendChild(el);\n this._dividerEl.classList.remove('gengage-chat-panel-divider--hidden');\n if (!this._panelVisible) {\n this._panelVisible = true;\n this._panelEl.classList.add('gengage-chat-panel--visible');\n this.root.classList.add('gengage-chat-drawer--with-panel');\n }\n if (this._panelCollapsed) {\n this._panelEl.classList.add('gengage-chat-panel--collapsed');\n }\n }\n\n /** Append content to the panel without replacing existing content. */\n appendPanelContent(el: HTMLElement): void {\n this._panelEl.appendChild(el);\n this._dividerEl.classList.remove('gengage-chat-panel-divider--hidden');\n if (!this._panelVisible) {\n this._panelVisible = true;\n this._panelEl.classList.add('gengage-chat-panel--visible');\n this.root.classList.add('gengage-chat-drawer--with-panel');\n }\n }\n\n /** Return the panel element's content child (after topbar), or null. */\n getPanelContentElement(): HTMLElement | null {\n const children = this._panelEl.children;\n for (let i = 0; i < children.length; i++) {\n const child = children[i] as HTMLElement;\n if (\n child.classList.contains('gengage-chat-panel-topbar') ||\n child.classList.contains('gengage-chat-thumbnails-column')\n ) {\n continue;\n }\n return child;\n }\n return null;\n }\n\n /** Whether the panel is currently visible and has rendered content (beyond topbar + thumbnails column). */\n hasPanelContent(): boolean {\n return this._panelVisible && this.getPanelContentElement() !== null;\n }\n\n /** Whether panel currently shows loading skeleton blocks. */\n isPanelLoading(): boolean {\n return this._panelEl.querySelector('.gengage-chat-panel-skeleton') !== null;\n }\n\n /** Show loading skeleton in the panel. Variant depends on contentType hint. */\n showPanelLoading(contentType?: string): void {\n this._dividerEl.classList.remove('gengage-chat-panel-divider--hidden');\n this._panelEl.innerHTML = '';\n this._panelEl.appendChild(this._panelTopBar.getElement());\n const skeleton = document.createElement('div');\n skeleton.className = 'gengage-chat-panel-skeleton';\n\n switch (contentType) {\n case 'productDetails': {\n // Tall image placeholder + text lines\n const imgBlock = document.createElement('div');\n imgBlock.className = 'gengage-chat-panel-skeleton-block gengage-chat-panel-skeleton-block--image';\n skeleton.appendChild(imgBlock);\n for (let i = 0; i < 3; i++) {\n const line = document.createElement('div');\n line.className = 'gengage-chat-panel-skeleton-block gengage-chat-panel-skeleton-block--text';\n skeleton.appendChild(line);\n }\n break;\n }\n case 'productList':\n case 'groupList': {\n // 2x3 grid of small card placeholders\n const grid = document.createElement('div');\n grid.className = 'gengage-chat-panel-skeleton-grid';\n for (let i = 0; i < 6; i++) {\n const card = document.createElement('div');\n card.className = 'gengage-chat-panel-skeleton-block gengage-chat-panel-skeleton-block--card';\n grid.appendChild(card);\n }\n skeleton.appendChild(grid);\n break;\n }\n case 'comparisonTable': {\n // Table-like rows\n for (let i = 0; i < 4; i++) {\n const row = document.createElement('div');\n row.className = 'gengage-chat-panel-skeleton-block gengage-chat-panel-skeleton-block--row';\n skeleton.appendChild(row);\n }\n break;\n }\n default: {\n // Generic: 3 blocks (existing behavior)\n for (let i = 0; i < 3; i++) {\n const block = document.createElement('div');\n block.className = 'gengage-chat-panel-skeleton-block';\n skeleton.appendChild(block);\n }\n break;\n }\n }\n\n this._panelEl.appendChild(skeleton);\n if (!this._panelVisible) {\n this._panelVisible = true;\n this._panelEl.classList.add('gengage-chat-panel--visible');\n this.root.classList.add('gengage-chat-drawer--with-panel');\n }\n }\n\n /** Update the panel top bar navigation state. */\n updatePanelTopBar(canBack: boolean, canForward: boolean, title: string): void {\n this._panelTopBar.update(canBack, canForward, title);\n }\n\n /**\n * Hide the panel and clear its content. Always hides — even in force-expanded mode.\n * Callers: _hideDrawer (stale panel cleanup), stream onDone (loading skeleton cleanup),\n * thread navigation (no snapshot to restore). All require full hide.\n * Keeps `_panelCollapsed` untouched so user collapse preference survives future panel renders.\n */\n clearPanel(): void {\n this._panelEl.innerHTML = '';\n this._panelEl.appendChild(this._panelTopBar.getElement());\n this._panelVisible = false;\n this._panelEl.classList.remove('gengage-chat-panel--visible', 'gengage-chat-panel--collapsed');\n this.root.classList.remove('gengage-chat-drawer--with-panel');\n this._dividerEl.classList.add('gengage-chat-panel-divider--hidden');\n }\n\n /** Expand panel without locking — user can still toggle via divider. */\n expandPanel(): void {\n this._panelCollapsed = false;\n this._panelEl.classList.remove('gengage-chat-panel--collapsed');\n if (!this._panelVisible) {\n this._panelVisible = true;\n this._panelEl.classList.add('gengage-chat-panel--visible');\n this.root.classList.add('gengage-chat-drawer--with-panel');\n }\n }\n\n /**\n * Ensure the panel starts expanded (panelMode: 'expanded').\n * Users can still collapse/expand via the divider chevron.\n */\n setForceExpanded(): void {\n this._panelCollapsed = false;\n this._panelEl.classList.remove('gengage-chat-panel--collapsed');\n // Show panel immediately even if empty\n if (!this._panelVisible) {\n this._panelVisible = true;\n this._panelEl.classList.add('gengage-chat-panel--visible');\n this.root.classList.add('gengage-chat-drawer--with-panel');\n }\n this._dividerEl.classList.remove('gengage-chat-panel-divider--hidden');\n }\n\n /** Toggle panel between collapsed and expanded. */\n togglePanel(): void {\n this.setPanelCollapsed(!this._panelCollapsed);\n }\n\n /** Whether the panel is currently collapsed by the user. */\n isPanelCollapsed(): boolean {\n return this._panelCollapsed;\n }\n\n /** Programmatically set panel collapsed state. */\n setPanelCollapsed(collapsed: boolean): void {\n this._panelCollapsed = collapsed;\n if (collapsed) {\n this._panelEl.classList.add('gengage-chat-panel--collapsed');\n } else {\n this._panelEl.classList.remove('gengage-chat-panel--collapsed');\n }\n const chevronBtn = this._dividerEl.querySelector('.gengage-chat-panel-divider-toggle');\n if (chevronBtn) {\n chevronBtn.textContent = collapsed ? '\\u00AB' : '\\u00BB'; // « (expand left) or » (collapse right)\n }\n }\n\n /** Save panel collapsed state to sessionStorage. */\n persistPanelState(accountId: string): void {\n try {\n const key = `gengage:panel:${accountId}`;\n if (this._panelCollapsed) {\n sessionStorage.setItem(key, 'collapsed');\n } else {\n sessionStorage.removeItem(key);\n }\n } catch {\n // sessionStorage may be unavailable in restricted environments\n }\n }\n\n /** Restore panel collapsed state from sessionStorage. Returns true when restored as collapsed. */\n restorePanelState(accountId: string): boolean {\n try {\n const key = `gengage:panel:${accountId}`;\n if (sessionStorage.getItem(key) === 'collapsed') {\n this._panelCollapsed = true;\n return true;\n }\n } catch {\n // sessionStorage may be unavailable in restricted environments\n }\n return false;\n }\n\n /** Re-render thinking steps inside the existing typing indicator container. */\n private _renderThinkingSteps(): void {\n const existing = this.messagesEl.querySelector('[data-typing=\"true\"]') as HTMLElement | null;\n if (!existing) {\n // No typing indicator yet — create one with the steps\n this.showTypingIndicator();\n return;\n }\n // Clear and re-render\n existing.innerHTML = '';\n this._renderThinkingStepsInto(existing);\n this._scrollToBottom(false);\n }\n\n /** Render the accumulated thinking-step checklist into a container element. */\n private _renderThinkingStepsInto(container: HTMLElement): void {\n const list = document.createElement('div');\n list.className = 'gengage-chat-thinking-steps';\n\n for (let i = 0; i < this._thinkingSteps.length; i++) {\n const step = document.createElement('div');\n step.className = 'gengage-chat-thinking-step';\n\n const marker = document.createElement('span');\n marker.className = 'gengage-chat-thinking-step-marker';\n\n if (i < this._thinkingSteps.length - 1) {\n // Completed step\n marker.textContent = '\\u2713'; // ✓\n marker.classList.add('gengage-chat-thinking-step-marker--done');\n } else {\n // Current step (last one — still in progress)\n marker.textContent = '\\u25CF'; // ●\n marker.classList.add('gengage-chat-thinking-step-marker--active');\n }\n\n step.appendChild(marker);\n\n const text = document.createElement('span');\n text.className = 'gengage-chat-thinking-step-text';\n text.textContent = this._thinkingSteps[i]!;\n step.appendChild(text);\n\n list.appendChild(step);\n }\n\n container.appendChild(list);\n }\n\n private _trapFocus(): void {\n this.root.addEventListener('keydown', (e) => {\n if (e.key !== 'Tab') return;\n const focusable = this.root.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) return;\n\n // Use getRootNode() to resolve activeElement inside Shadow DOM\n const rootNode = this.root.getRootNode();\n const active = (rootNode as ShadowRoot).activeElement ?? document.activeElement;\n\n if (e.shiftKey) {\n if (active === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n });\n }\n\n private _submit(): void {\n const text = this.inputEl.value.trim();\n const attachment = this._pendingAttachment;\n if (!text && !attachment) return;\n this.onSend(text, attachment ?? undefined);\n this.inputEl.value = '';\n this.inputEl.style.height = 'auto'; // Reset textarea height after submit\n this.clearAttachment();\n }\n\n private _toggleVoice(): void {\n if (!this._voiceInput) return;\n if (this._voiceInput.state === 'listening') {\n const text = this._voiceInput.stop();\n if (text.trim()) {\n this.inputEl.value = text;\n this._submit();\n }\n } else {\n this.inputEl.value = '';\n this._voiceInput.start();\n }\n }\n\n /** Lock auto-scroll for 500ms after session history restore to prevent visual jump. */\n lockScrollForRestore(): void {\n this._scrollLockedUntil = Date.now() + 500;\n }\n\n /** Scroll to bottom only if user hasn't scrolled up. Force=true always scrolls. */\n private _scrollToBottom(force = false): void {\n if (!force && this._userScrolledUp) return;\n if (!force && Date.now() < this._scrollLockedUntil) return;\n requestAnimationFrame(() => {\n this.messagesEl.scrollTop = this.messagesEl.scrollHeight;\n this._userScrolledUp = false;\n });\n }\n\n /** Public method for typewriter ticks — scrolls only if user is near bottom. */\n scrollToBottomIfNeeded(): void {\n this._scrollToBottom(false);\n }\n\n /** Update a bot message's text content in the DOM (e.g. for fallback messages). */\n updateBotMessage(messageId: string, html: string): void {\n const bubble = this.messagesEl.querySelector(`[data-message-id=\"${CSS.escape(messageId)}\"]`);\n if (!bubble) return;\n let textEl = bubble.querySelector('.gengage-chat-bubble-text');\n if (!textEl) {\n textEl = document.createElement('div');\n textEl.className = 'gengage-chat-bubble-text';\n bubble.appendChild(textEl);\n }\n textEl.innerHTML = sanitizeHtml(html);\n this._scrollToBottom(false);\n }\n\n /** Mark a message as the first bot message in its thread (for special styling). */\n markFirstBotMessage(messageId: string): void {\n this._firstBotMessageIds.add(messageId);\n const bubble = this.messagesEl.querySelector(`[data-message-id=\"${CSS.escape(messageId)}\"]`);\n if (bubble) {\n bubble.classList.add('gengage-chat-bubble--first');\n }\n }\n\n /** Scroll to the first message of the last thread (for restore targeting). */\n scrollToLastThread(): void {\n const allBubbles = this.messagesEl.querySelectorAll('[data-thread-id]');\n if (allBubbles.length === 0) {\n this._scrollToBottom(true);\n return;\n }\n const lastThreadId = allBubbles[allBubbles.length - 1]!.getAttribute('data-thread-id');\n if (!lastThreadId) {\n this._scrollToBottom(true);\n return;\n }\n const target = this.messagesEl.querySelector(`[data-thread-id=\"${CSS.escape(lastThreadId)}\"]`);\n if (target) {\n requestAnimationFrame(() => {\n target.scrollIntoView({ block: 'start', behavior: 'auto' });\n this._userScrolledUp = false;\n });\n } else {\n this._scrollToBottom(true);\n }\n }\n\n /** Set compact input-area chips (search/info/review shortcuts above input). */\n setInputAreaChips(chips: Array<{ label: string; onAction: () => void; icon?: string }>): void {\n this._inputChipsEl.innerHTML = '';\n if (chips.length === 0) {\n this._inputChipsEl.style.display = 'none';\n return;\n }\n this._inputChipsEl.style.display = '';\n for (const chip of chips) {\n const btn = document.createElement('button');\n btn.className = 'gengage-chat-input-chip';\n btn.type = 'button';\n\n // Icon (SVG from icon map)\n if (chip.icon) {\n const svgHtml = SUGGESTED_ACTION_ICONS[chip.icon];\n if (svgHtml) {\n const iconSpan = document.createElement('span');\n iconSpan.className = 'gengage-chat-input-chip-icon';\n iconSpan.innerHTML = svgHtml;\n btn.appendChild(iconSpan);\n }\n }\n\n const label = document.createElement('span');\n label.textContent = chip.label;\n btn.appendChild(label);\n\n btn.addEventListener('click', () => chip.onAction());\n this._inputChipsEl.appendChild(btn);\n }\n }\n\n /** Clear input-area chips. */\n clearInputAreaChips(): void {\n this._inputChipsEl.innerHTML = '';\n this._inputChipsEl.style.display = 'none';\n }\n\n setThumbnails(entries: ThumbnailEntry[]): void {\n this._thumbnailsColumn.setEntries(entries);\n if (entries.length > 0) {\n this._thumbnailsColumn.show();\n } else {\n this._thumbnailsColumn.hide();\n }\n }\n\n hideThumbnails(): void {\n this._thumbnailsColumn.hide();\n }\n}\n","export interface LauncherOptions {\n onClick: () => void;\n svgMarkup?: string;\n ariaLabel?: string;\n hideMobile?: boolean;\n mobileBreakpoint?: number;\n tooltip?: string;\n}\n\n/**\n * Result of createLauncher — the container wraps the button and exposes\n * content-area slots where the QNA widget or host page can inject engagement\n * actions (buying-hesitation questions, \"Find Similar\" buttons, etc.).\n */\nexport interface LauncherElements {\n /** Outer container — append this to the DOM. */\n container: HTMLElement;\n /** The clickable FAB button. */\n button: HTMLButtonElement;\n /** Slot above the button (primary QNA actions). */\n contentArea: HTMLElement;\n /** Slot below the button (secondary content). */\n contentAreaBottom: HTMLElement;\n}\n\nconst DEFAULT_SVG = `<svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"3\" fill=\"currentColor\" opacity=\"0.15\"/>\n <rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <circle cx=\"9\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <circle cx=\"15\" cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n <path d=\"M9.5 17C10.3 17.6 11.1 18 12 18C12.9 18 13.7 17.6 14.5 17\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M12 7V4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <circle cx=\"12\" cy=\"3\" r=\"1\" fill=\"currentColor\"/>\n <path d=\"M1 12V14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n <path d=\"M23 12V14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n</svg>`;\n\nexport function createLauncher(options: LauncherOptions): LauncherElements {\n // Container holds content areas + button\n const container = document.createElement('div');\n container.className = 'gengage-chat-launcher-container';\n\n // Content area above button (QNA actions, buying-hesitation questions)\n const contentArea = document.createElement('div');\n contentArea.className = 'gengage-chat-launcher-content-area';\n container.appendChild(contentArea);\n\n // The FAB button\n const button = document.createElement('button');\n button.className = 'gengage-chat-launcher';\n button.type = 'button';\n button.setAttribute('aria-label', options.ariaLabel ?? 'Open chat');\n button.innerHTML = options.svgMarkup ?? DEFAULT_SVG;\n\n if (options.tooltip !== undefined) {\n const tooltipEl = document.createElement('span');\n tooltipEl.className = 'gengage-chat-launcher-tooltip';\n tooltipEl.textContent = options.tooltip;\n button.appendChild(tooltipEl);\n }\n\n if (options.hideMobile) {\n container.dataset['hideMobile'] = '1';\n }\n if (options.mobileBreakpoint !== undefined) {\n container.dataset['mobileBreakpoint'] = String(options.mobileBreakpoint);\n }\n\n button.addEventListener('click', options.onClick);\n container.appendChild(button);\n\n // Content area below button (secondary content)\n const contentAreaBottom = document.createElement('div');\n contentAreaBottom.className = 'gengage-chat-launcher-content-area-bottom';\n container.appendChild(contentAreaBottom);\n\n return { container, button, contentArea, contentAreaBottom };\n}\n","export interface ProactiveAction {\n title: string;\n onSelect: () => void;\n}\n\nexport interface ProactivePopupOptions {\n message: string;\n onAccept: () => void;\n onDismiss: () => void;\n /** Auto-dismiss after this many ms (default: 15000). 0 = never. */\n autoDismissMs?: number;\n /** Accept button label (default: \"Sohbete Başla\"). */\n acceptLabel?: string;\n /** Dismiss button aria-label (default: \"Kapat\"). */\n closeAriaLabel?: string;\n /** Backend-driven action buttons. When provided, renders per-action buttons\n * instead of the generic accept button. */\n actionButtons?: ProactiveAction[];\n}\n\nexport function createProactivePopup(options: ProactivePopupOptions): HTMLElement {\n const popup = document.createElement('div');\n popup.className = 'gengage-chat-proactive';\n\n const messageEl = document.createElement('p');\n messageEl.className = 'gengage-chat-proactive-message';\n messageEl.textContent = options.message;\n popup.appendChild(messageEl);\n\n const actions = document.createElement('div');\n actions.className = 'gengage-chat-proactive-actions';\n\n // Auto-dismiss timer (stored so manual dismiss can cancel it)\n let autoDismissTimer: ReturnType<typeof setTimeout> | null = null;\n\n function clearAndRemove(): void {\n if (autoDismissTimer !== null) clearTimeout(autoDismissTimer);\n popup.remove();\n }\n\n if (options.actionButtons && options.actionButtons.length > 0) {\n // Render per-action buttons from backend response (like legacy proactive)\n for (const ab of options.actionButtons) {\n const btn = document.createElement('button');\n btn.className = 'gengage-chat-proactive-accept';\n btn.type = 'button';\n btn.textContent = ab.title;\n btn.addEventListener('click', () => {\n clearAndRemove();\n ab.onSelect();\n });\n actions.appendChild(btn);\n }\n } else {\n // Fallback: single generic accept button\n const acceptBtn = document.createElement('button');\n acceptBtn.className = 'gengage-chat-proactive-accept';\n acceptBtn.type = 'button';\n acceptBtn.textContent = options.acceptLabel ?? 'Sohbete Başla';\n acceptBtn.addEventListener('click', () => {\n clearAndRemove();\n options.onAccept();\n });\n actions.appendChild(acceptBtn);\n }\n\n const dismissBtn = document.createElement('button');\n dismissBtn.className = 'gengage-chat-proactive-dismiss';\n dismissBtn.type = 'button';\n dismissBtn.textContent = '\\u00D7';\n dismissBtn.setAttribute('aria-label', options.closeAriaLabel ?? 'Kapat');\n dismissBtn.addEventListener('click', () => {\n clearAndRemove();\n options.onDismiss();\n });\n popup.appendChild(dismissBtn);\n\n popup.appendChild(actions);\n\n // Auto-dismiss\n const timeout = options.autoDismissMs ?? 15000;\n if (timeout > 0) {\n autoDismissTimer = setTimeout(() => {\n if (popup.parentElement) {\n popup.remove();\n options.onDismiss();\n }\n }, timeout);\n }\n\n // Animate in\n requestAnimationFrame(() => popup.classList.add('gengage-chat-proactive--visible'));\n\n return popup;\n}\n","/**\n * Tracks user activity signals (page views, idle, scroll depth) for\n * engagement analytics and proactive-agent triggering.\n */\n\nexport interface ActivityEvent {\n type: 'pageview' | 'idle' | 'scroll' | 'focus' | 'blur';\n timestamp: number;\n data?: Record<string, unknown>;\n}\n\nexport interface ActivityTrackerOptions {\n /** Idle threshold in ms (default: 30000). */\n idleThresholdMs?: number;\n /** Scroll depth granularity in percent (default: 25). */\n scrollGranularity?: number;\n /** Callback when an activity event fires. */\n onActivity?: (event: ActivityEvent) => void;\n}\n\nexport class ActivityTracker {\n private _idleTimer: ReturnType<typeof setTimeout> | null = null;\n private _idleThreshold: number;\n private _scrollGranularity: number;\n private _maxScrollDepth = 0;\n private _lastReportedDepth = 0;\n private _onActivity: ((event: ActivityEvent) => void) | null;\n private _listeners: Array<[EventTarget, string, EventListener]> = [];\n private _destroyed = false;\n\n constructor(options: ActivityTrackerOptions = {}) {\n this._idleThreshold = options.idleThresholdMs ?? 30000;\n this._scrollGranularity = options.scrollGranularity ?? 25;\n this._onActivity = options.onActivity ?? null;\n this._setup();\n }\n\n private _setup(): void {\n this._emit({ type: 'pageview', timestamp: Date.now() });\n this._resetIdleTimer();\n\n this._listen(window, 'scroll', () => this._onScroll(), { passive: true });\n this._listen(window, 'mousemove', () => this._resetIdleTimer(), { passive: true });\n this._listen(window, 'keydown', () => this._resetIdleTimer(), { passive: true });\n this._listen(window, 'touchstart', () => this._resetIdleTimer(), { passive: true });\n this._listen(document, 'visibilitychange', () => this._onVisibility());\n }\n\n private _listen(target: EventTarget, event: string, handler: EventListener, options?: AddEventListenerOptions): void {\n target.addEventListener(event, handler, options);\n this._listeners.push([target, event, handler]);\n }\n\n private _resetIdleTimer(): void {\n if (this._idleTimer) clearTimeout(this._idleTimer);\n this._idleTimer = setTimeout(() => {\n this._emit({ type: 'idle', timestamp: Date.now() });\n }, this._idleThreshold);\n }\n\n private _onScroll(): void {\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const docHeight = Math.max(document.documentElement.scrollHeight - window.innerHeight, 1);\n const depth = Math.min(100, Math.round((scrollTop / docHeight) * 100));\n\n if (depth > this._maxScrollDepth) {\n this._maxScrollDepth = depth;\n }\n\n const bucket = Math.floor(depth / this._scrollGranularity) * this._scrollGranularity;\n if (bucket > this._lastReportedDepth) {\n this._lastReportedDepth = bucket;\n this._emit({\n type: 'scroll',\n timestamp: Date.now(),\n data: { depth: bucket },\n });\n }\n\n this._resetIdleTimer();\n }\n\n private _onVisibility(): void {\n if (document.hidden) {\n this._emit({ type: 'blur', timestamp: Date.now() });\n if (this._idleTimer) clearTimeout(this._idleTimer);\n } else {\n this._emit({ type: 'focus', timestamp: Date.now() });\n this._resetIdleTimer();\n }\n }\n\n private _emit(event: ActivityEvent): void {\n if (this._destroyed) return;\n this._onActivity?.(event);\n }\n\n /** Current max scroll depth reached (0-100). */\n get maxScrollDepth(): number {\n return this._maxScrollDepth;\n }\n\n destroy(): void {\n this._destroyed = true;\n if (this._idleTimer) clearTimeout(this._idleTimer);\n for (const [target, event, handler] of this._listeners) {\n target.removeEventListener(event, handler);\n }\n this._listeners = [];\n }\n}\n","const ALLOWED_AUDIO_TYPES = new Set([\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp3',\n 'audio/wav',\n 'audio/webm',\n 'audio/aac',\n 'audio/mp4',\n]);\n\n/** Returned by `playTtsAudio` on successful playback initiation. */\nexport interface AudioHandle {\n /** Stop playback immediately. Safe to call multiple times. */\n stop: () => void;\n}\n\n/**\n * Plays a base64-encoded audio clip.\n * Returns an `AudioHandle` that can stop playback, or `null` if playback\n * could not be initiated (blocked by browser, unsupported environment, etc.).\n */\nexport function playTtsAudio(base64: string, contentType = 'audio/ogg'): AudioHandle | null {\n // Strip parameters like '; codecs=opus' before checking allowlist\n const baseType = contentType.split(';')[0]!.trim();\n if (!ALLOWED_AUDIO_TYPES.has(baseType)) return null;\n try {\n const audio = new Audio(`data:${contentType};base64,${base64}`);\n audio.play().catch(() => {\n // Autoplay blocked by browser — silently ignore\n });\n return {\n stop: () => {\n audio.pause();\n audio.currentTime = 0;\n },\n };\n } catch {\n // Unsupported environment\n return null;\n }\n}\n","/**\n * V2 heartbeat polling.\n *\n * Periodically sends session state signals to the `/v2/heartbeat` backend\n * endpoint. The backend evaluates proactive trigger rules and may return a\n * message to show to the user (e.g. idle nudge, cart abandonment reminder).\n *\n * Gated behind `ChatWidgetConfig.enableHeartbeat` (default: false).\n */\n\nimport { normalizeMiddlewareUrl } from '../common/api-paths.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface HeartbeatRequest {\n account_id: string;\n thread_id: string;\n output_language: string;\n idle_seconds: number;\n page_type: string;\n current_sku: string;\n cart_item_count: number;\n searches_count: number;\n actions_count: number;\n session_duration_seconds: number;\n trigger_fire_counts: Record<string, number>;\n}\n\nexport interface HeartbeatResponse {\n action: 'noop' | 'message';\n trigger_type?: string;\n message?: string;\n suggested_actions?: Array<{\n title: string;\n icon?: string;\n requestDetails?: { type: string; payload?: unknown };\n }>;\n}\n\nexport interface HeartbeatManagerOptions {\n middlewareUrl: string;\n accountId: string;\n sessionId: string;\n locale: string;\n intervalMs: number;\n getPageType: () => string;\n getCurrentSku: () => string;\n onMessage: (response: HeartbeatResponse) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Manager\n// ---------------------------------------------------------------------------\n\nexport class HeartbeatManager {\n private _timer: ReturnType<typeof setTimeout> | null = null;\n private _destroyed = false;\n private _abortController: AbortController | null = null;\n private _sessionStart = Date.now();\n private _lastActivity = Date.now();\n private _searchesCount = 0;\n private _actionsCount = 0;\n private _triggerFireCounts: Record<string, number> = {};\n private readonly _options: HeartbeatManagerOptions;\n private readonly _endpoint: string;\n\n constructor(options: HeartbeatManagerOptions) {\n this._options = options;\n const base = normalizeMiddlewareUrl(options.middlewareUrl);\n this._endpoint = `${base}/v2/heartbeat`;\n }\n\n start(): void {\n if (this._timer || this._destroyed) return;\n this._scheduleNext();\n }\n\n /** Schedule the next poll after the current one finishes (prevents overlapping polls). */\n private _scheduleNext(): void {\n if (this._destroyed) return;\n this._timer = setTimeout(() => {\n void this._poll().finally(() => this._scheduleNext());\n }, this._options.intervalMs);\n }\n\n stop(): void {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n }\n\n /** Call when the user performs an action (search, click, etc.). */\n recordAction(): void {\n this._actionsCount++;\n this._lastActivity = Date.now();\n }\n\n /** Call when the user performs a search. */\n recordSearch(): void {\n this._searchesCount++;\n this._lastActivity = Date.now();\n }\n\n /** Call on any user interaction to reset idle timer. */\n recordActivity(): void {\n this._lastActivity = Date.now();\n }\n\n destroy(): void {\n this._destroyed = true;\n this._abortController?.abort();\n this._abortController = null;\n this.stop();\n }\n\n private async _poll(): Promise<void> {\n if (this._destroyed) return;\n\n const now = Date.now();\n const request: HeartbeatRequest = {\n account_id: this._options.accountId,\n thread_id: this._options.sessionId,\n output_language: this._options.locale.toUpperCase(),\n idle_seconds: (now - this._lastActivity) / 1000,\n page_type: this._options.getPageType(),\n current_sku: this._options.getCurrentSku(),\n cart_item_count: 0,\n searches_count: this._searchesCount,\n actions_count: this._actionsCount,\n session_duration_seconds: (now - this._sessionStart) / 1000,\n trigger_fire_counts: { ...this._triggerFireCounts },\n };\n\n this._abortController = new AbortController();\n try {\n const response = await fetch(this._endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n signal: this._abortController.signal,\n });\n\n if (this._destroyed || !response.ok) return;\n\n const data = (await response.json()) as HeartbeatResponse;\n if (this._destroyed) return;\n if (data.action === 'message' && data.message) {\n // Track trigger fire count to avoid re-firing\n if (data.trigger_type) {\n this._triggerFireCounts[data.trigger_type] = (this._triggerFireCounts[data.trigger_type] ?? 0) + 1;\n }\n this._options.onMessage(data);\n }\n } catch {\n // Non-fatal — heartbeat is best-effort\n }\n }\n}\n","/**\n * Configurable price formatting.\n *\n * Defaults to Turkish locale (dot thousands, comma decimal, TL suffix).\n * Configure via widget config `pricing` field for any locale/currency.\n */\n\nexport interface PriceFormatConfig {\n /** Currency symbol. Default: 'TL' */\n currencySymbol?: string;\n /** Where to place the symbol. Default: 'suffix' */\n currencyPosition?: 'prefix' | 'suffix';\n /** Separator between thousands. Default: '.' (Turkish) */\n thousandsSeparator?: string;\n /** Decimal point character. Default: ',' (Turkish) */\n decimalSeparator?: string;\n /** Whether to show decimal part for whole numbers. Default: false */\n alwaysShowDecimals?: boolean;\n}\n\nconst TURKISH_DEFAULTS: Required<PriceFormatConfig> = {\n currencySymbol: 'TL',\n currencyPosition: 'suffix',\n thousandsSeparator: '.',\n decimalSeparator: ',',\n alwaysShowDecimals: false,\n};\n\n/**\n * Formats a raw numeric price string into the configured locale format.\n *\n * Examples (default Turkish):\n * \"17990\" → \"17.990 TL\"\n * \"17990.5\" → \"17.990,50 TL\"\n *\n * Examples (GBP prefix):\n * \"17990\" with { currencySymbol: '£', currencyPosition: 'prefix', thousandsSeparator: ',', decimalSeparator: '.' }\n * → \"£17,990\"\n *\n * Returns the input as-is if it's not a valid number.\n */\nexport function formatPrice(raw: string, config?: PriceFormatConfig): string {\n const num = Number(raw);\n if (!Number.isFinite(num) || num < 0) return raw;\n\n const resolved = { ...TURKISH_DEFAULTS, ...config };\n\n const hasDecimals = num % 1 !== 0;\n const fixed = hasDecimals || resolved.alwaysShowDecimals ? num.toFixed(2) : num.toFixed(0);\n const dotIdx = fixed.indexOf('.');\n const intPart = dotIdx === -1 ? fixed : fixed.slice(0, dotIdx);\n const decPart = dotIdx === -1 ? undefined : fixed.slice(dotIdx + 1);\n\n // Add thousands separators to integer part\n const withSeparators = intPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, resolved.thousandsSeparator);\n\n let formatted: string;\n if (decPart !== undefined) {\n formatted = `${withSeparators}${resolved.decimalSeparator}${decPart}`;\n } else {\n formatted = withSeparators;\n }\n\n if (resolved.currencySymbol) {\n if (resolved.currencyPosition === 'prefix') {\n return `${resolved.currencySymbol}${formatted}`;\n }\n return `${formatted} ${resolved.currencySymbol}`;\n }\n\n return formatted;\n}\n","/**\n * ComparisonTable — renders a product comparison table with recommended pick,\n * attribute rows, highlights, and optional special cases.\n *\n * XSS safety: All text is set via textContent. Image URLs are validated\n * for safe protocols before being assigned to img.src.\n */\n\nimport { sanitizeHtml, isSafeImageUrl } from '../../common/safe-html.js';\nimport { formatPrice } from '../../common/price-formatter.js';\nimport type { PriceFormatConfig } from '../../common/price-formatter.js';\n\n/** Fallback display names for common Turkish e-commerce product attributes. */\nconst CRITERIA_DISPLAY_NAMES: Record<string, string> = {\n screen_size: 'Ekran Boyutu',\n weight: 'Ağırlık',\n battery_capacity: 'Batarya Kapasitesi',\n battery_life: 'Batarya Ömrü',\n storage: 'Depolama',\n memory: 'Bellek',\n ram: 'RAM',\n processor: 'İşlemci',\n camera: 'Kamera',\n resolution: 'Çözünürlük',\n display_type: 'Ekran Tipi',\n refresh_rate: 'Yenileme Hızı',\n color: 'Renk',\n material: 'Malzeme',\n dimensions: 'Boyutlar',\n warranty: 'Garanti',\n connectivity: 'Bağlantı',\n water_resistance: 'Su Dayanıklılığı',\n operating_system: 'İşletim Sistemi',\n brand: 'Marka',\n model: 'Model',\n price: 'Fiyat',\n energy_class: 'Enerji Sınıfı',\n noise_level: 'Gürültü Seviyesi',\n capacity: 'Kapasite',\n power: 'Güç',\n voltage: 'Voltaj',\n width: 'Genişlik',\n height: 'Yükseklik',\n depth: 'Derinlik',\n};\n\n/**\n * Map a raw criteria field name to a human-readable label.\n * Uses the Turkish fallback map first, then falls back to a simple\n * formatting heuristic (replace underscores, capitalize first letter).\n */\nexport function formatCriteriaName(rawName: string): string {\n return CRITERIA_DISPLAY_NAMES[rawName] ?? rawName.replace(/_/g, ' ').replace(/^\\w/, (c) => c.toUpperCase());\n}\n\nexport interface ComparisonProduct {\n sku: string;\n name: string;\n price: string;\n imageUrl?: string | undefined;\n rating?: number | undefined;\n reviewCount?: number | undefined;\n}\n\nexport interface ComparisonAttribute {\n label: string;\n values: string[];\n}\n\nexport interface ComparisonTableI18n {\n comparisonHeading?: string;\n recommendedChoiceLabel?: string;\n highlightsLabel?: string;\n keyDifferencesLabel?: string;\n specialCasesLabel?: string;\n addToCartButton?: string;\n}\n\nexport interface ComparisonTableOptions {\n recommended: ComparisonProduct;\n products: ComparisonProduct[];\n attributes: ComparisonAttribute[];\n highlights: string[];\n specialCases?: string[] | undefined;\n onProductClick: (sku: string) => void;\n onAddToCart?: ((sku: string) => void) | undefined;\n recommendedText?: string | undefined;\n winnerHits?: Record<string, { positive?: string[]; negative?: string[] }> | undefined;\n productActions?: Record<string, { title: string; type: string; payload?: unknown }> | undefined;\n keyDifferencesHtml?: string | undefined;\n i18n?: ComparisonTableI18n | undefined;\n pricing?: PriceFormatConfig | undefined;\n}\n\nexport function renderComparisonTable(options: ComparisonTableOptions): HTMLElement {\n const { recommended, products, attributes, highlights, specialCases, onProductClick, i18n } = options;\n\n const container = document.createElement('div');\n container.className = 'gengage-chat-comparison';\n\n // Heading\n const heading = document.createElement('h3');\n heading.className = 'gengage-chat-comparison-heading';\n heading.textContent = i18n?.comparisonHeading ?? 'KARŞILAŞTIRMA SONUÇLARI';\n container.appendChild(heading);\n\n // Recommended card\n if (recommended) {\n const recCard = document.createElement('div');\n recCard.className = 'gengage-chat-comparison-recommended';\n\n const recLabel = document.createElement('div');\n recLabel.className = 'gengage-chat-comparison-recommended-label';\n recLabel.textContent = i18n?.recommendedChoiceLabel ?? 'Önerilen Seçim';\n recCard.appendChild(recLabel);\n\n const recBody = document.createElement('div');\n recBody.className = 'gengage-chat-comparison-recommended-body';\n\n if (recommended.imageUrl && isSafeImageUrl(recommended.imageUrl)) {\n const img = document.createElement('img');\n img.src = recommended.imageUrl;\n img.alt = recommended.name;\n img.loading = 'lazy';\n img.addEventListener(\n 'error',\n () => {\n img.style.display = 'none';\n },\n { once: true },\n );\n recBody.appendChild(img);\n }\n\n const info = document.createElement('div');\n info.className = 'gengage-chat-comparison-recommended-info';\n const title = document.createElement('div');\n title.className = 'gengage-chat-comparison-recommended-title';\n title.textContent = recommended.name;\n info.appendChild(title);\n const price = document.createElement('div');\n price.className = 'gengage-chat-comparison-recommended-price';\n price.textContent = formatPrice(recommended.price, options.pricing);\n info.appendChild(price);\n recBody.appendChild(info);\n\n recBody.addEventListener('click', () => {\n onProductClick(recommended.sku);\n });\n recBody.style.cursor = 'pointer';\n\n recCard.appendChild(recBody);\n\n // Highlights\n if (highlights.length > 0) {\n const hlSection = document.createElement('div');\n hlSection.className = 'gengage-chat-comparison-highlights';\n const hlLabel = document.createElement('div');\n hlLabel.className = 'gengage-chat-comparison-highlights-label';\n hlLabel.textContent = i18n?.highlightsLabel ?? 'Öne Çıkan Özellikler';\n hlSection.appendChild(hlLabel);\n const ul = document.createElement('ul');\n for (const hl of highlights) {\n const li = document.createElement('li');\n li.textContent = hl;\n ul.appendChild(li);\n }\n hlSection.appendChild(ul);\n recCard.appendChild(hlSection);\n }\n\n // Recommended choice explanation\n if (options.recommendedText) {\n const recExplanation = document.createElement('div');\n recExplanation.className = 'gengage-chat-comparison-recommended-text';\n recExplanation.innerHTML = sanitizeHtml(options.recommendedText);\n recCard.appendChild(recExplanation);\n }\n\n container.appendChild(recCard);\n }\n\n // Key Differences section\n if (options.keyDifferencesHtml) {\n const kdSection = document.createElement('div');\n kdSection.className = 'gengage-chat-comparison-key-differences';\n const kdHeading = document.createElement('h4');\n kdHeading.textContent = i18n?.keyDifferencesLabel ?? 'Temel Farklar';\n kdSection.appendChild(kdHeading);\n const kdContent = document.createElement('div');\n kdContent.className = 'gengage-chat-comparison-key-differences-content';\n kdContent.innerHTML = sanitizeHtml(formatKeyDifferences(options.keyDifferencesHtml));\n kdSection.appendChild(kdContent);\n container.appendChild(kdSection);\n }\n\n // Special cases (expandable)\n if (specialCases && specialCases.length > 0) {\n const special = document.createElement('details');\n special.className = 'gengage-chat-comparison-special';\n const summary = document.createElement('summary');\n summary.textContent = i18n?.specialCasesLabel ?? 'Özel Durumlar İçin';\n special.appendChild(summary);\n const list = document.createElement('ul');\n for (const sc of specialCases) {\n appendSpecialCaseListItems(list, sc);\n }\n if (list.childElementCount > 0) {\n special.appendChild(list);\n }\n container.appendChild(special);\n }\n\n // Comparison table\n if (products.length > 0 && attributes.length > 0) {\n const table = document.createElement('table');\n table.className = 'gengage-chat-comparison-table';\n\n // Header row: empty cell + product columns\n const thead = document.createElement('thead');\n const headerRow = document.createElement('tr');\n const emptyTh = document.createElement('th');\n headerRow.appendChild(emptyTh);\n for (const product of products) {\n const th = document.createElement('th');\n if (product.sku === recommended?.sku) {\n th.className = 'gengage-chat-comparison-selected';\n }\n if (product.imageUrl && isSafeImageUrl(product.imageUrl)) {\n const img = document.createElement('img');\n img.src = product.imageUrl;\n img.alt = product.name;\n img.loading = 'lazy';\n img.addEventListener(\n 'error',\n () => {\n img.style.display = 'none';\n },\n { once: true },\n );\n th.appendChild(img);\n }\n const name = document.createElement('div');\n name.textContent = product.name;\n th.appendChild(name);\n const prc = document.createElement('div');\n prc.className = 'gengage-chat-comparison-table-price';\n prc.textContent = formatPrice(product.price, options.pricing);\n th.appendChild(prc);\n headerRow.appendChild(th);\n }\n thead.appendChild(headerRow);\n table.appendChild(thead);\n\n // Attribute rows\n const tbody = document.createElement('tbody');\n for (const attr of attributes) {\n const row = document.createElement('tr');\n const labelTd = document.createElement('td');\n labelTd.className = 'gengage-chat-comparison-label';\n labelTd.textContent = formatCriteriaName(attr.label);\n row.appendChild(labelTd);\n for (let i = 0; i < attr.values.length; i++) {\n const td = document.createElement('td');\n if (products[i]?.sku === recommended?.sku) {\n td.className = 'gengage-chat-comparison-selected';\n }\n td.textContent = attr.values[i] ?? '';\n row.appendChild(td);\n }\n tbody.appendChild(row);\n }\n table.appendChild(tbody);\n container.appendChild(table);\n }\n\n // View product buttons\n if (options.productActions) {\n const btnRow = document.createElement('div');\n btnRow.className = 'gengage-chat-comparison-product-actions';\n for (const product of products) {\n const action = options.productActions[product.sku];\n if (action) {\n const btn = document.createElement('button');\n btn.className = 'gengage-chat-comparison-view-btn';\n btn.type = 'button';\n btn.textContent = product.name;\n btn.addEventListener('click', () => onProductClick(product.sku));\n btnRow.appendChild(btn);\n }\n }\n if (btnRow.childElementCount > 0) {\n container.appendChild(btnRow);\n }\n }\n\n return container;\n}\n\nfunction formatKeyDifferences(text: string): string {\n const lines = text.split('\\n').filter((l) => l.trim());\n if (lines.length <= 1) return text;\n return '<ul>' + lines.map((l) => `<li>${l.trim()}</li>`).join('') + '</ul>';\n}\n\nfunction appendSpecialCaseListItems(list: HTMLUListElement, raw: string): void {\n const sanitized = sanitizeHtml(raw);\n if (!sanitized) return;\n\n const template = document.createElement('template');\n template.innerHTML = sanitized;\n const nestedItems = Array.from(template.content.querySelectorAll('li'));\n if (nestedItems.length > 0) {\n for (const nestedItem of nestedItems) {\n const li = document.createElement('li');\n li.innerHTML = sanitizeHtml(nestedItem.innerHTML);\n list.appendChild(li);\n }\n return;\n }\n\n const li = document.createElement('li');\n if (looksLikeHtml(raw)) {\n li.innerHTML = sanitized;\n } else {\n li.textContent = raw;\n }\n list.appendChild(li);\n}\n\nfunction looksLikeHtml(text: string): boolean {\n return /<\\/?[a-z][\\s\\S]*>/i.test(text);\n}\n","/**\n * ReviewHighlights — renders review summary cards with filter tabs and sentiment tag pills.\n *\n * Production parity: filter tabs (Tümü/Olumlu/Olumsuz), sentiment pill summary,\n * and the existing per-review cards with tone coloring.\n *\n * All text is set via textContent — no innerHTML, no XSS surface.\n */\n\nimport type { UIElement } from '../../common/types.js';\n\ninterface ReviewItem {\n review_class?: string;\n review_text?: string;\n review_rating?: string | number;\n review_tag?: string;\n}\n\nexport function renderReviewHighlights(\n element: UIElement,\n options?: { emptyReviewsMessage?: string | undefined },\n): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-review-highlights';\n\n const reviews = element.props?.['reviews'];\n if (!Array.isArray(reviews) || reviews.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-chat-review-empty';\n empty.textContent = options?.emptyReviewsMessage ?? 'Yorum özeti bulunamadı.';\n container.appendChild(empty);\n return container;\n }\n\n const items: ReviewItem[] = reviews.filter(\n (r): r is Record<string, unknown> => r !== null && typeof r === 'object',\n ) as ReviewItem[];\n\n // Count sentiments\n const counts = { all: items.length, positive: 0, negative: 0, neutral: 0 };\n for (const item of items) {\n if (item.review_class === 'positive') counts.positive++;\n else if (item.review_class === 'negative') counts.negative++;\n else counts.neutral++;\n }\n\n // Filter tabs\n const tabBar = document.createElement('div');\n tabBar.className = 'gengage-chat-review-tabs';\n\n const filters: Array<{ label: string; filter: string }> = [{ label: `Tümü (${counts.all})`, filter: 'all' }];\n if (counts.positive > 0) filters.push({ label: `Olumlu (${counts.positive})`, filter: 'positive' });\n if (counts.negative > 0) filters.push({ label: `Olumsuz (${counts.negative})`, filter: 'negative' });\n\n let activeFilter = 'all';\n\n const itemsContainer = document.createElement('div');\n itemsContainer.className = 'gengage-chat-review-items';\n\n function renderItems(): void {\n while (itemsContainer.firstChild) itemsContainer.removeChild(itemsContainer.firstChild);\n const filtered = activeFilter === 'all' ? items : items.filter((i) => i.review_class === activeFilter);\n for (const review of filtered) {\n const item = document.createElement('article');\n item.className = 'gengage-chat-review-item';\n const cls = review.review_class;\n if (cls === 'positive' || cls === 'negative' || cls === 'neutral') {\n item.dataset['tone'] = cls;\n }\n\n if (typeof review.review_tag === 'string' && review.review_tag.length > 0) {\n const tagEl = document.createElement('div');\n tagEl.className = 'gengage-chat-review-tag';\n tagEl.textContent = review.review_tag;\n item.appendChild(tagEl);\n }\n\n if (typeof review.review_text === 'string' && review.review_text.length > 0) {\n const textEl = document.createElement('div');\n textEl.className = 'gengage-chat-review-text';\n textEl.textContent = review.review_text;\n item.appendChild(textEl);\n }\n\n if (review.review_rating !== undefined && String(review.review_rating).length > 0) {\n const ratingEl = document.createElement('div');\n ratingEl.className = 'gengage-chat-review-rating';\n ratingEl.textContent = String(review.review_rating);\n item.appendChild(ratingEl);\n }\n\n itemsContainer.appendChild(item);\n }\n }\n\n for (const f of filters) {\n const tab = document.createElement('button');\n tab.className = 'gengage-chat-review-tab';\n tab.type = 'button';\n tab.textContent = f.label;\n if (f.filter === activeFilter) tab.classList.add('gengage-chat-review-tab--active');\n\n tab.addEventListener('click', () => {\n activeFilter = f.filter;\n for (const t of tabBar.querySelectorAll('.gengage-chat-review-tab')) {\n t.classList.toggle('gengage-chat-review-tab--active', t === tab);\n }\n renderItems();\n });\n tabBar.appendChild(tab);\n }\n\n container.appendChild(tabBar);\n\n // Sentiment tag pills (summary of unique tags with counts)\n const tagCounts = new Map<string, { count: number; sentiment: string }>();\n for (const item of items) {\n if (typeof item.review_tag === 'string' && item.review_tag.length > 0) {\n const existing = tagCounts.get(item.review_tag);\n if (existing) {\n existing.count++;\n } else {\n tagCounts.set(item.review_tag, { count: 1, sentiment: item.review_class ?? 'neutral' });\n }\n }\n }\n\n if (tagCounts.size > 0) {\n const pillsRow = document.createElement('div');\n pillsRow.className = 'gengage-chat-review-pills';\n for (const [tag, data] of tagCounts) {\n const pill = document.createElement('span');\n pill.className = 'gengage-chat-review-pill';\n pill.dataset['tone'] = data.sentiment;\n\n const icon = document.createElement('span');\n icon.className = 'gengage-chat-review-pill-icon';\n icon.textContent = data.sentiment === 'positive' ? '\\u2713' : data.sentiment === 'negative' ? '\\u2715' : '\\u25CF';\n pill.appendChild(icon);\n\n const tagText = document.createElement('span');\n tagText.textContent = tag;\n pill.appendChild(tagText);\n\n if (data.count > 1) {\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-review-pill-count';\n badge.textContent = String(data.count);\n pill.appendChild(badge);\n }\n\n pillsRow.appendChild(pill);\n }\n container.appendChild(pillsRow);\n }\n\n renderItems();\n container.appendChild(itemsContainer);\n\n return container;\n}\n","/**\n * Shared product rendering utilities.\n *\n * Extracted from chat/renderUISpec and simrel/ProductCard to eliminate\n * duplication and provide consistent behavior across all widgets.\n */\n\n/** Clamp a rating value to the 0–5 range. Returns 0 for NaN/non-finite. */\nexport function clampRating(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(0, Math.min(5, value));\n}\n\n/** Clamp a discount percentage to the 0–100 range, rounded to integer. Returns 0 for NaN/non-finite. */\nexport function clampDiscount(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(0, Math.min(100, Math.round(value)));\n}\n\n/**\n * Render a star rating string with full, half, and empty stars.\n *\n * @param rating - A numeric rating (will be clamped to 0–5).\n * @param halfStars - Whether to render half-star characters. Defaults to true.\n * @returns A string like \"★★★½☆\" or \"★★★☆☆\" (without half-stars).\n */\nexport function renderStarRating(rating: number, halfStars: boolean = true): string {\n const clamped = clampRating(rating);\n if (halfStars) {\n const full = Math.floor(clamped);\n const half = clamped - full >= 0.5 ? 1 : 0;\n const empty = 5 - full - half;\n return '\\u2605'.repeat(full) + (half ? '\\u00BD' : '') + '\\u2606'.repeat(empty);\n }\n const rounded = Math.round(clamped);\n return '\\u2605'.repeat(rounded) + '\\u2606'.repeat(5 - rounded);\n}\n\n/**\n * Attach a one-time error handler that hides the image on load failure.\n *\n * Works with any HTMLImageElement. Hides the element by setting\n * `display: none` so layout doesn't break from broken images.\n */\nexport function addImageErrorHandler(img: HTMLImageElement): void {\n img.addEventListener(\n 'error',\n () => {\n img.style.display = 'none';\n },\n { once: true },\n );\n}\n","/**\n * AI Top Picks renderer.\n *\n * Renders rich AI-curated product suggestion cards with:\n * - Winner card (vertical, primary border, badge, large image)\n * - Compact cards (horizontal, smaller)\n * - Sentiment label chips (green/red/gray)\n * - Expert quality scores, review quotes\n */\n\nimport type { UIElement, ActionPayload } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\nimport { formatPrice } from '../../common/price-formatter.js';\nimport { isSafeImageUrl, safeSetAttribute } from '../../common/safe-html.js';\nimport { clampDiscount, addImageErrorHandler } from '../../common/product-utils.js';\n\ninterface SentimentLabel {\n label: string;\n sentiment?: 'positive' | 'negative' | 'neutral';\n}\n\ninterface AITopPickItem {\n product: Record<string, unknown>;\n role?: string;\n reason?: string;\n labels?: SentimentLabel[];\n expertQualityScore?: number;\n reviewHighlight?: string;\n action?: ActionPayload;\n}\n\nfunction resolveActionSku(item: AITopPickItem): string | null {\n const productSku = item.product['sku'];\n if (typeof productSku === 'string' && productSku.length > 0) return productSku;\n const payload = item.action?.payload;\n if (payload && typeof payload === 'object' && 'sku' in payload && typeof payload.sku === 'string') {\n return payload.sku;\n }\n return null;\n}\n\nconst ROLE_LABELS: Record<string, string> = {\n winner: 'roleWinner',\n best_value: 'roleBestValue',\n best_alternative: 'roleBestAlternative',\n};\n\nfunction getRoleLabel(role: string | undefined, i18n: ChatUISpecRenderContext['i18n']): string | null {\n if (!role || !i18n) return null;\n const key = ROLE_LABELS[role];\n if (!key) return role;\n return (i18n as Record<string, string>)[key] ?? role;\n}\n\nexport function renderAITopPicks(element: UIElement, ctx: ChatUISpecRenderContext): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-ai-top-picks';\n\n const suggestions = (element.props?.['suggestions'] ?? []) as AITopPickItem[];\n if (suggestions.length === 0) return container;\n\n // Title\n const title = document.createElement('h3');\n title.className = 'gengage-chat-ai-top-picks-title';\n title.textContent = ctx.i18n?.aiTopPicksTitle ?? 'Top Picks';\n container.appendChild(title);\n\n const cardsWrap = document.createElement('div');\n cardsWrap.className = 'gengage-chat-ai-top-picks-cards';\n\n for (let i = 0; i < suggestions.length; i++) {\n const suggestion = suggestions[i]!;\n const isWinner = suggestion.role === 'winner' || i === 0;\n const card = isWinner ? renderTopPickCard(suggestion, ctx) : renderCompactCard(suggestion, ctx);\n cardsWrap.appendChild(card);\n }\n\n container.appendChild(cardsWrap);\n return container;\n}\n\nfunction renderTopPickCard(item: AITopPickItem, ctx: ChatUISpecRenderContext): HTMLElement {\n const card = document.createElement('div');\n card.className = 'gengage-chat-ai-toppick-card gengage-chat-ai-toppick-card--winner';\n\n // Badge\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-ai-toppick-badge';\n badge.textContent = getRoleLabel(item.role, ctx.i18n) ?? ctx.i18n?.roleWinner ?? 'TOP MATCH';\n card.appendChild(badge);\n\n const product = item.product;\n\n // Discount badge\n const discountPercent = product['discountPercent'] as number | undefined;\n if (typeof discountPercent === 'number' && discountPercent > 0) {\n const discountBadge = document.createElement('span');\n discountBadge.className = 'gengage-chat-ai-toppick-discount-badge';\n discountBadge.textContent = `%${clampDiscount(discountPercent)}`;\n card.appendChild(discountBadge);\n }\n\n // Image\n const imageUrl = product['imageUrl'] as string | undefined;\n if (imageUrl && isSafeImageUrl(imageUrl)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-ai-toppick-img';\n safeSetAttribute(img, 'src', imageUrl);\n img.alt = (product['name'] as string) ?? '';\n addImageErrorHandler(img);\n card.appendChild(img);\n }\n\n // Body\n const body = document.createElement('div');\n body.className = 'gengage-chat-ai-toppick-body';\n\n const name = product['name'] as string | undefined;\n if (name) {\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-ai-toppick-name';\n nameEl.textContent = name;\n body.appendChild(nameEl);\n }\n\n // Reason text\n if (item.reason) {\n const reasonEl = document.createElement('div');\n reasonEl.className = 'gengage-chat-ai-toppick-reason';\n reasonEl.textContent = item.reason;\n body.appendChild(reasonEl);\n }\n\n // Sentiment chips\n if (item.labels && item.labels.length > 0) {\n body.appendChild(renderSentimentChips(item.labels));\n }\n\n // Expert quality score — auto-detect scale from value range\n if (typeof item.expertQualityScore === 'number') {\n const score = document.createElement('div');\n score.className = 'gengage-chat-ai-toppick-score';\n const maxScale = item.expertQualityScore <= 5 ? 5 : 10;\n score.textContent = `${item.expertQualityScore}/${maxScale}`;\n body.appendChild(score);\n }\n\n // Review highlight quote\n if (item.reviewHighlight) {\n const review = document.createElement('blockquote');\n review.className = 'gengage-chat-ai-toppick-review';\n review.textContent = item.reviewHighlight;\n body.appendChild(review);\n }\n\n // Price\n const price = product['price'] as string | undefined;\n const originalPrice = product['originalPrice'] as string | undefined;\n if (price) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-ai-toppick-price';\n if (originalPrice && originalPrice !== price) {\n const orig = document.createElement('span');\n orig.className = 'gengage-chat-ai-toppick-original-price';\n orig.textContent = formatPrice(originalPrice, ctx.pricing);\n priceRow.appendChild(orig);\n priceRow.appendChild(document.createTextNode(' '));\n }\n const current = document.createElement('span');\n current.textContent = formatPrice(price, ctx.pricing);\n priceRow.appendChild(current);\n body.appendChild(priceRow);\n }\n\n card.appendChild(body);\n\n // CTA button\n if (item.action) {\n const sku = resolveActionSku(item);\n const url = (product['url'] as string) ?? '';\n\n // Spinner overlay (hidden by default)\n const spinner = document.createElement('div');\n spinner.className = 'gengage-chat-ai-toppick-spinner';\n spinner.style.display = sku && ctx.topPicksLoadingSku === sku ? '' : 'none';\n card.appendChild(spinner);\n\n const cta = document.createElement('button');\n cta.className = 'gengage-chat-ai-toppick-cta';\n cta.type = 'button';\n cta.textContent = ctx.i18n?.viewDetails ?? 'View Details';\n cta.addEventListener('click', () => {\n if (item.action?.type === 'findSimilar' && sku && ctx.onProductClick) {\n ctx.onProductClick({ sku, url });\n return;\n }\n ctx.onAction(item.action!);\n });\n card.appendChild(cta);\n }\n\n return card;\n}\n\nfunction renderCompactCard(item: AITopPickItem, ctx: ChatUISpecRenderContext): HTMLElement {\n const card = document.createElement('div');\n card.className = 'gengage-chat-ai-toppick-card gengage-chat-ai-toppick-card--compact';\n\n const product = item.product;\n\n // Discount badge\n const discountPercent = product['discountPercent'] as number | undefined;\n if (typeof discountPercent === 'number' && discountPercent > 0) {\n const discountBadge = document.createElement('span');\n discountBadge.className = 'gengage-chat-ai-toppick-discount-badge';\n discountBadge.textContent = `%${clampDiscount(discountPercent)}`;\n card.appendChild(discountBadge);\n }\n\n // Image\n const imageUrl = product['imageUrl'] as string | undefined;\n if (imageUrl && isSafeImageUrl(imageUrl)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-ai-toppick-img';\n safeSetAttribute(img, 'src', imageUrl);\n img.alt = (product['name'] as string) ?? '';\n addImageErrorHandler(img);\n card.appendChild(img);\n }\n\n // Body\n const body = document.createElement('div');\n body.className = 'gengage-chat-ai-toppick-body';\n\n // Role label\n const roleLabel = getRoleLabel(item.role, ctx.i18n);\n if (roleLabel) {\n const roleEl = document.createElement('div');\n roleEl.className = 'gengage-chat-ai-toppick-role';\n roleEl.textContent = roleLabel;\n body.appendChild(roleEl);\n }\n\n const name = product['name'] as string | undefined;\n if (name) {\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-ai-toppick-name';\n nameEl.textContent = name;\n body.appendChild(nameEl);\n }\n\n // Reason text\n if (item.reason) {\n const reasonEl = document.createElement('div');\n reasonEl.className = 'gengage-chat-ai-toppick-reason';\n reasonEl.textContent = item.reason;\n body.appendChild(reasonEl);\n }\n\n // Sentiment chips\n if (item.labels && item.labels.length > 0) {\n body.appendChild(renderSentimentChips(item.labels));\n }\n\n // Price\n const price = product['price'] as string | undefined;\n if (price) {\n const priceEl = document.createElement('div');\n priceEl.className = 'gengage-chat-ai-toppick-price';\n priceEl.textContent = formatPrice(price, ctx.pricing);\n body.appendChild(priceEl);\n }\n\n card.appendChild(body);\n\n // CTA\n if (item.action) {\n const sku = resolveActionSku(item);\n const url = (product['url'] as string) ?? '';\n\n // Spinner overlay (hidden by default)\n const spinner = document.createElement('div');\n spinner.className = 'gengage-chat-ai-toppick-spinner';\n spinner.style.display = sku && ctx.topPicksLoadingSku === sku ? '' : 'none';\n card.appendChild(spinner);\n\n const cta = document.createElement('button');\n cta.className = 'gengage-chat-ai-toppick-cta';\n cta.type = 'button';\n cta.textContent = ctx.i18n?.viewDetails ?? 'View Details';\n cta.addEventListener('click', () => {\n if (item.action?.type === 'findSimilar' && sku && ctx.onProductClick) {\n ctx.onProductClick({ sku, url });\n return;\n }\n ctx.onAction(item.action!);\n });\n card.appendChild(cta);\n }\n\n return card;\n}\n\nfunction renderSentimentChips(labels: SentimentLabel[]): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-ai-toppick-labels';\n for (const label of labels) {\n const chip = document.createElement('span');\n chip.className = 'gengage-chat-ai-toppick-label';\n chip.dataset['sentiment'] = label.sentiment ?? 'neutral';\n chip.textContent = label.label;\n container.appendChild(chip);\n }\n return container;\n}\n","/**\n * Grounding Review Card renderer.\n *\n * Renders a clickable card for review grounding data with title,\n * review count, and a CTA arrow. The entire card is clickable.\n *\n * XSS safety: All text is set via textContent. No innerHTML.\n */\n\nimport type { UIElement, ActionPayload } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\n\nexport function renderGroundingReviewCard(element: UIElement, ctx: ChatUISpecRenderContext): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-grounding-review';\n\n const props = element.props ?? {};\n const title = props['title'] as string | undefined;\n const reviewCount = props['reviewCount'] as string | undefined;\n const action = props['action'] as ActionPayload | undefined;\n const ctaLabel = ctx.i18n?.groundingReviewCta ?? 'Yorumları Oku';\n\n // Icon\n const icon = document.createElement('span');\n icon.className = 'gengage-chat-grounding-review-icon';\n icon.textContent = '\\u{1F4CB}'; // clipboard\n container.appendChild(icon);\n\n const body = document.createElement('div');\n body.className = 'gengage-chat-grounding-review-body';\n\n // Title\n const titleEl = document.createElement('div');\n titleEl.className = 'gengage-chat-grounding-review-title';\n titleEl.textContent = title ?? 'M\\u00fc\\u015fteri Yorumlar\\u0131';\n body.appendChild(titleEl);\n\n // Subtitle (review count)\n if (reviewCount) {\n const subtitle = document.createElement('div');\n subtitle.className = 'gengage-chat-grounding-review-subtitle';\n const template = ctx.i18n?.groundingReviewSubtitle ?? '{count} yorum mevcut';\n subtitle.textContent = template.replace('{count}', reviewCount);\n body.appendChild(subtitle);\n }\n\n container.appendChild(body);\n\n // CTA arrow\n const cta = document.createElement('span');\n cta.className = 'gengage-chat-grounding-review-cta';\n cta.textContent = `${ctaLabel} \\u2192`;\n container.appendChild(cta);\n\n // Make entire card clickable\n if (action) {\n container.style.cursor = 'pointer';\n container.addEventListener('click', () => ctx.onAction(action));\n }\n\n return container;\n}\n","/**\n * AI Grouping Cards renderer.\n *\n * Desktop: compact card with image, name, and labels.\n * Mobile: simple button list with arrow prefix (images hidden via CSS).\n *\n * XSS safety: All text is set via textContent. Image URLs are validated\n * for safe protocols. No innerHTML.\n */\n\nimport type { UIElement, ActionPayload } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\nimport { isSafeImageUrl } from '../../common/safe-html.js';\n\ninterface GroupingEntry {\n name: string;\n image?: string;\n description?: string;\n labels?: string[];\n action: ActionPayload;\n}\n\nfunction normalizeGroupingAction(entry: GroupingEntry): ActionPayload {\n if (entry.action.type !== 'findSimilar') return entry.action;\n const payload =\n entry.action.payload && typeof entry.action.payload === 'object'\n ? (entry.action.payload as Record<string, unknown>)\n : null;\n const text =\n (typeof payload?.['input'] === 'string' && payload['input'].trim()) ||\n (typeof payload?.['text'] === 'string' && payload['text'].trim()) ||\n entry.name.trim();\n if (!text) return entry.action;\n\n const normalizedPayload: Record<string, unknown> = {\n text,\n is_suggested_text: 1,\n };\n if (typeof payload?.['sku'] === 'string' && payload['sku'].trim()) {\n normalizedPayload['sku'] = payload['sku'];\n }\n if (Array.isArray(payload?.['group_skus'])) {\n const groupSkus = payload['group_skus'].filter((sku): sku is string => typeof sku === 'string' && sku.length > 0);\n if (groupSkus.length > 0) normalizedPayload['group_skus'] = groupSkus;\n }\n return {\n title: entry.action.title,\n type: 'inputText',\n payload: normalizedPayload,\n };\n}\n\nexport function renderAIGroupingCards(element: UIElement, ctx: ChatUISpecRenderContext): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-grouping-cards';\n\n const entries = (element.props?.['entries'] ?? []) as GroupingEntry[];\n if (entries.length === 0) return container;\n\n for (const entry of entries) {\n const card = document.createElement('div');\n card.className = 'gengage-chat-grouping-card';\n card.style.cursor = 'pointer';\n card.addEventListener('click', () => ctx.onAction(normalizeGroupingAction(entry)));\n\n // Image (20x20 on desktop, hidden on mobile via CSS)\n if (entry.image && isSafeImageUrl(entry.image)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-grouping-card-img';\n img.src = entry.image;\n img.alt = entry.name;\n img.width = 20;\n img.height = 20;\n card.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'gengage-chat-grouping-card-body';\n\n const nameEl = document.createElement('span');\n nameEl.className = 'gengage-chat-grouping-card-name';\n nameEl.textContent = entry.name;\n body.appendChild(nameEl);\n\n if (entry.description) {\n const desc = document.createElement('span');\n desc.className = 'gengage-chat-grouping-card-desc';\n desc.textContent = entry.description;\n body.appendChild(desc);\n }\n\n if (entry.labels && entry.labels.length > 0) {\n const labelsEl = document.createElement('span');\n labelsEl.className = 'gengage-chat-grouping-card-labels';\n labelsEl.textContent = entry.labels.slice(0, 3).join(' \\u00B7 ');\n body.appendChild(labelsEl);\n }\n\n card.appendChild(body);\n\n // Mobile prefix arrow (shown via CSS only on mobile)\n const arrow = document.createElement('span');\n arrow.className = 'gengage-chat-grouping-card-arrow';\n arrow.textContent = '\\u21B3';\n card.insertBefore(arrow, card.firstChild);\n\n container.appendChild(card);\n }\n\n return container;\n}\n","/**\n * AI Suggested Search Cards renderer.\n *\n * Cards with image, short_name, detailed_user_message, and why_different.\n * Clicking a card dispatches the associated action.\n *\n * XSS safety: All text is set via textContent. Image URLs are validated\n * for safe protocols. No innerHTML.\n */\n\nimport type { UIElement, ActionPayload } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\nimport { isSafeImageUrl } from '../../common/safe-html.js';\n\ninterface SuggestedSearchEntry {\n shortName: string;\n detailedMessage?: string;\n whyDifferent?: string;\n image?: string;\n action: ActionPayload;\n}\n\nexport function renderAISuggestedSearchCards(element: UIElement, ctx: ChatUISpecRenderContext): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-suggested-search-cards';\n\n const entries = (element.props?.['entries'] ?? []) as SuggestedSearchEntry[];\n if (entries.length === 0) return container;\n\n for (const entry of entries) {\n const card = document.createElement('div');\n card.className = 'gengage-chat-suggested-search-card';\n card.style.cursor = 'pointer';\n card.addEventListener('click', () => ctx.onAction(entry.action));\n\n // Image (40x40)\n if (entry.image && isSafeImageUrl(entry.image)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-suggested-search-card-img';\n img.src = entry.image;\n img.alt = entry.shortName;\n img.width = 40;\n img.height = 40;\n card.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'gengage-chat-suggested-search-card-body';\n\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-suggested-search-card-name';\n nameEl.textContent = entry.shortName;\n body.appendChild(nameEl);\n\n if (entry.detailedMessage) {\n const desc = document.createElement('div');\n desc.className = 'gengage-chat-suggested-search-card-desc';\n desc.textContent = entry.detailedMessage;\n body.appendChild(desc);\n }\n\n if (entry.whyDifferent) {\n const diff = document.createElement('div');\n diff.className = 'gengage-chat-suggested-search-card-diff';\n diff.textContent = entry.whyDifferent;\n body.appendChild(diff);\n }\n\n card.appendChild(body);\n container.appendChild(card);\n }\n\n return container;\n}\n","/**\n * Floating comparison button.\n *\n * Renders a fixed-position button at the bottom of the product grid wrapper\n * that appears when 2+ products are selected for comparison.\n * Click dispatches a `getComparisonTable` action with the selected SKUs.\n *\n * XSS safety: All text set via textContent.\n */\n\nimport type { ChatUISpecRenderContext } from '../types.js';\n\n/**\n * Creates a floating comparison button element.\n * Only meaningful when `selectedSkus.length >= 2`.\n *\n * @param selectedSkus - Array of selected product SKU strings\n * @param ctx - Render context with onAction and i18n\n * @returns The button element\n */\nexport function renderFloatingComparisonButton(selectedSkus: string[], ctx: ChatUISpecRenderContext): HTMLElement {\n const button = document.createElement('button');\n button.className = 'gengage-chat-comparison-floating-btn';\n button.type = 'button';\n\n const label = ctx.i18n?.compareSelected ?? 'Karşılaştır';\n button.textContent = `${label} (${selectedSkus.length})`;\n\n button.addEventListener('click', () => {\n ctx.onAction({\n title: label,\n type: 'getComparisonTable',\n payload: { sku_list: [...selectedSkus] },\n });\n });\n\n return button;\n}\n","/**\n * Renders a Pros & Cons list for a product.\n *\n * XSS safety: All text is set via textContent. No innerHTML.\n */\n\nexport function renderProsAndCons(element: { props?: Record<string, unknown> }): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-pros-cons';\n\n const productName = element.props?.['productName'] as string | undefined;\n if (productName) {\n const heading = document.createElement('h4');\n heading.className = 'gengage-chat-pros-cons-heading';\n heading.textContent = productName;\n container.appendChild(heading);\n }\n\n const pros = element.props?.['pros'] as string[] | undefined;\n const cons = element.props?.['cons'] as string[] | undefined;\n\n if (pros && pros.length > 0) {\n const prosList = document.createElement('ul');\n prosList.className = 'gengage-chat-pros-cons-list';\n for (const pro of pros) {\n const li = document.createElement('li');\n li.className = 'gengage-chat-pros-cons-item';\n const icon = document.createElement('span');\n icon.className = 'gengage-chat-pros-cons-icon gengage-chat-pros-cons-icon--pro';\n icon.textContent = '\\u2713';\n li.appendChild(icon);\n const text = document.createElement('span');\n text.textContent = pro;\n li.appendChild(text);\n prosList.appendChild(li);\n }\n container.appendChild(prosList);\n }\n\n if (cons && cons.length > 0) {\n const consList = document.createElement('ul');\n consList.className = 'gengage-chat-pros-cons-list';\n for (const con of cons) {\n const li = document.createElement('li');\n li.className = 'gengage-chat-pros-cons-item';\n const icon = document.createElement('span');\n icon.className = 'gengage-chat-pros-cons-icon gengage-chat-pros-cons-icon--con';\n icon.textContent = '\\u2717';\n li.appendChild(icon);\n const text = document.createElement('span');\n text.textContent = con;\n li.appendChild(text);\n consList.appendChild(li);\n }\n container.appendChild(consList);\n }\n\n return container;\n}\n","/**\n * CategoriesContainer — renders grouped product lists with tab navigation\n * and optional filter tags.\n *\n * Backend sends `groupList` with `{ group_list: [{ group_name, product_list }], filter_tags }`.\n * The v1 adapter normalizes this into a CategoriesContainer UISpec element.\n *\n * XSS safety: All text is set via textContent. No innerHTML.\n */\n\nimport type { UIElement } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\nimport type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport { isSafeImageUrl } from '../../common/safe-html.js';\n\ninterface GroupData {\n groupName: string;\n products: NormalizedProduct[];\n}\n\ninterface FilterTagData {\n title: string;\n action?: { title: string; type: string; payload?: unknown };\n}\n\nexport function renderCategoriesContainer(element: UIElement, context: ChatUISpecRenderContext): HTMLElement {\n const groups = (element.props?.['groups'] as GroupData[] | undefined) ?? [];\n const filterTags = (element.props?.['filterTags'] as FilterTagData[] | undefined) ?? [];\n\n const container = document.createElement('div');\n container.className = 'gengage-chat-categories';\n\n if (groups.length === 0) return container;\n\n // Tab bar — WAI-ARIA tablist pattern\n const tabBar = document.createElement('div');\n tabBar.className = 'gengage-chat-categories-tabs';\n tabBar.setAttribute('role', 'tablist');\n\n const tabs: HTMLButtonElement[] = [];\n const panels: HTMLElement[] = [];\n\n const activateTab = (index: number): void => {\n for (let j = 0; j < tabs.length; j++) {\n const isActive = j === index;\n tabs[j]!.classList.toggle('gengage-chat-categories-tab--active', isActive);\n tabs[j]!.setAttribute('aria-selected', String(isActive));\n tabs[j]!.tabIndex = isActive ? 0 : -1;\n panels[j]!.style.display = isActive ? '' : 'none';\n }\n };\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i]!;\n const tabId = `gengage-cat-tab-${i}`;\n const panelId = `gengage-cat-panel-${i}`;\n\n // Tab button\n const tab = document.createElement('button');\n tab.className = 'gengage-chat-categories-tab';\n tab.type = 'button';\n tab.id = tabId;\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-controls', panelId);\n tab.setAttribute('aria-selected', String(i === 0));\n tab.tabIndex = i === 0 ? 0 : -1;\n if (i === 0) tab.classList.add('gengage-chat-categories-tab--active');\n tab.textContent = group.groupName;\n\n tab.addEventListener('click', () => activateTab(i));\n tab.addEventListener('keydown', (e: KeyboardEvent) => {\n let next = -1;\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n next = (i + 1) % groups.length;\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n next = (i - 1 + groups.length) % groups.length;\n } else if (e.key === 'Home') {\n next = 0;\n } else if (e.key === 'End') {\n next = groups.length - 1;\n }\n if (next >= 0) {\n e.preventDefault();\n activateTab(next);\n tabs[next]!.focus();\n }\n });\n\n tabs.push(tab);\n tabBar.appendChild(tab);\n\n // Product grid panel\n const panel = document.createElement('div');\n panel.className = 'gengage-chat-categories-grid';\n panel.id = panelId;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', tabId);\n if (i !== 0) panel.style.display = 'none';\n\n for (const product of group.products) {\n const card = renderCategoryProductCard(product, context);\n panel.appendChild(card);\n }\n\n panels.push(panel);\n }\n\n container.appendChild(tabBar);\n for (const panel of panels) container.appendChild(panel);\n\n // Filter tags\n if (filterTags.length > 0) {\n const tagsContainer = document.createElement('div');\n tagsContainer.className = 'gengage-chat-categories-filter-tags';\n\n for (const tag of filterTags) {\n const tagBtn = document.createElement('button');\n tagBtn.className = 'gengage-chat-categories-filter-tag';\n tagBtn.type = 'button';\n tagBtn.textContent = tag.title;\n if (tag.action) {\n tagBtn.addEventListener('click', () => {\n context.onAction(tag.action!);\n });\n }\n tagsContainer.appendChild(tagBtn);\n }\n\n container.appendChild(tagsContainer);\n }\n\n return container;\n}\n\nfunction renderCategoryProductCard(product: NormalizedProduct, ctx: ChatUISpecRenderContext): HTMLElement {\n const card = document.createElement('div');\n card.className = 'gengage-chat-product-card';\n\n if (product.imageUrl && isSafeImageUrl(product.imageUrl)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-product-card-img';\n img.src = product.imageUrl;\n img.alt = product.name;\n card.appendChild(img);\n }\n\n const body = document.createElement('div');\n body.className = 'gengage-chat-product-card-body';\n\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-product-card-name';\n nameEl.textContent = product.name;\n body.appendChild(nameEl);\n\n if (product.price) {\n const priceEl = document.createElement('div');\n priceEl.className = 'gengage-chat-product-card-price';\n priceEl.textContent = product.price;\n body.appendChild(priceEl);\n }\n\n card.appendChild(body);\n\n // Click → show product details\n if (ctx.onProductSelect) {\n card.style.cursor = 'pointer';\n card.addEventListener('click', () => {\n ctx.onProductSelect?.(product as unknown as Record<string, unknown>);\n });\n }\n\n return card;\n}\n","/**\n * Renders a handoff notice when the backend escalates to a human agent.\n *\n * XSS safety: All text is set via textContent. No innerHTML.\n */\n\nimport type { ChatUISpecRenderContext } from '../types.js';\n\nexport function renderHandoffNotice(\n element: { props?: Record<string, unknown> },\n context: ChatUISpecRenderContext,\n): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-handoff-notice';\n container.setAttribute('role', 'alert');\n\n const icon = document.createElement('span');\n icon.className = 'gengage-chat-handoff-notice-icon';\n icon.textContent = '\\u{1F464}'; // 👤\n icon.setAttribute('aria-hidden', 'true');\n container.appendChild(icon);\n\n const heading = document.createElement('h4');\n heading.className = 'gengage-chat-handoff-notice-heading';\n heading.textContent = context.i18n?.handoffHeading ?? 'Transferring to a support agent';\n container.appendChild(heading);\n\n const summary = element.props?.['summary'] as string | undefined;\n if (summary) {\n const summaryEl = document.createElement('p');\n summaryEl.className = 'gengage-chat-handoff-notice-summary';\n summaryEl.textContent = summary;\n container.appendChild(summaryEl);\n }\n\n return container;\n}\n","/**\n * Compact horizontal product card for inline chat-pane rendering.\n *\n * Production parity: mirrors the prior engine's `LaunchSingleProduct` component.\n * Renders when `productDetails` arrives — the full ProductDetailsPanel goes\n * to the left panel while this compact summary appears inline in chat messages.\n *\n * Layout: [image 64×64] [name · rating · price] [İncele link]\n */\n\nimport type { UIElement } from '../../common/types.js';\nimport type { ChatUISpecRenderContext } from '../types.js';\nimport { formatPrice } from '../../common/price-formatter.js';\nimport { isSafeUrl, safeSetAttribute } from '../../common/safe-html.js';\nimport { clampRating, addImageErrorHandler, renderStarRating } from '../../common/product-utils.js';\n\nexport function renderProductSummaryCard(element: UIElement, ctx: ChatUISpecRenderContext): HTMLElement {\n const product = (element.props?.['product'] ?? element.props) as Record<string, unknown> | undefined;\n\n const card = document.createElement('div');\n card.className = 'gengage-chat-product-summary';\n if (!product) return card;\n\n // Make entire card clickable to open product in panel\n card.style.cursor = 'pointer';\n card.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('a')) return;\n ctx.onProductSelect?.(product);\n });\n\n // --- Image (left side) ---\n const imageUrl = product['imageUrl'] as string | undefined;\n if (imageUrl && isSafeUrl(imageUrl)) {\n const imgWrap = document.createElement('div');\n imgWrap.className = 'gengage-chat-product-summary__image';\n const img = document.createElement('img');\n safeSetAttribute(img, 'src', imageUrl);\n const name = product['name'] as string | undefined;\n if (name) img.alt = name;\n addImageErrorHandler(img);\n imgWrap.appendChild(img);\n card.appendChild(imgWrap);\n }\n\n // --- Content (right side) ---\n const content = document.createElement('div');\n content.className = 'gengage-chat-product-summary__content';\n\n // Product name (brand + name)\n const brand = product['brand'] as string | undefined;\n const name = product['name'] as string | undefined;\n if (name) {\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-product-summary__name';\n // Only prepend brand if name doesn't already start with it\n const needsBrand = brand && !name.toLowerCase().startsWith(brand.toLowerCase());\n nameEl.textContent = needsBrand ? `${brand} ${name}` : name;\n content.appendChild(nameEl);\n }\n\n // Rating\n const rating = product['rating'];\n const reviewCount = product['reviewCount'];\n if (typeof rating === 'number' && Number.isFinite(rating) && rating > 0) {\n const ratingRow = document.createElement('div');\n ratingRow.className = 'gengage-chat-product-summary__rating';\n ratingRow.textContent = renderStarRating(clampRating(rating));\n if (typeof reviewCount === 'number' && Number.isFinite(reviewCount)) {\n const count = document.createElement('span');\n count.className = 'gengage-chat-product-summary__review-count';\n count.textContent = ` (${reviewCount})`;\n ratingRow.appendChild(count);\n }\n content.appendChild(ratingRow);\n }\n\n // Price row\n const price = product['price'] as string | undefined;\n const originalPrice = product['originalPrice'] as string | undefined;\n if (price) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-product-summary__price';\n if (originalPrice && originalPrice !== price) {\n const orig = document.createElement('span');\n orig.className = 'gengage-chat-product-summary__price-original';\n orig.textContent = formatPrice(originalPrice, ctx.pricing);\n priceRow.appendChild(orig);\n priceRow.appendChild(document.createTextNode(' '));\n }\n const current = document.createElement('span');\n current.className = 'gengage-chat-product-summary__price-current';\n current.textContent = formatPrice(price, ctx.pricing);\n priceRow.appendChild(current);\n content.appendChild(priceRow);\n }\n\n card.appendChild(content);\n\n // --- CTA link (right edge) ---\n const url = product['url'] as string | undefined;\n if (url && isSafeUrl(url)) {\n const cta = document.createElement('a');\n cta.className = 'gengage-chat-product-summary__cta';\n safeSetAttribute(cta, 'href', url);\n safeSetAttribute(cta, 'target', '_blank');\n safeSetAttribute(cta, 'rel', 'noopener noreferrer');\n cta.textContent = ctx.i18n?.productCtaLabel ?? 'İncele';\n card.appendChild(cta);\n }\n\n return card;\n}\n","export interface QuantityStepperOptions {\n min?: number;\n max?: number;\n initial?: number;\n label?: string;\n compact?: boolean;\n decreaseLabel?: string;\n increaseLabel?: string;\n /** Symbol for decrease button (default: '\\u2212' minus sign). */\n decreaseSymbol?: string;\n /** Symbol for increase button (default: '+'). */\n increaseSymbol?: string;\n /** Icon/text for compact mode submit button (default: shopping cart emoji). */\n submitIcon?: string;\n onSubmit: (quantity: number) => void;\n}\n\n/**\n * Creates a quantity stepper with [−] [value] [+] and a submit button.\n * Compact mode renders a cart icon button; full mode renders a labeled button.\n */\nexport function createQuantityStepper(options: QuantityStepperOptions): HTMLElement {\n const rawMin = options.min ?? 1;\n const rawMax = options.max ?? 99;\n // Ensure min <= max; swap if caller provided inverted range\n const min = Math.min(rawMin, rawMax);\n const max = Math.max(rawMin, rawMax);\n const initial = Math.max(min, Math.min(max, options.initial ?? min));\n const compact = options.compact ?? false;\n\n let quantity = initial;\n\n const container = document.createElement('div');\n container.className = `gengage-qty-stepper${compact ? ' gengage-qty-stepper--compact' : ''}`;\n\n const decBtn = document.createElement('button');\n decBtn.className = 'gengage-qty-btn';\n decBtn.type = 'button';\n decBtn.textContent = options.decreaseSymbol ?? '\\u2212'; // minus sign\n decBtn.setAttribute('aria-label', options.decreaseLabel ?? 'Azalt');\n\n const valueEl = document.createElement('span');\n valueEl.className = 'gengage-qty-value';\n valueEl.textContent = String(quantity);\n valueEl.setAttribute('aria-live', 'polite');\n valueEl.setAttribute('aria-atomic', 'true');\n\n const incBtn = document.createElement('button');\n incBtn.className = 'gengage-qty-btn';\n incBtn.type = 'button';\n incBtn.textContent = options.increaseSymbol ?? '+';\n incBtn.setAttribute('aria-label', options.increaseLabel ?? 'Art\\u0131r');\n\n const submitBtn = document.createElement('button');\n submitBtn.className = 'gengage-qty-submit';\n submitBtn.type = 'button';\n\n if (compact) {\n submitBtn.textContent = options.submitIcon ?? '\\uD83D\\uDED2'; // shopping cart emoji\n submitBtn.title = options.label ?? 'Sepete Ekle';\n } else {\n submitBtn.textContent = options.label ?? 'Sepete Ekle';\n }\n\n function updateButtons(): void {\n decBtn.disabled = quantity <= min;\n incBtn.disabled = quantity >= max;\n }\n\n decBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (quantity > min) {\n quantity--;\n valueEl.textContent = String(quantity);\n updateButtons();\n }\n });\n\n incBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n if (quantity < max) {\n quantity++;\n valueEl.textContent = String(quantity);\n updateButtons();\n }\n });\n\n submitBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n options.onSubmit(quantity);\n });\n\n // Prevent card click when interacting with stepper\n container.addEventListener('click', (e) => {\n e.stopPropagation();\n });\n\n updateButtons();\n\n container.appendChild(decBtn);\n container.appendChild(valueEl);\n container.appendChild(incBtn);\n container.appendChild(submitBtn);\n\n return container;\n}\n","/**\n * Renders a json-render UISpec into DOM elements.\n *\n * XSS safety: All text is set via textContent. URLs are validated for safe protocols.\n * No innerHTML is used anywhere in this module.\n */\n\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { ChatUISpecRenderContext, ProductSortState } from '../types.js';\nimport { formatPrice } from '../../common/price-formatter.js';\nimport type { PriceFormatConfig } from '../../common/price-formatter.js';\nimport { renderComparisonTable } from './ComparisonTable.js';\nimport type { ComparisonProduct, ComparisonAttribute } from './ComparisonTable.js';\nimport { renderReviewHighlights as renderReviewHighlightsComponent } from './ReviewHighlights.js';\nimport { renderAITopPicks } from './AITopPicks.js';\nimport { renderGroundingReviewCard } from './GroundingReviewCard.js';\nimport { renderAIGroupingCards } from './AIGroupingCards.js';\nimport { renderAISuggestedSearchCards } from './AISuggestedSearchCards.js';\nimport { renderFloatingComparisonButton } from './FloatingComparisonButton.js';\nimport { renderProsAndCons } from './ProsAndCons.js';\nimport { renderCategoriesContainer } from './CategoriesContainer.js';\nimport { renderHandoffNotice } from './HandoffNotice.js';\nimport { renderProductSummaryCard } from './ProductSummaryCard.js';\nimport { createQuantityStepper } from '../../common/quantity-stepper.js';\nimport { isSafeUrl, safeSetAttribute } from '../../common/safe-html.js';\nimport { clampRating, clampDiscount, addImageErrorHandler, renderStarRating } from '../../common/product-utils.js';\n\nexport type UISpecRenderContext = ChatUISpecRenderContext;\n\nexport type ChatUISpecRegistry = UISpecDomRegistry<UISpecRenderContext>;\n\n/**\n * @deprecated Use `formatPrice()` from `../../common/price-formatter.js` instead.\n * Kept for backwards compatibility — delegates to `formatPrice()` with Turkish defaults.\n */\nexport function formatTurkishPrice(raw: string): string {\n return formatPrice(raw);\n}\n\nexport type { PriceFormatConfig };\n\nfunction isMobileViewport(): boolean {\n return window.innerWidth < 768;\n}\n\nconst DEFAULT_CHAT_UI_SPEC_REGISTRY: ChatUISpecRegistry = {\n ActionButtons: ({ element, context }) => renderActionButtons(element, context),\n ActionButton: ({ element, context }) => renderActionButton(element, context),\n ProductCard: ({ element, context }) => renderProductCard(element, context),\n ProductDetailsPanel: ({ element, context }) => renderProductDetailsPanel(element, context),\n ProductGrid: ({ element, spec, renderElement, context }) => renderProductGrid(element, spec, renderElement, context),\n ReviewHighlights: ({ element, context }) =>\n renderReviewHighlightsComponent(element, { emptyReviewsMessage: context.i18n?.emptyReviewsMessage }),\n ComparisonTable: ({ element, context }) => renderComparisonTableElement(element, context),\n AITopPicks: ({ element, context }) => renderAITopPicks(element, context),\n GroundingReviewCard: ({ element, context }) => renderGroundingReviewCard(element, context),\n AIGroupingCards: ({ element, context }) => renderAIGroupingCards(element, context),\n AISuggestedSearchCards: ({ element, context }) => renderAISuggestedSearchCards(element, context),\n ProsAndCons: ({ element }) => renderProsAndCons(element),\n CategoriesContainer: ({ element, context }) => renderCategoriesContainer(element, context),\n HandoffNotice: ({ element, context }) => renderHandoffNotice(element, context),\n ProductSummaryCard: ({ element, context }) => renderProductSummaryCard(element, context),\n Divider: ({ element }) => renderDivider(element),\n};\n\nexport const defaultChatUnknownUISpecRenderer: UISpecDomUnknownRenderer<UISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultChatUISpecRegistry(): ChatUISpecRegistry {\n return { ...DEFAULT_CHAT_UI_SPEC_REGISTRY };\n}\n\nexport function renderUISpec(\n spec: UISpec,\n ctx: UISpecRenderContext,\n registry = DEFAULT_CHAT_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<UISpecRenderContext> = defaultChatUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context: ctx,\n registry,\n containerClassName: 'gengage-chat-uispec',\n unknownRenderer,\n });\n}\n\nfunction renderActionButtons(element: UIElement, ctx: UISpecRenderContext): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-action-buttons';\n\n const buttons = element.props?.['buttons'] as Array<{ label: string; action: ActionPayload }> | undefined;\n\n if (buttons) {\n for (const btn of buttons) {\n const button = document.createElement('button');\n button.className = 'gengage-chat-action-btn';\n button.textContent = btn.label;\n button.addEventListener('click', () => ctx.onAction(btn.action));\n container.appendChild(button);\n }\n }\n\n return container;\n}\n\nfunction renderActionButton(element: UIElement, ctx: UISpecRenderContext): HTMLElement {\n const button = document.createElement('button');\n button.className = 'gengage-chat-action-btn';\n const label = element.props?.['label'];\n if (typeof label === 'string') button.textContent = label;\n const action = element.props?.['action'] as ActionPayload | undefined;\n if (action) {\n button.addEventListener('click', () => ctx.onAction(action));\n }\n return button;\n}\n\nfunction renderProductCard(element: UIElement, ctx: UISpecRenderContext): HTMLElement {\n const card = document.createElement('div');\n card.className = 'gengage-chat-product-card';\n\n // Product data may be nested under `product` prop (v1 adapter) or flat in props\n const product = (element.props?.['product'] ?? element.props) as Record<string, unknown> | undefined;\n if (!product) return card;\n\n // Store SKU as data attribute for comparison mode DOM refresh\n const productSku = product['sku'] as string | undefined;\n if (productSku) card.dataset['sku'] = productSku;\n\n // Make card clickable to show detail in panel\n if (ctx.onProductSelect) {\n card.style.cursor = 'pointer';\n card.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.gengage-chat-product-card-atc')) return;\n if ((e.target as HTMLElement).closest('.gengage-chat-product-card-cta')) return;\n ctx.onProductSelect?.(product);\n });\n }\n\n const imageUrl = product['imageUrl'] as string | undefined;\n if (imageUrl && isSafeUrl(imageUrl)) {\n const imgWrapper = document.createElement('div');\n imgWrapper.className = 'gengage-chat-product-card-img-wrapper';\n\n const img = document.createElement('img');\n img.className = 'gengage-chat-product-card-img';\n img.loading = 'lazy';\n safeSetAttribute(img, 'src', imageUrl);\n const name = product['name'] as string | undefined;\n if (name) img.alt = name;\n addImageErrorHandler(img);\n imgWrapper.appendChild(img);\n\n // Discount badge (top-left of image)\n const discountPercent = product['discountPercent'] as number | undefined;\n if (typeof discountPercent === 'number' && discountPercent > 0) {\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-product-card-discount-badge';\n badge.textContent = `%${clampDiscount(discountPercent)}`;\n imgWrapper.appendChild(badge);\n }\n\n // \"Find Similar\" hover pill on image\n const findSimilarSku = product['sku'] as string | undefined;\n if (findSimilarSku) {\n const pill = document.createElement('button');\n pill.className = 'gengage-chat-find-similar-pill';\n pill.type = 'button';\n pill.textContent = ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul';\n pill.addEventListener('click', (e) => {\n e.stopPropagation();\n ctx.onAction({\n title: ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul',\n type: 'findSimilar',\n payload: { sku: findSimilarSku, ...(imageUrl ? { image_url: imageUrl } : {}) },\n });\n });\n imgWrapper.appendChild(pill);\n }\n\n // Favorite heart toggle\n const favSku = product['sku'] as string | undefined;\n if (favSku && ctx.onFavoriteToggle) {\n const heart = document.createElement('button');\n heart.className = 'gengage-chat-favorite-btn';\n heart.type = 'button';\n heart.setAttribute('aria-label', 'Favorilere ekle');\n const isFav = ctx.favoritedSkus?.has(favSku) ?? false;\n if (isFav) heart.classList.add('gengage-chat-favorite-btn--active');\n const svgFill = isFav ? 'currentColor' : 'none';\n heart.innerHTML = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"${svgFill}\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\"/></svg>`;\n heart.addEventListener('click', (e) => {\n e.stopPropagation();\n heart.classList.toggle('gengage-chat-favorite-btn--active');\n const svg = heart.querySelector('svg');\n if (svg) {\n svg.setAttribute(\n 'fill',\n heart.classList.contains('gengage-chat-favorite-btn--active') ? 'currentColor' : 'none',\n );\n }\n ctx.onFavoriteToggle!(favSku, product);\n });\n imgWrapper.appendChild(heart);\n }\n\n card.appendChild(imgWrapper);\n }\n\n const body = document.createElement('div');\n body.className = 'gengage-chat-product-card-body';\n\n const brand = product['brand'] as string | undefined;\n if (brand) {\n const brandEl = document.createElement('div');\n brandEl.className = 'gengage-chat-product-card-brand';\n brandEl.textContent = brand;\n body.appendChild(brandEl);\n }\n\n const name = product['name'] as string | undefined;\n if (name) {\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-chat-product-card-name';\n nameEl.textContent = name;\n body.appendChild(nameEl);\n }\n\n const rating = product['rating'];\n const reviewCount = product['reviewCount'];\n if (typeof rating === 'number' && Number.isFinite(rating)) {\n const ratingRow = document.createElement('div');\n ratingRow.className = 'gengage-chat-product-card-rating';\n ratingRow.textContent = renderStarRating(rating);\n if (typeof reviewCount === 'number' && Number.isFinite(reviewCount)) {\n const count = document.createElement('span');\n count.className = 'gengage-chat-product-card-review-count';\n count.textContent = ` (${reviewCount})`;\n ratingRow.appendChild(count);\n }\n body.appendChild(ratingRow);\n }\n\n const price = product['price'] as string | undefined;\n const originalPrice = product['originalPrice'] as string | undefined;\n const priceAsync = product['price_async'] as boolean | undefined;\n\n if (priceAsync === true) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-product-card-price';\n const skeleton = document.createElement('span');\n skeleton.className = 'gengage-chat-price-skeleton';\n priceRow.appendChild(skeleton);\n body.appendChild(priceRow);\n // Replace skeleton with actual price after delay\n setTimeout(() => {\n if (!skeleton.parentElement) return; // Element removed from DOM\n if (price) {\n skeleton.replaceWith(document.createTextNode(formatPrice(price, ctx.pricing)));\n } else {\n skeleton.remove();\n }\n }, 300);\n } else if (price) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-product-card-price';\n if (originalPrice && originalPrice !== price) {\n const orig = document.createElement('span');\n orig.className = 'gengage-chat-product-card-original-price';\n orig.textContent = formatPrice(originalPrice, ctx.pricing);\n priceRow.appendChild(orig);\n priceRow.appendChild(document.createTextNode(' '));\n }\n const current = document.createElement('span');\n current.textContent = formatPrice(price, ctx.pricing);\n priceRow.appendChild(current);\n body.appendChild(priceRow);\n }\n\n // Stock indicator\n const inStock = product['inStock'];\n if (typeof inStock === 'boolean') {\n const stock = document.createElement('div');\n stock.className = `gengage-chat-product-card-stock ${inStock ? 'is-in-stock' : 'is-out-of-stock'}`;\n stock.textContent = inStock ? (ctx.i18n?.inStockLabel ?? 'Stokta') : (ctx.i18n?.outOfStockLabel ?? 'Tükendi');\n body.appendChild(stock);\n }\n\n // Promotion badges (e.g. \"Free Shipping\", \"Flash Sale\")\n const promotions = product['promotions'] as string[] | undefined;\n if (promotions && promotions.length > 0) {\n const promoBadges = document.createElement('div');\n promoBadges.className = 'gengage-chat-product-card-promos';\n for (const promo of promotions) {\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-product-card-promo-badge';\n badge.textContent = promo;\n promoBadges.appendChild(badge);\n }\n body.appendChild(promoBadges);\n }\n\n card.appendChild(body);\n\n const url = product['url'] as string | undefined;\n const sku = product['sku'] as string | undefined;\n const action = element.props?.['action'] as ActionPayload | undefined;\n\n if (action) {\n const cta = document.createElement('button');\n cta.className = 'gengage-chat-product-card-cta';\n cta.type = 'button';\n cta.textContent = action.title || ctx.i18n?.productCtaLabel || 'Incele';\n cta.addEventListener('click', () => ctx.onAction(action));\n card.appendChild(cta);\n } else if (url && isSafeUrl(url)) {\n const cta = document.createElement('a');\n cta.className = 'gengage-chat-product-card-cta';\n safeSetAttribute(cta, 'href', url);\n safeSetAttribute(cta, 'target', '_blank');\n safeSetAttribute(cta, 'rel', 'noopener noreferrer');\n cta.textContent = ctx.i18n?.productCtaLabel ?? 'İncele';\n cta.addEventListener('click', (e) => {\n if (ctx.onProductClick && sku) {\n e.preventDefault();\n ctx.onProductClick({ sku, url });\n }\n });\n card.appendChild(cta);\n }\n\n // Add to cart stepper (shown on search result cards when cartCode is available and in stock)\n const cartCode = product['cartCode'] as string | undefined;\n if (cartCode && sku && inStock !== false) {\n const stepper = createQuantityStepper({\n compact: true,\n label: ctx.i18n?.addToCartButton ?? 'Sepete Ekle',\n onSubmit: (quantity) => {\n ctx.onAction({\n title: ctx.i18n?.addToCartButton ?? 'Sepete Ekle',\n type: 'addToCart',\n payload: { sku, cartCode, quantity },\n });\n },\n });\n stepper.classList.add('gengage-chat-product-card-atc');\n card.appendChild(stepper);\n }\n\n // Wrap with checkbox overlay when comparison select mode is active\n if (ctx.comparisonSelectMode && sku && ctx.onToggleComparisonSku) {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-chat-comparison-select-wrapper';\n\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'gengage-chat-comparison-checkbox';\n checkbox.checked = ctx.comparisonSelectedSkus?.includes(sku) ?? false;\n checkbox.addEventListener('change', () => {\n ctx.onToggleComparisonSku?.(sku);\n });\n\n wrapper.appendChild(checkbox);\n wrapper.appendChild(card);\n return wrapper;\n }\n\n return card;\n}\n\n/* clampRating, clampDiscount, addImageErrorHandler, renderStarRating\n are imported from ../../common/product-utils.js */\n\nfunction renderProductDetailsPanel(element: UIElement, ctx: UISpecRenderContext): HTMLElement {\n const panel = document.createElement('article');\n panel.className = 'gengage-chat-product-details-panel';\n\n const product = (element.props?.['product'] ?? element.props) as Record<string, unknown> | undefined;\n if (!product) return panel;\n\n // Image gallery or single image\n const images = product['images'] as string[] | undefined;\n const imageUrl = product['imageUrl'] as string | undefined;\n\n const detailsSku = product['sku'] as string | undefined;\n\n if (images && images.length > 1) {\n // Gallery with thumbnails\n const media = document.createElement('div');\n media.className =\n 'gengage-chat-product-details-media gengage-chat-product-details-gallery gengage-chat-product-details-img-wrap';\n\n const mainImg = document.createElement('img');\n mainImg.className = 'gengage-chat-product-details-img';\n const firstSafe = images.find((u) => isSafeUrl(u));\n if (firstSafe) safeSetAttribute(mainImg, 'src', firstSafe);\n const name = product['name'] as string | undefined;\n if (name) mainImg.alt = name;\n addImageErrorHandler(mainImg);\n media.appendChild(mainImg);\n\n const thumbStrip = document.createElement('div');\n thumbStrip.className = 'gengage-chat-product-gallery-thumbs';\n\n let activeThumb: HTMLElement | null = null;\n let activeThumbIdx = 0;\n for (let i = 0; i < images.length; i++) {\n const imgUrl = images[i];\n if (!imgUrl || !isSafeUrl(imgUrl)) continue;\n const thumb = document.createElement('img');\n thumb.className = 'gengage-chat-product-gallery-thumb';\n if (i === 0) {\n thumb.classList.add('gengage-chat-product-gallery-thumb--active');\n activeThumb = thumb;\n }\n safeSetAttribute(thumb, 'src', imgUrl);\n thumb.alt = `${name ?? 'Product'} ${i + 1}`;\n thumb.width = 48;\n thumb.height = 48;\n addImageErrorHandler(thumb);\n thumb.addEventListener('click', () => {\n safeSetAttribute(mainImg, 'src', imgUrl);\n if (activeThumb) activeThumb.classList.remove('gengage-chat-product-gallery-thumb--active');\n thumb.classList.add('gengage-chat-product-gallery-thumb--active');\n activeThumb = thumb;\n activeThumbIdx = i;\n });\n thumbStrip.appendChild(thumb);\n }\n\n // Touch swipe gesture for gallery navigation\n let touchStartX = 0;\n const SWIPE_THRESHOLD = 50;\n\n mainImg.addEventListener(\n 'touchstart',\n (e: TouchEvent) => {\n touchStartX = e.changedTouches[0]!.clientX;\n },\n { passive: true },\n );\n\n mainImg.addEventListener('touchend', (e: TouchEvent) => {\n const touchEndX = e.changedTouches[0]!.clientX;\n const diff = touchStartX - touchEndX;\n if (Math.abs(diff) < SWIPE_THRESHOLD) return;\n\n const thumbEls = thumbStrip.querySelectorAll('.gengage-chat-product-gallery-thumb');\n const nextIdx =\n diff > 0\n ? Math.min(activeThumbIdx + 1, thumbEls.length - 1) // swipe left → next\n : Math.max(activeThumbIdx - 1, 0); // swipe right → prev\n\n if (nextIdx !== activeThumbIdx && thumbEls[nextIdx]) {\n (thumbEls[nextIdx] as HTMLElement).click();\n }\n });\n\n media.appendChild(thumbStrip);\n\n // \"Find Similar\" hover pill on gallery image\n if (detailsSku) {\n const pill = document.createElement('button');\n pill.className = 'gengage-chat-find-similar-pill';\n pill.type = 'button';\n pill.textContent = ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul';\n pill.addEventListener('click', () => {\n ctx.onAction({\n title: ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul',\n type: 'findSimilar',\n payload: { sku: detailsSku, ...(firstSafe ? { image_url: firstSafe } : {}) },\n });\n });\n media.appendChild(pill);\n }\n\n panel.appendChild(media);\n } else if (imageUrl && isSafeUrl(imageUrl)) {\n // Single image fallback\n const media = document.createElement('div');\n media.className = 'gengage-chat-product-details-media gengage-chat-product-details-img-wrap';\n const img = document.createElement('img');\n img.className = 'gengage-chat-product-details-img';\n img.loading = 'lazy';\n safeSetAttribute(img, 'src', imageUrl);\n addImageErrorHandler(img);\n const name = product['name'] as string | undefined;\n if (name) img.alt = name;\n media.appendChild(img);\n\n // \"Find Similar\" hover pill on single image\n if (detailsSku) {\n const pill = document.createElement('button');\n pill.className = 'gengage-chat-find-similar-pill';\n pill.type = 'button';\n pill.textContent = ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul';\n pill.addEventListener('click', () => {\n ctx.onAction({\n title: ctx.i18n?.findSimilarLabel ?? 'Benzerlerini Bul',\n type: 'findSimilar',\n payload: { sku: detailsSku, ...(imageUrl ? { image_url: imageUrl } : {}) },\n });\n });\n media.appendChild(pill);\n }\n\n panel.appendChild(media);\n }\n\n const content = document.createElement('div');\n content.className = 'gengage-chat-product-details-content';\n\n const name = product['name'] as string | undefined;\n if (name) {\n const title = document.createElement('h3');\n title.className = 'gengage-chat-product-details-title';\n title.textContent = name;\n content.appendChild(title);\n }\n\n const rating = product['rating'];\n const reviewCount = product['reviewCount'];\n if (typeof rating === 'number' && Number.isFinite(rating)) {\n const ratingRow = document.createElement('div');\n ratingRow.className = 'gengage-chat-product-details-rating';\n ratingRow.textContent = `\\u2605 ${clampRating(rating).toFixed(1)}`;\n if (typeof reviewCount === 'number' && Number.isFinite(reviewCount)) {\n const count = document.createElement('span');\n count.className = 'gengage-chat-product-details-review-count';\n count.textContent = ` (${reviewCount})`;\n ratingRow.appendChild(count);\n }\n content.appendChild(ratingRow);\n }\n\n const price = product['price'] as string | undefined;\n const originalPrice = product['originalPrice'] as string | undefined;\n const priceAsync = product['price_async'] as boolean | undefined;\n\n if (priceAsync === true) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-product-details-price';\n const skeleton = document.createElement('span');\n skeleton.className = 'gengage-chat-price-skeleton';\n priceRow.appendChild(skeleton);\n content.appendChild(priceRow);\n // Replace skeleton with actual price after delay\n setTimeout(() => {\n if (!skeleton.parentElement) return; // Element removed from DOM\n if (price) {\n const currentPrice = document.createElement('span');\n currentPrice.className = 'gengage-chat-product-details-current-price';\n currentPrice.textContent = formatPrice(price, ctx.pricing);\n skeleton.replaceWith(currentPrice);\n } else {\n skeleton.remove();\n }\n }, 300);\n } else if (price) {\n const priceRow = document.createElement('div');\n priceRow.className = 'gengage-chat-product-details-price';\n if (originalPrice && originalPrice !== price) {\n const oldPrice = document.createElement('span');\n oldPrice.className = 'gengage-chat-product-details-original-price';\n oldPrice.textContent = formatPrice(originalPrice, ctx.pricing);\n priceRow.appendChild(oldPrice);\n priceRow.appendChild(document.createTextNode(' '));\n }\n const currentPrice = document.createElement('span');\n currentPrice.className = 'gengage-chat-product-details-current-price';\n currentPrice.textContent = formatPrice(price, ctx.pricing);\n priceRow.appendChild(currentPrice);\n content.appendChild(priceRow);\n }\n\n const inStock = product['inStock'];\n if (typeof inStock === 'boolean') {\n const stock = document.createElement('div');\n stock.className = `gengage-chat-product-details-stock ${inStock ? 'is-in-stock' : 'is-out-of-stock'}`;\n stock.textContent = inStock ? 'Stokta var' : 'Stokta yok';\n content.appendChild(stock);\n }\n\n // Promotion badges (e.g. \"Free Shipping\", \"Flash Sale\")\n const promotions = product['promotions'] as string[] | undefined;\n if (promotions && promotions.length > 0) {\n const promoBadges = document.createElement('div');\n promoBadges.className = 'gengage-chat-product-details-promos';\n for (const promo of promotions) {\n const badge = document.createElement('span');\n badge.className = 'gengage-chat-product-details-promo-badge';\n badge.textContent = promo;\n promoBadges.appendChild(badge);\n }\n content.appendChild(promoBadges);\n }\n\n // Variant selector\n const variants = product['variants'] as Array<Record<string, unknown>> | undefined;\n if (variants && variants.length > 0) {\n const variantSection = document.createElement('div');\n variantSection.className = 'gengage-chat-product-variants';\n\n const variantLabel = document.createElement('div');\n variantLabel.className = 'gengage-chat-product-variants-label';\n variantLabel.textContent = ctx.i18n?.variantsLabel ?? 'Varyantlar';\n variantSection.appendChild(variantLabel);\n\n const variantList = document.createElement('div');\n variantList.className = 'gengage-chat-product-variants-list';\n\n for (const variant of variants) {\n const variantName = (variant['name'] as string | undefined) ?? (variant['variant_name'] as string | undefined);\n const variantSku = variant['sku'] as string | undefined;\n if (!variantName && !variantSku) continue;\n\n const btn = document.createElement('button');\n btn.className = 'gengage-chat-product-variant-btn';\n btn.type = 'button';\n\n const labelText = variantName ?? variantSku ?? '';\n const variantPrice = variant['price'] as number | string | undefined;\n if (variantPrice && String(variantPrice) !== String(price)) {\n btn.textContent = `${labelText} - ${formatPrice(String(variantPrice), ctx.pricing)}`;\n } else {\n btn.textContent = labelText;\n }\n\n if (variantSku) {\n btn.addEventListener('click', () => {\n ctx.onAction({\n title: labelText,\n type: 'launchVariant',\n payload: { sku: variantSku },\n });\n });\n }\n variantList.appendChild(btn);\n }\n\n variantSection.appendChild(variantList);\n content.appendChild(variantSection);\n }\n\n const sku = product['sku'] as string | undefined;\n const cartCode = product['cartCode'] as string | undefined;\n\n const actionRow = document.createElement('div');\n actionRow.className = 'gengage-chat-product-details-actions';\n\n const action = element.props?.['action'] as ActionPayload | undefined;\n if (action) {\n const actionBtn = document.createElement('button');\n actionBtn.className = 'gengage-chat-product-details-cta';\n actionBtn.type = 'button';\n actionBtn.textContent = action.title || ctx.i18n?.productCtaLabel || 'Incele';\n actionBtn.addEventListener('click', () => ctx.onAction(action));\n actionRow.appendChild(actionBtn);\n } else {\n const url = product['url'] as string | undefined;\n if (url && isSafeUrl(url)) {\n const cta = document.createElement('a');\n cta.className = 'gengage-chat-product-details-cta';\n safeSetAttribute(cta, 'href', url);\n safeSetAttribute(cta, 'target', '_blank');\n safeSetAttribute(cta, 'rel', 'noopener noreferrer');\n cta.textContent = ctx.i18n?.productCtaLabel ?? 'Incele';\n cta.addEventListener('click', (e) => {\n if (ctx.onProductClick && sku) {\n e.preventDefault();\n ctx.onProductClick({ sku, url });\n }\n });\n actionRow.appendChild(cta);\n }\n }\n\n // \"Sepete Ekle\" stepper — shown when the product has a cartCode and is in stock\n if (cartCode && sku && inStock !== false) {\n const stepper = createQuantityStepper({\n compact: false,\n label: ctx.i18n?.addToCartButton ?? 'Sepete Ekle',\n onSubmit: (quantity) => {\n ctx.onAction({\n title: ctx.i18n?.addToCartButton ?? 'Sepete Ekle',\n type: 'addToCart',\n payload: { sku, cartCode, quantity },\n });\n },\n });\n stepper.classList.add('gengage-chat-product-details-atc-stepper');\n actionRow.appendChild(stepper);\n }\n\n // Share button — copies product URL or triggers native share\n const shareUrl = product['url'] as string | undefined;\n if (shareUrl && isSafeUrl(shareUrl)) {\n const shareBtn = document.createElement('button');\n shareBtn.className = 'gengage-chat-product-details-share';\n shareBtn.type = 'button';\n const shareLabel = ctx.i18n?.shareButton ?? 'Paylaş';\n shareBtn.title = shareLabel;\n shareBtn.setAttribute('aria-label', shareLabel);\n const svgNS = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(svgNS, 'svg');\n svg.setAttribute('width', '18');\n svg.setAttribute('height', '18');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n function addCircle(cx: string, cy: string): void {\n const c = document.createElementNS(svgNS, 'circle');\n c.setAttribute('cx', cx);\n c.setAttribute('cy', cy);\n c.setAttribute('r', '3');\n svg.appendChild(c);\n }\n function addLine(x1: string, y1: string, x2: string, y2: string): void {\n const l = document.createElementNS(svgNS, 'line');\n l.setAttribute('x1', x1);\n l.setAttribute('y1', y1);\n l.setAttribute('x2', x2);\n l.setAttribute('y2', y2);\n svg.appendChild(l);\n }\n addCircle('18', '5');\n addCircle('6', '12');\n addCircle('18', '19');\n addLine('8.59', '13.51', '15.42', '17.49');\n addLine('15.41', '6.51', '8.59', '10.49');\n shareBtn.appendChild(svg);\n shareBtn.addEventListener('click', async () => {\n const productName = product['name'] as string | undefined;\n try {\n if (navigator.share) {\n await navigator.share({ title: productName ?? '', url: shareUrl });\n } else if (navigator.clipboard) {\n await navigator.clipboard.writeText(shareUrl);\n shareBtn.classList.add('gengage-chat-product-details-share--copied');\n setTimeout(() => shareBtn.classList.remove('gengage-chat-product-details-share--copied'), 1500);\n }\n } catch {\n // Share cancelled or clipboard write denied — ignore\n }\n });\n actionRow.appendChild(shareBtn);\n }\n\n if (actionRow.childElementCount > 0) {\n content.appendChild(actionRow);\n }\n\n panel.appendChild(content);\n\n // Product detail tabs: \"Ürün Bilgileri\" / \"Teknik Özellikler\"\n const description = product['description'] as string | undefined;\n const specifications = product['specifications'] as\n | Record<string, string>\n | Array<{ key: string; value: string }>\n | undefined;\n if (description || specifications) {\n panel.appendChild(renderProductDetailTabs(description, specifications, ctx));\n }\n\n return panel;\n}\n\nfunction renderProductDetailTabs(\n description: string | undefined,\n specifications: Record<string, string> | Array<{ key: string; value: string }> | undefined,\n ctx: UISpecRenderContext,\n): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-chat-product-detail-tabs';\n\n const tabBar = document.createElement('div');\n tabBar.className = 'gengage-chat-product-detail-tab-bar';\n\n const tabPanels: HTMLElement[] = [];\n\n // Product Info tab\n if (description) {\n const tab = document.createElement('button');\n tab.className = 'gengage-chat-product-detail-tab gengage-chat-product-detail-tab--active';\n tab.type = 'button';\n tab.textContent = ctx.i18n?.productInfoTab ?? 'Ürün Bilgileri';\n tabBar.appendChild(tab);\n\n const panel = document.createElement('div');\n panel.className = 'gengage-chat-product-detail-tab-panel';\n panel.textContent = description;\n tabPanels.push(panel);\n }\n\n // Specifications tab\n if (specifications) {\n const tab = document.createElement('button');\n tab.className = `gengage-chat-product-detail-tab${!description ? ' gengage-chat-product-detail-tab--active' : ''}`;\n tab.type = 'button';\n tab.textContent = ctx.i18n?.specificationsTab ?? 'Teknik Özellikler';\n tabBar.appendChild(tab);\n\n const panel = document.createElement('div');\n panel.className = 'gengage-chat-product-detail-tab-panel';\n if (!description) {\n // Show specs by default if no description\n } else {\n panel.style.display = 'none';\n }\n\n const table = document.createElement('table');\n table.className = 'gengage-chat-product-specs-table';\n const entries = Array.isArray(specifications)\n ? specifications\n : Object.entries(specifications).map(([key, value]) => ({ key, value }));\n for (const entry of entries) {\n const row = document.createElement('tr');\n const keyCell = document.createElement('td');\n keyCell.className = 'gengage-chat-product-specs-key';\n keyCell.textContent = entry.key;\n const valCell = document.createElement('td');\n valCell.className = 'gengage-chat-product-specs-value';\n valCell.textContent = entry.value;\n row.appendChild(keyCell);\n row.appendChild(valCell);\n table.appendChild(row);\n }\n panel.appendChild(table);\n tabPanels.push(panel);\n }\n\n // Wire up tab switching\n const tabs = tabBar.querySelectorAll('.gengage-chat-product-detail-tab');\n tabs.forEach((tabEl, idx) => {\n tabEl.addEventListener('click', () => {\n tabs.forEach((t) => t.classList.remove('gengage-chat-product-detail-tab--active'));\n tabEl.classList.add('gengage-chat-product-detail-tab--active');\n tabPanels.forEach((p, pIdx) => {\n p.style.display = pIdx === idx ? '' : 'none';\n });\n });\n });\n\n container.appendChild(tabBar);\n for (const p of tabPanels) container.appendChild(p);\n return container;\n}\n\nfunction getSortedChildIds(childIds: string[], spec: UISpec, sort?: ProductSortState): string[] {\n if (!sort || sort.type === 'related') return childIds;\n\n const withPrice = childIds.map((id) => {\n const el = spec.elements[id];\n const product = el?.props?.['product'] as Record<string, unknown> | undefined;\n const price = product ? Number(product['price']) : NaN;\n return { id, price: Number.isFinite(price) ? price : Infinity };\n });\n\n withPrice.sort((a, b) => {\n if (a.price === Infinity && b.price === Infinity) return 0;\n if (a.price === Infinity) return 1;\n if (b.price === Infinity) return -1;\n return sort.direction === 'desc' ? b.price - a.price : a.price - b.price;\n });\n\n return withPrice.map((x) => x.id);\n}\n\nfunction resortGrid(grid: HTMLElement, childIds: string[], spec: UISpec, sort: ProductSortState): void {\n const sorted = getSortedChildIds(childIds, spec, sort);\n // Build map from element ID data attribute to DOM element\n const childMap = new Map<string, HTMLElement>();\n for (const child of Array.from(grid.children) as HTMLElement[]) {\n const elId = child.dataset['elementId'];\n if (elId) childMap.set(elId, child);\n }\n\n for (const id of sorted) {\n const el = childMap.get(id);\n if (el) grid.appendChild(el);\n }\n}\n\nfunction renderProductGrid(\n element: UIElement,\n spec: UISpec,\n renderElement: (elementId: string) => HTMLElement | null,\n ctx?: UISpecRenderContext,\n): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-chat-product-grid-wrapper';\n\n const childIds = element.children ?? [];\n\n // Sort toolbar (only when >1 children and context has sort support)\n if (childIds.length > 1 && ctx?.onSortChange) {\n const toolbar = document.createElement('div');\n toolbar.className = 'gengage-chat-product-sort-toolbar';\n\n const sort = ctx.productSort ?? { type: 'related' as const };\n\n const buttons: Array<{ label: string; sortState: ProductSortState }> = [\n { label: ctx.i18n?.sortRelated ?? 'Önerilen', sortState: { type: 'related' } },\n { label: ctx.i18n?.sortPriceAsc ?? 'Fiyat ↑', sortState: { type: 'price', direction: 'asc' } },\n { label: ctx.i18n?.sortPriceDesc ?? 'Fiyat ↓', sortState: { type: 'price', direction: 'desc' } },\n ];\n\n for (const btn of buttons) {\n const button = document.createElement('button');\n button.className = 'gengage-chat-product-sort-btn';\n button.type = 'button';\n const isActive = sort.type === btn.sortState.type && sort.direction === btn.sortState.direction;\n if (isActive) button.classList.add('gengage-chat-product-sort-btn--active');\n button.textContent = btn.label;\n button.addEventListener('click', () => {\n ctx.onSortChange?.(btn.sortState);\n resortGrid(grid, childIds, spec, btn.sortState);\n toolbar\n .querySelectorAll('.gengage-chat-product-sort-btn')\n .forEach((b) => b.classList.remove('gengage-chat-product-sort-btn--active'));\n button.classList.add('gengage-chat-product-sort-btn--active');\n });\n toolbar.appendChild(button);\n }\n\n // Comparison toggle button (only if onToggleComparisonSku is provided)\n if (ctx.onToggleComparisonSku) {\n const separator = document.createElement('div');\n separator.className = 'gengage-chat-product-sort-separator';\n toolbar.appendChild(separator);\n\n const compareBtn = document.createElement('button');\n compareBtn.className = 'gengage-chat-comparison-toggle-btn';\n compareBtn.type = 'button';\n if (ctx.comparisonSelectMode) {\n compareBtn.classList.add('gengage-chat-comparison-toggle-btn--active');\n }\n compareBtn.textContent = ctx.i18n?.compareSelected ?? 'Karşılaştır';\n compareBtn.addEventListener('click', () => {\n // Toggle is handled by the parent — dispatched via onToggleComparisonSku with empty string\n // to signal mode toggle (convention: empty sku = toggle mode)\n ctx.onToggleComparisonSku?.('');\n });\n toolbar.appendChild(compareBtn);\n }\n\n wrapper.appendChild(toolbar);\n }\n\n const grid = document.createElement('div');\n grid.className = 'gengage-chat-product-grid';\n\n const sortedIds = getSortedChildIds(childIds, spec, ctx?.productSort);\n for (const childId of sortedIds) {\n if (!spec.elements[childId]) continue;\n const rendered = renderElement(childId);\n if (rendered) {\n rendered.dataset['elementId'] = childId;\n grid.appendChild(rendered);\n }\n }\n\n // Mobile variant: horizontal scroll\n if (isMobileViewport()) {\n grid.classList.add('gengage-chat-product-grid--mobile');\n }\n\n wrapper.appendChild(grid);\n\n // \"View More\" button (only when endOfList is not true)\n const endOfList = element.props?.['endOfList'] as boolean | undefined;\n if (endOfList !== true && childIds.length > 0) {\n const viewMoreBtn = document.createElement('button');\n viewMoreBtn.className = 'gengage-chat-product-grid-view-more';\n viewMoreBtn.type = 'button';\n viewMoreBtn.textContent = ctx?.i18n?.viewMoreLabel ?? 'Daha Fazla Göster';\n viewMoreBtn.addEventListener('click', () => {\n ctx?.onAction({ title: 'More', type: 'moreProductList', payload: {} });\n });\n wrapper.appendChild(viewMoreBtn);\n }\n\n // Floating comparison button (visible when 2+ products are selected)\n if (ctx?.comparisonSelectMode && ctx.comparisonSelectedSkus && ctx.comparisonSelectedSkus.length >= 2) {\n const floatingBtn = renderFloatingComparisonButton(ctx.comparisonSelectedSkus, ctx);\n wrapper.appendChild(floatingBtn);\n }\n\n return wrapper;\n}\n\nfunction renderComparisonTableElement(element: UIElement, ctx: UISpecRenderContext): HTMLElement {\n const props = element.props ?? {};\n const keyDifferencesHtml = props['keyDifferencesHtml'] as string | undefined;\n const recommended = props['recommended'] as ComparisonProduct | undefined;\n const products = (props['products'] as ComparisonProduct[] | undefined) ?? [];\n const attributes = (props['attributes'] as ComparisonAttribute[] | undefined) ?? [];\n const highlights = (props['highlights'] as string[] | undefined) ?? [];\n const specialCases = props['specialCases'] as string[] | undefined;\n const recommendedText = props['recommendedText'] as string | undefined;\n const winnerHits = props['winnerHits'] as Record<string, { positive?: string[]; negative?: string[] }> | undefined;\n const productActions = props['productActions'] as\n | Record<string, { title: string; type: string; payload?: unknown }>\n | undefined;\n\n if (!recommended) {\n const fallback = document.createElement('div');\n return fallback;\n }\n\n const options: import('./ComparisonTable.js').ComparisonTableOptions = {\n recommended,\n products,\n attributes,\n highlights,\n specialCases,\n onProductClick: (sku) => {\n ctx.onProductClick?.({ sku, url: '' });\n },\n pricing: ctx.pricing,\n };\n if (recommendedText !== undefined) options.recommendedText = recommendedText;\n if (winnerHits !== undefined) options.winnerHits = winnerHits;\n if (productActions !== undefined) options.productActions = productActions;\n if (keyDifferencesHtml !== undefined) options.keyDifferencesHtml = keyDifferencesHtml;\n if (ctx.i18n) {\n options.i18n = {\n comparisonHeading: ctx.i18n.panelTitleComparisonResults,\n recommendedChoiceLabel: ctx.i18n.recommendedChoiceLabel,\n highlightsLabel: ctx.i18n.highlightsLabel,\n keyDifferencesLabel: ctx.i18n.keyDifferencesLabel,\n specialCasesLabel: ctx.i18n.specialCasesLabel,\n addToCartButton: ctx.i18n.addToCartButton,\n };\n }\n\n const el = renderComparisonTable(options);\n\n // Mobile variant\n if (isMobileViewport()) {\n el.classList.add('gengage-chat-comparison--mobile');\n }\n\n return el;\n}\n\nfunction renderDivider(element: UIElement): HTMLElement {\n const hr = document.createElement('hr');\n hr.className = 'gengage-chat-divider';\n const label = element.props?.['label'] as string | undefined;\n if (label) {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-chat-divider-wrapper';\n const labelEl = document.createElement('span');\n labelEl.className = 'gengage-chat-divider-label';\n labelEl.textContent = label;\n wrapper.appendChild(hr);\n wrapper.appendChild(labelEl);\n return wrapper;\n }\n return hr;\n}\n","/**\n * Block-by-block HTML typewriter effect.\n *\n * Parses sanitised HTML into top-level blocks and reveals them one at a time\n * with a configurable stagger delay. Respects prefers-reduced-motion.\n */\n\nexport interface TypewriterOptions {\n container: HTMLElement;\n html: string;\n /** Delay in ms between block reveals (default: 30). */\n delayMs?: number;\n /** Called after each block is revealed — useful for scroll tracking. */\n onTick?: () => void;\n /** Called when all blocks have been revealed. */\n onComplete?: () => void;\n}\n\nexport interface TypewriterHandle {\n /** Skip animation and show all content immediately. */\n complete(): void;\n /** Cancel animation, leave content as-is. */\n cancel(): void;\n readonly isRunning: boolean;\n}\n\nconst BLOCK_ELEMENTS = new Set([\n 'P',\n 'DIV',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'LI',\n 'UL',\n 'OL',\n 'BLOCKQUOTE',\n 'PRE',\n 'TABLE',\n 'SECTION',\n 'HR',\n 'FIGURE',\n 'FIGCAPTION',\n 'DL',\n 'DT',\n 'DD',\n]);\n\n/**\n * Split parsed DOM children into logical blocks for reveal animation.\n * Block-level elements each become their own block.\n * Adjacent inline/text nodes are grouped together.\n */\nfunction splitIntoBlocks(nodes: NodeList): Node[][] {\n const blocks: Node[][] = [];\n let currentInline: Node[] = [];\n\n for (const node of nodes) {\n if (node.nodeType === Node.ELEMENT_NODE && BLOCK_ELEMENTS.has((node as Element).tagName)) {\n // Flush any pending inline group\n if (currentInline.length > 0) {\n blocks.push(currentInline);\n currentInline = [];\n }\n blocks.push([node]);\n } else {\n currentInline.push(node);\n }\n }\n\n if (currentInline.length > 0) {\n blocks.push(currentInline);\n }\n\n return blocks;\n}\n\nfunction containsTable(nodes: Node[][]): boolean {\n for (const block of nodes) {\n for (const node of block) {\n if (\n node.nodeType === Node.ELEMENT_NODE &&\n ((node as Element).tagName === 'TABLE' || (node as Element).querySelector?.('table'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nexport function typewriteHtml(options: TypewriterOptions): TypewriterHandle {\n const { container, html, delayMs = 30, onTick, onComplete } = options;\n\n // Parse HTML into DOM nodes\n const template = document.createElement('template');\n template.innerHTML = html;\n const blocks = splitIntoBlocks(template.content.childNodes);\n\n // Skip animation for: reduced motion, single block, contains table, empty\n if (prefersReducedMotion() || blocks.length <= 1 || containsTable(blocks)) {\n container.innerHTML = html;\n onComplete?.();\n return { complete() {}, cancel() {}, isRunning: false };\n }\n\n // Clear container and start reveal\n container.innerHTML = '';\n let currentIndex = 0;\n let timerId: ReturnType<typeof setTimeout> | null = null;\n let running = true;\n\n function revealNext(): void {\n if (!running || currentIndex >= blocks.length) {\n running = false;\n onComplete?.();\n return;\n }\n\n const block = blocks[currentIndex]!;\n const wrapper = document.createElement('span');\n wrapper.className = 'gengage-chat-typewriter-block';\n for (const node of block) {\n wrapper.appendChild(node.cloneNode(true));\n }\n container.appendChild(wrapper);\n\n currentIndex++;\n onTick?.();\n\n if (currentIndex < blocks.length) {\n timerId = setTimeout(revealNext, delayMs);\n } else {\n running = false;\n onComplete?.();\n }\n }\n\n // Start the first reveal immediately\n revealNext();\n\n return {\n complete() {\n if (!running) return;\n if (timerId !== null) clearTimeout(timerId);\n running = false;\n container.innerHTML = html;\n onComplete?.();\n },\n cancel() {\n if (timerId !== null) clearTimeout(timerId);\n running = false;\n },\n get isRunning() {\n return running;\n },\n };\n}\n","/**\n * Product mention linker.\n *\n * After sanitiseHtml() renders bot text, this module walks text nodes and\n * wraps product name occurrences with clickable links that dispatch a\n * `launchSingleProduct` action.\n *\n * XSS safety: Uses DOM text-node manipulation only — no innerHTML.\n */\n\nexport interface ProductMention {\n sku: string;\n short_name: string;\n}\n\nexport interface ProductMentionLinkerOptions {\n container: HTMLElement;\n mentions: ProductMention[];\n onProductClick: (sku: string) => void;\n}\n\nfunction isWordChar(char: string | undefined): boolean {\n return char !== undefined && /[\\p{L}\\p{N}_]/u.test(char);\n}\n\n/**\n * Walk text nodes in `container` and wrap occurrences of each mention's\n * `short_name` with a clickable `<a>` element.\n *\n * Only the first occurrence of each mention is linked to avoid visual clutter.\n */\nexport function linkProductMentions(options: ProductMentionLinkerOptions): void {\n const { container, mentions, onProductClick } = options;\n if (mentions.length === 0) return;\n\n // Build a map of lowercase short_name → mention for case-insensitive matching\n const mentionMap = new Map<string, ProductMention>();\n for (const m of mentions) {\n if (m.short_name.length === 0) continue;\n mentionMap.set(m.short_name.toLowerCase(), m);\n }\n\n if (mentionMap.size === 0) return;\n\n // Process one mention at a time, re-walking the tree each time\n // (DOM mutations invalidate the walker)\n for (const [lowerName, mention] of mentionMap) {\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);\n let node = walker.nextNode();\n let found = false;\n\n while (node && !found) {\n const text = node.textContent ?? '';\n const idx = text.toLowerCase().indexOf(lowerName);\n if (idx === -1) {\n node = walker.nextNode();\n continue;\n }\n\n const prevChar = idx > 0 ? text[idx - 1] : undefined;\n const nextChar = text[idx + mention.short_name.length];\n if (isWordChar(prevChar) || isWordChar(nextChar)) {\n node = walker.nextNode();\n continue;\n }\n\n const before = text.slice(0, idx);\n const match = text.slice(idx, idx + mention.short_name.length);\n const after = text.slice(idx + mention.short_name.length);\n\n const parent = node.parentNode;\n if (!parent) {\n node = walker.nextNode();\n continue;\n }\n\n const link = document.createElement('a');\n link.className = 'gengage-product-mention';\n link.textContent = match;\n link.href = '#';\n link.addEventListener('click', (e) => {\n e.preventDefault();\n onProductClick(mention.sku);\n });\n\n if (before) parent.insertBefore(document.createTextNode(before), node);\n parent.insertBefore(link, node);\n if (after) parent.insertBefore(document.createTextNode(after), node);\n parent.removeChild(node);\n\n found = true;\n }\n }\n}\n","/**\n * Classifies suggested actions into input-area chips vs message-flow pills.\n *\n * Input-area chips: compact shortcuts above the input field (search, info, review, similar).\n * Message-flow pills: larger interactive cards in the suggestion row.\n */\n\nconst INPUT_AREA_ICONS = new Set(['search', 'info', 'review', 'similar']);\nconst INPUT_AREA_TYPES = new Set([\n 'quickAnswer',\n 'reviewSummary',\n 'searchDiscovery',\n 'launchDiscovery',\n 'exploreTogetherV2',\n]);\n\nexport function isInputAreaAction(btn: { icon?: string; action?: { type?: string } }): boolean {\n if (btn.icon && INPUT_AREA_ICONS.has(btn.icon)) return true;\n if (btn.action?.type && INPUT_AREA_TYPES.has(btn.action.type)) return true;\n return false;\n}\n","/**\n * Floating card that suggests the user try comparison mode.\n *\n * Shows in the panel bottom-right when a ProductGrid is displayed and\n * comparison mode is not active.\n */\n\nconst SESSION_STORAGE_KEY = 'gengage_choice_prompter_dismissed';\n\nexport interface ChoicePrompterOptions {\n heading: string;\n suggestion: string;\n ctaLabel: string;\n onCtaClick: () => void;\n onDismiss?: () => void;\n}\n\nexport function createChoicePrompter(options: ChoicePrompterOptions): HTMLElement {\n const card = document.createElement('div');\n card.className = 'gengage-chat-choice-prompter';\n\n const headingEl = document.createElement('div');\n headingEl.className = 'gengage-chat-choice-prompter-heading';\n headingEl.textContent = options.heading;\n card.appendChild(headingEl);\n\n const suggestionEl = document.createElement('div');\n suggestionEl.className = 'gengage-chat-choice-prompter-suggestion';\n suggestionEl.textContent = options.suggestion;\n card.appendChild(suggestionEl);\n\n const cta = document.createElement('button');\n cta.type = 'button';\n cta.className = 'gengage-chat-choice-prompter-cta';\n cta.textContent = options.ctaLabel;\n cta.addEventListener('click', () => {\n markDismissed();\n card.remove();\n options.onCtaClick();\n });\n card.appendChild(cta);\n\n const dismiss = document.createElement('button');\n dismiss.type = 'button';\n dismiss.className = 'gengage-chat-choice-prompter-dismiss';\n dismiss.textContent = '\\u00D7'; // × close\n dismiss.setAttribute('aria-label', 'Dismiss');\n dismiss.addEventListener('click', () => {\n markDismissed();\n card.remove();\n options.onDismiss?.();\n });\n card.appendChild(dismiss);\n\n return card;\n}\n\nexport function isChoicePrompterDismissed(): boolean {\n try {\n return sessionStorage.getItem(SESSION_STORAGE_KEY) === '1';\n } catch {\n return false;\n }\n}\n\nfunction markDismissed(): void {\n try {\n sessionStorage.setItem(SESSION_STORAGE_KEY, '1');\n } catch {\n // sessionStorage unavailable — silently ignore\n }\n}\n","/**\n * IndexedDB persistence for chat sessions, backend context, and message payloads.\n *\n * Three stores:\n * - `sessions` — full session state (messages, thread cursors, timestamps)\n * - `context` — per-thread backend context snapshots (compound key)\n * - `payload` — message UISpec payloads (lean message pattern)\n *\n * All operations are best-effort: IndexedDB unavailability is non-fatal.\n */\n\nimport type { SerializableChatMessage } from '../chat/types.js';\nimport type { UISpec } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Data shapes stored in each object store\n// ---------------------------------------------------------------------------\n\nexport interface SessionData {\n userId: string;\n appId: string;\n sessionId: string;\n messages: SerializableChatMessage[];\n currentThreadId: string | null;\n lastThreadId: string | null;\n createdAt: string;\n /** Thread IDs that produced panel content, in creation order. */\n panelThreads?: string[] | undefined;\n /** Product thumbnails for ThumbnailsColumn. */\n thumbnailEntries?: Array<{ sku: string; imageUrl: string; threadId: string }> | undefined;\n /** Serialized panel HTML keyed by bot message ID (for panel snapshot restore). */\n panelSnapshotHtml?: Record<string, string> | undefined;\n /** SKU active when session was saved — prevents cross-SKU restore. */\n sku?: string | undefined;\n}\n\nexport interface ContextData {\n sessionId: string;\n threadId: string;\n context: import('./types.js').BackendContext;\n}\n\nexport interface PayloadData {\n threadId: string;\n messageId: string;\n uiSpec: UISpec;\n}\n\nexport interface FavoriteData {\n userId: string;\n appId: string;\n sku: string;\n name?: string | undefined;\n imageUrl?: string | undefined;\n price?: string | undefined;\n savedAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// GengageIndexedDB\n// ---------------------------------------------------------------------------\n\nconst DB_NAME = 'gengage_assistant';\nconst DB_VERSION = 3;\n\nconst STORE_SESSIONS = 'sessions';\nconst STORE_CONTEXT = 'context';\nconst STORE_PAYLOAD = 'payload';\nconst STORE_FAVORITES = 'favorites';\n\n/**\n * Wrap an IDBRequest in a Promise.\n */\nfunction requestToPromise<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Wrap an IDBTransaction completion in a Promise.\n */\nfunction transactionComplete(tx: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error ?? new DOMException('Transaction aborted'));\n });\n}\n\nexport class GengageIndexedDB {\n private _db: IDBDatabase | null = null;\n private _dbName: string;\n private _version: number;\n\n constructor(dbName: string = DB_NAME, version: number = DB_VERSION) {\n this._dbName = dbName;\n this._version = version;\n }\n\n // -------------------------------------------------------------------------\n // Lifecycle\n // -------------------------------------------------------------------------\n\n async open(): Promise<IDBDatabase> {\n if (this._db) return this._db;\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this._dbName, this._version);\n\n request.onupgradeneeded = (event) => {\n const db = request.result;\n const oldVersion = (event as IDBVersionChangeEvent).oldVersion;\n\n if (oldVersion < 1) {\n // Fresh install — create stores with v3 schema directly\n db.createObjectStore(STORE_SESSIONS, { keyPath: ['userId', 'appId', 'sessionId'] });\n db.createObjectStore(STORE_CONTEXT, { keyPath: ['sessionId', 'threadId'] });\n const payloadStore = db.createObjectStore(STORE_PAYLOAD, {\n keyPath: ['threadId', 'messageId'],\n });\n payloadStore.createIndex('threadId', 'threadId', { unique: false });\n db.createObjectStore(STORE_FAVORITES, { keyPath: ['userId', 'appId', 'sku'] });\n }\n\n if (oldVersion >= 1 && oldVersion < 2) {\n // Upgrade from v1 — drop old stores, recreate with new keys\n if (db.objectStoreNames.contains(STORE_SESSIONS)) db.deleteObjectStore(STORE_SESSIONS);\n if (db.objectStoreNames.contains(STORE_PAYLOAD)) db.deleteObjectStore(STORE_PAYLOAD);\n db.createObjectStore(STORE_SESSIONS, { keyPath: ['userId', 'appId', 'sessionId'] });\n const payloadStore = db.createObjectStore(STORE_PAYLOAD, {\n keyPath: ['threadId', 'messageId'],\n });\n payloadStore.createIndex('threadId', 'threadId', { unique: false });\n // Ensure context store exists (may be absent in early v1 schemas)\n if (!db.objectStoreNames.contains(STORE_CONTEXT)) {\n db.createObjectStore(STORE_CONTEXT, { keyPath: ['sessionId', 'threadId'] });\n }\n }\n\n if (oldVersion < 3) {\n if (!db.objectStoreNames.contains(STORE_FAVORITES)) {\n db.createObjectStore(STORE_FAVORITES, { keyPath: ['userId', 'appId', 'sku'] });\n }\n }\n };\n\n request.onsuccess = () => {\n this._db = request.result;\n resolve(this._db);\n };\n\n request.onerror = () => reject(request.error);\n });\n }\n\n close(): void {\n this._db?.close();\n this._db = null;\n }\n\n // -------------------------------------------------------------------------\n // Sessions\n // -------------------------------------------------------------------------\n\n async saveSession(data: SessionData): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_SESSIONS, 'readwrite');\n tx.objectStore(STORE_SESSIONS).put(data);\n await transactionComplete(tx);\n }\n\n async loadSession(userId: string, appId: string, sessionId: string): Promise<SessionData | null> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_SESSIONS, 'readonly');\n const result = await requestToPromise(tx.objectStore(STORE_SESSIONS).get([userId, appId, sessionId]));\n return (result as SessionData | undefined) ?? null;\n }\n\n // -------------------------------------------------------------------------\n // Context (compound key: [sessionId, threadId])\n // -------------------------------------------------------------------------\n\n async saveContext(data: ContextData): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_CONTEXT, 'readwrite');\n tx.objectStore(STORE_CONTEXT).put(data);\n await transactionComplete(tx);\n }\n\n async loadContext(sessionId: string, threadId: string): Promise<ContextData | null> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_CONTEXT, 'readonly');\n const result = await requestToPromise(tx.objectStore(STORE_CONTEXT).get([sessionId, threadId]));\n return (result as ContextData | undefined) ?? null;\n }\n\n /**\n * Delete all context entries for a session whose threadId is lexicographically\n * greater than the given threadId. Used during rollback to prune future branches.\n *\n * Thread IDs are UUIDv7 (lexicographically sortable by time), so string\n * comparison is sufficient.\n */\n async deleteContextsAfterThread(sessionId: string, threadId: string): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_CONTEXT, 'readwrite');\n const store = tx.objectStore(STORE_CONTEXT);\n\n // Open cursor over all entries and filter by sessionId + threadId comparison\n const request = store.openCursor();\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve();\n return;\n }\n const entry = cursor.value as ContextData;\n if (entry.sessionId === sessionId && entry.threadId > threadId) {\n try {\n cursor.delete();\n } catch {\n // cursor.delete() may fail on read-only or version-change transactions — non-fatal\n }\n }\n cursor.continue();\n };\n request.onerror = () => reject(request.error);\n });\n\n await transactionComplete(tx);\n }\n\n /**\n * Load the most recent context for a session (latest threadId).\n * Uses lexicographic ordering of UUIDv7 threadIds for chronological sort.\n */\n async loadLatestContext(sessionId: string): Promise<ContextData | null> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_CONTEXT, 'readonly');\n const store = tx.objectStore(STORE_CONTEXT);\n\n // UUIDv7 thread IDs are ASCII hex+hyphens, so \\uffff is a safe upper bound\n const range = IDBKeyRange.bound([sessionId, ''], [sessionId, '\\uffff']);\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range, 'prev');\n request.onsuccess = () => {\n const cursor = request.result;\n resolve(cursor ? (cursor.value as ContextData) : null);\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n // -------------------------------------------------------------------------\n // Payload\n // -------------------------------------------------------------------------\n\n async savePayload(data: PayloadData): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_PAYLOAD, 'readwrite');\n tx.objectStore(STORE_PAYLOAD).put(data);\n await transactionComplete(tx);\n }\n\n async loadPayload(threadId: string, messageId: string): Promise<PayloadData | null> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_PAYLOAD, 'readonly');\n const result = await requestToPromise(tx.objectStore(STORE_PAYLOAD).get([threadId, messageId]));\n return (result as PayloadData | undefined) ?? null;\n }\n\n async loadPayloadsByThread(threadId: string): Promise<PayloadData[]> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_PAYLOAD, 'readonly');\n const index = tx.objectStore(STORE_PAYLOAD).index('threadId');\n const results: PayloadData[] = [];\n\n return new Promise((resolve, reject) => {\n const request = index.openCursor(IDBKeyRange.only(threadId));\n request.onsuccess = () => {\n const cursor = request.result;\n if (!cursor) {\n resolve(results);\n return;\n }\n results.push(cursor.value as PayloadData);\n cursor.continue();\n };\n request.onerror = () => reject(request.error);\n });\n }\n\n // -------------------------------------------------------------------------\n // Favorites\n // -------------------------------------------------------------------------\n\n async saveFavorite(data: FavoriteData): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_FAVORITES, 'readwrite');\n tx.objectStore(STORE_FAVORITES).put(data);\n await transactionComplete(tx);\n }\n\n async removeFavorite(userId: string, appId: string, sku: string): Promise<void> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_FAVORITES, 'readwrite');\n tx.objectStore(STORE_FAVORITES).delete([userId, appId, sku]);\n await transactionComplete(tx);\n }\n\n async loadFavorites(userId: string, appId: string): Promise<FavoriteData[]> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_FAVORITES, 'readonly');\n const all = await requestToPromise(tx.objectStore(STORE_FAVORITES).getAll());\n return (all as FavoriteData[]).filter((f) => f.userId === userId && f.appId === appId);\n }\n\n async isFavorite(userId: string, appId: string, sku: string): Promise<boolean> {\n const db = this._requireDb();\n const tx = db.transaction(STORE_FAVORITES, 'readonly');\n const result = await requestToPromise(tx.objectStore(STORE_FAVORITES).get([userId, appId, sku]));\n return result !== undefined;\n }\n\n // -------------------------------------------------------------------------\n // Internal\n // -------------------------------------------------------------------------\n\n private _requireDb(): IDBDatabase {\n if (!this._db) {\n throw new Error('GengageIndexedDB: database not open. Call open() first.');\n }\n return this._db;\n }\n}\n","/**\n * Extended Mode Manager — production lock-count system for panel extension.\n *\n * Controls whether the host page PDP area should be maximized or minimized\n * based on a combination of conditions: lock count, user visibility preference,\n * favorites mode, panel content type, and chat visibility.\n */\n\nexport type PanelContentType =\n | 'comparisonTable'\n | 'groupList'\n | 'productDetails'\n | 'productDetailsSimilars'\n | 'productList';\n\n/**\n * Base content types that always trigger panel extension.\n * `productDetails` is only added when `productDetailsInPanel` is true\n * (i.e. demo websites). Regular accounts show product details inline in ChatPane.\n */\nconst BASE_PANEL_CONTENT_TYPES: readonly PanelContentType[] = [\n 'comparisonTable',\n 'groupList',\n 'productDetailsSimilars',\n 'productList',\n];\n\nexport interface ExtendedModeManagerOptions {\n onChange: (extended: boolean) => void;\n /** Whether `productDetails` should trigger panel extension (default: false, true for demo sites). */\n productDetailsInPanel?: boolean;\n}\n\nexport class ExtendedModeManager {\n private _lockCount = 1; // starts locked\n private _hiddenByUser = false;\n private _lastPanelContentType: PanelContentType | null = null;\n private _chatShown = false;\n private _isFavoritesMode = false;\n private _lastExtended = false;\n private _onChange: (extended: boolean) => void;\n private _panelContentTypes: ReadonlySet<string>;\n\n constructor(options: ExtendedModeManagerOptions) {\n this._onChange = options.onChange;\n\n const types = new Set<string>(BASE_PANEL_CONTENT_TYPES);\n if (options.productDetailsInPanel) {\n types.add('productDetails');\n }\n this._panelContentTypes = types;\n }\n\n get isExtended(): boolean {\n return (\n this._lockCount === 0 &&\n !this._hiddenByUser &&\n !this._isFavoritesMode &&\n this._lastPanelContentType !== null &&\n this._panelContentTypes.has(this._lastPanelContentType) &&\n this._chatShown\n );\n }\n\n unlock(): void {\n if (this._lockCount > 0) {\n this._lockCount--;\n }\n this._checkStateChange();\n }\n\n lock(): void {\n this._lockCount++;\n this._checkStateChange();\n }\n\n setHiddenByUser(hidden: boolean): void {\n this._hiddenByUser = hidden;\n this._checkStateChange();\n }\n\n setChatShown(shown: boolean): void {\n this._chatShown = shown;\n this._checkStateChange();\n }\n\n setFavoritesMode(fav: boolean): void {\n this._isFavoritesMode = fav;\n this._checkStateChange();\n }\n\n setPanelContentType(type: PanelContentType | null): void {\n this._lastPanelContentType = type;\n this._checkStateChange();\n }\n\n private _checkStateChange(): void {\n const current = this.isExtended;\n if (current !== this._lastExtended) {\n this._lastExtended = current;\n this._onChange(current);\n }\n }\n}\n","/**\n * PanelManager — manages the two-pane panel state for the chat widget.\n *\n * Owns panel snapshots, snapshot types, active message highlighting,\n * panel thread navigation, topbar updates, and extended mode coordination.\n *\n * Extracted from chat/index.ts to improve cohesion and reduce file size.\n */\n\nimport type { ChatDrawer } from './components/ChatDrawer.js';\nimport type { CommunicationBridge } from '../common/communication-bridge.js';\nimport type { ExtendedModeManager, PanelContentType } from './extendedModeManager.js';\nimport type { ChatI18n } from './types.js';\nimport type { UISpec, UIElement } from '../common/types.js';\n\n/** Minimal interface the panel manager needs from its host widget. */\nexport interface PanelManagerDeps {\n drawer: () => ChatDrawer | null;\n shadow: () => ShadowRoot | null;\n currentThreadId: () => string | null;\n bridge: () => CommunicationBridge | null;\n extendedModeManager: () => ExtendedModeManager | null;\n i18n: () => ChatI18n;\n rollbackToThread: (threadId: string) => void;\n}\n\nexport class PanelManager {\n /** Panel content snapshots keyed by bot message ID for history navigation. */\n readonly snapshots = new Map<string, HTMLElement>();\n /** Component type for each panel snapshot (for topbar title restoration). */\n readonly snapshotTypes = new Map<string, string>();\n /** Currently active (highlighted) message ID in the chat pane. */\n activePanelMessageId: string | null = null;\n /** Current panel component type. */\n currentType: string | null = null;\n /** Thread IDs that have panel content, in order of creation. */\n threads: string[] = [];\n /** Action type that triggered the current stream (for panel title disambiguation). */\n lastActionType: string | null = null;\n\n constructor(private readonly deps: PanelManagerDeps) {}\n\n /**\n * Deep-clone the current panel content (excluding topbar/thumbnails) and store\n * it keyed by message ID. Called when a stream completes so panel content can\n * be restored later without duplicating the topbar.\n */\n snapshotForMessage(messageId: string): void {\n const drawer = this.deps.drawer();\n if (!drawer?.hasPanelContent()) return;\n // Never snapshot loading skeleton — it must not be persisted or restored\n if (drawer.isPanelLoading()) return;\n const contentEl = drawer.getPanelContentElement();\n if (!contentEl) return;\n const clone = contentEl.cloneNode(true) as HTMLElement;\n this.snapshots.set(messageId, clone);\n // Store the component type so topbar can be restored with the right title\n if (this.currentType) {\n this.snapshotTypes.set(messageId, this.currentType);\n }\n }\n\n /**\n * Attach a click handler to a bot message bubble so clicking it restores\n * the panel content that was active when that message was received.\n */\n attachClickHandler(messageId: string): void {\n const shadow = this.deps.shadow();\n const bubble = shadow?.querySelector(`[data-message-id=\"${CSS.escape(messageId)}\"]`);\n if (!bubble) return;\n (bubble as HTMLElement).style.cursor = 'pointer';\n bubble.addEventListener('click', () => this.restoreForMessage(messageId));\n }\n\n /**\n * Restore the panel content snapshot associated with a given message ID.\n * Highlights the active message and de-highlights the previous one.\n * Also restores the panel topbar title for the snapshot's component type.\n * Returns true if the snapshot was found and restored.\n */\n restoreForMessage(messageId: string): boolean {\n const snapshot = this.snapshots.get(messageId);\n if (!snapshot) return false;\n\n const shadow = this.deps.shadow();\n const drawer = this.deps.drawer();\n\n // De-highlight previous active message\n if (this.activePanelMessageId) {\n const prev = shadow?.querySelector(`[data-message-id=\"${CSS.escape(this.activePanelMessageId)}\"]`);\n prev?.classList.remove('gengage-chat-bubble--active');\n }\n\n // Highlight the clicked message\n const current = shadow?.querySelector(`[data-message-id=\"${CSS.escape(messageId)}\"]`);\n current?.classList.add('gengage-chat-bubble--active');\n this.activePanelMessageId = messageId;\n\n // Restore panel content from snapshot clone\n drawer?.setPanelContent(snapshot.cloneNode(true) as HTMLElement);\n\n // Restore component type and topbar\n const snapshotType = this.snapshotTypes.get(messageId);\n if (snapshotType) {\n this.currentType = snapshotType;\n this.updateTopBar(snapshotType);\n }\n return true;\n }\n\n /**\n * Send maximize-pdp / minify-pdp bridge messages with production-matching delays.\n * Called by the extended mode manager when panel extension state changes.\n */\n notifyExtension(extended: boolean): void {\n const bridge = this.deps.bridge();\n if (extended) {\n setTimeout(() => bridge?.send('maximize-pdp', {}), 350);\n } else {\n setTimeout(() => bridge?.send('minify-pdp', {}), 200);\n }\n }\n\n /**\n * Derive panel title from UISpec root element type using i18n strings.\n * When the backend provides a `panelTitle` prop, it takes precedence.\n */\n titleForComponent(componentType: string, backendTitle?: string): string {\n if (backendTitle) return backendTitle;\n const i18n = this.deps.i18n();\n switch (componentType) {\n case 'ProductDetailsPanel':\n return i18n.panelTitleProductDetails;\n case 'ProductGrid':\n // User-typed queries produce search results; product actions produce similar products\n return isSearchLikeActionType(this.lastActionType)\n ? i18n.panelTitleSearchResults\n : i18n.panelTitleSimilarProducts;\n case 'ComparisonTable':\n return i18n.panelTitleComparisonResults;\n case 'AIGroupingCards':\n return i18n.panelTitleCategories;\n default:\n return '';\n }\n }\n\n /**\n * Update the panel top bar navigation state and title.\n * When the backend provides a `panelTitle`, it takes precedence over i18n defaults.\n */\n updateTopBar(componentType: string, backendTitle?: string): void {\n const currentThreadId = this.deps.currentThreadId();\n if (!currentThreadId) return;\n const idx = this.threads.indexOf(currentThreadId);\n const canBack = idx > 0;\n const canForward = idx >= 0 && idx < this.threads.length - 1;\n const title = this.titleForComponent(componentType, backendTitle);\n this.deps.drawer()?.updatePanelTopBar(canBack, canForward, title);\n }\n\n /**\n * Set panel topbar title during loading (before actual panel content arrives).\n * Maps backend pending types to the same i18n titles used for final content.\n */\n updateTopBarForLoading(pendingType: string): void {\n const i18n = this.deps.i18n();\n const loadingTitleMap: Record<string, string> = {\n productDetails: i18n.panelTitleProductDetails,\n productList: isSearchLikeActionType(this.lastActionType)\n ? i18n.panelTitleSearchResults\n : i18n.panelTitleSimilarProducts,\n comparisonTable: i18n.panelTitleComparisonResults,\n groupList: i18n.panelTitleCategories,\n };\n const title = loadingTitleMap[pendingType] ?? '';\n if (title) {\n const currentThreadId = this.deps.currentThreadId();\n const idx = currentThreadId ? this.threads.indexOf(currentThreadId) : -1;\n const canBack = idx > 0;\n const canForward = idx >= 0 && idx < this.threads.length - 1;\n this.deps.drawer()?.updatePanelTopBar(canBack, canForward, title);\n }\n }\n\n /**\n * Map UISpec component types to PanelContentType for the extended mode manager.\n */\n updateExtendedMode(componentType: string): void {\n const mapping: Record<string, PanelContentType> = {\n ComparisonTable: 'comparisonTable',\n AIGroupingCards: 'groupList',\n ProductDetailsPanel: 'productDetails',\n ProductGrid: 'productList',\n };\n const panelType = mapping[componentType] ?? null;\n this.deps.extendedModeManager()?.setPanelContentType(panelType);\n }\n\n /** Navigate to the previous panel thread. */\n navigateBack(): void {\n const currentThreadId = this.deps.currentThreadId();\n if (!currentThreadId) return;\n const idx = this.threads.indexOf(currentThreadId);\n if (idx > 0) {\n const target = this.threads[idx - 1];\n if (target) this.deps.rollbackToThread(target);\n }\n }\n\n /** Navigate to the next panel thread. */\n navigateForward(): void {\n const currentThreadId = this.deps.currentThreadId();\n if (!currentThreadId) return;\n const idx = this.threads.indexOf(currentThreadId);\n if (idx >= 0 && idx < this.threads.length - 1) {\n const target = this.threads[idx + 1];\n if (target) this.deps.rollbackToThread(target);\n }\n }\n\n /**\n * Panel route shaping:\n * - product details => expanded LHS panel (`ProductDetailsPanel`)\n * - all other panel-routed specs keep their original component types\n */\n toPanelSpec(spec: UISpec): UISpec {\n const root = spec.elements[spec.root];\n if (!root || root.type !== 'ProductCard') return spec;\n\n const panelRoot: UIElement = {\n ...root,\n type: 'ProductDetailsPanel',\n };\n\n return {\n root: spec.root,\n elements: {\n ...spec.elements,\n [spec.root]: panelRoot,\n },\n };\n }\n\n destroy(): void {\n this.snapshots.clear();\n this.snapshotTypes.clear();\n this.activePanelMessageId = null;\n this.currentType = null;\n this.threads = [];\n }\n}\n\nfunction isSearchLikeActionType(actionType: string | null): boolean {\n return actionType === 'user_message' || actionType === 'inputText';\n}\n","/**\n * SessionPersistence — IndexedDB persistence helpers for the chat widget.\n *\n * Encapsulates session save/load, payload caching, favorite toggling,\n * and URL navigation with pre-save.\n *\n * Extracted from chat/index.ts to improve cohesion and reduce file size.\n */\n\nimport type { GengageIndexedDB } from '../common/indexed-db.js';\nimport type { CommunicationBridge } from '../common/communication-bridge.js';\nimport type { BackendContext, UISpec } from '../common/types.js';\nimport type { ChatMessage, SerializableChatMessage } from './types.js';\nimport type { ThumbnailEntry } from './components/ThumbnailsColumn.js';\n\nexport interface PersistSessionParams {\n userId: string;\n appId: string;\n sessionId: string;\n messages: ChatMessage[];\n currentThreadId: string | null;\n lastThreadId: string | null;\n chatCreatedAt: string;\n panelSnapshots: Map<string, HTMLElement>;\n panelThreads: string[];\n thumbnailEntries: ThumbnailEntry[];\n lastBackendContext: BackendContext | null;\n sku?: string | undefined;\n}\n\nexport class SessionPersistence {\n private _db: GengageIndexedDB | null;\n /** Favorited product SKUs (loaded from IDB). */\n readonly favoritedSkus: Set<string> = new Set();\n\n constructor(db: GengageIndexedDB | null) {\n this._db = db;\n }\n\n get db(): GengageIndexedDB | null {\n return this._db;\n }\n\n set db(value: GengageIndexedDB | null) {\n this._db = value;\n }\n\n /**\n * Persist current session state to IndexedDB.\n * Called after each stream completion (onDone). Non-fatal on failure.\n */\n async persist(params: PersistSessionParams): Promise<void> {\n if (!this._db) return;\n\n const serializableMessages: SerializableChatMessage[] = params.messages.map((m) => {\n const sm: SerializableChatMessage = {\n id: m.id,\n role: m.role,\n timestamp: m.timestamp,\n status: m.status === 'streaming' ? 'done' : m.status,\n };\n if (m.threadId !== undefined) sm.threadId = m.threadId;\n if (m.content !== undefined) sm.content = m.content;\n if (m.silent) sm.silent = true;\n return sm;\n });\n\n // Serialize panel snapshots to HTML strings (never persist loading skeletons)\n const panelSnapshotHtml: Record<string, string> = {};\n for (const [msgId, el] of params.panelSnapshots) {\n if (el.querySelector('.gengage-chat-panel-skeleton')) continue;\n panelSnapshotHtml[msgId] = el.innerHTML;\n }\n\n await this._db.saveSession({\n userId: params.userId,\n appId: params.appId,\n sessionId: params.sessionId,\n messages: serializableMessages,\n currentThreadId: params.currentThreadId,\n lastThreadId: params.lastThreadId,\n createdAt: params.chatCreatedAt,\n panelThreads: params.panelThreads.length > 0 ? params.panelThreads : undefined,\n thumbnailEntries: params.thumbnailEntries.length > 0 ? params.thumbnailEntries : undefined,\n panelSnapshotHtml: Object.keys(panelSnapshotHtml).length > 0 ? panelSnapshotHtml : undefined,\n sku: params.sku,\n });\n\n // Save latest context snapshot for current thread\n if (params.lastBackendContext && params.currentThreadId) {\n await this._db.saveContext({\n sessionId: params.sessionId,\n threadId: params.currentThreadId,\n context: params.lastBackendContext,\n });\n }\n\n // Save UISpec payloads separately\n // Note: we intentionally do NOT delete m.uiSpec from the caller's live objects.\n // The caller's message array must remain intact for re-rendering and snapshot logic.\n for (const m of params.messages) {\n if (m.uiSpec && m.threadId) {\n await this._db.savePayload({\n threadId: m.threadId,\n messageId: m.id,\n uiSpec: m.uiSpec,\n });\n }\n }\n }\n\n /**\n * Persist session to IndexedDB, then navigate to the URL.\n * Sends an 'openURLInNewTab' bridge message so the host page can intercept\n * (e.g. for SPA routing), then navigates directly as fallback.\n *\n * Legacy compatibility: the prior engine navigated via window.location.href\n * after posting saveSessionAndOpenURL to the iframe. The clean-room runs in\n * the same window (Shadow DOM, not iframe), so it navigates directly.\n */\n async saveAndOpenURL(url: string, persistFn: () => Promise<void>, bridge: CommunicationBridge | null): Promise<void> {\n try {\n await persistFn();\n } catch {\n // Non-fatal — still navigate\n }\n // Notify host so SPAs can intercept (e.g. router.push instead of full reload).\n // NOTE: The bridge message is fire-and-forget. The subsequent location.href\n // assignment may trigger a page unload before the host processes the message.\n // This matches legacy behavior. SPAs that need to intercept\n // should handle the bridge event synchronously or call event.preventDefault()\n // on the gengage:navigate CustomEvent to suppress the fallback navigation.\n bridge?.send('openURLInNewTab', { url });\n window.location.href = url;\n }\n\n /**\n * Load a UISpec payload from IndexedDB with retry logic.\n * Returns null if not found or all retries fail.\n */\n async loadPayload(threadId: string, messageId: string): Promise<UISpec | null> {\n if (!this._db) return null;\n\n for (let attempt = 0; attempt < 3; attempt++) {\n try {\n const payload = await this._db.loadPayload(threadId, messageId);\n if (payload) return payload.uiSpec;\n } catch {\n // Retry after delay\n }\n if (attempt < 2) {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n return null;\n }\n\n /**\n * Load favorited SKUs from IDB into the in-memory set.\n */\n async loadFavorites(userId: string, appId: string): Promise<void> {\n if (!this._db) return;\n try {\n const favs = await this._db.loadFavorites(userId, appId);\n for (const f of favs) this.favoritedSkus.add(f.sku);\n } catch {\n // Non-fatal — continue without favorites\n }\n }\n\n /**\n * Toggle a product's favorited state in IDB and in-memory set.\n */\n async toggleFavorite(userId: string, appId: string, sku: string, product: Record<string, unknown>): Promise<void> {\n if (!this._db) return;\n if (this.favoritedSkus.has(sku)) {\n this.favoritedSkus.delete(sku);\n await this._db.removeFavorite(userId, appId, sku);\n } else {\n this.favoritedSkus.add(sku);\n await this._db.saveFavorite({\n userId,\n appId,\n sku,\n name: product['name'] as string | undefined,\n imageUrl: product['imageUrl'] as string | undefined,\n price: product['price'] as string | undefined,\n savedAt: new Date().toISOString(),\n });\n }\n }\n\n close(): void {\n this._db?.close();\n this._db = null;\n }\n}\n","/**\n * KVKK notice filtering and caching helpers.\n *\n * KVKK (Kişisel Verilerin Korunması Kanunu) is Turkey's data protection law.\n * When the backend streams a response containing a KVKK notice, we:\n * 1. Strip the KVKK block from the visible bot text\n * 2. Show a banner on first encounter (per account)\n * 3. Mark it as shown in localStorage to avoid repeat banners\n */\n\nconst KVKK_STORAGE_KEY = 'gengage_kvkk_shown';\nconst KVKK_TEXT_MARKERS = ['kvkk', 'kişisel veri', 'kisisel veri'];\nconst KVKK_LAW_NUMBER_RE = /\\b6698\\b/;\n\nexport function containsKvkk(html: string): boolean {\n const lower = html.toLowerCase();\n return KVKK_TEXT_MARKERS.some((m) => lower.includes(m)) || KVKK_LAW_NUMBER_RE.test(lower);\n}\n\nexport function isKvkkShown(accountId: string): boolean {\n try {\n return localStorage.getItem(`${KVKK_STORAGE_KEY}_${accountId}`) === '1';\n } catch {\n return false;\n }\n}\n\nexport function markKvkkShown(accountId: string): void {\n try {\n localStorage.setItem(`${KVKK_STORAGE_KEY}_${accountId}`, '1');\n } catch {\n // localStorage unavailable — silently ignore\n }\n}\n\n/**\n * Strip the KVKK portion from bot HTML.\n * KVKK is typically wrapped in a `<div style=\"...\">` at the start.\n * We remove the first block-level element that contains a KVKK marker.\n */\nexport function stripKvkkBlock(html: string): string {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n const body = doc.body;\n const children = Array.from(body.children);\n for (const child of children) {\n if (containsKvkk(child.textContent ?? '')) {\n child.remove();\n break; // Only strip the first KVKK block\n }\n }\n return body.innerHTML.trim();\n}\n\nexport function extractKvkkBlock(html: string): string | null {\n const doc = new DOMParser().parseFromString(html, 'text/html');\n for (const child of Array.from(doc.body.children)) {\n if (containsKvkk(child.textContent ?? '')) {\n return child.outerHTML;\n }\n }\n return null;\n}\n\nconst LOCALE_TO_LANGUAGE: Record<string, string> = {\n tr: 'TURKISH',\n en: 'ENGLISH',\n de: 'GERMAN',\n fr: 'FRENCH',\n};\n\nexport function localeToOutputLanguage(locale?: string): string {\n if (!locale) return 'TURKISH';\n return LOCALE_TO_LANGUAGE[locale.toLowerCase().slice(0, 2)] ?? 'TURKISH';\n}\n","/**\n * Google Analytics dataLayer integration.\n *\n * Pushes chat activity events to `window.dataLayer` when GA is available.\n * Falls back to `console.debug` when GA is not detected (useful for debugging).\n *\n * Event naming follows the GA4 recommended event pattern:\n * - All lowercase, hyphen-separated\n * - Prefixed with `gengage-` for easy filtering in GA dashboards\n *\n * Clients can build custom chat funnels in GA using these events.\n */\n\n// ---------------------------------------------------------------------------\n// GA dataLayer type augmentation\n// ---------------------------------------------------------------------------\n\ninterface DataLayerEvent {\n event: string;\n [key: string]: unknown;\n}\n\ndeclare global {\n interface Window {\n dataLayer?: DataLayerEvent[];\n }\n}\n\n// ---------------------------------------------------------------------------\n// GA detection\n// ---------------------------------------------------------------------------\n\nfunction isGAAvailable(): boolean {\n return typeof window !== 'undefined' && Array.isArray(window.dataLayer);\n}\n\n// ---------------------------------------------------------------------------\n// Core push function\n// ---------------------------------------------------------------------------\n\nfunction pushEvent(eventName: string, params?: Record<string, unknown>): void {\n const payload: DataLayerEvent = {\n event: eventName,\n ...params,\n };\n\n if (isGAAvailable()) {\n window.dataLayer!.push(payload);\n }\n // No fallback log — GA events are silently dropped when dataLayer is absent.\n}\n\n// ---------------------------------------------------------------------------\n// Typed event emitters\n// ---------------------------------------------------------------------------\n\n/** Widget icon/avatar displayed on page. */\nexport function trackInit(widget: string): void {\n pushEvent('gengage-on-init', { gengage_widget: widget });\n}\n\n/** Widget opened / shown to user. */\nexport function trackShow(widget: string): void {\n pushEvent('gengage-show', { gengage_widget: widget });\n}\n\n/** Widget closed / hidden. */\nexport function trackHide(widget: string): void {\n pushEvent('gengage-hide', { gengage_widget: widget });\n}\n\n/** User clicked a suggested question / action button. */\nexport function trackSuggestedQuestion(title: string, type: string): void {\n pushEvent('gengage-suggested-question', {\n gengage_question_title: title,\n gengage_action_type: type,\n });\n}\n\n/** User clicked \"Find Similar\" for a product. */\nexport function trackFindSimilars(sku: string): void {\n pushEvent('gengage-find-similars', { gengage_sku: sku });\n}\n\n/** User pre-selected a product for comparison. */\nexport function trackComparePreselection(sku: string): void {\n pushEvent('gengage-compare-preselection', { gengage_sku: sku });\n}\n\n/** User submitted the comparison (clicked \"Compare Selected\"). */\nexport function trackCompareSelected(skus: string[]): void {\n pushEvent('gengage-compare-selected', {\n gengage_skus: skus,\n gengage_product_count: skus.length,\n });\n}\n\n/** User cleared the comparison selection. */\nexport function trackCompareClear(): void {\n pushEvent('gengage-compare-clear');\n}\n\n/** Comparison results received and rendered. */\nexport function trackCompareReceived(productCount: number): void {\n pushEvent('gengage-compare-received', {\n gengage_product_count: productCount,\n });\n}\n\n/** User liked / favorited a product. */\nexport function trackLikeProduct(sku: string): void {\n pushEvent('gengage-like-product', { gengage_sku: sku });\n}\n\n/** User clicked the favorites/likes list button. */\nexport function trackLikeList(): void {\n pushEvent('gengage-like-list');\n}\n\n/** Product list / search results displayed. */\nexport function trackSearch(query?: string, resultCount?: number): void {\n pushEvent('gengage-search', {\n gengage_search_query: query,\n gengage_result_count: resultCount,\n });\n}\n\n/** User clicked on a product to view details. */\nexport function trackProductDetail(sku: string, name?: string): void {\n pushEvent('gengage-product-detail', {\n gengage_sku: sku,\n gengage_product_name: name,\n });\n}\n\n/** User added a product to cart from the widget. */\nexport function trackCartAdd(sku: string, quantity: number): void {\n pushEvent('gengage-cart-add', {\n gengage_sku: sku,\n gengage_quantity: quantity,\n });\n}\n\n/** User sent a chat message. */\nexport function trackMessageSent(): void {\n pushEvent('gengage-message-sent');\n}\n\n/** Assistant responded with text. */\nexport function trackMessageReceived(): void {\n pushEvent('gengage-message-received');\n}\n\n/** User started a new conversation. */\nexport function trackConversationStart(): void {\n pushEvent('gengage-conversation-start');\n}\n\n/** User used voice input. */\nexport function trackVoiceInput(): void {\n pushEvent('gengage-voice-input');\n}\n\n/** Widget or stream error occurred. */\nexport function trackError(widget: string, error: string): void {\n pushEvent('gengage-error', { gengage_widget: widget, gengage_error: error });\n}\n\n// ---------------------------------------------------------------------------\n// Batch wire-up: connect to the Gengage event bus\n// ---------------------------------------------------------------------------\n\n/**\n * Wire GA dataLayer tracking to the Gengage event bus.\n * Call once after widgets are initialized.\n *\n * @returns unsubscribe function that removes all listeners.\n */\nlet _gaWiredUnsub: (() => void) | null = null;\n\nexport function wireGADataLayer(): () => void {\n if (typeof window === 'undefined') return () => {};\n // Idempotency guard: return existing unsubscribe if already wired\n if (_gaWiredUnsub) return _gaWiredUnsub;\n\n const listeners: Array<() => void> = [];\n\n function on<T>(eventName: string, handler: (detail: T) => void): void {\n const listener = (e: Event) => handler((e as CustomEvent<T>).detail);\n window.addEventListener(eventName, listener);\n listeners.push(() => window.removeEventListener(eventName, listener));\n }\n\n // Chat lifecycle\n on<{ state?: string }>('gengage:chat:open', () => trackShow('chat'));\n on<Record<string, never>>('gengage:chat:close', () => trackHide('chat'));\n on<Record<string, never>>('gengage:chat:ready', () => trackInit('chat'));\n\n // Add to cart (from any widget)\n on<{ sku: string; quantity: number }>('gengage:chat:add-to-cart', ({ sku, quantity }) => {\n trackCartAdd(sku, quantity);\n });\n on<{ sku: string; quantity: number; cartCode: string }>('gengage:similar:add-to-cart', ({ sku, quantity }) => {\n trackCartAdd(sku, quantity);\n });\n\n // Product click from similar products\n on<{ sku: string; url: string }>('gengage:similar:product-click', ({ sku }) => {\n trackProductDetail(sku);\n });\n\n // QNA action (suggested question click)\n on<{ title: string; type: string }>('gengage:qna:action', ({ title, type }) => {\n trackSuggestedQuestion(title, type);\n });\n\n // Voice input\n on<{ payload: unknown }>('gengage:chat:voice', () => trackVoiceInput());\n\n // QNA open chat\n on<Record<string, never>>('gengage:qna:open-chat', () => trackShow('chat'));\n\n // Error tracking\n on<{ source: string; message: string }>('gengage:global:error', ({ source, message }) => {\n trackError(source, message);\n });\n\n _gaWiredUnsub = () => {\n for (const unsub of listeners) unsub();\n listeners.length = 0;\n _gaWiredUnsub = null;\n };\n return _gaWiredUnsub;\n}\n","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n if (!inst._zod) {\n Object.defineProperty(inst, \"_zod\", {\n value: {\n def,\n constr: _,\n traits: new Set(),\n },\n enumerable: false,\n });\n }\n if (inst._zod.traits.has(name)) {\n return;\n }\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n const proto = _.prototype;\n const keys = Object.keys(proto);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (!(k in inst)) {\n inst[k] = proto[k].bind(inst);\n }\n }\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport class $ZodEncodeError extends Error {\n constructor(name) {\n super(`Encountered unidirectional transform during encode: ${name}`);\n this.name = \"ZodEncodeError\";\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepString = step.toString();\n let stepDecCount = (stepString.split(\".\")[1] || \"\").length;\n if (stepDecCount === 0 && /\\d?e-\\d?/.test(stepString)) {\n const match = stepString.match(/\\d?e-(\\d?)/);\n if (match?.[1]) {\n stepDecCount = Number.parseInt(match[1]);\n }\n }\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nconst EVALUATING = Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n let value = undefined;\n Object.defineProperty(object, key, {\n get() {\n if (value === EVALUATING) {\n // Circular reference detected, return undefined to break the cycle\n return undefined;\n }\n if (value === undefined) {\n value = EVALUATING;\n value = getter();\n }\n return value;\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function objectClone(obj) {\n return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function mergeDefs(...defs) {\n const mergedDescriptors = {};\n for (const def of defs) {\n const descriptors = Object.getOwnPropertyDescriptors(def);\n Object.assign(mergedDescriptors, descriptors);\n }\n return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport function slugify(input) {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n // @ts-ignore\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n if (typeof ctor !== \"function\")\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function shallowClone(o) {\n if (isPlainObject(o))\n return { ...o };\n if (Array.isArray(o))\n return [...o];\n return o;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n // @ts-ignore\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = {};\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n newShape[key] = currDef.shape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function omit(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = { ...schema._zod.def.shape };\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const checks = schema._zod.def.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n // Only throw if new shape overlaps with existing shape\n // Use getOwnPropertyDescriptor to check key existence without accessing values\n const existingShape = schema._zod.def.shape;\n for (const key in shape) {\n if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n }\n }\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function merge(a, b) {\n const def = mergeDefs(a._zod.def, {\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n get catchall() {\n return b._zod.def.catchall;\n },\n checks: [], // delete existing checks\n });\n return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n });\n return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true) {\n return true;\n }\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n // @ts-ignore\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function parsedType(data) {\n const t = typeof data;\n switch (t) {\n case \"number\": {\n return Number.isNaN(data) ? \"nan\" : \"number\";\n }\n case \"object\": {\n if (data === null) {\n return \"null\";\n }\n if (Array.isArray(data)) {\n return \"array\";\n }\n const obj = data;\n if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n return obj.constructor.name;\n }\n }\n }\n return t;\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n let binaryString = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binaryString += String.fromCharCode(bytes[i]);\n }\n return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n const cleanHex = hex.replace(/^0x/, \"\");\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n const segs = [];\n const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n","import * as util from \"./util.js\";\nexport const cuid = /^[cC][^\\s-]{8,}$/;\nexport const cuid2 = /^[0-9a-z]+$/;\nexport const ulid = /^[0-9A-HJKMNP-TV-Za-hjkmnp-tv-z]{26}$/;\nexport const xid = /^[0-9a-vA-V]{20}$/;\nexport const ksuid = /^[A-Za-z0-9]{27}$/;\nexport const nanoid = /^[a-zA-Z0-9_-]{21}$/;\n/** ISO 8601-1 duration regex. Does not support the 8601-2 extensions like negative durations or fractional/negative components. */\nexport const duration = /^P(?:(\\d+W)|(?!.*W)(?=\\d|T\\d)(\\d+Y)?(\\d+M)?(\\d+D)?(T(?=\\d)(\\d+H)?(\\d+M)?(\\d+([.,]\\d+)?S)?)?)$/;\n/** Implements ISO 8601-2 extensions like explicit +- prefixes, mixing weeks with other units, and fractional/negative components. */\nexport const extendedDuration = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n/** A regex for any UUID-like identifier: 8-4-4-4-12 hex pattern */\nexport const guid = /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n/** Returns a regex for validating an RFC 9562/4122 UUID.\n *\n * @param version Optionally specify a version 1-8. If no version is specified, all versions are supported. */\nexport const uuid = (version) => {\n if (!version)\n return /^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/;\n return new RegExp(`^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-${version}[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$`);\n};\nexport const uuid4 = /*@__PURE__*/ uuid(4);\nexport const uuid6 = /*@__PURE__*/ uuid(6);\nexport const uuid7 = /*@__PURE__*/ uuid(7);\n/** Practical email validation */\nexport const email = /^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/;\n/** Equivalent to the HTML5 input[type=email] validation implemented by browsers. Source: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email */\nexport const html5Email = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n/** The classic emailregex.com regex for RFC 5322-compliant emails */\nexport const rfc5322Email = /^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/** A loose regex that allows Unicode characters, enforces length limits, and that's about it. */\nexport const unicodeEmail = /^[^\\s@\"]{1,64}@[^\\s@]{1,255}$/u;\nexport const idnEmail = unicodeEmail;\nexport const browserEmail = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emoji = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nexport function emoji() {\n return new RegExp(_emoji, \"u\");\n}\nexport const ipv4 = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nexport const ipv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:))$/;\nexport const mac = (delimiter) => {\n const escapedDelim = util.escapeRegex(delimiter ?? \":\");\n return new RegExp(`^(?:[0-9A-F]{2}${escapedDelim}){5}[0-9A-F]{2}$|^(?:[0-9a-f]{2}${escapedDelim}){5}[0-9a-f]{2}$`);\n};\nexport const cidrv4 = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/([0-9]|[1-2][0-9]|3[0-2])$/;\nexport const cidrv6 = /^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|::|([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:?){0,6})\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nexport const base64 = /^$|^(?:[0-9a-zA-Z+/]{4})*(?:(?:[0-9a-zA-Z+/]{2}==)|(?:[0-9a-zA-Z+/]{3}=))?$/;\nexport const base64url = /^[A-Za-z0-9_-]*$/;\n// based on https://stackoverflow.com/questions/106179/regular-expression-to-match-dns-hostname-or-ip-address\n// export const hostname: RegExp = /^([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+$/;\nexport const hostname = /^(?=.{1,253}\\.?$)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[-0-9a-zA-Z]{0,61}[0-9a-zA-Z])?)*\\.?$/;\nexport const domain = /^([a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\n// https://blog.stevenlevithan.com/archives/validate-phone-number#r4-3 (regex sans spaces)\n// E.164: leading digit must be 1-9; total digits (excluding '+') between 7-15\nexport const e164 = /^\\+[1-9]\\d{6,14}$/;\n// const dateSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateSource = `(?:(?:\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\\\d|30)|(?:02)-(?:0[1-9]|1\\\\d|2[0-8])))`;\nexport const date = /*@__PURE__*/ new RegExp(`^${dateSource}$`);\nfunction timeSource(args) {\n const hhmm = `(?:[01]\\\\d|2[0-3]):[0-5]\\\\d`;\n const regex = typeof args.precision === \"number\"\n ? args.precision === -1\n ? `${hhmm}`\n : args.precision === 0\n ? `${hhmm}:[0-5]\\\\d`\n : `${hhmm}:[0-5]\\\\d\\\\.\\\\d{${args.precision}}`\n : `${hhmm}(?::[0-5]\\\\d(?:\\\\.\\\\d+)?)?`;\n return regex;\n}\nexport function time(args) {\n return new RegExp(`^${timeSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetime(args) {\n const time = timeSource({ precision: args.precision });\n const opts = [\"Z\"];\n if (args.local)\n opts.push(\"\");\n // if (args.offset) opts.push(`([+-]\\\\d{2}:\\\\d{2})`);\n if (args.offset)\n opts.push(`([+-](?:[01]\\\\d|2[0-3]):[0-5]\\\\d)`);\n const timeRegex = `${time}(?:${opts.join(\"|\")})`;\n return new RegExp(`^${dateSource}T(?:${timeRegex})$`);\n}\nexport const string = (params) => {\n const regex = params ? `[\\\\s\\\\S]{${params?.minimum ?? 0},${params?.maximum ?? \"\"}}` : `[\\\\s\\\\S]*`;\n return new RegExp(`^${regex}$`);\n};\nexport const bigint = /^-?\\d+n?$/;\nexport const integer = /^-?\\d+$/;\nexport const number = /^-?\\d+(?:\\.\\d+)?$/;\nexport const boolean = /^(?:true|false)$/i;\nconst _null = /^null$/i;\nexport { _null as null };\nconst _undefined = /^undefined$/i;\nexport { _undefined as undefined };\n// regex for string with no uppercase letters\nexport const lowercase = /^[^A-Z]*$/;\n// regex for string with no lowercase letters\nexport const uppercase = /^[^a-z]*$/;\n// regex for hexadecimal strings (any length)\nexport const hex = /^[0-9a-fA-F]*$/;\n// Hash regexes for different algorithms and encodings\n// Helper function to create base64 regex with exact length and padding\nfunction fixedBase64(bodyLength, padding) {\n return new RegExp(`^[A-Za-z0-9+/]{${bodyLength}}${padding}$`);\n}\n// Helper function to create base64url regex with exact length (no padding)\nfunction fixedBase64url(length) {\n return new RegExp(`^[A-Za-z0-9_-]{${length}}$`);\n}\n// MD5 (16 bytes): base64 = 24 chars total (22 + \"==\")\nexport const md5_hex = /^[0-9a-fA-F]{32}$/;\nexport const md5_base64 = /*@__PURE__*/ fixedBase64(22, \"==\");\nexport const md5_base64url = /*@__PURE__*/ fixedBase64url(22);\n// SHA1 (20 bytes): base64 = 28 chars total (27 + \"=\")\nexport const sha1_hex = /^[0-9a-fA-F]{40}$/;\nexport const sha1_base64 = /*@__PURE__*/ fixedBase64(27, \"=\");\nexport const sha1_base64url = /*@__PURE__*/ fixedBase64url(27);\n// SHA256 (32 bytes): base64 = 44 chars total (43 + \"=\")\nexport const sha256_hex = /^[0-9a-fA-F]{64}$/;\nexport const sha256_base64 = /*@__PURE__*/ fixedBase64(43, \"=\");\nexport const sha256_base64url = /*@__PURE__*/ fixedBase64url(43);\n// SHA384 (48 bytes): base64 = 64 chars total (no padding)\nexport const sha384_hex = /^[0-9a-fA-F]{96}$/;\nexport const sha384_base64 = /*@__PURE__*/ fixedBase64(64, \"\");\nexport const sha384_base64url = /*@__PURE__*/ fixedBase64url(64);\n// SHA512 (64 bytes): base64 = 88 chars total (86 + \"==\")\nexport const sha512_hex = /^[0-9a-fA-F]{128}$/;\nexport const sha512_base64 = /*@__PURE__*/ fixedBase64(86, \"==\");\nexport const sha512_base64url = /*@__PURE__*/ fixedBase64url(86);\n","// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n var _a;\n inst._zod ?? (inst._zod = {});\n inst._zod.def = def;\n (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n number: \"number\",\n bigint: \"bigint\",\n object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n if (def.value < curr) {\n if (def.inclusive)\n bag.maximum = def.value;\n else\n bag.exclusiveMaximum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n if (def.value > curr) {\n if (def.inclusive)\n bag.minimum = def.value;\n else\n bag.exclusiveMinimum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n var _a;\n (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n });\n inst._zod.check = (payload) => {\n if (typeof payload.value !== typeof def.value)\n throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n const isMultiple = typeof payload.value === \"bigint\"\n ? payload.value % def.value === BigInt(0)\n : util.floatSafeRemainder(payload.value, def.value) === 0;\n if (isMultiple)\n return;\n payload.issues.push({\n origin: typeof payload.value,\n code: \"not_multiple_of\",\n divisor: def.value,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n def.format = def.format || \"float64\";\n const isInt = def.format?.includes(\"int\");\n const origin = isInt ? \"int\" : \"number\";\n const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n if (isInt)\n bag.pattern = regexes.integer;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (isInt) {\n if (!Number.isInteger(input)) {\n // invalid_format issue\n // payload.issues.push({\n // expected: def.format,\n // format: def.format,\n // code: \"invalid_format\",\n // input,\n // inst,\n // });\n // invalid_type issue\n payload.issues.push({\n expected: origin,\n format: def.format,\n code: \"invalid_type\",\n continue: false,\n input,\n inst,\n });\n return;\n // not_multiple_of issue\n // payload.issues.push({\n // code: \"not_multiple_of\",\n // origin: \"number\",\n // input,\n // inst,\n // divisor: 1,\n // });\n }\n if (!Number.isSafeInteger(input)) {\n if (input > 0) {\n // too_big\n payload.issues.push({\n input,\n code: \"too_big\",\n maximum: Number.MAX_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n else {\n // too_small\n payload.issues.push({\n input,\n code: \"too_small\",\n minimum: Number.MIN_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n return;\n }\n }\n if (input < minimum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_small\",\n minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (input < minimum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_small\",\n minimum: minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size <= def.maximum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size >= def.minimum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.size;\n bag.maximum = def.size;\n bag.size = def.size;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size === def.size)\n return;\n const tooBig = size > def.size;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length <= def.maximum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length >= def.minimum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.length;\n bag.maximum = def.length;\n bag.length = def.length;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length === def.length)\n return;\n const origin = util.getLengthableOrigin(input);\n const tooBig = length > def.length;\n payload.issues.push({\n origin,\n ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n var _a, _b;\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n if (def.pattern) {\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(def.pattern);\n }\n });\n if (def.pattern)\n (_a = inst._zod).check ?? (_a.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n inst,\n continue: !def.abort,\n });\n });\n else\n (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n $ZodCheckStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"regex\",\n input: payload.value,\n pattern: def.pattern.toString(),\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.lowercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.uppercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const escapedRegex = util.escapeRegex(def.includes);\n const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n def.pattern = pattern;\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.includes(def.includes, def.position))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"includes\",\n includes: def.includes,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.startsWith(def.prefix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"starts_with\",\n prefix: def.prefix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.endsWith(def.suffix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"ends_with\",\n suffix: def.suffix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n///////////////////////////////////\n///// $ZodCheckProperty /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(property, result.issues));\n }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n const result = def.schema._zod.run({\n value: payload.value[def.property],\n issues: [],\n }, {});\n if (result instanceof Promise) {\n return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n }\n handleCheckPropertyResult(result, payload, def.property);\n return;\n };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const mimeSet = new Set(def.mime);\n inst._zod.onattach.push((inst) => {\n inst._zod.bag.mime = def.mime;\n });\n inst._zod.check = (payload) => {\n if (mimeSet.has(payload.value.type))\n return;\n payload.issues.push({\n code: \"invalid_value\",\n values: def.mime,\n input: payload.value.type,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n payload.value = def.tx(payload.value);\n };\n});\n","export class Doc {\n constructor(args = []) {\n this.content = [];\n this.indent = 0;\n if (this)\n this.args = args;\n }\n indented(fn) {\n this.indent += 1;\n fn(this);\n this.indent -= 1;\n }\n write(arg) {\n if (typeof arg === \"function\") {\n arg(this, { execution: \"sync\" });\n arg(this, { execution: \"async\" });\n return;\n }\n const content = arg;\n const lines = content.split(\"\\n\").filter((x) => x);\n const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n for (const line of dedented) {\n this.content.push(line);\n }\n }\n compile() {\n const F = Function;\n const args = this?.args;\n const content = this?.content ?? [``];\n const lines = [...content.map((x) => ` ${x}`)];\n // console.log(lines.join(\"\\n\"));\n return new F(...args, lines.join(\"\\n\"));\n }\n}\n","export const version = {\n major: 4,\n minor: 3,\n patch: 6,\n};\n","import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n var _a;\n inst ?? (inst = {});\n inst._zod.def = def; // set _def property\n inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n inst._zod.version = version;\n const checks = [...(inst._zod.def.checks ?? [])];\n // if inst is itself a checks.$ZodCheck, run it as a check\n if (inst._zod.traits.has(\"$ZodCheck\")) {\n checks.unshift(inst);\n }\n for (const ch of checks) {\n for (const fn of ch._zod.onattach) {\n fn(inst);\n }\n }\n if (checks.length === 0) {\n // deferred initializer\n // inst._zod.parse is not yet defined\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n inst._zod.deferred?.push(() => {\n inst._zod.run = inst._zod.parse;\n });\n }\n else {\n const runChecks = (payload, checks, ctx) => {\n let isAborted = util.aborted(payload);\n let asyncResult;\n for (const ch of checks) {\n if (ch._zod.def.when) {\n const shouldRun = ch._zod.def.when(payload);\n if (!shouldRun)\n continue;\n }\n else if (isAborted) {\n continue;\n }\n const currLen = payload.issues.length;\n const _ = ch._zod.check(payload);\n if (_ instanceof Promise && ctx?.async === false) {\n throw new core.$ZodAsyncError();\n }\n if (asyncResult || _ instanceof Promise) {\n asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n await _;\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n return;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n });\n }\n else {\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n continue;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n }\n }\n if (asyncResult) {\n return asyncResult.then(() => {\n return payload;\n });\n }\n return payload;\n };\n const handleCanaryResult = (canary, payload, ctx) => {\n // abort if the canary is aborted\n if (util.aborted(canary)) {\n canary.aborted = true;\n return canary;\n }\n // run checks first, then\n const checkResult = runChecks(payload, checks, ctx);\n if (checkResult instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n }\n return inst._zod.parse(checkResult, ctx);\n };\n inst._zod.run = (payload, ctx) => {\n if (ctx.skipChecks) {\n return inst._zod.parse(payload, ctx);\n }\n if (ctx.direction === \"backward\") {\n // run canary\n // initial pass (no checks)\n const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n if (canary instanceof Promise) {\n return canary.then((canary) => {\n return handleCanaryResult(canary, payload, ctx);\n });\n }\n return handleCanaryResult(canary, payload, ctx);\n }\n // forward\n const result = inst._zod.parse(payload, ctx);\n if (result instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return result.then((result) => runChecks(result, checks, ctx));\n }\n return runChecks(result, checks, ctx);\n };\n }\n // Lazy initialize ~standard to avoid creating objects for every schema\n util.defineLazy(inst, \"~standard\", () => ({\n validate: (value) => {\n try {\n const r = safeParse(inst, value);\n return r.success ? { value: r.data } : { issues: r.error?.issues };\n }\n catch (_) {\n return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n }\n },\n vendor: \"zod\",\n version: 1,\n }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n inst._zod.parse = (payload, _) => {\n if (def.coerce)\n try {\n payload.value = String(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"string\")\n return payload;\n payload.issues.push({\n expected: \"string\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n // check initialization must come first\n checks.$ZodCheckStringFormat.init(inst, def);\n $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.guid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n if (def.version) {\n const versionMap = {\n v1: 1,\n v2: 2,\n v3: 3,\n v4: 4,\n v5: 5,\n v6: 6,\n v7: 7,\n v8: 8,\n };\n const v = versionMap[def.version];\n if (v === undefined)\n throw new Error(`Invalid UUID version: \"${def.version}\"`);\n def.pattern ?? (def.pattern = regexes.uuid(v));\n }\n else\n def.pattern ?? (def.pattern = regexes.uuid());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.email);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n try {\n // Trim whitespace from input\n const trimmed = payload.value.trim();\n // @ts-ignore\n const url = new URL(trimmed);\n if (def.hostname) {\n def.hostname.lastIndex = 0;\n if (!def.hostname.test(url.hostname)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid hostname\",\n pattern: def.hostname.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n if (def.protocol) {\n def.protocol.lastIndex = 0;\n if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid protocol\",\n pattern: def.protocol.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n // Set the output value based on normalize flag\n if (def.normalize) {\n // Use normalized URL\n payload.value = url.href;\n }\n else {\n // Preserve the original input (trimmed)\n payload.value = trimmed;\n }\n return;\n }\n catch (_) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.emoji());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.nanoid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid2);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ulid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.xid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ksuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.datetime(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.date);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.time(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.duration);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv4);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv6);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv6`;\n inst._zod.check = (payload) => {\n try {\n // @ts-ignore\n new URL(`http://[${payload.value}]`);\n // return;\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"ipv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv4);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n const parts = payload.value.split(\"/\");\n try {\n if (parts.length !== 2)\n throw new Error();\n const [address, prefix] = parts;\n if (!prefix)\n throw new Error();\n const prefixNum = Number(prefix);\n if (`${prefixNum}` !== prefix)\n throw new Error();\n if (prefixNum < 0 || prefixNum > 128)\n throw new Error();\n // @ts-ignore\n new URL(`http://[${address}]`);\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"cidrv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64(data) {\n if (data === \"\")\n return true;\n if (data.length % 4 !== 0)\n return false;\n try {\n // @ts-ignore\n atob(data);\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64\";\n inst._zod.check = (payload) => {\n if (isValidBase64(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64URL(data) {\n if (!regexes.base64url.test(data))\n return false;\n const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64url);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64url\";\n inst._zod.check = (payload) => {\n if (isValidBase64URL(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.e164);\n $ZodStringFormat.init(inst, def);\n});\n////////////////////////////// ZodJWT //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n try {\n const tokensParts = token.split(\".\");\n if (tokensParts.length !== 3)\n return false;\n const [header] = tokensParts;\n if (!header)\n return false;\n // @ts-ignore\n const parsedHeader = JSON.parse(atob(header));\n if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n return false;\n if (!parsedHeader.alg)\n return false;\n if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (isValidJWT(payload.value, def.alg))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"jwt\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (def.fn(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Number(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n return payload;\n }\n const received = typeof input === \"number\"\n ? Number.isNaN(input)\n ? \"NaN\"\n : !Number.isFinite(input)\n ? \"Infinity\"\n : undefined\n : undefined;\n payload.issues.push({\n expected: \"number\",\n code: \"invalid_type\",\n input,\n inst,\n ...(received ? { received } : {}),\n });\n return payload;\n };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n checks.$ZodCheckNumberFormat.init(inst, def);\n $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.boolean;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Boolean(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"boolean\")\n return payload;\n payload.issues.push({\n expected: \"boolean\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.bigint;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = BigInt(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"bigint\")\n return payload;\n payload.issues.push({\n expected: \"bigint\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n checks.$ZodCheckBigIntFormat.init(inst, def);\n $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"symbol\")\n return payload;\n payload.issues.push({\n expected: \"symbol\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.undefined;\n inst._zod.values = new Set([undefined]);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"undefined\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.null;\n inst._zod.values = new Set([null]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (input === null)\n return payload;\n payload.issues.push({\n expected: \"null\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n payload.issues.push({\n expected: \"never\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"void\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce) {\n try {\n payload.value = new Date(payload.value);\n }\n catch (_err) { }\n }\n const input = payload.value;\n const isDate = input instanceof Date;\n const isValidDate = isDate && !Number.isNaN(input.getTime());\n if (isValidDate)\n return payload;\n payload.issues.push({\n expected: \"date\",\n code: \"invalid_type\",\n input,\n ...(isDate ? { received: \"Invalid Date\" } : {}),\n inst,\n });\n return payload;\n };\n});\nfunction handleArrayResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n expected: \"array\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = Array(input.length);\n const proms = [];\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\n const result = def.element._zod.run({\n value: item,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n }\n else {\n handleArrayResult(result, payload, i);\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload; //handleArrayResultsAsync(parseResults, final);\n };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalOut) {\n if (result.issues.length) {\n // For optional-out schemas, ignore errors on absent keys\n if (isOptionalOut && !(key in input)) {\n return;\n }\n final.issues.push(...util.prefixIssues(key, result.issues));\n }\n if (result.value === undefined) {\n if (key in input) {\n final.value[key] = undefined;\n }\n }\n else {\n final.value[key] = result.value;\n }\n}\nfunction normalizeDef(def) {\n const keys = Object.keys(def.shape);\n for (const k of keys) {\n if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n }\n }\n const okeys = util.optionalKeys(def.shape);\n return {\n ...def,\n keys,\n keySet: new Set(keys),\n numKeys: keys.length,\n optionalKeys: new Set(okeys),\n };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n const unrecognized = [];\n // iterate over input keys\n const keySet = def.keySet;\n const _catchall = def.catchall._zod;\n const t = _catchall.def.type;\n const isOptionalOut = _catchall.optout === \"optional\";\n for (const key in input) {\n if (keySet.has(key))\n continue;\n if (t === \"never\") {\n unrecognized.push(key);\n continue;\n }\n const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (unrecognized.length) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n keys: unrecognized,\n input,\n inst,\n });\n }\n if (!proms.length)\n return payload;\n return Promise.all(proms).then(() => {\n return payload;\n });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodType.init(inst, def);\n // const sh = def.shape;\n const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n if (!desc?.get) {\n const sh = def.shape;\n Object.defineProperty(def, \"shape\", {\n get: () => {\n const newSh = { ...sh };\n Object.defineProperty(def, \"shape\", {\n value: newSh,\n });\n return newSh;\n },\n });\n }\n const _normalized = util.cached(() => normalizeDef(def));\n util.defineLazy(inst._zod, \"propValues\", () => {\n const shape = def.shape;\n const propValues = {};\n for (const key in shape) {\n const field = shape[key]._zod;\n if (field.values) {\n propValues[key] ?? (propValues[key] = new Set());\n for (const v of field.values)\n propValues[key].add(v);\n }\n }\n return propValues;\n });\n const isObject = util.isObject;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = {};\n const proms = [];\n const shape = value.shape;\n for (const key of value.keys) {\n const el = shape[key];\n const isOptionalOut = el._zod.optout === \"optional\";\n const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (!catchall) {\n return proms.length ? Promise.all(proms).then(() => payload) : payload;\n }\n return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodObject.init(inst, def);\n const superParse = inst._zod.parse;\n const _normalized = util.cached(() => normalizeDef(def));\n const generateFastpass = (shape) => {\n const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n const normalized = _normalized.value;\n const parseStr = (key) => {\n const k = util.esc(key);\n return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n };\n doc.write(`const input = payload.value;`);\n const ids = Object.create(null);\n let counter = 0;\n for (const key of normalized.keys) {\n ids[key] = `key_${counter++}`;\n }\n // A: preserve key order {\n doc.write(`const newResult = {};`);\n for (const key of normalized.keys) {\n const id = ids[key];\n const k = util.esc(key);\n const schema = shape[key];\n const isOptionalOut = schema?._zod?.optout === \"optional\";\n doc.write(`const ${id} = ${parseStr(key)};`);\n if (isOptionalOut) {\n // For optional-out schemas, ignore errors on absent keys\n doc.write(`\n if (${id}.issues.length) {\n if (${k} in input) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n else {\n doc.write(`\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n }\n doc.write(`payload.value = newResult;`);\n doc.write(`return payload;`);\n const fn = doc.compile();\n return (payload, ctx) => fn(shape, payload, ctx);\n };\n let fastpass;\n const isObject = util.isObject;\n const jit = !core.globalConfig.jitless;\n const allowsEval = util.allowsEval;\n const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n // always synchronous\n if (!fastpass)\n fastpass = generateFastpass(def.shape);\n payload = fastpass(payload, ctx);\n if (!catchall)\n return payload;\n return handleCatchall([], input, payload, ctx, value, inst);\n }\n return superParse(payload, ctx);\n };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n for (const result of results) {\n if (result.issues.length === 0) {\n final.value = result.value;\n return final;\n }\n }\n const nonaborted = results.filter((r) => !util.aborted(r));\n if (nonaborted.length === 1) {\n final.value = nonaborted[0].value;\n return nonaborted[0];\n }\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"values\", () => {\n if (def.options.every((o) => o._zod.values)) {\n return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n }\n return undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n if (def.options.every((o) => o._zod.pattern)) {\n const patterns = def.options.map((o) => o._zod.pattern);\n return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n }\n return undefined;\n });\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n if (result.issues.length === 0)\n return result;\n results.push(result);\n }\n }\n if (!async)\n return handleUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleUnionResults(results, payload, inst, ctx);\n });\n };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n const successes = results.filter((r) => r.issues.length === 0);\n if (successes.length === 1) {\n final.value = successes[0].value;\n return final;\n }\n if (successes.length === 0) {\n // No matches - same as regular union\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n }\n else {\n // Multiple matches - exclusive union failure\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: [],\n inclusive: false,\n });\n }\n return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n $ZodUnion.init(inst, def);\n def.inclusive = false;\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n results.push(result);\n }\n }\n if (!async)\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n });\n };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n def.inclusive = false;\n $ZodUnion.init(inst, def);\n const _super = inst._zod.parse;\n util.defineLazy(inst._zod, \"propValues\", () => {\n const propValues = {};\n for (const option of def.options) {\n const pv = option._zod.propValues;\n if (!pv || Object.keys(pv).length === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n for (const [k, v] of Object.entries(pv)) {\n if (!propValues[k])\n propValues[k] = new Set();\n for (const val of v) {\n propValues[k].add(val);\n }\n }\n }\n return propValues;\n });\n const disc = util.cached(() => {\n const opts = def.options;\n const map = new Map();\n for (const o of opts) {\n const values = o._zod.propValues?.[def.discriminator];\n if (!values || values.size === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n for (const v of values) {\n if (map.has(v)) {\n throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n }\n map.set(v, o);\n }\n }\n return map;\n });\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isObject(input)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"object\",\n input,\n inst,\n });\n return payload;\n }\n const opt = disc.value.get(input?.[def.discriminator]);\n if (opt) {\n return opt._zod.run(payload, ctx);\n }\n if (def.unionFallback) {\n return _super(payload, ctx);\n }\n // no matching discriminator\n payload.issues.push({\n code: \"invalid_union\",\n errors: [],\n note: \"No matching discriminator\",\n discriminator: def.discriminator,\n input,\n path: [def.discriminator],\n inst,\n });\n return payload;\n };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n const async = left instanceof Promise || right instanceof Promise;\n if (async) {\n return Promise.all([left, right]).then(([left, right]) => {\n return handleIntersectionResults(payload, left, right);\n });\n }\n return handleIntersectionResults(payload, left, right);\n };\n});\nfunction mergeValues(a, b) {\n // const aType = parse.t(a);\n // const bType = parse.t(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n if (a instanceof Date && b instanceof Date && +a === +b) {\n return { valid: true, data: a };\n }\n if (util.isPlainObject(a) && util.isPlainObject(b)) {\n const bKeys = Object.keys(b);\n const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return { valid: false, mergeErrorPath: [] };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n // Track which side(s) report each key as unrecognized\n const unrecKeys = new Map();\n let unrecIssue;\n for (const iss of left.issues) {\n if (iss.code === \"unrecognized_keys\") {\n unrecIssue ?? (unrecIssue = iss);\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).l = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n for (const iss of right.issues) {\n if (iss.code === \"unrecognized_keys\") {\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).r = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n // Report only keys unrecognized by BOTH sides\n const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n if (bothKeys.length && unrecIssue) {\n result.issues.push({ ...unrecIssue, keys: bothKeys });\n }\n if (util.aborted(result))\n return result;\n const merged = mergeValues(left.value, right.value);\n if (!merged.valid) {\n throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n }\n result.value = merged.data;\n return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n $ZodType.init(inst, def);\n const items = def.items;\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n input,\n inst,\n expected: \"tuple\",\n code: \"invalid_type\",\n });\n return payload;\n }\n payload.value = [];\n const proms = [];\n const reversedIndex = [...items].reverse().findIndex((item) => item._zod.optin !== \"optional\");\n const optStart = reversedIndex === -1 ? 0 : items.length - reversedIndex;\n if (!def.rest) {\n const tooBig = input.length > items.length;\n const tooSmall = input.length < optStart - 1;\n if (tooBig || tooSmall) {\n payload.issues.push({\n ...(tooBig\n ? { code: \"too_big\", maximum: items.length, inclusive: true }\n : { code: \"too_small\", minimum: items.length }),\n input,\n inst,\n origin: \"array\",\n });\n return payload;\n }\n }\n let i = -1;\n for (const item of items) {\n i++;\n if (i >= input.length)\n if (i >= optStart)\n continue;\n const result = item._zod.run({\n value: input[i],\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n if (def.rest) {\n const rest = input.slice(items.length);\n for (const el of rest) {\n i++;\n const result = def.rest._zod.run({\n value: el,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleTupleResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isPlainObject(input)) {\n payload.issues.push({\n expected: \"record\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n const values = def.keyType._zod.values;\n if (values) {\n payload.value = {};\n const recordKeys = new Set();\n for (const key of values) {\n if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }\n }\n }\n let unrecognized;\n for (const key in input) {\n if (!recordKeys.has(key)) {\n unrecognized = unrecognized ?? [];\n unrecognized.push(key);\n }\n }\n if (unrecognized && unrecognized.length > 0) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n input,\n inst,\n keys: unrecognized,\n });\n }\n }\n else {\n payload.value = {};\n for (const key of Reflect.ownKeys(input)) {\n if (key === \"__proto__\")\n continue;\n let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n if (checkNumericKey) {\n const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n if (retryResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (retryResult.issues.length === 0) {\n keyResult = retryResult;\n }\n }\n if (keyResult.issues.length) {\n if (def.mode === \"loose\") {\n // Pass through unchanged\n payload.value[key] = input[key];\n }\n else {\n // Default \"strict\" behavior: error on invalid key\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n }\n continue;\n }\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload;\n };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Map)) {\n payload.issues.push({\n expected: \"map\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n payload.value = new Map();\n for (const [key, value] of input) {\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n if (keyResult instanceof Promise || valueResult instanceof Promise) {\n proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }));\n }\n else {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n if (keyResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, keyResult.issues));\n }\n else {\n final.issues.push({\n code: \"invalid_key\",\n origin: \"map\",\n input,\n inst,\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n if (valueResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, valueResult.issues));\n }\n else {\n final.issues.push({\n origin: \"map\",\n code: \"invalid_element\",\n input,\n inst,\n key: key,\n issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Set)) {\n payload.issues.push({\n input,\n inst,\n expected: \"set\",\n code: \"invalid_type\",\n });\n return payload;\n }\n const proms = [];\n payload.value = new Set();\n for (const item of input) {\n const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleSetResult(result, payload)));\n }\n else\n handleSetResult(result, payload);\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleSetResult(result, final) {\n if (result.issues.length) {\n final.issues.push(...result.issues);\n }\n final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n $ZodType.init(inst, def);\n const values = util.getEnumValues(def.entries);\n const valuesSet = new Set(values);\n inst._zod.values = valuesSet;\n inst._zod.pattern = new RegExp(`^(${values\n .filter((k) => util.propertyKeyTypes.has(typeof k))\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (valuesSet.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n if (def.values.length === 0) {\n throw new Error(\"Cannot create literal schema with no valid values\");\n }\n const values = new Set(def.values);\n inst._zod.values = values;\n inst._zod.pattern = new RegExp(`^(${def.values\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (values.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values: def.values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n // @ts-ignore\n if (input instanceof File)\n return payload;\n payload.issues.push({\n expected: \"file\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n const _out = def.transform(payload.value, payload);\n if (ctx.async) {\n const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n if (_out instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n payload.value = _out;\n return payload;\n };\n});\nfunction handleOptionalResult(result, input) {\n if (result.issues.length && input === undefined) {\n return { issues: [], value: undefined };\n }\n return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n if (def.innerType._zod.optin === \"optional\") {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise)\n return result.then((r) => handleOptionalResult(r, payload.value));\n return handleOptionalResult(result, payload.value);\n }\n if (payload.value === undefined) {\n return payload;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n // Call parent init - inherits optin/optout = \"optional\"\n $ZodOptional.init(inst, def);\n // Override values/pattern to NOT add undefined\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n // Override parse to just delegate (no undefined handling)\n inst._zod.parse = (payload, ctx) => {\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n });\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n // Forward direction (decode): allow null to pass through\n if (payload.value === null)\n return payload;\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n $ZodType.init(inst, def);\n // inst._zod.qin = \"true\";\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply defaults for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n /**\n * $ZodDefault returns the default value immediately in forward direction.\n * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe. */\n return payload;\n }\n // Forward direction: continue with default handling\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleDefaultResult(result, def));\n }\n return handleDefaultResult(result, def);\n };\n});\nfunction handleDefaultResult(payload, def) {\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply prefault for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => {\n const v = def.innerType._zod.values;\n return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleNonOptionalResult(result, inst));\n }\n return handleNonOptionalResult(result, inst);\n };\n});\nfunction handleNonOptionalResult(payload, inst) {\n if (!payload.issues.length && payload.value === undefined) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: payload.value,\n inst,\n });\n }\n return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(\"ZodSuccess\");\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.issues.length === 0;\n return payload;\n });\n }\n payload.value = result.issues.length === 0;\n return payload;\n };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply catch logic\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n });\n }\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"nan\",\n code: \"invalid_type\",\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handlePipeResult(right, def.in, ctx));\n }\n return handlePipeResult(right, def.in, ctx);\n }\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handlePipeResult(left, def.out, ctx));\n }\n return handlePipeResult(left, def.out, ctx);\n };\n});\nfunction handlePipeResult(left, next, ctx) {\n if (left.issues.length) {\n // prevent further checks\n left.aborted = true;\n return left;\n }\n return next._zod.run({ value: left.value, issues: left.issues }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handleCodecAResult(left, def, ctx));\n }\n return handleCodecAResult(left, def, ctx);\n }\n else {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handleCodecAResult(right, def, ctx));\n }\n return handleCodecAResult(right, def, ctx);\n }\n };\n});\nfunction handleCodecAResult(result, def, ctx) {\n if (result.issues.length) {\n // prevent further checks\n result.aborted = true;\n return result;\n }\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const transformed = def.transform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n }\n return handleCodecTxResult(result, transformed, def.out, ctx);\n }\n else {\n const transformed = def.reverseTransform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n }\n return handleCodecTxResult(result, transformed, def.in, ctx);\n }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n // Check if transform added any issues\n if (left.issues.length) {\n left.aborted = true;\n return left;\n }\n return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then(handleReadonlyResult);\n }\n return handleReadonlyResult(result);\n };\n});\nfunction handleReadonlyResult(payload) {\n payload.value = Object.freeze(payload.value);\n return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n const regexParts = [];\n for (const part of def.parts) {\n if (typeof part === \"object\" && part !== null) {\n // is Zod schema\n if (!part._zod.pattern) {\n // if (!source)\n throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n }\n const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n if (!source)\n throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n regexParts.push(source.slice(start, end));\n }\n else if (part === null || util.primitiveTypes.has(typeof part)) {\n regexParts.push(util.escapeRegex(`${part}`));\n }\n else {\n throw new Error(`Invalid template literal part: ${part}`);\n }\n }\n inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"string\") {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"string\",\n code: \"invalid_type\",\n });\n return payload;\n }\n inst._zod.pattern.lastIndex = 0;\n if (!inst._zod.pattern.test(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n code: \"invalid_format\",\n format: def.format ?? \"template_literal\",\n pattern: inst._zod.pattern.source,\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._def = def;\n inst._zod.def = def;\n inst.implement = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implement() must be called with a function\");\n }\n return function (...args) {\n const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n const result = Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return parse(inst._def.output, result);\n }\n return result;\n };\n };\n inst.implementAsync = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implementAsync() must be called with a function\");\n }\n return async function (...args) {\n const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n const result = await Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return await parseAsync(inst._def.output, result);\n }\n return result;\n };\n };\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"function\") {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"function\",\n input: payload.value,\n inst,\n });\n return payload;\n }\n // Check if output is a promise type to determine if we should use async implementation\n const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n if (hasPromiseOutput) {\n payload.value = inst.implementAsync(payload.value);\n }\n else {\n payload.value = inst.implement(payload.value);\n }\n return payload;\n };\n inst.input = (...args) => {\n const F = inst.constructor;\n if (Array.isArray(args[0])) {\n return new F({\n type: \"function\",\n input: new $ZodTuple({\n type: \"tuple\",\n items: args[0],\n rest: args[1],\n }),\n output: inst._def.output,\n });\n }\n return new F({\n type: \"function\",\n input: args[0],\n output: inst._def.output,\n });\n };\n inst.output = (output) => {\n const F = inst.constructor;\n return new F({\n type: \"function\",\n input: inst._def.input,\n output,\n });\n };\n return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n $ZodType.init(inst, def);\n // let _innerType!: any;\n // util.defineLazy(def, \"getter\", () => {\n // if (!_innerType) {\n // _innerType = def.getter();\n // }\n // return () => _innerType;\n // });\n util.defineLazy(inst._zod, \"innerType\", () => def.getter());\n util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n inst._zod.parse = (payload, ctx) => {\n const inner = inst._zod.innerType;\n return inner._zod.run(payload, ctx);\n };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n checks.$ZodCheck.init(inst, def);\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _) => {\n return payload;\n };\n inst._zod.check = (payload) => {\n const input = payload.value;\n const r = def.fn(input);\n if (r instanceof Promise) {\n return r.then((r) => handleRefineResult(r, payload, input, inst));\n }\n handleRefineResult(r, payload, input, inst);\n return;\n };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n if (!result) {\n const _iss = {\n code: \"custom\",\n input,\n inst, // incorporates params.error into issue reporting\n path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n continue: !inst._zod.def.abort,\n // params: inst._zod.def.params,\n };\n if (inst._zod.def.params)\n _iss.params = inst._zod.def.params;\n payload.issues.push(util.issue(_iss));\n }\n}\n","var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n constructor() {\n this._map = new WeakMap();\n this._idmap = new Map();\n }\n add(schema, ..._meta) {\n const meta = _meta[0];\n this._map.set(schema, meta);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.set(meta.id, schema);\n }\n return this;\n }\n clear() {\n this._map = new WeakMap();\n this._idmap = new Map();\n return this;\n }\n remove(schema) {\n const meta = this._map.get(schema);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.delete(meta.id);\n }\n this._map.delete(schema);\n return this;\n }\n get(schema) {\n // return this._map.get(schema) as any;\n // inherit metadata\n const p = schema._zod.parent;\n if (p) {\n const pm = { ...(this.get(p) ?? {}) };\n delete pm.id; // do not inherit id\n const f = { ...pm, ...this._map.get(schema) };\n return Object.keys(f).length ? f : undefined;\n }\n return this._map.get(schema);\n }\n has(schema) {\n return this._map.has(schema);\n }\n}\n// registries\nexport function registry() {\n return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n","import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n return new Class({\n type: \"string\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n return new Class({\n type: \"string\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n return new Class({\n type: \"string\",\n format: \"email\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"guid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v4\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v6\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v7\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n return new Class({\n type: \"string\",\n format: \"emoji\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"nanoid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid2\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ulid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"xid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ksuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n return new Class({\n type: \"string\",\n format: \"mac\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n return new Class({\n type: \"string\",\n format: \"e164\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n return new Class({\n type: \"string\",\n format: \"jwt\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\nexport const TimePrecision = {\n Any: null,\n Minute: -1,\n Second: 0,\n Millisecond: 3,\n Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"datetime\",\n check: \"string_format\",\n offset: false,\n local: false,\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n return new Class({\n type: \"string\",\n format: \"date\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"time\",\n check: \"string_format\",\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n return new Class({\n type: \"string\",\n format: \"duration\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n return new Class({\n type: \"number\",\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n return new Class({\n type: \"number\",\n coerce: true,\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"safeint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"int32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"uint32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n return new Class({\n type: \"boolean\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n return new Class({\n type: \"boolean\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n return new Class({\n type: \"bigint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n return new Class({\n type: \"bigint\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"int64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"uint64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n return new Class({\n type: \"symbol\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n return new Class({\n type: \"undefined\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n return new Class({\n type: \"null\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n return new Class({\n type: \"any\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n return new Class({\n type: \"unknown\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n return new Class({\n type: \"never\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n return new Class({\n type: \"void\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n return new Class({\n type: \"date\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n return new Class({\n type: \"date\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n return new Class({\n type: \"nan\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n return new checks.$ZodCheckMultipleOf({\n check: \"multiple_of\",\n ...util.normalizeParams(params),\n value,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n return new checks.$ZodCheckMaxSize({\n check: \"max_size\",\n ...util.normalizeParams(params),\n maximum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n return new checks.$ZodCheckMinSize({\n check: \"min_size\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n return new checks.$ZodCheckSizeEquals({\n check: \"size_equals\",\n ...util.normalizeParams(params),\n size,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n const ch = new checks.$ZodCheckMaxLength({\n check: \"max_length\",\n ...util.normalizeParams(params),\n maximum,\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n return new checks.$ZodCheckMinLength({\n check: \"min_length\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n return new checks.$ZodCheckLengthEquals({\n check: \"length_equals\",\n ...util.normalizeParams(params),\n length,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n return new checks.$ZodCheckRegex({\n check: \"string_format\",\n format: \"regex\",\n ...util.normalizeParams(params),\n pattern,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n return new checks.$ZodCheckLowerCase({\n check: \"string_format\",\n format: \"lowercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n return new checks.$ZodCheckUpperCase({\n check: \"string_format\",\n format: \"uppercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n return new checks.$ZodCheckIncludes({\n check: \"string_format\",\n format: \"includes\",\n ...util.normalizeParams(params),\n includes,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n return new checks.$ZodCheckStartsWith({\n check: \"string_format\",\n format: \"starts_with\",\n ...util.normalizeParams(params),\n prefix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n return new checks.$ZodCheckEndsWith({\n check: \"string_format\",\n format: \"ends_with\",\n ...util.normalizeParams(params),\n suffix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n return new checks.$ZodCheckProperty({\n check: \"property\",\n property,\n schema,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n return new checks.$ZodCheckMimeType({\n check: \"mime_type\",\n mime: types,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n return new checks.$ZodCheckOverwrite({\n check: \"overwrite\",\n tx,\n });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n return new Class({\n type: \"array\",\n element,\n // get element() {\n // return element;\n // },\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n ...util.normalizeParams(params),\n });\n}\nexport function _xor(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n return new Class({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n return new Class({\n type: \"intersection\",\n left,\n right,\n });\n}\n// export function _tuple(\n// Class: util.SchemaClass<schemas.$ZodTuple>,\n// items: [],\n// params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new Class({\n type: \"tuple\",\n items,\n rest,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n return new Class({\n type: \"record\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n return new Class({\n type: \"map\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n return new Class({\n type: \"set\",\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n // if (Array.isArray(values)) {\n // for (const value of values) {\n // entries[value] = value;\n // }\n // } else {\n // Object.assign(entries, values);\n // }\n // const entries: util.EnumLike = {};\n // for (const val of values) {\n // entries[val] = val;\n // }\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n return new Class({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n return new Class({\n type: \"file\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n return new Class({\n type: \"transform\",\n transform: fn,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n return new Class({\n type: \"optional\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n return new Class({\n type: \"nullable\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n return new Class({\n type: \"default\",\n innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n return new Class({\n type: \"nonoptional\",\n innerType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n return new Class({\n type: \"success\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n return new Class({\n type: \"catch\",\n innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n return new Class({\n type: \"pipe\",\n in: in_,\n out,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n return new Class({\n type: \"readonly\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n return new Class({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n return new Class({\n type: \"lazy\",\n getter,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n return new Class({\n type: \"promise\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n const norm = util.normalizeParams(_params);\n norm.abort ?? (norm.abort = true); // default to abort:false\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...norm,\n });\n return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...util.normalizeParams(_params),\n });\n return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn) {\n const ch = _check((payload) => {\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = ch);\n _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n payload.issues.push(util.issue(_issue));\n }\n };\n return fn(payload.value, payload);\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n const ch = new checks.$ZodCheck({\n check: \"custom\",\n ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n const ch = new checks.$ZodCheck({ check: \"describe\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, description });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n const ch = new checks.$ZodCheck({ check: \"meta\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, ...metadata });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n const params = util.normalizeParams(_params);\n let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n if (params.case !== \"sensitive\") {\n truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n }\n const truthySet = new Set(truthyArray);\n const falsySet = new Set(falsyArray);\n const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n const _String = Classes.String ?? schemas.$ZodString;\n const stringSchema = new _String({ type: \"string\", error: params.error });\n const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n const codec = new _Codec({\n type: \"pipe\",\n in: stringSchema,\n out: booleanSchema,\n transform: ((input, payload) => {\n let data = input;\n if (params.case !== \"sensitive\")\n data = data.toLowerCase();\n if (truthySet.has(data)) {\n return true;\n }\n else if (falsySet.has(data)) {\n return false;\n }\n else {\n payload.issues.push({\n code: \"invalid_value\",\n expected: \"stringbool\",\n values: [...truthySet, ...falsySet],\n input: payload.value,\n inst: codec,\n continue: false,\n });\n return {};\n }\n }),\n reverseTransform: ((input, _payload) => {\n if (input === true) {\n return truthyArray[0] || \"true\";\n }\n else {\n return falsyArray[0] || \"false\";\n }\n }),\n error: params.error,\n });\n return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n const params = util.normalizeParams(_params);\n const def = {\n ...util.normalizeParams(_params),\n check: \"string_format\",\n type: \"string\",\n format,\n fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n ...params,\n };\n if (fnOrRegex instanceof RegExp) {\n def.pattern = fnOrRegex;\n }\n const inst = new Class(def);\n return inst;\n}\n","import { globalRegistry } from \"./registries.js\";\n// function initializeContext<T extends schemas.$ZodType>(inputs: JSONSchemaGeneratorParams<T>): ToJSONSchemaContext<T> {\n// return {\n// processor: inputs.processor,\n// metadataRegistry: inputs.metadata ?? globalRegistry,\n// target: inputs.target ?? \"draft-2020-12\",\n// unrepresentable: inputs.unrepresentable ?? \"throw\",\n// };\n// }\nexport function initializeContext(params) {\n // Normalize target: convert old non-hyphenated versions to hyphenated versions\n let target = params?.target ?? \"draft-2020-12\";\n if (target === \"draft-4\")\n target = \"draft-04\";\n if (target === \"draft-7\")\n target = \"draft-07\";\n return {\n processors: params.processors ?? {},\n metadataRegistry: params?.metadata ?? globalRegistry,\n target,\n unrepresentable: params?.unrepresentable ?? \"throw\",\n override: params?.override ?? (() => { }),\n io: params?.io ?? \"output\",\n counter: 0,\n seen: new Map(),\n cycles: params?.cycles ?? \"ref\",\n reused: params?.reused ?? \"inline\",\n external: params?.external ?? undefined,\n };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n var _a;\n const def = schema._zod.def;\n // check for schema in seens\n const seen = ctx.seen.get(schema);\n if (seen) {\n seen.count++;\n // check if cycle\n const isCycle = _params.schemaPath.includes(schema);\n if (isCycle) {\n seen.cycle = _params.path;\n }\n return seen.schema;\n }\n // initialize\n const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n ctx.seen.set(schema, result);\n // custom method overrides default behavior\n const overrideSchema = schema._zod.toJSONSchema?.();\n if (overrideSchema) {\n result.schema = overrideSchema;\n }\n else {\n const params = {\n ..._params,\n schemaPath: [..._params.schemaPath, schema],\n path: _params.path,\n };\n if (schema._zod.processJSONSchema) {\n schema._zod.processJSONSchema(ctx, result.schema, params);\n }\n else {\n const _json = result.schema;\n const processor = ctx.processors[def.type];\n if (!processor) {\n throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n }\n processor(schema, ctx, _json, params);\n }\n const parent = schema._zod.parent;\n if (parent) {\n // Also set ref if processor didn't (for inheritance)\n if (!result.ref)\n result.ref = parent;\n process(parent, ctx, params);\n ctx.seen.get(parent).isParent = true;\n }\n }\n // metadata\n const meta = ctx.metadataRegistry.get(schema);\n if (meta)\n Object.assign(result.schema, meta);\n if (ctx.io === \"input\" && isTransforming(schema)) {\n // examples/defaults only apply to output type of pipe\n delete result.schema.examples;\n delete result.schema.default;\n }\n // set prefault as default\n if (ctx.io === \"input\" && result.schema._prefault)\n (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n delete result.schema._prefault;\n // pulling fresh from ctx.seen in case it was overwritten\n const _result = ctx.seen.get(schema);\n return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n // iterate over seen map;\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // Track ids to detect duplicates across different schemas\n const idToSchema = new Map();\n for (const entry of ctx.seen.entries()) {\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n const existing = idToSchema.get(id);\n if (existing && existing !== entry[0]) {\n throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n }\n idToSchema.set(id, entry[0]);\n }\n }\n // returns a ref to the schema\n // defId will be empty if the ref points to an external schema (or #)\n const makeURI = (entry) => {\n // comparing the seen objects because sometimes\n // multiple schemas map to the same seen object.\n // e.g. lazy\n // external is configured\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (ctx.external) {\n const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n // check if schema is in the external registry\n const uriGenerator = ctx.external.uri ?? ((id) => id);\n if (externalId) {\n return { ref: uriGenerator(externalId) };\n }\n // otherwise, add to __shared\n const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n entry[1].defId = id; // set defId so it will be reused if needed\n return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n }\n if (entry[1] === root) {\n return { ref: \"#\" };\n }\n // self-contained schema\n const uriPrefix = `#`;\n const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n return { defId, ref: defUriPrefix + defId };\n };\n // stored cached version in `def` property\n // remove all properties, set $ref\n const extractToDef = (entry) => {\n // if the schema is already a reference, do not extract it\n if (entry[1].schema.$ref) {\n return;\n }\n const seen = entry[1];\n const { ref, defId } = makeURI(entry);\n seen.def = { ...seen.schema };\n // defId won't be set if the schema is a reference to an external schema\n // or if the schema is the root schema\n if (defId)\n seen.defId = defId;\n // wipe away all properties except $ref\n const schema = seen.schema;\n for (const key in schema) {\n delete schema[key];\n }\n schema.$ref = ref;\n };\n // throw on cycles\n // break cycles\n if (ctx.cycles === \"throw\") {\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.cycle) {\n throw new Error(\"Cycle detected: \" +\n `#/${seen.cycle?.join(\"/\")}/<root>` +\n '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n }\n }\n }\n // extract schemas into $defs\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n // convert root schema to # $ref\n if (schema === entry[0]) {\n extractToDef(entry); // this has special handling for the root schema\n continue;\n }\n // extract schemas that are in the external registry\n if (ctx.external) {\n const ext = ctx.external.registry.get(entry[0])?.id;\n if (schema !== entry[0] && ext) {\n extractToDef(entry);\n continue;\n }\n }\n // extract schemas with `id` meta\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n extractToDef(entry);\n continue;\n }\n // break cycles\n if (seen.cycle) {\n // any\n extractToDef(entry);\n continue;\n }\n // extract reused schemas\n if (seen.count > 1) {\n if (ctx.reused === \"ref\") {\n extractToDef(entry);\n // biome-ignore lint:\n continue;\n }\n }\n }\n}\nexport function finalize(ctx, schema) {\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // flatten refs - inherit properties from parent schemas\n const flattenRef = (zodSchema) => {\n const seen = ctx.seen.get(zodSchema);\n // already processed\n if (seen.ref === null)\n return;\n const schema = seen.def ?? seen.schema;\n const _cached = { ...schema };\n const ref = seen.ref;\n seen.ref = null; // prevent infinite recursion\n if (ref) {\n flattenRef(ref);\n const refSeen = ctx.seen.get(ref);\n const refSchema = refSeen.schema;\n // merge referenced schema into current\n if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n // older drafts can't combine $ref with other properties\n schema.allOf = schema.allOf ?? [];\n schema.allOf.push(refSchema);\n }\n else {\n Object.assign(schema, refSchema);\n }\n // restore child's own properties (child wins)\n Object.assign(schema, _cached);\n const isParentRef = zodSchema._zod.parent === ref;\n // For parent chain, child is a refinement - remove parent-only properties\n if (isParentRef) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (!(key in _cached)) {\n delete schema[key];\n }\n }\n }\n // When ref was extracted to $defs, remove properties that match the definition\n if (refSchema.$ref && refSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n // If parent was extracted (has $ref), propagate $ref to this schema\n // This handles cases like: readonly().meta({id}).describe()\n // where processor sets ref to innerType but parent should be referenced\n const parent = zodSchema._zod.parent;\n if (parent && parent !== ref) {\n // Ensure parent is processed first so its def has inherited properties\n flattenRef(parent);\n const parentSeen = ctx.seen.get(parent);\n if (parentSeen?.schema.$ref) {\n schema.$ref = parentSeen.schema.$ref;\n // De-duplicate with parent's definition\n if (parentSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n }\n // execute overrides\n ctx.override({\n zodSchema: zodSchema,\n jsonSchema: schema,\n path: seen.path ?? [],\n });\n };\n for (const entry of [...ctx.seen.entries()].reverse()) {\n flattenRef(entry[0]);\n }\n const result = {};\n if (ctx.target === \"draft-2020-12\") {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n else if (ctx.target === \"draft-07\") {\n result.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (ctx.target === \"draft-04\") {\n result.$schema = \"http://json-schema.org/draft-04/schema#\";\n }\n else if (ctx.target === \"openapi-3.0\") {\n // OpenAPI 3.0 schema objects should not include a $schema property\n }\n else {\n // Arbitrary string values are allowed but won't have a $schema property set\n }\n if (ctx.external?.uri) {\n const id = ctx.external.registry.get(schema)?.id;\n if (!id)\n throw new Error(\"Schema is missing an `id` property\");\n result.$id = ctx.external.uri(id);\n }\n Object.assign(result, root.def ?? root.schema);\n // build defs object\n const defs = ctx.external?.defs ?? {};\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.def && seen.defId) {\n defs[seen.defId] = seen.def;\n }\n }\n // set definitions in result\n if (ctx.external) {\n }\n else {\n if (Object.keys(defs).length > 0) {\n if (ctx.target === \"draft-2020-12\") {\n result.$defs = defs;\n }\n else {\n result.definitions = defs;\n }\n }\n }\n try {\n // this \"finalizes\" this schema and ensures all cycles are removed\n // each call to finalize() is functionally independent\n // though the seen map is shared\n const finalized = JSON.parse(JSON.stringify(result));\n Object.defineProperty(finalized, \"~standard\", {\n value: {\n ...schema[\"~standard\"],\n jsonSchema: {\n input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n },\n },\n enumerable: false,\n writable: false,\n });\n return finalized;\n }\n catch (_err) {\n throw new Error(\"Error converting schema to JSON.\");\n }\n}\nfunction isTransforming(_schema, _ctx) {\n const ctx = _ctx ?? { seen: new Set() };\n if (ctx.seen.has(_schema))\n return false;\n ctx.seen.add(_schema);\n const def = _schema._zod.def;\n if (def.type === \"transform\")\n return true;\n if (def.type === \"array\")\n return isTransforming(def.element, ctx);\n if (def.type === \"set\")\n return isTransforming(def.valueType, ctx);\n if (def.type === \"lazy\")\n return isTransforming(def.getter(), ctx);\n if (def.type === \"promise\" ||\n def.type === \"optional\" ||\n def.type === \"nonoptional\" ||\n def.type === \"nullable\" ||\n def.type === \"readonly\" ||\n def.type === \"default\" ||\n def.type === \"prefault\") {\n return isTransforming(def.innerType, ctx);\n }\n if (def.type === \"intersection\") {\n return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n }\n if (def.type === \"record\" || def.type === \"map\") {\n return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n }\n if (def.type === \"pipe\") {\n return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n }\n if (def.type === \"object\") {\n for (const key in def.shape) {\n if (isTransforming(def.shape[key], ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"union\") {\n for (const option of def.options) {\n if (isTransforming(option, ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"tuple\") {\n for (const item of def.items) {\n if (isTransforming(item, ctx))\n return true;\n }\n if (def.rest && isTransforming(def.rest, ctx))\n return true;\n return false;\n }\n return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n const ctx = initializeContext({ ...params, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n const { libraryOptions, target } = params ?? {};\n const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\n","import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n guid: \"uuid\",\n url: \"uri\",\n datetime: \"date-time\",\n json_string: \"json-string\",\n regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n json.type = \"string\";\n const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n .bag;\n if (typeof minimum === \"number\")\n json.minLength = minimum;\n if (typeof maximum === \"number\")\n json.maxLength = maximum;\n // custom pattern overrides format\n if (format) {\n json.format = formatMap[format] ?? format;\n if (json.format === \"\")\n delete json.format; // empty format is not valid\n // JSON Schema format: \"time\" requires a full time with offset or Z\n // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n if (format === \"time\") {\n delete json.format;\n }\n }\n if (contentEncoding)\n json.contentEncoding = contentEncoding;\n if (patterns && patterns.size > 0) {\n const regexes = [...patterns];\n if (regexes.length === 1)\n json.pattern = regexes[0].source;\n else if (regexes.length > 1) {\n json.allOf = [\n ...regexes.map((regex) => ({\n ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n ? { type: \"string\" }\n : {}),\n pattern: regex.source,\n })),\n ];\n }\n }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n if (typeof format === \"string\" && format.includes(\"int\"))\n json.type = \"integer\";\n else\n json.type = \"number\";\n if (typeof exclusiveMinimum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.minimum = exclusiveMinimum;\n json.exclusiveMinimum = true;\n }\n else {\n json.exclusiveMinimum = exclusiveMinimum;\n }\n }\n if (typeof minimum === \"number\") {\n json.minimum = minimum;\n if (typeof exclusiveMinimum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMinimum >= minimum)\n delete json.minimum;\n else\n delete json.exclusiveMinimum;\n }\n }\n if (typeof exclusiveMaximum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.maximum = exclusiveMaximum;\n json.exclusiveMaximum = true;\n }\n else {\n json.exclusiveMaximum = exclusiveMaximum;\n }\n }\n if (typeof maximum === \"number\") {\n json.maximum = maximum;\n if (typeof exclusiveMaximum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMaximum <= maximum)\n delete json.maximum;\n else\n delete json.exclusiveMaximum;\n }\n }\n if (typeof multipleOf === \"number\")\n json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt cannot be represented in JSON Schema\");\n }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Symbols cannot be represented in JSON Schema\");\n }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n if (ctx.target === \"openapi-3.0\") {\n json.type = \"string\";\n json.nullable = true;\n json.enum = [null];\n }\n else {\n json.type = \"null\";\n }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Undefined cannot be represented in JSON Schema\");\n }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Void cannot be represented in JSON Schema\");\n }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Date cannot be represented in JSON Schema\");\n }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n const def = schema._zod.def;\n const values = getEnumValues(def.entries);\n // Number enums can have both string and number values\n if (values.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (values.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n const def = schema._zod.def;\n const vals = [];\n for (const val of def.values) {\n if (val === undefined) {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n }\n else {\n // do not add to vals\n }\n }\n else if (typeof val === \"bigint\") {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n }\n else {\n vals.push(Number(val));\n }\n }\n else {\n vals.push(val);\n }\n }\n if (vals.length === 0) {\n // do nothing (an undefined literal was stripped)\n }\n else if (vals.length === 1) {\n const val = vals[0];\n json.type = val === null ? \"null\" : typeof val;\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.enum = [val];\n }\n else {\n json.const = val;\n }\n }\n else {\n if (vals.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (vals.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n if (vals.every((v) => typeof v === \"boolean\"))\n json.type = \"boolean\";\n if (vals.every((v) => v === null))\n json.type = \"null\";\n json.enum = vals;\n }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"NaN cannot be represented in JSON Schema\");\n }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const pattern = schema._zod.pattern;\n if (!pattern)\n throw new Error(\"Pattern not found in template literal\");\n _json.type = \"string\";\n _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const file = {\n type: \"string\",\n format: \"binary\",\n contentEncoding: \"binary\",\n };\n const { minimum, maximum, mime } = schema._zod.bag;\n if (minimum !== undefined)\n file.minLength = minimum;\n if (maximum !== undefined)\n file.maxLength = maximum;\n if (mime) {\n if (mime.length === 1) {\n file.contentMediaType = mime[0];\n Object.assign(_json, file);\n }\n else {\n Object.assign(_json, file); // shared props at root\n _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n }\n }\n else {\n Object.assign(_json, file);\n }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Custom types cannot be represented in JSON Schema\");\n }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Function types cannot be represented in JSON Schema\");\n }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Transforms cannot be represented in JSON Schema\");\n }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Map cannot be represented in JSON Schema\");\n }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Set cannot be represented in JSON Schema\");\n }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n json.type = \"array\";\n json.items = process(def.element, ctx, { ...params, path: [...params.path, \"items\"] });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n json.properties = {};\n const shape = def.shape;\n for (const key in shape) {\n json.properties[key] = process(shape[key], ctx, {\n ...params,\n path: [...params.path, \"properties\", key],\n });\n }\n // required keys\n const allKeys = new Set(Object.keys(shape));\n const requiredKeys = new Set([...allKeys].filter((key) => {\n const v = def.shape[key]._zod;\n if (ctx.io === \"input\") {\n return v.optin === undefined;\n }\n else {\n return v.optout === undefined;\n }\n }));\n if (requiredKeys.size > 0) {\n json.required = Array.from(requiredKeys);\n }\n // catchall\n if (def.catchall?._zod.def.type === \"never\") {\n // strict\n json.additionalProperties = false;\n }\n else if (!def.catchall) {\n // regular\n if (ctx.io === \"output\")\n json.additionalProperties = false;\n }\n else if (def.catchall) {\n json.additionalProperties = process(def.catchall, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n // This includes both z.xor() and discriminated unions\n const isExclusive = def.inclusive === false;\n const options = def.options.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n }));\n if (isExclusive) {\n json.oneOf = options;\n }\n else {\n json.anyOf = options;\n }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const a = process(def.left, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 0],\n });\n const b = process(def.right, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 1],\n });\n const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n const allOf = [\n ...(isSimpleIntersection(a) ? a.allOf : [a]),\n ...(isSimpleIntersection(b) ? b.allOf : [b]),\n ];\n json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"array\";\n const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n const prefixItems = def.items.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, prefixPath, i],\n }));\n const rest = def.rest\n ? process(def.rest, ctx, {\n ...params,\n path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n })\n : null;\n if (ctx.target === \"draft-2020-12\") {\n json.prefixItems = prefixItems;\n if (rest) {\n json.items = rest;\n }\n }\n else if (ctx.target === \"openapi-3.0\") {\n json.items = {\n anyOf: prefixItems,\n };\n if (rest) {\n json.items.anyOf.push(rest);\n }\n json.minItems = prefixItems.length;\n if (!rest) {\n json.maxItems = prefixItems.length;\n }\n }\n else {\n json.items = prefixItems;\n if (rest) {\n json.additionalItems = rest;\n }\n }\n // length\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n // For looseRecord with regex patterns, use patternProperties\n // This correctly represents \"only validate keys matching the pattern\" semantics\n // and composes well with allOf (intersections)\n const keyType = def.keyType;\n const keyBag = keyType._zod.bag;\n const patterns = keyBag?.patterns;\n if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n // Use patternProperties for looseRecord with regex patterns\n const valueSchema = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"patternProperties\", \"*\"],\n });\n json.patternProperties = {};\n for (const pattern of patterns) {\n json.patternProperties[pattern.source] = valueSchema;\n }\n }\n else {\n // Default behavior: use propertyNames + additionalProperties\n if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n json.propertyNames = process(def.keyType, ctx, {\n ...params,\n path: [...params.path, \"propertyNames\"],\n });\n }\n json.additionalProperties = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n // Add required for keys with discrete values (enum, literal, etc.)\n const keyValues = keyType._zod.values;\n if (keyValues) {\n const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n if (validKeyValues.length > 0) {\n json.required = validKeyValues;\n }\n }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const inner = process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n if (ctx.target === \"openapi-3.0\") {\n seen.ref = def.innerType;\n json.nullable = true;\n }\n else {\n json.anyOf = [inner, { type: \"null\" }];\n }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n if (ctx.io === \"input\")\n json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n let catchValue;\n try {\n catchValue = def.catchValue(undefined);\n }\n catch {\n throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n }\n json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n const innerType = ctx.io === \"input\" ? (def.in._zod.def.type === \"transform\" ? def.out : def.in) : def.out;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n const innerType = schema._zod.innerType;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n string: stringProcessor,\n number: numberProcessor,\n boolean: booleanProcessor,\n bigint: bigintProcessor,\n symbol: symbolProcessor,\n null: nullProcessor,\n undefined: undefinedProcessor,\n void: voidProcessor,\n never: neverProcessor,\n any: anyProcessor,\n unknown: unknownProcessor,\n date: dateProcessor,\n enum: enumProcessor,\n literal: literalProcessor,\n nan: nanProcessor,\n template_literal: templateLiteralProcessor,\n file: fileProcessor,\n success: successProcessor,\n custom: customProcessor,\n function: functionProcessor,\n transform: transformProcessor,\n map: mapProcessor,\n set: setProcessor,\n array: arrayProcessor,\n object: objectProcessor,\n union: unionProcessor,\n intersection: intersectionProcessor,\n tuple: tupleProcessor,\n record: recordProcessor,\n nullable: nullableProcessor,\n nonoptional: nonoptionalProcessor,\n default: defaultProcessor,\n prefault: prefaultProcessor,\n catch: catchProcessor,\n pipe: pipeProcessor,\n readonly: readonlyProcessor,\n promise: promiseProcessor,\n optional: optionalProcessor,\n lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n if (\"_idmap\" in input) {\n // Registry case\n const registry = input;\n const ctx = initializeContext({ ...params, processors: allProcessors });\n const defs = {};\n // First pass: process all schemas to build the seen map\n for (const entry of registry._idmap.entries()) {\n const [_, schema] = entry;\n process(schema, ctx);\n }\n const schemas = {};\n const external = {\n registry,\n uri: params?.uri,\n defs,\n };\n // Update the context with external configuration\n ctx.external = external;\n // Second pass: emit each schema\n for (const entry of registry._idmap.entries()) {\n const [key, schema] = entry;\n extractDefs(ctx, schema);\n schemas[key] = finalize(ctx, schema);\n }\n if (Object.keys(defs).length > 0) {\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n schemas.__shared = {\n [defsSegment]: defs,\n };\n }\n return { schemas };\n }\n // Single schema case\n const ctx = initializeContext({ ...params, processors: allProcessors });\n process(input, ctx);\n extractDefs(ctx, input);\n return finalize(ctx, input);\n}\n","import * as core from \"../core/index.js\";\nimport * as schemas from \"./schemas.js\";\nexport const ZodISODateTime = /*@__PURE__*/ core.$constructor(\"ZodISODateTime\", (inst, def) => {\n core.$ZodISODateTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function datetime(params) {\n return core._isoDateTime(ZodISODateTime, params);\n}\nexport const ZodISODate = /*@__PURE__*/ core.$constructor(\"ZodISODate\", (inst, def) => {\n core.$ZodISODate.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function date(params) {\n return core._isoDate(ZodISODate, params);\n}\nexport const ZodISOTime = /*@__PURE__*/ core.$constructor(\"ZodISOTime\", (inst, def) => {\n core.$ZodISOTime.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function time(params) {\n return core._isoTime(ZodISOTime, params);\n}\nexport const ZodISODuration = /*@__PURE__*/ core.$constructor(\"ZodISODuration\", (inst, def) => {\n core.$ZodISODuration.init(inst, def);\n schemas.ZodStringFormat.init(inst, def);\n});\nexport function duration(params) {\n return core._isoDuration(ZodISODuration, params);\n}\n","import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n $ZodError.init(inst, issues);\n inst.name = \"ZodError\";\n Object.defineProperties(inst, {\n format: {\n value: (mapper) => core.formatError(inst, mapper),\n // enumerable: false,\n },\n flatten: {\n value: (mapper) => core.flattenError(inst, mapper),\n // enumerable: false,\n },\n addIssue: {\n value: (issue) => {\n inst.issues.push(issue);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n addIssues: {\n value: (issues) => {\n inst.issues.push(...issues);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n isEmpty: {\n get() {\n return inst.issues.length === 0;\n },\n // enumerable: false,\n },\n });\n // Object.defineProperty(inst, \"isEmpty\", {\n // get() {\n // return inst.issues.length === 0;\n // },\n // });\n};\nexport const ZodError = core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = core.$constructor(\"ZodError\", initializer, {\n Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n","import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n","import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n core.$ZodType.init(inst, def);\n Object.assign(inst[\"~standard\"], {\n jsonSchema: {\n input: createStandardJSONSchemaMethod(inst, \"input\"),\n output: createStandardJSONSchemaMethod(inst, \"output\"),\n },\n });\n inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n inst.def = def;\n inst.type = def.type;\n Object.defineProperty(inst, \"_def\", { value: def });\n // base methods\n inst.check = (...checks) => {\n return inst.clone(util.mergeDefs(def, {\n checks: [\n ...(def.checks ?? []),\n ...checks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n ],\n }), {\n parent: true,\n });\n };\n inst.with = inst.check;\n inst.clone = (def, params) => core.clone(inst, def, params);\n inst.brand = () => inst;\n inst.register = ((reg, meta) => {\n reg.add(inst, meta);\n return inst;\n });\n // parsing\n inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n inst.spa = inst.safeParseAsync;\n // encoding/decoding\n inst.encode = (data, params) => parse.encode(inst, data, params);\n inst.decode = (data, params) => parse.decode(inst, data, params);\n inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n // refinements\n inst.refine = (check, params) => inst.check(refine(check, params));\n inst.superRefine = (refinement) => inst.check(superRefine(refinement));\n inst.overwrite = (fn) => inst.check(checks.overwrite(fn));\n // wrappers\n inst.optional = () => optional(inst);\n inst.exactOptional = () => exactOptional(inst);\n inst.nullable = () => nullable(inst);\n inst.nullish = () => optional(nullable(inst));\n inst.nonoptional = (params) => nonoptional(inst, params);\n inst.array = () => array(inst);\n inst.or = (arg) => union([inst, arg]);\n inst.and = (arg) => intersection(inst, arg);\n inst.transform = (tx) => pipe(inst, transform(tx));\n inst.default = (def) => _default(inst, def);\n inst.prefault = (def) => prefault(inst, def);\n // inst.coalesce = (def, params) => coalesce(inst, def, params);\n inst.catch = (params) => _catch(inst, params);\n inst.pipe = (target) => pipe(inst, target);\n inst.readonly = () => readonly(inst);\n // meta\n inst.describe = (description) => {\n const cl = inst.clone();\n core.globalRegistry.add(cl, { description });\n return cl;\n };\n Object.defineProperty(inst, \"description\", {\n get() {\n return core.globalRegistry.get(inst)?.description;\n },\n configurable: true,\n });\n inst.meta = (...args) => {\n if (args.length === 0) {\n return core.globalRegistry.get(inst);\n }\n const cl = inst.clone();\n core.globalRegistry.add(cl, args[0]);\n return cl;\n };\n // helpers\n inst.isOptional = () => inst.safeParse(undefined).success;\n inst.isNullable = () => inst.safeParse(null).success;\n inst.apply = (fn) => fn(inst);\n return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n const bag = inst._zod.bag;\n inst.format = bag.format ?? null;\n inst.minLength = bag.minimum ?? null;\n inst.maxLength = bag.maximum ?? null;\n // validations\n inst.regex = (...args) => inst.check(checks.regex(...args));\n inst.includes = (...args) => inst.check(checks.includes(...args));\n inst.startsWith = (...args) => inst.check(checks.startsWith(...args));\n inst.endsWith = (...args) => inst.check(checks.endsWith(...args));\n inst.min = (...args) => inst.check(checks.minLength(...args));\n inst.max = (...args) => inst.check(checks.maxLength(...args));\n inst.length = (...args) => inst.check(checks.length(...args));\n inst.nonempty = (...args) => inst.check(checks.minLength(1, ...args));\n inst.lowercase = (params) => inst.check(checks.lowercase(params));\n inst.uppercase = (params) => inst.check(checks.uppercase(params));\n // transforms\n inst.trim = () => inst.check(checks.trim());\n inst.normalize = (...args) => inst.check(checks.normalize(...args));\n inst.toLowerCase = () => inst.check(checks.toLowerCase());\n inst.toUpperCase = () => inst.check(checks.toUpperCase());\n inst.slugify = () => inst.check(checks.slugify());\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n _ZodString.init(inst, def);\n inst.email = (params) => inst.check(core._email(ZodEmail, params));\n inst.url = (params) => inst.check(core._url(ZodURL, params));\n inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n // iso\n inst.datetime = (params) => inst.check(iso.datetime(params));\n inst.date = (params) => inst.check(iso.date(params));\n inst.time = (params) => inst.check(iso.time(params));\n inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n core.$ZodStringFormat.init(inst, def);\n _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmail.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodGUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodUUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodURL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n return core._url(ZodURL, {\n protocol: /^https?$/,\n hostname: core.regexes.domain,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmoji.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodNanoID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n return core._nanoid(ZodNanoID, params);\n}\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid(params) {\n return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID2.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodULID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodXID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodKSUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodMAC.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n core.$ZodCIDRv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n core.$ZodCIDRv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64URL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodE164.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodJWT.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCustomStringFormat.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n const enc = params?.enc ?? \"hex\";\n const format = `${alg}_${enc}`;\n const regex = core.regexes[format];\n if (!regex)\n throw new Error(`Unrecognized hash format: ${format}`);\n return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n core.$ZodNumber.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.int = (params) => inst.check(int(params));\n inst.safe = (params) => inst.check(int(params));\n inst.positive = (params) => inst.check(checks.gt(0, params));\n inst.nonnegative = (params) => inst.check(checks.gte(0, params));\n inst.negative = (params) => inst.check(checks.lt(0, params));\n inst.nonpositive = (params) => inst.check(checks.lte(0, params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n inst.step = (value, params) => inst.check(checks.multipleOf(value, params));\n // inst.finite = (params) => inst.check(core.finite(params));\n inst.finite = () => inst;\n const bag = inst._zod.bag;\n inst.minValue =\n Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n inst.maxValue =\n Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n inst.isFinite = true;\n inst.format = bag.format ?? null;\n});\nexport function number(params) {\n return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n core.$ZodNumberFormat.init(inst, def);\n ZodNumber.init(inst, def);\n});\nexport function int(params) {\n return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n core.$ZodBoolean.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n core.$ZodBigInt.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n const bag = inst._zod.bag;\n inst.minValue = bag.minimum ?? null;\n inst.maxValue = bag.maximum ?? null;\n inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n core.$ZodBigIntFormat.init(inst, def);\n ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n core.$ZodSymbol.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n core.$ZodUndefined.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n core.$ZodNull.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n core.$ZodAny.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n core.$ZodUnknown.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n core.$ZodNever.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n core.$ZodVoid.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n core.$ZodDate.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n const c = inst._zod.bag;\n inst.minDate = c.minimum ? new Date(c.minimum) : null;\n inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n core.$ZodArray.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n inst.element = def.element;\n inst.min = (minLength, params) => inst.check(checks.minLength(minLength, params));\n inst.nonempty = (params) => inst.check(checks.minLength(1, params));\n inst.max = (maxLength, params) => inst.check(checks.maxLength(maxLength, params));\n inst.length = (len, params) => inst.check(checks.length(len, params));\n inst.unwrap = () => inst.element;\n});\nexport function array(element, params) {\n return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n const shape = schema._zod.def.shape;\n return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n core.$ZodObjectJIT.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n util.defineLazy(inst, \"shape\", () => {\n return def.shape;\n });\n inst.keyof = () => _enum(Object.keys(inst._zod.def.shape));\n inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall: catchall });\n inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() });\n inst.strip = () => inst.clone({ ...inst._zod.def, catchall: undefined });\n inst.extend = (incoming) => {\n return util.extend(inst, incoming);\n };\n inst.safeExtend = (incoming) => {\n return util.safeExtend(inst, incoming);\n };\n inst.merge = (other) => util.merge(inst, other);\n inst.pick = (mask) => util.pick(inst, mask);\n inst.omit = (mask) => util.omit(inst, mask);\n inst.partial = (...args) => util.partial(ZodOptional, inst, args[0]);\n inst.required = (...args) => util.required(ZodNonOptional, inst, args[0]);\n});\nexport function object(shape, params) {\n const def = {\n type: \"object\",\n shape: shape ?? {},\n ...util.normalizeParams(params),\n };\n return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: never(),\n ...util.normalizeParams(params),\n });\n}\n// looseObject\nexport function looseObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: unknown(),\n ...util.normalizeParams(params),\n });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n core.$ZodUnion.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\nexport function union(options, params) {\n return new ZodUnion({\n type: \"union\",\n options: options,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodXor.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n return new ZodXor({\n type: \"union\",\n options: options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n // const [options, params] = args;\n return new ZodDiscriminatedUnion({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n core.$ZodIntersection.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n return new ZodIntersection({\n type: \"intersection\",\n left: left,\n right: right,\n });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n core.$ZodTuple.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n inst.rest = (rest) => inst.clone({\n ...inst._zod.def,\n rest: rest,\n });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof core.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new ZodTuple({\n type: \"tuple\",\n items: items,\n rest,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n core.$ZodRecord.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\n// type alksjf = core.output<core.$ZodRecordKey>;\nexport function partialRecord(keyType, valueType, params) {\n const k = core.clone(keyType);\n k._zod.values = undefined;\n return new ZodRecord({\n type: \"record\",\n keyType: k,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport function looseRecord(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n mode: \"loose\",\n ...util.normalizeParams(params),\n });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n core.$ZodMap.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n return new ZodMap({\n type: \"map\",\n keyType: keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n core.$ZodSet.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n return new ZodSet({\n type: \"set\",\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n core.$ZodEnum.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n inst.enum = def.entries;\n inst.options = Object.values(def.entries);\n const keys = new Set(Object.keys(def.entries));\n inst.extract = (values, params) => {\n const newEntries = {};\n for (const value of values) {\n if (keys.has(value)) {\n newEntries[value] = def.entries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n inst.exclude = (values, params) => {\n const newEntries = { ...def.entries };\n for (const value of values) {\n if (keys.has(value)) {\n delete newEntries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n});\nfunction _enum(values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n core.$ZodLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n inst.values = new Set(def.values);\n Object.defineProperty(inst, \"value\", {\n get() {\n if (def.values.length > 1) {\n throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n }\n return def.values[0];\n },\n });\n});\nexport function literal(value, params) {\n return new ZodLiteral({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n core.$ZodFile.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n inst.min = (size, params) => inst.check(core._minSize(size, params));\n inst.max = (size, params) => inst.check(core._maxSize(size, params));\n inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n core.$ZodTransform.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n inst._zod.parse = (payload, _ctx) => {\n if (_ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = inst);\n // _issue.continue ??= true;\n payload.issues.push(util.issue(_issue));\n }\n };\n const output = def.transform(payload.value, payload);\n if (output instanceof Promise) {\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n payload.value = output;\n return payload;\n };\n});\nexport function transform(fn) {\n return new ZodTransform({\n type: \"transform\",\n transform: fn,\n });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n core.$ZodOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n return new ZodOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n core.$ZodExactOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n return new ZodExactOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n core.$ZodNullable.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n return new ZodNullable({\n type: \"nullable\",\n innerType: innerType,\n });\n}\n// nullish\nexport function nullish(innerType) {\n return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n core.$ZodDefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n return new ZodDefault({\n type: \"default\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n core.$ZodPrefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n return new ZodPrefault({\n type: \"prefault\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n core.$ZodNonOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n return new ZodNonOptional({\n type: \"nonoptional\",\n innerType: innerType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n core.$ZodSuccess.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n return new ZodSuccess({\n type: \"success\",\n innerType: innerType,\n });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n core.$ZodCatch.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n return new ZodCatch({\n type: \"catch\",\n innerType: innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n core.$ZodNaN.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n core.$ZodPipe.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n inst.in = def.in;\n inst.out = def.out;\n});\nexport function pipe(in_, out) {\n return new ZodPipe({\n type: \"pipe\",\n in: in_,\n out: out,\n // ...util.normalizeParams(params),\n });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n return new ZodCodec({\n type: \"pipe\",\n in: in_,\n out: out,\n transform: params.decode,\n reverseTransform: params.encode,\n });\n}\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n core.$ZodReadonly.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n return new ZodReadonly({\n type: \"readonly\",\n innerType: innerType,\n });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n core.$ZodTemplateLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n return new ZodTemplateLiteral({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n core.$ZodLazy.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n return new ZodLazy({\n type: \"lazy\",\n getter: getter,\n });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n core.$ZodPromise.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n return new ZodPromise({\n type: \"promise\",\n innerType: innerType,\n });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n core.$ZodFunction.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n return new ZodFunction({\n type: \"function\",\n input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n output: params?.output ?? unknown(),\n });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n core.$ZodCustom.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n const ch = new core.$ZodCheck({\n check: \"custom\",\n // ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\nexport function custom(fn, _params) {\n return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn) {\n return core._superRefine(fn);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n const inst = new ZodCustom({\n type: \"custom\",\n check: \"custom\",\n fn: (data) => data instanceof cls,\n abort: true,\n ...util.normalizeParams(params),\n });\n inst._zod.bag.Class = cls;\n // Override check to emit invalid_type instead of custom\n inst._zod.check = (payload) => {\n if (!(payload.value instanceof cls)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: cls.name,\n input: payload.value,\n inst,\n path: [...(inst._zod.def.path ?? [])],\n });\n }\n };\n return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n Codec: ZodCodec,\n Boolean: ZodBoolean,\n String: ZodString,\n}, ...args);\nexport function json(params) {\n const jsonSchema = lazy(() => {\n return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n });\n return jsonSchema;\n}\n// preprocess\n// /** @deprecated Use `z.pipe()` and `z.transform()` instead. */\nexport function preprocess(fn, schema) {\n return pipe(transform(fn), schema);\n}\n","/**\n * Chat widget -- public entry point.\n *\n * Renders a floating launcher button + slide-in chat drawer inside Shadow DOM\n * for CSS isolation. Handles streaming NDJSON from the backend.\n */\n\nimport type { ActionPayload, PageContext, StreamEvent, StreamEventAction, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { ActionRouterOptions } from '../common/action-router.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport type { BridgeMessage } from '../common/communication-bridge.js';\nimport type { BackendRequestMeta } from './api.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { uuidv7 } from '../common/uuidv7.js';\nimport { CommunicationBridge } from '../common/communication-bridge.js';\nimport { routeStreamAction } from '../common/action-router.js';\nimport {\n streamStartEvent,\n streamChunkEvent,\n streamDoneEvent,\n streamErrorEvent,\n streamUiSpecEvent,\n llmUsageEvent,\n meteringIncrementEvent,\n chatHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { sanitizeHtml } from '../common/safe-html.js';\nimport { validateImageFile } from './attachment-utils.js';\nimport { sendChatMessage, enrichActionPayload, fetchProactiveAction } from './api.js';\nimport { ChatDrawer } from './components/ChatDrawer.js';\nimport { createLauncher } from './components/Launcher.js';\nimport type { LauncherElements } from './components/Launcher.js';\nimport { createProactivePopup } from './components/ProactivePopup.js';\nimport type { ProactiveAction } from './components/ProactivePopup.js';\nimport { ActivityTracker } from '../common/activity-tracker.js';\nimport { playTtsAudio } from '../common/tts-player.js';\nimport type { AudioHandle } from '../common/tts-player.js';\nimport { HeartbeatManager } from './heartbeat.js';\nimport {\n renderUISpec,\n createDefaultChatUISpecRegistry,\n defaultChatUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nimport type { TypewriterHandle } from './components/typewriter.js';\nimport { typewriteHtml } from './components/typewriter.js';\nimport { linkProductMentions } from './components/productMentionLinker.js';\nimport { isInputAreaAction } from './components/actionClassifier.js';\nimport type { ThumbnailEntry } from './components/ThumbnailsColumn.js';\nimport { createChoicePrompter, isChoicePrompterDismissed } from './components/ChoicePrompter.js';\nimport type {\n ChatWidgetConfig,\n ChatMessage,\n ChatI18n,\n ChatUISpecRenderContext,\n ChatUISpecRegistry,\n ProductSortState,\n} from './types.js';\nimport { GengageIndexedDB } from '../common/indexed-db.js';\nimport { CHAT_I18N_TR, resolveChatLocale } from './locales/index.js';\nimport { ExtendedModeManager } from './extendedModeManager.js';\nimport { PanelManager } from './panel-manager.js';\nimport { SessionPersistence } from './session-persistence.js';\nimport {\n containsKvkk,\n isKvkkShown,\n markKvkkShown,\n stripKvkkBlock,\n extractKvkkBlock,\n localeToOutputLanguage,\n} from './kvkk.js';\n\nimport chatStyles from './components/chat.css?inline';\nimport * as ga from '../common/ga-datalayer.js';\n\n/** Validate that a string is a safe CSS color value (no url(), expression(), etc.). */\nfunction isSafeCSSColor(value: string): boolean {\n if (value.length > 120) return false;\n // Only allow characters found in valid CSS colors: hex digits, letters, parens,\n // commas, dots, spaces, percent, slash (modern color syntax), and hyphens.\n return /^[a-zA-Z0-9#(),.\\s%/\\-]+$/.test(value);\n}\n\n/** Lightweight runtime check: value looks like an ActionPayload (has a string `type`). */\nfunction isActionLike(value: unknown): value is ActionPayload {\n return typeof value === 'object' && value !== null && typeof (value as Record<string, unknown>).type === 'string';\n}\n\nexport class GengageChat extends BaseWidget<ChatWidgetConfig> {\n private _shadow: ShadowRoot | null = null;\n private _rootEl: HTMLElement | null = null;\n private _launcher: LauncherElements | null = null;\n private _drawer: ChatDrawer | null = null;\n private _bridge: CommunicationBridge | null = null;\n private _activityTracker: ActivityTracker | null = null;\n private _heartbeat: HeartbeatManager | null = null;\n private _proactiveShown = false;\n private _drawerVisible = false;\n private _messages: ChatMessage[] = [];\n // Bot text accumulation is now closure-local inside _sendAction to prevent\n // corruption when concurrent preservePanel streams write simultaneously.\n private _currentMessageId = 0;\n private _abortControllers = new Set<AbortController>();\n /** Current thread cursor — only messages with threadId <= this are visible. */\n private _currentThreadId: string | null = null;\n /** Most recent threadId ever created — used to detect branch points. */\n private _lastThreadId: string | null = null;\n /** Timestamp when the chat session was created (ISO 8601). */\n private _chatCreatedAt = '';\n /** Last backend-streamed context object — sent back with every request. */\n private _lastBackendContext: import('../common/types.js').BackendContext | null = null;\n private _productSort: ProductSortState = { type: 'related' };\n private _lastSku: string | undefined;\n private _comparisonSelectMode = false;\n private _comparisonSelectedSkus: string[] = [];\n private _thumbnailEntries: ThumbnailEntry[] = [];\n private _choicePrompterEl: HTMLElement | null = null;\n private _openState: 'full' | 'half' = 'full';\n private _mobileBreakpoint = 768;\n private _isMobileViewport = false;\n private _pdpLaunched = false;\n /** True while the initial silent PDP launch request is in flight. */\n private _pdpPrimingInFlight = false;\n /** User messages queued until silent PDP priming completes. */\n private _queuedUserMessages: Array<{ text: string; attachment?: File }> = [];\n private _productContextUnavailableSku: string | null = null;\n private _i18n: ChatI18n = CHAT_I18N_TR;\n private _extendedModeManager: ExtendedModeManager | null = null;\n /** Active typewriter animation handle — cancelled on new action or drawer close. */\n private _activeTypewriter: TypewriterHandle | null = null;\n /** Active TTS audio handle — stopped on new stream start or drawer close. */\n private _activeTtsHandle: AudioHandle | null = null;\n /** Active request thread ID — guards against stale stream events from cancelled requests. */\n private _activeRequestThreadId: string | null = null;\n /** Accumulated SKU → product item map from outputText events. */\n private _skuToProductItem: Record<string, Record<string, unknown>> = {};\n /** Current conversation mode from the latest outputText event. */\n private _conversationMode: string | null = null;\n /** Whether initialization (including IDB restore) has completed. */\n private _initComplete = false;\n /** Queue of actions received before init completes. Max 10, FIFO discard. */\n private _pendingActions: Array<{\n action: ActionPayload;\n options?: { silent?: boolean; attachment?: File } | undefined;\n }> = [];\n /** Supplemental context received from host via bridge (e.g. PDP detail context). */\n private _bridgeContext: Record<string, unknown> | null = null;\n /** Last cart quantity received from host via bridge. */\n private _cartQuantity: number | null = null;\n private _threadsWithFirstBot: Set<string> = new Set();\n /** Panel state manager (snapshots, topbar, navigation). */\n private _panel: PanelManager | null = null;\n /** IndexedDB session persistence manager. */\n private _session: SessionPersistence | null = null;\n /** Registered event callbacks (GA4 event hooks). Key = event name, value = set of callbacks. */\n private _eventCallbacks = new Map<string, Set<(detail: Record<string, unknown>) => boolean | Promise<boolean>>>();\n\n protected async onInit(config: ChatWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n this._chatCreatedAt = new Date().toISOString();\n\n // Create Shadow DOM for CSS isolation\n this._shadow = this.root.attachShadow({ mode: 'open' });\n\n // Inject styles\n const style = document.createElement('style');\n style.textContent = chatStyles;\n this._shadow.appendChild(style);\n\n // Create root container\n const rootEl = document.createElement('div');\n rootEl.className = 'gengage-chat-root';\n this._rootEl = rootEl;\n this._shadow.appendChild(rootEl);\n\n // Create launcher (floating variant only — inline/overlay are triggered programmatically)\n const variant = config.variant ?? 'floating';\n if (variant === 'floating') {\n const launcherOpts: import('./components/Launcher.js').LauncherOptions = {\n onClick: () => this.open(),\n ariaLabel: this._i18n.openButton,\n };\n if (config.launcherSvg !== undefined) launcherOpts.svgMarkup = config.launcherSvg;\n if (config.hideMobileLauncher !== undefined) launcherOpts.hideMobile = config.hideMobileLauncher;\n if (config.mobileBreakpoint !== undefined) launcherOpts.mobileBreakpoint = config.mobileBreakpoint;\n if (config.launcherTooltip !== undefined) launcherOpts.tooltip = config.launcherTooltip;\n this._launcher = createLauncher(launcherOpts);\n rootEl.appendChild(this._launcher.container);\n }\n\n // Overlay variant wraps drawer in a backdrop for full-screen modal\n if (variant === 'overlay') {\n rootEl.classList.add('gengage-chat--overlay');\n }\n\n // Create drawer (hidden initially for floating/overlay, visible for inline)\n const drawerContainer = document.createElement('div');\n rootEl.appendChild(drawerContainer);\n\n this._drawer = new ChatDrawer(drawerContainer, {\n i18n: this._i18n,\n onSend: (text, attachment) => this._sendMessage(text, attachment),\n onClose: () => this.close(),\n onAttachment: (file) => this._handleAttachment(file),\n onPanelToggle: () => {\n this._drawer?.persistPanelState(config.accountId);\n },\n onRollback: (messageId) => this._handleRollback(messageId),\n onPanelBack: () => this._panel?.navigateBack(),\n onPanelForward: () => this._panel?.navigateForward(),\n headerTitle: config.headerTitle,\n headerAvatarUrl: config.headerAvatarUrl,\n headerBadge: config.headerBadge,\n headerCartUrl: config.headerCartUrl,\n headerFavoritesToggle: config.headerFavoritesToggle,\n onFavoritesClick: () => {\n ga.trackLikeList();\n config.onFavoritesClick?.();\n },\n onThumbnailClick: (threadId) => this._rollbackToThread(threadId),\n onLinkClick: (url) => {\n this._saveSessionAndOpenURL(url);\n },\n voiceEnabled: config.voiceEnabled,\n voiceLang: config.locale\n ? `${config.locale.split('-')[0] ?? 'tr'}-${(config.locale.split('-')[1] ?? config.locale.split('-')[0] ?? 'TR').toUpperCase()}`\n : undefined,\n });\n\n // Extended mode manager for host PDP maximize/minimize\n this._extendedModeManager = new ExtendedModeManager({\n onChange: (extended) => this._panel?.notifyExtension(extended),\n productDetailsInPanel: config.isDemoWebsite ?? false,\n });\n\n // Panel manager for snapshot/topbar/navigation state\n this._panel = new PanelManager({\n drawer: () => this._drawer,\n shadow: () => this._shadow,\n currentThreadId: () => this._currentThreadId,\n bridge: () => this._bridge,\n extendedModeManager: () => this._extendedModeManager,\n i18n: () => this._i18n,\n rollbackToThread: (tid) => this._rollbackToThread(tid),\n });\n\n // Hide drawer initially for floating/overlay variants\n if (variant !== 'inline') {\n this._drawer.getElement().classList.add('gengage-chat-drawer--hidden');\n }\n\n // Restore panel state from session\n const restoredCollapsedPanel = this._drawer.restorePanelState(config.accountId);\n\n // Panel mode: 'collapsed' starts hidden, 'expanded' starts open, 'auto' (default) expands when content arrives\n const panelMode = config.panelMode ?? 'auto';\n if (panelMode === 'collapsed') {\n this._drawer.setPanelCollapsed(true);\n } else if (panelMode === 'expanded') {\n this._drawer.setForceExpanded();\n } else if (!restoredCollapsedPanel) {\n // 'auto': panel starts expanded but user can toggle via chevron\n this._drawer.expandPanel();\n }\n\n // Restore session if an explicit handoff signal exists (e.g. SimRel product navigation)\n const restoreSessionId = sessionStorage.getItem('gengage_restore_session_id');\n const restoreSku = sessionStorage.getItem('gengage_restore_sku');\n const hasHandoff = !!(restoreSessionId && restoreSku);\n if (hasHandoff) {\n sessionStorage.removeItem('gengage_restore_session_id');\n sessionStorage.removeItem('gengage_restore_sku');\n }\n\n // IndexedDB persistence — best-effort, non-fatal\n try {\n const idb = new GengageIndexedDB();\n await idb.open();\n this._session = new SessionPersistence(idb);\n await this._restoreFromIndexedDB(hasHandoff);\n } catch {\n // IndexedDB unavailable — continue without persistence\n this._session = new SessionPersistence(null);\n }\n\n // Register public API on window\n this._registerPublicAPI();\n\n // Apply mobileInitialState if configured\n if (config.mobileInitialState !== undefined) {\n this._openState = config.mobileInitialState;\n }\n this._mobileBreakpoint = config.mobileBreakpoint ?? 768;\n\n this._syncViewportState();\n const onResize = () => this._syncViewportState();\n window.addEventListener('resize', onResize, { passive: true });\n this.addCleanup(() => window.removeEventListener('resize', onResize));\n\n // iOS visualViewport keyboard handling\n if (window.visualViewport) {\n const onViewportResize = () => {\n if (!this._drawerVisible || !this._isMobileViewport) return;\n const el = this._drawer?.getElement();\n if (!el) return;\n const offset = window.innerHeight - (window.visualViewport?.height ?? window.innerHeight);\n el.style.setProperty('--gengage-keyboard-offset', `${Math.max(0, offset)}px`);\n };\n window.visualViewport.addEventListener('resize', onViewportResize);\n this.addCleanup(() => window.visualViewport?.removeEventListener('resize', onViewportResize));\n }\n\n // Inline variant starts visible\n if (variant === 'inline') {\n this._drawerVisible = true;\n this.isVisible = true;\n this._applyOpenStateClasses();\n }\n\n // Communication bridge for host ↔ widget messaging\n this._bridge = new CommunicationBridge({\n namespace: 'chat',\n onMessage: (msg) => this._handleBridgeMessage(msg),\n });\n\n // Activity tracker for engagement signals & proactive popup trigger\n this._activityTracker = new ActivityTracker({\n idleThresholdMs: config.proactiveDelayMs ?? 30000,\n onActivity: (event) => {\n if (event.type === 'idle' && !this._proactiveShown && !this._drawerVisible) {\n // Check scroll depth threshold (config is 0–1 fraction, tracker reports 0–100)\n const minDepth = config.proactiveMinScrollDepth ?? 0;\n if (minDepth > 0 && (this._activityTracker?.maxScrollDepth ?? 0) < minDepth * 100) {\n return;\n }\n // Check sessionStorage guard — don't re-trigger in same session\n try {\n if (sessionStorage.getItem('gengage_proactive_shown')) return;\n } catch {\n // sessionStorage unavailable (e.g. sandboxed iframe) — proceed\n }\n // Check localStorage cooldown (like legacy 60min window)\n if (this._isProactiveCooldownActive()) return;\n\n if (config.proactiveFetchActions) {\n // Fetch backend-driven proactive actions (like legacy /chat/proactive_action)\n void this._fetchAndShowProactive();\n } else if (config.proactiveMessage) {\n // Static message from config\n this._showProactivePopup(config.proactiveMessage);\n }\n }\n },\n });\n this.addCleanup(() => this._activityTracker?.destroy());\n\n // V2 heartbeat polling (opt-in via config.enableHeartbeat)\n if (config.enableHeartbeat) {\n this._heartbeat = new HeartbeatManager({\n middlewareUrl: config.middlewareUrl,\n accountId: config.accountId,\n sessionId: config.session?.sessionId ?? '',\n locale: config.locale ?? 'tr',\n intervalMs: config.heartbeatIntervalMs ?? 30000,\n getPageType: () => this.config.pageContext?.pageType ?? 'other',\n getCurrentSku: () => this.config.pageContext?.sku ?? '',\n onMessage: (res) => {\n if (!this._proactiveShown && !this._drawerVisible && res.message) {\n // Build action buttons from heartbeat suggested_actions if available\n const heartbeatActions: ProactiveAction[] = [];\n if (res.suggested_actions && Array.isArray(res.suggested_actions)) {\n for (const sa of res.suggested_actions) {\n if (sa.title && isActionLike(sa.requestDetails)) {\n heartbeatActions.push({\n title: sa.title,\n onSelect: () => {\n this.openWithAction(sa.requestDetails as ActionPayload);\n },\n });\n }\n }\n }\n this._showProactivePopup(res.message, heartbeatActions.length > 0 ? heartbeatActions : undefined);\n }\n },\n });\n this._heartbeat.start();\n this.addCleanup(() => this._heartbeat?.destroy());\n }\n\n // Track initial SKU for page-change detection\n this._lastSku = this.config.pageContext?.sku;\n\n // Mark init complete and drain pending actions queue\n this._initComplete = true;\n for (const pending of this._pendingActions) {\n this._sendAction(pending.action, pending.options);\n }\n this._pendingActions = [];\n\n dispatch('gengage:chat:ready', {});\n ga.trackInit('chat');\n config.onReady?.();\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n if (context.sku !== undefined && context.sku !== this._lastSku) {\n this._lastSku = context.sku;\n this._resetForNewPage();\n }\n }\n\n protected onShow(): void {\n this._showDrawer();\n this.emit('open');\n dispatch('gengage:chat:open', { state: this._openState });\n ga.trackShow('chat');\n this.config.onOpen?.();\n\n // Auto-launch PDP context on first open when SKU is available\n if (!this._pdpLaunched && this.config.pageContext?.sku) {\n this._pdpLaunched = true;\n this._pdpPrimingInFlight = true;\n this._sendAction(\n {\n title: '',\n type: 'launchSingleProduct',\n payload: { sku: this.config.pageContext.sku },\n },\n { silent: true, isPdpPrime: true },\n );\n }\n }\n\n protected onHide(): void {\n // Floating mode should only hide the drawer, not the launcher button.\n // BaseWidget.hide() toggles `root.style.display = 'none'`, so undo it here.\n if ((this.config.variant ?? 'floating') === 'floating') {\n this.root.style.display = '';\n }\n this._hideDrawer();\n this.emit('close');\n dispatch('gengage:chat:close', {});\n this.config.onClose?.();\n }\n\n protected onDestroy(): void {\n this._abortControllers.forEach((c) => c.abort());\n this._abortControllers.clear();\n this._activeTypewriter?.cancel();\n this._activeTypewriter = null;\n this._activeTtsHandle?.stop();\n this._activeTtsHandle = null;\n this._bridge?.destroy();\n this._bridge = null;\n this._extendedModeManager = null;\n this._panel?.destroy();\n this._panel = null;\n this._session?.close();\n this._session = null;\n if (window.gengage) {\n delete window.gengage.chat;\n }\n if (this._shadow) {\n this._shadow.innerHTML = '';\n this._shadow = null;\n }\n this._rootEl = null;\n }\n\n // ---------------------------------------------------------------------------\n // Public API\n // ---------------------------------------------------------------------------\n\n open(options?: { state?: 'full' | 'half'; initialMessage?: string }): void {\n if (options?.state !== undefined) {\n this._openState = options.state;\n if (this._drawerVisible) {\n this._applyOpenStateClasses();\n }\n }\n this.show();\n if (options?.initialMessage !== undefined) {\n this._sendMessage(options.initialMessage);\n }\n }\n\n openWithAction(action: ActionPayload, options?: { sku?: string; state?: 'full' | 'half' }): void {\n if (options?.sku !== undefined) {\n this.update({ sku: options.sku });\n }\n // Mark PDP as launched since we're sending an explicit action\n this._pdpLaunched = true;\n // Action-triggered opens default to half-sheet on mobile\n if (options?.state !== undefined) {\n this._openState = options.state;\n } else if (this._isMobileViewport) {\n this._openState = 'half';\n }\n this.show();\n if (this._drawerVisible) {\n this._applyOpenStateClasses();\n }\n this._sendAction(action);\n }\n\n /** Send a user message programmatically (same flow as typing + submit). */\n sendMessage(text: string): void {\n this._sendMessage(text);\n }\n\n /** Send a backend action programmatically. */\n sendAction(action: ActionPayload, options?: { silent?: boolean }): void {\n this._sendAction(action, options);\n }\n\n close(): void {\n this.hide();\n }\n\n saveSession(sessionId: string, sku: string): void {\n sessionStorage.setItem('gengage_restore_session_id', sessionId);\n sessionStorage.setItem('gengage_restore_sku', sku);\n }\n\n get isOpen(): boolean {\n return this._drawerVisible;\n }\n\n /**\n * Register a callback for a GA4 event name (e.g. 'gengage-cart-add').\n * The callback receives the event detail and should return true (success) or false (failure).\n * For add-to-cart, failure triggers an error message in the chat.\n * @returns unsubscribe function\n */\n addCallback(\n eventName: string,\n callback: (detail: Record<string, unknown>) => boolean | Promise<boolean>,\n ): () => void {\n let set = this._eventCallbacks.get(eventName);\n if (!set) {\n set = new Set();\n this._eventCallbacks.set(eventName, set);\n }\n set.add(callback);\n return () => {\n set!.delete(callback);\n if (set!.size === 0) this._eventCallbacks.delete(eventName);\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n /** Reset all chat state when navigating to a different SKU/page. */\n private _resetForNewPage(): void {\n // Abort in-flight streams\n this._abortControllers.forEach((c) => c.abort());\n this._abortControllers.clear();\n // Cancel active typewriter/TTS\n this._activeTypewriter?.cancel();\n this._activeTypewriter = null;\n this._activeTtsHandle?.stop();\n this._activeTtsHandle = null;\n // Clear messages\n this._messages.length = 0;\n this._drawer?.clearMessages();\n // Clear panel\n this._drawer?.clearPanel();\n this._panel!.snapshots.clear();\n this._panel!.threads = [];\n // Clear thumbnails\n this._thumbnailEntries = [];\n this._drawer?.setThumbnails([]);\n // Reset comparison state\n this._comparisonSelectMode = false;\n this._comparisonSelectedSkus = [];\n // Reset thread cursors\n this._currentThreadId = null;\n this._lastThreadId = null;\n this._lastBackendContext = null;\n this._chatCreatedAt = new Date().toISOString();\n // Allow PDP auto-launch for new SKU\n this._pdpLaunched = false;\n this._pdpPrimingInFlight = false;\n this._queuedUserMessages = [];\n this._productContextUnavailableSku = null;\n }\n\n private _handleBridgeMessage(msg: BridgeMessage): void {\n switch (msg.type) {\n case 'openChat':\n this.open();\n break;\n case 'closeChat':\n this.close();\n break;\n case 'startNewChatWithLauncherAction': {\n // Start a new chat with a preset launcher action.\n // Legacy sends payload as the action directly: { type, title, requestDetails }\n // Clean-room also accepts nested: { action: { type, title, ... } }\n const payload = msg.payload as Record<string, unknown> | undefined;\n const nested = payload?.action;\n // Prefer nested shape, fall back to payload-is-action (legacy compat)\n const action = isActionLike(nested) ? nested : isActionLike(payload) ? payload : null;\n if (action) {\n this._sendAction(action, { silent: true });\n }\n this.open();\n break;\n }\n case 'startNewChatWithDetailContext': {\n // Start chat with product detail context (e.g., from PDP page).\n // Legacy shape: { action: {...}, sku: \"...\" }\n const ctx = msg.payload as Record<string, unknown> | undefined;\n if (ctx && typeof ctx === 'object') {\n this._bridgeContext = ctx;\n // Extract SKU and update page context so auto-PDP launch uses it\n const sku = ctx.sku as string | undefined;\n if (sku) {\n this.update({ sku });\n }\n // Extract and send the action (legacy sent action + premade context)\n if (isActionLike(ctx.action)) {\n this._pdpLaunched = true; // Skip auto-launch, explicit action takes priority\n this.open();\n this._sendAction(ctx.action);\n break;\n }\n }\n this.open();\n break;\n }\n case 'launcherAction': {\n // Send action to active chat from external trigger\n const payload = msg.payload as Record<string, unknown> | undefined;\n const action = payload?.action;\n if (action && typeof action === 'object' && 'type' in (action as Record<string, unknown>)) {\n this._sendAction(action as ActionPayload);\n }\n break;\n }\n case 'scrollToBottom':\n this._drawer?.scrollToBottomIfNeeded();\n break;\n case 'addToCardHandler': {\n // Host notifies widget of add-to-cart result\n this._bridge?.send('addToCardResult', msg.payload);\n break;\n }\n case 'cartQuantityHandler': {\n // Host sends updated cart quantity\n const payload = msg.payload as Record<string, unknown> | undefined;\n if (payload && 'quantity' in payload && typeof payload.quantity === 'number') {\n this._cartQuantity = payload.quantity;\n }\n break;\n }\n case 'minimizeRequestedByUser':\n this._extendedModeManager?.setHiddenByUser(true);\n break;\n case 'bgColorChange': {\n const payload = msg.payload as Record<string, unknown> | undefined;\n const color = payload?.color;\n if (typeof color === 'string' && isSafeCSSColor(color) && this._shadow) {\n (this._shadow.host as HTMLElement).style.setProperty('--gengage-chat-bg', color);\n }\n break;\n }\n default:\n break;\n }\n }\n\n private _registerPublicAPI(): void {\n if (!window.gengage) window.gengage = {};\n window.gengage.chat = {\n open: (opts) => this.open(opts),\n openWithAction: (action, opts) => this.openWithAction(action, opts),\n sendMessage: (text) => this.sendMessage(text),\n sendAction: (action, opts) => this.sendAction(action, opts),\n close: () => this.close(),\n saveSession: (sid, sku) => this.saveSession(sid, sku),\n get isOpen() {\n return false;\n }, // Placeholder, overridden below\n on: (event, handler) => this.on(event, handler),\n trackCheckout: (type, data) => this.trackCheckout(type, data),\n flushMeteringSummary: (data) => this.flushMeteringSummary(data),\n addCallback: (eventName, callback) => this.addCallback(eventName, callback),\n };\n // Fix isOpen getter to reflect actual state\n Object.defineProperty(window.gengage.chat, 'isOpen', {\n get: () => this._drawerVisible,\n });\n }\n\n private _showDrawer(): void {\n if (this._drawerVisible) return;\n this._drawerVisible = true;\n const el = this._drawer?.getElement();\n if (el) {\n el.classList.remove('gengage-chat-drawer--hidden');\n }\n this._applyOpenStateClasses();\n if (!(this._isMobileViewport && this._openState === 'half')) {\n this._drawer?.focusInput();\n }\n this._extendedModeManager?.setChatShown(true);\n }\n\n private _showProactivePopup(message: string, actionButtons?: ProactiveAction[]): void {\n if (this._proactiveShown || !this._rootEl) return;\n this._proactiveShown = true;\n\n // Persist across same-session page navigations\n try {\n sessionStorage.setItem('gengage_proactive_shown', '1');\n } catch {\n // sessionStorage unavailable — proceed without persistence\n }\n // Set localStorage cooldown (like legacy 60min window)\n this._setProactiveCooldown();\n\n const popupOpts: import('./components/ProactivePopup.js').ProactivePopupOptions = {\n message,\n onAccept: () => this.open(),\n onDismiss: () => {\n /* no-op — popup auto-removes itself */\n },\n ...(actionButtons && actionButtons.length > 0 && { actionButtons }),\n };\n if (this.config.proactiveAcceptLabel !== undefined) {\n popupOpts.acceptLabel = this.config.proactiveAcceptLabel;\n }\n const popup = createProactivePopup(popupOpts);\n this._rootEl.appendChild(popup);\n }\n\n /** Fetch proactive actions from backend and show popup with per-action buttons. */\n private async _fetchAndShowProactive(): Promise<void> {\n if (this._proactiveShown) return;\n try {\n const transport: import('../common/api-paths.js').ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n accountId: this.config.accountId,\n backendType: this.config.backendType ?? 'v1',\n };\n const sku = this.config.pageContext?.sku;\n const pageType = this.config.pageContext?.pageType;\n const locale = this.config.locale;\n const result = await fetchProactiveAction(\n {\n account_id: this.config.accountId,\n ...(sku && { sku }),\n ...(pageType && { page_type: pageType }),\n ...(locale && { output_language: locale }),\n },\n transport,\n );\n if (!result) return;\n\n const message = result.question ?? result.title ?? '';\n if (!message) return;\n\n // Build per-action buttons from backend response\n const actionButtons: ProactiveAction[] = [];\n if (result.actions && Array.isArray(result.actions)) {\n for (const raw of result.actions) {\n const a = raw as Record<string, unknown>;\n const title = a.title as string | undefined;\n if (title && isActionLike(a.requestDetails)) {\n const rd = a.requestDetails;\n actionButtons.push({\n title,\n onSelect: () => {\n this.openWithAction(rd);\n },\n });\n }\n }\n }\n\n this._showProactivePopup(message, actionButtons);\n } catch {\n // Non-fatal — proactive fetch failure shouldn't crash the widget\n }\n }\n\n private _proactiveCooldownKey(): string {\n return `gengage_proactive_time_${this.config.accountId}`;\n }\n\n private _isProactiveCooldownActive(): boolean {\n try {\n const ts = localStorage.getItem(this._proactiveCooldownKey());\n if (ts) {\n const elapsed = Date.now() - parseInt(ts, 10);\n // parseInt returns NaN for corrupted values → NaN < cooldown is false → no cooldown\n const cooldown = this.config.proactiveCooldownMs ?? 3_600_000; // 1 hour default\n return elapsed < cooldown;\n }\n } catch {\n // localStorage unavailable\n }\n return false;\n }\n\n private _setProactiveCooldown(): void {\n try {\n localStorage.setItem(this._proactiveCooldownKey(), String(Date.now()));\n } catch {\n // localStorage unavailable\n }\n }\n\n private _hideDrawer(): void {\n if (!this._drawerVisible) return;\n this._activeTypewriter?.cancel();\n this._activeTypewriter = null;\n this._activeTtsHandle?.stop();\n this._activeTtsHandle = null;\n this._drawerVisible = false;\n // Reset mobile open state so next launcher open defaults to full-screen\n this._openState = 'full';\n // Don't clear panel — preserve it so reopening the drawer shows the same\n // panel state. clearPanel() is reserved for SKU/page resets and stale\n // loading skeleton cleanup after streams.\n const el = this._drawer?.getElement();\n if (el) {\n el.classList.add('gengage-chat-drawer--hidden');\n }\n this._applyOpenStateClasses();\n this._extendedModeManager?.setChatShown(false);\n }\n\n private _syncViewportState(): void {\n if (!this._rootEl) return;\n this._isMobileViewport = window.innerWidth <= this._mobileBreakpoint;\n this._rootEl.classList.toggle('gengage-chat-root--mobile', this._isMobileViewport);\n\n if (this._launcher) {\n const hideLauncher = this._isMobileViewport && this.config.hideMobileLauncher === true;\n this._launcher.container.classList.toggle('gengage-chat-launcher--hidden-mobile', hideLauncher);\n }\n\n this._applyOpenStateClasses();\n }\n\n private _applyOpenStateClasses(): void {\n if (!this._rootEl) return;\n const mobileHalf = this._drawerVisible && this._isMobileViewport && this._openState === 'half';\n const mobileFull = this._drawerVisible && this._isMobileViewport && this._openState === 'full';\n this._rootEl.classList.toggle('gengage-chat-root--open', this._drawerVisible);\n this._rootEl.classList.toggle('gengage-chat-root--mobile-half', mobileHalf);\n this._rootEl.classList.toggle('gengage-chat-root--mobile-full', mobileFull);\n }\n\n private _handleAttachment(file: File): void {\n const result = validateImageFile(file);\n if (!result.ok) {\n const message = result.reason === 'invalid_type' ? this._i18n.invalidFileType : this._i18n.fileTooLarge;\n dispatch('gengage:global:error', {\n message,\n source: 'chat' as const,\n });\n return;\n }\n this._drawer?.stageAttachment(file);\n }\n\n private _sendMessage(text: string, attachment?: File): void {\n if (this._pdpPrimingInFlight) {\n this._queuedUserMessages.push(attachment !== undefined ? { text, attachment } : { text });\n return;\n }\n\n ga.trackMessageSent();\n // Track conversation start on first user message in a new thread\n const hasUserMessages = this._messages.some((m) => m.role === 'user');\n if (!hasUserMessages) {\n ga.trackConversationStart();\n }\n const action: ActionPayload = {\n title: text,\n type: 'user_message',\n payload: text,\n };\n if (attachment !== undefined) {\n this._sendAction(action, { attachment });\n } else {\n this._sendAction(action);\n }\n }\n\n private _flushQueuedUserMessages(): void {\n if (this._pdpPrimingInFlight || this._queuedUserMessages.length === 0) return;\n const queued = [...this._queuedUserMessages];\n this._queuedUserMessages = [];\n for (const item of queued) {\n this._sendMessage(item.text, item.attachment);\n }\n }\n\n private _sendAction(\n action: ActionPayload,\n options?: { silent?: boolean; attachment?: File; preservePanel?: boolean; isPdpPrime?: boolean },\n ): void {\n // Cancel any running typewriter animation and TTS playback\n this._activeTypewriter?.cancel();\n this._activeTypewriter = null;\n this._activeTtsHandle?.stop();\n this._activeTtsHandle = null;\n\n // Defer actions until init completes\n if (!this._initComplete) {\n if (this._pendingActions.length < 10) {\n this._pendingActions.push({ action, options });\n }\n return;\n }\n\n // Remove ChoicePrompter on new action\n this._choicePrompterEl?.remove();\n this._choicePrompterEl = null;\n\n // Branch deletion: if user is sending from a rewound position, prune future messages\n if (this._currentThreadId && this._lastThreadId && this._lastThreadId > this._currentThreadId) {\n const cutoff = this._currentThreadId;\n // Remove future messages from array\n const removed = this._messages.filter((m) => m.threadId !== undefined && m.threadId > cutoff);\n this._messages = this._messages.filter((m) => !m.threadId || m.threadId <= cutoff);\n // Remove their DOM nodes\n for (const msg of removed) {\n this._shadow?.querySelector(`[data-message-id=\"${CSS.escape(msg.id)}\"]`)?.remove();\n this._panel!.snapshots.delete(msg.id);\n this._panel!.snapshotTypes.delete(msg.id);\n }\n // Remove orphaned inline UISpec elements\n const orphanedUISpecs = this._shadow?.querySelectorAll(`[data-thread-id]`);\n orphanedUISpecs?.forEach((el) => {\n if (el instanceof HTMLElement && el.dataset['threadId'] && el.dataset['threadId'] > cutoff) {\n el.remove();\n }\n });\n }\n\n // Clear previous suggestion pills and input chips\n this._drawer?.setPills([]);\n this._drawer?.clearInputAreaChips();\n\n // Notify host that assistant is responding\n this._bridge?.send('isResponding', true);\n\n // Generate thread ID for this request-response cycle\n const threadId = uuidv7();\n this._currentThreadId = threadId;\n this._lastThreadId = threadId;\n // Preserve the active grid intent during product drilldowns. A product click\n // should not relabel an existing search-result panel as \"similar products\".\n if (this._panel && action.type !== 'launchSingleProduct') {\n this._panel.lastActionType = action.type;\n }\n // For preservePanel actions (like/addToCart), don't overwrite _activeRequestThreadId\n // to avoid silencing concurrent streams. Instead, track validity locally.\n const isPreservePanel = options?.preservePanel === true;\n const isPdpAutoLaunch =\n action.type === 'launchSingleProduct' && options?.silent === true && options?.isPdpPrime === true;\n if (!isPreservePanel) {\n this._activeRequestThreadId = threadId;\n }\n\n // Add user message to UI (skip for silent/auto-launch actions)\n if (!options?.silent) {\n const userMsg = this._createMessage('user', typeof action.payload === 'string' ? action.payload : action.title);\n userMsg.threadId = threadId;\n if (options?.attachment !== undefined) {\n userMsg.attachment = options.attachment;\n }\n this._drawer?.addMessage(userMsg);\n this._messages.push(userMsg);\n }\n\n const shouldShortCircuitUnavailableContext =\n !options?.silent &&\n this._hasUnavailableProductContext() &&\n (action.type === 'user_message' || action.type === 'inputText');\n if (shouldShortCircuitUnavailableContext) {\n const fallback = this._i18n.productNotFoundMessage;\n const botMsg = this._createMessage('assistant', fallback);\n botMsg.threadId = threadId;\n botMsg.status = 'done';\n this._messages.push(botMsg);\n this._ensureAssistantMessageRendered(botMsg);\n this._drawer?.updateBotMessage(botMsg.id, fallback);\n this._bridge?.send('isResponding', false);\n this.emit('message', botMsg);\n this._persistToIndexedDB().catch(() => {\n /* non-fatal */\n });\n return;\n }\n\n // Keep panel visible during search — show loading skeleton instead of collapsing.\n // Skip for preservePanel actions (like/addToCart) that shouldn't disrupt current panel.\n if (!options?.preservePanel) {\n if (this._drawer?.hasPanelContent()) {\n this._drawer.showPanelLoading();\n } else {\n this._drawer?.clearPanel();\n }\n }\n\n // Show typing indicator\n this._drawer?.showTypingIndicator();\n // Use a local text accumulator per stream invocation to prevent corruption\n // when multiple concurrent preservePanel streams write to the same state.\n let localBotText = '';\n\n // Create bot message placeholder\n const botMsg = this._createMessage('assistant', '');\n botMsg.threadId = threadId;\n botMsg.status = 'streaming';\n if (options?.silent) botMsg.silent = true;\n // Note: silent flag only skips the USER message above — bot response is always rendered\n this._messages.push(botMsg);\n\n // Abort previous request(s) — skip for preservePanel to avoid killing concurrent streams\n if (!options?.preservePanel) {\n this._abortControllers.forEach((c) => c.abort());\n this._abortControllers.clear();\n }\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n ...(this.config.backendType ? { backendType: this.config.backendType } : {}),\n ...(this.config.accountId ? { accountId: this.config.accountId } : {}),\n };\n if (options?.attachment !== undefined) {\n transport.attachment = options.attachment;\n }\n\n const visibleMessages = this._getVisibleMessages();\n const chatHistory = visibleMessages\n .filter((m) => m.content)\n .slice(-50)\n .map((m) => ({\n role: m.role === 'user' ? 'user' : 'model',\n content: m.content ?? '',\n }));\n\n // Build meta object for v1 backend\n const meta: BackendRequestMeta = {\n outputLanguage: localeToOutputLanguage(this.config.locale),\n parentUrl: window.location.href,\n windowWidth: String(window.innerWidth),\n windowHeight: String(window.innerHeight),\n selfUrl: '',\n id: this.config.session?.sessionId ?? '',\n userId: this.config.session?.userId ?? '',\n appId: this.config.accountId,\n threads: [],\n createdAt: this._chatCreatedAt,\n kvkkApproved: isKvkkShown(this.config.accountId),\n voiceEnabled: this.config.voiceEnabled ?? false,\n threadId,\n isControlGroup: this.config.session?.abTestVariant === 'control',\n isMobile: this._isMobileViewport,\n };\n if (this.config.session?.viewId !== undefined) {\n meta.viewId = this.config.session.viewId;\n }\n\n // Enrich action payload with fields the backend expects\n const enrichedAction = enrichActionPayload(action, {\n pageContext: this.config.pageContext,\n backendContext: this._lastBackendContext,\n isMobile: this._isMobileViewport,\n });\n\n const request: import('./api.js').ProcessActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n type: enrichedAction.type,\n locale: this.config.locale ?? 'tr',\n meta,\n context: {\n // Spread backend context (panel, message_id, etc.) but preserve FE's\n // authoritative chatHistory — the backend's stale `messages` must not\n // overwrite the up-to-date conversation history built by the widget.\n ...(this._lastBackendContext ?? {}),\n messages: chatHistory,\n // V1 backend reads session_id from context (not top-level).\n // Include here for V1 compatibility; V2 uses thread_id from meta.\n session_id: this.config.session?.sessionId ?? '',\n },\n };\n\n // Only set optional fields when values exist (exactOptionalPropertyTypes)\n if (this.config.session?.userId !== undefined) {\n request.user_id = this.config.session.userId;\n }\n if (this.config.session?.viewId !== undefined) {\n request.view_id = this.config.session.viewId;\n }\n if (enrichedAction.payload !== undefined) {\n request.payload = enrichedAction.payload;\n }\n if (this.config.pageContext?.sku !== undefined) {\n request.sku = this.config.pageContext.sku;\n }\n if (this.config.pageContext?.pageType !== undefined) {\n request.page_type = this.config.pageContext.pageType;\n }\n\n // Analytics tracking state for this request\n const requestId = crypto.randomUUID();\n const streamStart = Date.now();\n let chunkIndex = 0;\n let panelLoadingSeen = false;\n let panelContentReceived = false;\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'process_action',\n request_id: requestId,\n widget: 'chat',\n }),\n );\n\n let streamController: AbortController | null = null;\n streamController = sendChatMessage(\n request,\n {\n onTextChunk: (content, isFinal, extra) => {\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n localBotText += content;\n this._drawer?.removeTypingIndicator();\n\n // Store enrichment data from outputText for downstream rendering\n if (extra?.skuToProductItem) {\n this._skuToProductItem = { ...this._skuToProductItem, ...extra.skuToProductItem };\n }\n if (extra?.conversationMode) {\n this._conversationMode = extra.conversationMode;\n }\n\n this.track(\n streamChunkEvent(this.analyticsContext(), {\n request_id: requestId,\n chunk_index: chunkIndex++,\n widget: 'chat',\n }),\n );\n\n if (!this._drawer) return;\n\n // KVKK filtering: always strip KVKK block from display text.\n // Show banner on first encounter only.\n let displayText = localBotText;\n if (isFinal && containsKvkk(displayText)) {\n const acctId = this.config.accountId;\n if (!isKvkkShown(acctId)) {\n const kvkkHtml = extractKvkkBlock(displayText);\n if (kvkkHtml) {\n this._drawer?.showKvkkBanner(kvkkHtml, () => {\n this._drawer?.hideKvkkBanner();\n });\n }\n markKvkkShown(acctId);\n }\n displayText = stripKvkkBlock(displayText);\n }\n\n // Check if we already have a bot bubble in the DOM (query by message ID, not :last-child)\n const existingBubble = this._shadow?.querySelector(\n `[data-message-id=\"${botMsg.id}\"] .gengage-chat-bubble-text`,\n );\n if (existingBubble) {\n existingBubble.innerHTML = sanitizeHtml(displayText);\n } else {\n botMsg.content = displayText;\n if (botMsg.role === 'assistant' && botMsg.threadId && !this._threadsWithFirstBot.has(botMsg.threadId)) {\n this._threadsWithFirstBot.add(botMsg.threadId);\n this._drawer.markFirstBotMessage(botMsg.id);\n }\n this._drawer.addMessage(botMsg);\n }\n\n if (isFinal) {\n botMsg.content = displayText;\n botMsg.status = 'done';\n ga.trackMessageReceived();\n\n // Apply typewriter animation to the final bot text\n const bubbleTextEl = this._shadow?.querySelector(\n `[data-message-id=\"${botMsg.id}\"] .gengage-chat-bubble-text`,\n ) as HTMLElement | null;\n if (bubbleTextEl) {\n this._activeTypewriter?.cancel();\n const mentions = extra?.productMentions;\n this._activeTypewriter = typewriteHtml({\n container: bubbleTextEl,\n html: sanitizeHtml(displayText),\n onTick: () => this._drawer?.scrollToBottomIfNeeded(),\n onComplete: () => {\n this._activeTypewriter = null;\n // Link product mentions after typewriter finishes\n if (mentions && mentions.length > 0 && bubbleTextEl) {\n linkProductMentions({\n container: bubbleTextEl,\n mentions,\n onProductClick: (sku) => {\n this._sendAction({\n title: mentions.find((m) => m.sku === sku)?.short_name ?? sku,\n type: 'launchSingleProduct',\n payload: { sku },\n });\n },\n });\n }\n },\n });\n }\n }\n },\n onUISpec: (spec, widget, panelHint) => {\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n if (widget !== 'chat') return;\n\n const rootElement = spec.elements[spec.root];\n const componentType = rootElement?.type ?? 'unknown';\n this.track(\n streamUiSpecEvent(this.analyticsContext(), {\n request_id: requestId,\n chunk_index: chunkIndex,\n component_type: componentType,\n widget: 'chat',\n }),\n );\n\n const renderContext = this._buildRenderContext();\n\n // GA dataLayer: track component-specific events\n if (componentType === 'ComparisonTable') {\n const products = rootElement?.props?.['products'];\n ga.trackCompareReceived(Array.isArray(products) ? products.length : 0);\n }\n if (componentType === 'ProductGrid') {\n const childCount = rootElement?.children?.length ?? 0;\n ga.trackSearch(undefined, childCount);\n }\n\n const panelSpec = panelHint === 'panel' && this._panel ? this._panel.toPanelSpec(spec) : spec;\n const shouldRenderInline =\n !botMsg.silent &&\n (panelHint !== 'panel' || componentType === 'ProductCard') &&\n componentType !== 'ActionButtons'; // ActionButtons render as bottom pills only\n\n if (panelHint === 'panel' && this._panel) {\n panelContentReceived = true;\n\n // productDetailsSimilars: append to existing ProductDetailsPanel instead of replacing\n // Never append to loading skeleton — always replace it\n if (\n rootElement?.props?.['similarsAppend'] === true &&\n this._panel.currentType === 'ProductDetailsPanel' &&\n this._drawer?.hasPanelContent() &&\n !this._drawer.isPanelLoading()\n ) {\n this._appendSimilarsToPanel(panelSpec, renderContext);\n } else if (\n componentType === 'ProductGrid' &&\n this._drawer?.hasPanelContent() &&\n !this._drawer.isPanelLoading()\n ) {\n // Append ProductGrid (similar products) below existing panel content\n this._drawer.appendPanelContent(this._renderUISpec(panelSpec, renderContext));\n } else {\n // Reset comparison state when new panel content replaces the grid\n this._comparisonSelectMode = false;\n this._comparisonSelectedSkus = [];\n this._drawer?.setPanelContent(this._renderUISpec(panelSpec, renderContext));\n this._panel.currentType = componentType;\n }\n\n if (componentType === 'ProductDetailsPanel' && action.type === 'launchSingleProduct') {\n this._clearUnavailableProductContext();\n }\n\n // Track panel thread and update topbar + extended mode\n if (botMsg.threadId && !this._panel.threads.includes(botMsg.threadId)) {\n this._panel.threads.push(botMsg.threadId);\n }\n // Use the primary panel type for title (don't let appended grids overwrite it).\n // Backend-provided panelTitle (e.g. search results title) takes precedence.\n const titleType = this._panel.currentType ?? componentType;\n const backendTitle = rootElement?.props?.['panelTitle'] as string | undefined;\n this._panel.updateTopBar(titleType, backendTitle);\n this._panel.updateExtendedMode(componentType);\n }\n\n // ProductDetailsPanel goes to the panel, but also render a compact\n // horizontal ProductSummaryCard in chat messages (production parity\n // with the prior engine's LaunchSingleProduct component).\n if (componentType === 'ProductDetailsPanel' && !botMsg.silent && panelHint === 'panel') {\n const product = rootElement?.props?.['product'] as Record<string, unknown> | undefined;\n if (product) {\n const inlineSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'ProductSummaryCard',\n props: { product },\n },\n },\n };\n const messagesContainer = this._shadow?.querySelector('.gengage-chat-messages');\n if (messagesContainer) {\n const inline = this._renderUISpec(inlineSpec, renderContext);\n if (botMsg.threadId) {\n inline.dataset['threadId'] = botMsg.threadId;\n }\n messagesContainer.appendChild(inline);\n inline.scrollIntoView({ behavior: 'auto', block: 'end' });\n }\n }\n }\n\n if (shouldRenderInline) {\n const messagesContainer = this._shadow?.querySelector('.gengage-chat-messages');\n if (messagesContainer) {\n const inline = this._renderUISpec(spec, renderContext);\n if (botMsg.threadId) {\n inline.dataset['threadId'] = botMsg.threadId;\n }\n messagesContainer.appendChild(inline);\n inline.scrollIntoView({ behavior: 'auto', block: 'end' });\n }\n }\n\n // Track product thumbnails for ThumbnailsColumn\n if ((componentType === 'ProductGrid' || componentType === 'ProductCard') && botMsg.threadId) {\n const childIds = rootElement?.children ?? [];\n const products =\n componentType === 'ProductGrid'\n ? (childIds\n .map((id) => spec.elements[id]?.props?.['product'] as Record<string, unknown> | undefined)\n .filter(Boolean) as Record<string, unknown>[])\n : ([rootElement?.props?.['product'] as Record<string, unknown> | undefined].filter(Boolean) as Record<\n string,\n unknown\n >[]);\n\n for (const product of products) {\n const sku = product['sku'] as string | undefined;\n const imageUrl = product['imageUrl'] as string | undefined;\n if (sku && imageUrl) {\n this._thumbnailEntries.push({ sku, imageUrl, threadId: botMsg.threadId });\n }\n }\n this._drawer?.setThumbnails(this._thumbnailEntries);\n }\n\n // Send preview images to host for launcher thumbnails\n if (componentType === 'ProductGrid' || componentType === 'ProductDetailsPanel') {\n const previewProducts =\n componentType === 'ProductGrid'\n ? ((rootElement?.children ?? [])\n .map((id) => spec.elements[id]?.props?.['product'] as Record<string, unknown> | undefined)\n .filter(Boolean) as Record<string, unknown>[])\n : ([\n (rootElement?.props?.['product'] ?? rootElement?.props) as Record<string, unknown> | undefined,\n ].filter(Boolean) as Record<string, unknown>[]);\n const previewImageUrls = previewProducts\n .map((p) => p['imageUrl'] as string | undefined)\n .filter((url): url is string => typeof url === 'string')\n .slice(0, 5);\n if (previewImageUrls.length > 0) {\n this._bridge?.send('previewImages', { images: previewImageUrls });\n }\n }\n\n // Show ChoicePrompter when ProductGrid in panel and comparison mode is not active\n if (\n componentType === 'ProductGrid' &&\n panelHint === 'panel' &&\n !this._comparisonSelectMode &&\n !isChoicePrompterDismissed()\n ) {\n this._choicePrompterEl?.remove();\n this._shadow?.querySelectorAll('.gengage-chat-choice-prompter').forEach((el) => el.remove());\n this._choicePrompterEl = createChoicePrompter({\n heading: this._i18n.choicePrompterHeading,\n suggestion: this._i18n.choicePrompterSuggestion,\n ctaLabel: this._i18n.choicePrompterCta,\n onCtaClick: () => {\n this._comparisonSelectMode = true;\n this._choicePrompterEl = null;\n this._refreshComparisonUI();\n },\n onDismiss: () => {\n this._choicePrompterEl = null;\n },\n });\n // Mount into the visible pane. On mobile (and when panel is collapsed),\n // panel can be off-screen; mounting there makes CTA unreachable.\n const shouldMountInConversation = this._isMobileViewport || this._drawer?.isPanelCollapsed();\n const mountSelector = shouldMountInConversation ? '.gengage-chat-conversation' : '.gengage-chat-panel';\n const mountEl = this._shadow?.querySelector(mountSelector);\n if (mountEl) {\n mountEl.appendChild(this._choicePrompterEl);\n } else {\n this._choicePrompterEl = null;\n }\n }\n\n // Extract suggestion pills / input-area chips from ActionButtons UISpec\n if (componentType === 'ActionButtons') {\n const buttons = rootElement?.props?.['buttons'] as\n | Array<{\n label: string;\n action: ActionPayload;\n icon?: string;\n image?: string;\n description?: string;\n }>\n | undefined;\n if (buttons && buttons.length > 0) {\n const inputChips: Array<{ label: string; icon?: string | undefined; action: ActionPayload }> = [];\n const pillButtons: typeof buttons = [];\n\n for (const btn of buttons) {\n if (isInputAreaAction(btn)) {\n const chip: { label: string; icon?: string | undefined; action: ActionPayload } = {\n label: btn.label,\n action: btn.action,\n };\n if (btn.icon) chip.icon = btn.icon;\n inputChips.push(chip);\n } else {\n pillButtons.push(btn);\n }\n }\n\n if (inputChips.length > 0) {\n this._drawer?.setInputAreaChips(\n inputChips.map((chip) => ({\n label: chip.label,\n onAction: () => this._sendAction(chip.action),\n ...(chip.icon ? { icon: chip.icon } : {}),\n })),\n );\n }\n\n if (pillButtons.length > 0) {\n this._drawer?.setPills(\n pillButtons.map((btn) => {\n const pill: {\n label: string;\n onAction: () => void;\n icon?: string;\n image?: string;\n description?: string;\n } = {\n label: btn.label,\n onAction: () => this._sendAction(btn.action),\n };\n if (btn.icon) pill.icon = btn.icon;\n if (btn.image) pill.image = btn.image;\n if (btn.description) pill.description = btn.description;\n return pill;\n }),\n );\n }\n }\n }\n\n botMsg.uiSpec = spec;\n },\n onAction: (event: StreamEvent) => {\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n if (event.type === 'action') {\n const routerOpts: ActionRouterOptions = {};\n if (this.config.actionHandling?.unknownActionPolicy !== undefined) {\n routerOpts.unknownActionPolicy = this.config.actionHandling.unknownActionPolicy;\n }\n if (this.config.actionHandling?.allowScriptCall !== undefined) {\n routerOpts.allowScriptCall = this.config.actionHandling.allowScriptCall;\n }\n routeStreamAction(\n event as StreamEventAction,\n {\n openChat: () => this.open(),\n navigate: (params) => {\n this._bridge?.send('navigate', params);\n if (params.newTab) {\n window.open(params.url, '_blank', 'noopener,noreferrer');\n } else {\n window.location.href = params.url;\n }\n },\n saveSession: (params) => this.saveSession(params.sessionId, params.sku),\n addToCart: (params) => {\n dispatch('gengage:similar:add-to-cart', params);\n },\n scriptCall: (params) => {\n dispatch('gengage:chat:script-call', params);\n this.config.onScriptCall?.(params);\n },\n },\n routerOpts,\n );\n }\n },\n onMetadata: (event: StreamEvent) => {\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n if (event.type === 'metadata' && event.meta) {\n // Store backend context for sending with next request\n if (\n event.meta.panel !== undefined ||\n event.meta.messages !== undefined ||\n event.meta.message_id !== undefined\n ) {\n this._lastBackendContext = event.meta as import('../common/types.js').BackendContext;\n }\n\n // Panel loading indicator\n if (event.meta.panelLoading) {\n panelLoadingSeen = true;\n panelContentReceived = false;\n const pendingType =\n typeof event.meta.panelPendingType === 'string' ? event.meta.panelPendingType : undefined;\n if (this._panel) this._panel.currentType = null;\n this._drawer?.showPanelLoading(pendingType);\n // Set panel topbar title immediately so it's not an empty white bar\n if (pendingType) {\n this._panel?.updateTopBarForLoading(pendingType);\n }\n }\n\n // Optional voice payload emitted by v1 backend when voiceEnabled is true.\n if (event.meta.voice) {\n // Dispatch cancelable event — host can call preventDefault() to suppress built-in playback\n const voiceEvent = new CustomEvent('gengage:chat:voice', {\n detail: { payload: event.meta.voice },\n bubbles: false,\n cancelable: true,\n });\n const allowed = window.dispatchEvent(voiceEvent);\n ga.trackVoiceInput();\n\n // Built-in TTS playback (skipped if host called preventDefault)\n if (allowed) {\n const voicePayload = event.meta.voice as { audio_base64?: string; content_type?: string };\n if (voicePayload.audio_base64) {\n this._activeTtsHandle?.stop();\n this._activeTtsHandle = playTtsAudio(\n voicePayload.audio_base64,\n voicePayload.content_type ?? 'audio/ogg',\n );\n }\n }\n }\n\n if (event.meta.redirectTarget || event.meta.redirect) {\n dispatch('gengage:chat:redirect', {\n target: event.meta.redirectTarget ?? null,\n payload: event.meta.redirect ?? null,\n });\n }\n\n // Analyze animation — show panel loading skeleton with pulse\n if (event.meta.analyzeAnimation) {\n panelLoadingSeen = true;\n panelContentReceived = false;\n if (this._panel) this._panel.currentType = null;\n this._drawer?.showPanelLoading();\n // Default to product details title during analyze\n this._panel?.updateTopBarForLoading('productDetails');\n }\n\n // Thinking step messages — accumulate as checklist in typing indicator\n if (event.meta.loading && typeof event.meta.loadingText === 'string') {\n this._drawer?.addThinkingStep(event.meta.loadingText);\n this._bridge?.send('loadingMessage', { text: event.meta.loadingText });\n }\n\n // Forward visitor engagement data to host page\n if (event.meta.visitorDataResponse) {\n this._bridge?.send('engagingMessage', event.meta.visitorDataResponse);\n }\n\n // Forward form events to host via bridge (Otokoc-specific)\n if (event.meta.formType) {\n this._bridge?.send('glovOtokoc', {\n type: event.meta.formType,\n data: event.meta.formPayload,\n });\n }\n\n // Forward launcher content to host via bridge\n if (event.meta.launcherContent) {\n this._bridge?.send('launcherContent', event.meta.launcherContent);\n }\n\n dispatch('gengage:chat:metadata', { payload: event.meta });\n\n // Extract LLM usage from metadata if present\n const meta = event.meta;\n if (typeof meta.prompt_tokens === 'number' && typeof meta.completion_tokens === 'number') {\n this.track(\n llmUsageEvent(this.analyticsContext(), {\n model: event.model ?? 'unknown',\n prompt_tokens: meta.prompt_tokens as number,\n completion_tokens: meta.completion_tokens as number,\n total_tokens:\n (meta.total_tokens as number) ??\n (meta.prompt_tokens as number) + (meta.completion_tokens as number),\n }),\n );\n }\n }\n },\n onError: (err) => {\n if (streamController) this._abortControllers.delete(streamController);\n // Skip error handling for aborted/superseded requests (including when no active request)\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n this._bridge?.send('isResponding', false);\n this._bridge?.send('loadingMessage', { text: null });\n this._drawer?.removeTypingIndicator();\n // Capture panel state before resetting — needed for error gating below\n const hadPanelContent = panelContentReceived;\n if (panelLoadingSeen && !panelContentReceived && this._drawer?.isPanelLoading()) {\n this._drawer.clearPanel();\n }\n panelLoadingSeen = false;\n panelContentReceived = false;\n // Skip error toast when the stream already delivered user-facing content\n // (bot text, panel content, or silent auto-launch). Showing a generic\n // error on top of an already-rendered assistant response is confusing.\n const hasContent =\n botMsg.silent ||\n (botMsg.content != null && botMsg.content.length > 0) ||\n localBotText.length > 0 ||\n hadPanelContent;\n if (!hasContent) {\n if (isPdpAutoLaunch || this._hasUnavailableProductContext()) {\n // Show soft fallback instead of generic error for auto-launch\n const fallback = this._i18n.productNotFoundMessage;\n botMsg.content = fallback;\n botMsg.status = 'done';\n this._ensureAssistantMessageRendered(botMsg);\n this._drawer?.updateBotMessage(botMsg.id, fallback);\n this._markUnavailableProductContext();\n } else {\n // Show error inline in the chat — not as a global toast.\n // The user is in an active conversation; a toast on top of the\n // chat is confusing and can overlap with prior bot messages.\n this.emit('error', err);\n this._drawer?.showError(this._i18n.errorMessage);\n }\n }\n if (isPdpAutoLaunch) {\n this._pdpPrimingInFlight = false;\n this._flushQueuedUserMessages();\n }\n // Only overwrite status if message hasn't already completed (isFinal text chunk sets 'done')\n if (botMsg.status === 'streaming') {\n botMsg.status = 'error';\n }\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'STREAM_ERROR',\n error_message: err.message,\n widget: 'chat',\n }),\n );\n },\n onDone: () => {\n if (streamController) this._abortControllers.delete(streamController);\n // Skip cleanup for aborted/superseded requests\n if (!isPreservePanel && threadId !== this._activeRequestThreadId) return;\n this._activeRequestThreadId = null;\n this._bridge?.send('isResponding', false);\n this._bridge?.send('loadingMessage', { text: null });\n this._drawer?.removeTypingIndicator();\n if (panelLoadingSeen && !panelContentReceived && this._drawer?.isPanelLoading()) {\n this._drawer.clearPanel();\n }\n panelLoadingSeen = false;\n panelContentReceived = false;\n // Detect failed PDP auto-launch: silent launch action that produced\n // no visible content (no bot text, no panel). Show a soft fallback\n // message so the user isn't left with an empty chat.\n if (isPdpAutoLaunch && !localBotText && !panelContentReceived) {\n const fallback = this._i18n.productNotFoundMessage;\n botMsg.content = fallback;\n this._ensureAssistantMessageRendered(botMsg);\n this._drawer?.updateBotMessage(botMsg.id, fallback);\n this._markUnavailableProductContext();\n }\n if (isPdpAutoLaunch) {\n this._pdpPrimingInFlight = false;\n this._flushQueuedUserMessages();\n }\n\n if (botMsg.status === 'streaming') {\n botMsg.status = 'done';\n ga.trackMessageReceived();\n }\n this.emit('message', botMsg);\n\n // Snapshot current panel content for this message's history\n this._panel?.snapshotForMessage(botMsg.id);\n // Make the bot message bubble clickable to restore its panel state\n this._panel?.attachClickHandler(botMsg.id);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - streamStart,\n chunk_count: chunkIndex,\n widget: 'chat',\n }),\n );\n\n this.track(\n meteringIncrementEvent(this.analyticsContext(), {\n meter_key: 'chat_request',\n quantity: 1,\n unit: 'request',\n }),\n );\n\n this.track(\n chatHistorySnapshotEvent(this.analyticsContext(), {\n message_count: this._messages.length,\n history_ref: this.config.session?.sessionId ?? '',\n redaction_level: 'none',\n }),\n );\n\n // Persist session to IndexedDB (fire-and-forget)\n this._persistToIndexedDB().catch(() => {\n /* non-fatal */\n });\n },\n },\n transport,\n );\n this._abortControllers.add(streamController);\n }\n\n /** Return messages visible at the current thread cursor. */\n private _getVisibleMessages(): ChatMessage[] {\n const msgs = this._messages.filter((m) => !m.silent);\n if (!this._currentThreadId) return msgs;\n const cutoff = this._currentThreadId;\n return msgs.filter((m) => !m.threadId || m.threadId <= cutoff);\n }\n\n /** Handle rollback-on-click from a user message bubble. */\n private _appendSimilarsToPanel(spec: UISpec, ctx: import('../chat/types.js').ChatUISpecRenderContext): void {\n if (!this._drawer) return;\n const panelEl = this._drawer.getPanelContentElement();\n if (!panelEl) return;\n const heading = document.createElement('h3');\n heading.className = 'gengage-chat-product-details-similars-heading';\n heading.textContent = this._i18n.similarProductsLabel ?? 'Benzer Ürünler';\n panelEl.appendChild(heading);\n const grid = this._renderUISpec(spec, ctx);\n grid.classList.add('gengage-chat-product-details-similars');\n panelEl.appendChild(grid);\n }\n\n private _handleRollback(messageId: string): void {\n const msg = this._messages.find((m) => m.id === messageId);\n if (!msg?.threadId) return;\n this._rollbackToThread(msg.threadId);\n }\n\n /** Rewind the conversation to the given thread. */\n private _rollbackToThread(threadId: string): void {\n this._currentThreadId = threadId;\n this._extendedModeManager?.setHiddenByUser(false);\n\n // Toggle visibility of messages after the cutoff\n for (const msg of this._messages) {\n const bubble = this._shadow?.querySelector(`[data-message-id=\"${CSS.escape(msg.id)}\"]`);\n if (!bubble) continue;\n if (msg.threadId && msg.threadId > threadId) {\n bubble.classList.add('gengage-chat-bubble--hidden');\n } else {\n bubble.classList.remove('gengage-chat-bubble--hidden');\n }\n }\n\n // Hide inline UISpec elements from future threads\n this._shadow?.querySelectorAll('[data-thread-id]').forEach((el) => {\n if (el instanceof HTMLElement && el.dataset['threadId'] && el.dataset['threadId'] > threadId) {\n el.classList.add('gengage-chat-bubble--hidden');\n } else if (el instanceof HTMLElement) {\n el.classList.remove('gengage-chat-bubble--hidden');\n }\n });\n\n // Restore panel snapshot from the target thread's bot message\n const targetBot = this._messages.find((m) => m.role === 'assistant' && m.threadId === threadId);\n const restored = targetBot ? this._panel?.restoreForMessage(targetBot.id) : false;\n if (!restored) {\n this._drawer?.clearPanel();\n }\n // Always update topbar navigation state for the new thread position\n const panelType = this._panel!.currentType ?? '';\n this._panel?.updateTopBar(panelType);\n\n // Clear suggestion pills (they belong to the latest thread)\n this._drawer?.setPills([]);\n\n // Load context from IndexedDB for the target thread so the next request\n // sends the correct historical context (not the latest one).\n if (this._session?.db && this.config.session?.sessionId) {\n this._session?.db\n .loadContext(this.config.session.sessionId, threadId)\n .then((ctx) => {\n if (ctx) this._lastBackendContext = ctx.context;\n })\n .catch(() => {\n /* non-fatal */\n });\n }\n\n // Prune future context entries from IndexedDB\n if (this._session?.db && this.config.session?.sessionId) {\n this._session?.db.deleteContextsAfterThread(this.config.session.sessionId, threadId).catch(() => {\n /* non-fatal */\n });\n }\n }\n\n // ---------------------------------------------------------------------------\n // IndexedDB persistence (delegates to SessionPersistence)\n // ---------------------------------------------------------------------------\n\n private async _persistToIndexedDB(): Promise<void> {\n if (!this._session || !this.config.session?.sessionId) return;\n await this._session.persist({\n userId: this.config.session.userId ?? '',\n appId: this.config.accountId,\n sessionId: this.config.session.sessionId,\n messages: this._messages,\n currentThreadId: this._currentThreadId,\n lastThreadId: this._lastThreadId,\n chatCreatedAt: this._chatCreatedAt,\n panelSnapshots: this._panel?.snapshots ?? new Map(),\n panelThreads: this._panel?.threads ?? [],\n thumbnailEntries: this._thumbnailEntries,\n lastBackendContext: this._lastBackendContext,\n sku: this.config.pageContext?.sku,\n });\n }\n\n private _isSameOriginUrl(url: string): boolean {\n try {\n if (!url.trim()) return false;\n const parsed = new URL(url, window.location.href);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n }\n\n private _markUnavailableProductContext(): void {\n this._productContextUnavailableSku = this.config.pageContext?.sku ?? null;\n }\n\n private _clearUnavailableProductContext(): void {\n this._productContextUnavailableSku = null;\n }\n\n private _hasUnavailableProductContext(): boolean {\n const currentSku = this.config.pageContext?.sku;\n return currentSku !== undefined && currentSku.length > 0 && this._productContextUnavailableSku === currentSku;\n }\n\n private _ensureAssistantMessageRendered(msg: ChatMessage): void {\n const bubble = this._shadow?.querySelector(`[data-message-id=\"${CSS.escape(msg.id)}\"]`);\n if (bubble || !this._drawer) return;\n if (msg.role === 'assistant' && msg.threadId && !this._threadsWithFirstBot.has(msg.threadId)) {\n this._threadsWithFirstBot.add(msg.threadId);\n this._drawer.addMessage(msg);\n this._drawer.markFirstBotMessage(msg.id);\n return;\n }\n this._drawer.addMessage(msg);\n }\n\n private async _saveSessionAndOpenURL(url: string): Promise<void> {\n if (!this._session) return;\n await this._session.saveAndOpenURL(url, () => this._persistToIndexedDB(), this._bridge);\n }\n\n private async _loadPayload(threadId: string, messageId: string): Promise<import('../common/types.js').UISpec | null> {\n if (!this._session) return null;\n return this._session.loadPayload(threadId, messageId);\n }\n\n /**\n * Attempt to restore chat session from IndexedDB.\n * Always restores when IDB has session data for the current sessionId.\n * Best-effort — failures are silently ignored.\n */\n private async _restoreFromIndexedDB(shouldRestore: boolean): Promise<void> {\n if (!this._session?.db) return;\n const sessionId = this.config.session?.sessionId;\n if (!sessionId) return;\n\n const userId = this.config.session?.userId ?? '';\n const appId = this.config.accountId;\n\n // Always restore favorites (user preference, not session state)\n await this._session.loadFavorites(userId, appId);\n\n // Only restore chat state on explicit handoff (e.g. SimRel product navigation)\n if (!shouldRestore) return;\n\n const session = await this._session.db?.loadSession(userId, appId, sessionId);\n if (!session || session.messages.length === 0) return;\n\n // Don't restore a session saved for a different SKU\n const currentSku = this.config.pageContext?.sku;\n if (currentSku && session.sku && session.sku !== currentSku) return;\n\n // Prevent duplicate auto-launch: session already has messages, so PDP launch already happened\n this._pdpLaunched = true;\n\n // Lock auto-scroll during restore to prevent visual jump\n this._drawer?.lockScrollForRestore();\n\n // Restore thread cursors and creation timestamp\n this._currentThreadId = session.currentThreadId;\n this._lastThreadId = session.lastThreadId;\n this._chatCreatedAt = session.createdAt;\n\n // Restore panel threads and thumbnail entries\n if (session.panelThreads) {\n this._panel!.threads = session.panelThreads;\n }\n if (session.thumbnailEntries) {\n this._thumbnailEntries = session.thumbnailEntries;\n this._drawer?.setThumbnails(this._thumbnailEntries);\n }\n\n // Restore panel snapshots from serialized HTML (sanitize for defense-in-depth)\n if (session.panelSnapshotHtml) {\n for (const [msgId, html] of Object.entries(session.panelSnapshotHtml)) {\n const container = document.createElement('div');\n container.innerHTML = sanitizeHtml(html);\n this._panel!.snapshots.set(msgId, container);\n }\n }\n\n // Track highest message ID to avoid collisions with new messages\n let maxMsgNum = 0;\n\n // Replay messages into DOM\n for (const msg of session.messages) {\n const chatMsg: ChatMessage = {\n id: msg.id,\n role: msg.role,\n timestamp: msg.timestamp,\n status: msg.status,\n };\n if (msg.threadId !== undefined) chatMsg.threadId = msg.threadId;\n if (msg.content !== undefined) chatMsg.content = msg.content;\n if (msg.silent) chatMsg.silent = true;\n\n this._messages.push(chatMsg);\n\n // Skip silent messages from DOM rendering\n if (chatMsg.silent) continue;\n\n if (chatMsg.role === 'assistant' && chatMsg.threadId && !this._threadsWithFirstBot.has(chatMsg.threadId)) {\n this._threadsWithFirstBot.add(chatMsg.threadId);\n this._drawer?.markFirstBotMessage(chatMsg.id);\n }\n this._drawer?.addMessage(chatMsg);\n\n // Track message ID counter\n const idNum = parseInt(msg.id.replace('msg-', ''), 10);\n if (!isNaN(idNum) && idNum > maxMsgNum) maxMsgNum = idNum;\n\n // Re-render inline UISpec elements for bot messages (load from payload store)\n if (chatMsg.role === 'assistant' && chatMsg.threadId) {\n const uiSpec = await this._loadPayload(chatMsg.threadId, chatMsg.id);\n if (uiSpec) {\n chatMsg.uiSpec = uiSpec;\n this._restoreInlineUISpec(chatMsg);\n this._panel?.attachClickHandler(chatMsg.id);\n // Clear after render to maintain lean pattern\n delete chatMsg.uiSpec;\n }\n }\n }\n\n // Advance message ID counter past restored messages\n if (maxMsgNum > this._currentMessageId) {\n this._currentMessageId = maxMsgNum;\n }\n\n // Restore backend context with fallback chain\n if (this._currentThreadId) {\n let ctx = await this._session.db?.loadContext(sessionId, this._currentThreadId);\n if (!ctx) {\n ctx = await this._session.db?.loadLatestContext(sessionId);\n }\n if (ctx) this._lastBackendContext = ctx.context;\n }\n\n // Restore panel for the current thread's latest bot message\n if (this._currentThreadId) {\n const panelBot = [...this._messages]\n .reverse()\n .find((m) => m.role === 'assistant' && m.threadId === this._currentThreadId && !m.silent);\n if (panelBot && this._panel!.snapshots.has(panelBot.id)) {\n this._panel?.restoreForMessage(panelBot.id);\n }\n }\n\n // Apply thread visibility — hide messages from future threads\n if (this._currentThreadId) {\n const cutoff = this._currentThreadId;\n for (const msg of this._messages) {\n if (msg.threadId && msg.threadId > cutoff) {\n const bubble = this._shadow?.querySelector(`[data-message-id=\"${CSS.escape(msg.id)}\"]`);\n bubble?.classList.add('gengage-chat-bubble--hidden');\n }\n }\n this._shadow?.querySelectorAll('[data-thread-id]').forEach((el) => {\n if (el instanceof HTMLElement && el.dataset['threadId'] && el.dataset['threadId'] > cutoff) {\n el.classList.add('gengage-chat-bubble--hidden');\n }\n });\n }\n\n // Update panel topbar if we have panel threads\n if (this._panel!.threads.length > 0 && this._currentThreadId) {\n const lastPanelThread = this._panel!.threads[this._panel!.threads.length - 1];\n if (lastPanelThread) {\n const lastPanelBot = [...this._messages]\n .reverse()\n .find((m) => m.role === 'assistant' && m.threadId === lastPanelThread);\n if (lastPanelBot?.threadId) {\n const uiSpec = await this._loadPayload(lastPanelBot.threadId, lastPanelBot.id);\n if (uiSpec) {\n const rootEl = uiSpec.elements[uiSpec.root];\n if (rootEl) {\n this._panel?.updateTopBar(rootEl.type);\n }\n }\n }\n }\n }\n\n // After lockout expires, scroll to last thread boundary instead of absolute bottom\n setTimeout(() => {\n this._drawer?.scrollToLastThread();\n }, 550);\n }\n\n /**\n * Toggle comparison mode or individual SKU selection, then refresh the DOM.\n * Extracted so both the render-context callback and DOM-created checkboxes\n * share the same state-mutation + refresh path.\n */\n private _toggleComparisonSku(sku: string): void {\n if (sku === '') {\n this._comparisonSelectMode = !this._comparisonSelectMode;\n if (!this._comparisonSelectMode) {\n this._comparisonSelectedSkus = [];\n ga.trackCompareClear();\n }\n } else {\n const idx = this._comparisonSelectedSkus.indexOf(sku);\n if (idx >= 0) {\n this._comparisonSelectedSkus = this._comparisonSelectedSkus.filter((s) => s !== sku);\n } else {\n this._comparisonSelectedSkus = [...this._comparisonSelectedSkus, sku];\n ga.trackComparePreselection(sku);\n }\n }\n this._refreshComparisonUI();\n }\n\n /**\n * Refresh the panel DOM to reflect the current comparison state without\n * full re-render. Updates: toggle button active class, checkbox overlays\n * on product cards, and the floating comparison button.\n */\n private _refreshComparisonUI(): void {\n const panelEl = this._shadow?.querySelector('.gengage-chat-panel');\n if (!panelEl) return;\n\n const gridWrapper = panelEl.querySelector('.gengage-chat-product-grid-wrapper');\n if (!gridWrapper) return;\n const grid = gridWrapper.querySelector('.gengage-chat-product-grid');\n if (!grid) return;\n\n // 1. Toggle comparison button active state\n const toggleBtn = gridWrapper.querySelector('.gengage-chat-comparison-toggle-btn');\n if (toggleBtn) {\n toggleBtn.classList.toggle('gengage-chat-comparison-toggle-btn--active', this._comparisonSelectMode);\n }\n\n // 2. Add or remove checkbox overlays on product cards\n if (this._comparisonSelectMode) {\n const cards = grid.querySelectorAll<HTMLElement>('.gengage-chat-product-card[data-sku]');\n for (const card of cards) {\n if (card.parentElement?.classList.contains('gengage-chat-comparison-select-wrapper')) {\n // Already wrapped — sync checked state\n const cb = card.parentElement.querySelector<HTMLInputElement>('.gengage-chat-comparison-checkbox');\n if (cb) cb.checked = this._comparisonSelectedSkus.includes(card.dataset['sku']!);\n continue;\n }\n const sku = card.dataset['sku']!;\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-chat-comparison-select-wrapper';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'gengage-chat-comparison-checkbox';\n checkbox.checked = this._comparisonSelectedSkus.includes(sku);\n checkbox.addEventListener('change', () => {\n this._toggleComparisonSku(sku);\n });\n card.parentNode!.insertBefore(wrapper, card);\n wrapper.appendChild(checkbox);\n wrapper.appendChild(card);\n }\n } else {\n // Remove all checkbox wrappers\n const wrappers = grid.querySelectorAll('.gengage-chat-comparison-select-wrapper');\n for (const wrapper of wrappers) {\n const card = wrapper.querySelector('.gengage-chat-product-card');\n if (card && wrapper.parentNode) {\n wrapper.parentNode.insertBefore(card, wrapper);\n wrapper.remove();\n }\n }\n }\n\n // 3. Update floating comparison button\n const existingFloating = gridWrapper.querySelector('.gengage-chat-comparison-floating-btn');\n if (this._comparisonSelectMode && this._comparisonSelectedSkus.length >= 2) {\n const label = this._i18n.compareSelected ?? 'Karşılaştır';\n const text = `${label} (${this._comparisonSelectedSkus.length})`;\n if (existingFloating) {\n existingFloating.textContent = text;\n } else {\n const btn = document.createElement('button');\n btn.className = 'gengage-chat-comparison-floating-btn';\n btn.type = 'button';\n btn.textContent = text;\n btn.addEventListener('click', () => {\n ga.trackCompareSelected(this._comparisonSelectedSkus);\n this._sendAction({\n title: label,\n type: 'getComparisonTable',\n payload: { sku_list: [...this._comparisonSelectedSkus] },\n });\n });\n gridWrapper.appendChild(btn);\n }\n } else {\n existingFloating?.remove();\n }\n }\n\n /**\n * Build a ChatUISpecRenderContext with all callbacks wired up.\n * Used both during streaming and during session restore.\n */\n private _buildRenderContext(): ChatUISpecRenderContext {\n const ctx: ChatUISpecRenderContext = {\n onAction: (action) => {\n ga.trackSuggestedQuestion(action.title, action.type);\n if (action.type === 'findSimilar') {\n const sku =\n typeof action.payload === 'object' && action.payload !== null && 'sku' in action.payload\n ? String((action.payload as Record<string, unknown>).sku)\n : '';\n ga.trackFindSimilars(sku);\n }\n if (action.type === 'getComparisonTable') {\n ga.trackCompareSelected(this._comparisonSelectedSkus);\n }\n // addToCart/like actions should preserve the current panel (product cards stay visible)\n const preservePanel = action.type === 'addToCart' || action.type === 'like';\n this._sendAction(action, preservePanel ? { preservePanel: true } : undefined);\n },\n onProductClick: (params) => {\n ga.trackProductDetail(params.sku);\n // Demo mode: load product in-chat via launchSingleProduct (no navigation)\n // Production mode: navigate to product page (chat auto-opens on new page)\n const shouldNavigate = this.config.isDemoWebsite !== true && this._isSameOriginUrl(params.url);\n if (!shouldNavigate) {\n this._sendAction({\n title: params.sku,\n type: 'launchSingleProduct',\n payload: { sku: params.sku },\n });\n } else {\n dispatch('gengage:similar:product-click', {\n sku: params.sku,\n url: params.url,\n sessionId: this.config.session?.sessionId ?? null,\n });\n this._saveSessionAndOpenURL(params.url);\n }\n },\n onAddToCart: (params) => {\n ga.trackCartAdd(params.sku, params.quantity);\n const detail = {\n ...params,\n sessionId: this.config.session?.sessionId ?? null,\n };\n dispatch('gengage:chat:add-to-cart', detail);\n this._bridge?.send('addToCart', params);\n void this._runEventCallbacks('gengage-cart-add', detail as unknown as Record<string, unknown>);\n // Send addToCart action to backend — preservePanel keeps current products visible\n this._sendAction(\n {\n title: 'Sepete Ekle',\n type: 'addToCart',\n payload: { sku: params.sku, cart_code: params.cartCode, quantity: params.quantity },\n },\n { preservePanel: true },\n );\n },\n onProductSelect: (product) => {\n const detailSpec: import('../common/types.js').UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'ProductDetailsPanel',\n props: { product },\n },\n },\n };\n this._drawer?.setPanelContent(this._renderUISpec(detailSpec, ctx));\n },\n i18n: this._i18n,\n pricing: this.config.pricing,\n productSort: this._productSort,\n onSortChange: (sort) => {\n this._productSort = sort;\n },\n comparisonSelectMode: this._comparisonSelectMode,\n comparisonSelectedSkus: this._comparisonSelectedSkus,\n onToggleComparisonSku: (sku) => {\n this._toggleComparisonSku(sku);\n },\n favoritedSkus: this._session?.favoritedSkus ?? new Set(),\n onFavoriteToggle: (sku, product) => {\n ga.trackLikeProduct(sku);\n void this._toggleFavorite(sku, product);\n // Send like action to backend — preservePanel keeps current products visible\n const productName = (product['name'] as string | undefined) ?? sku;\n this._sendAction(\n {\n title: productName,\n type: 'like',\n payload: { sku },\n },\n { preservePanel: true },\n );\n },\n };\n return ctx;\n }\n\n private async _toggleFavorite(sku: string, product: Record<string, unknown>): Promise<void> {\n if (!this._session) return;\n const userId = this.config.session?.userId ?? '';\n const appId = this.config.accountId;\n await this._session.toggleFavorite(userId, appId, sku, product);\n }\n\n /**\n * Run registered callbacks for a GA4 event.\n * If any callback returns false or throws, handle the failure (e.g. show error for cart-add).\n */\n private async _runEventCallbacks(eventName: string, detail: Record<string, unknown>): Promise<void> {\n const callbacks = this._eventCallbacks.get(eventName);\n if (!callbacks || callbacks.size === 0) return;\n\n for (const cb of callbacks) {\n try {\n const result = cb(detail);\n const success = result instanceof Promise ? await result : result;\n if (success === false) {\n this._handleCallbackFailure(eventName, detail);\n return;\n }\n } catch {\n this._handleCallbackFailure(eventName, detail);\n return;\n }\n }\n }\n\n /**\n * Handle a callback failure — for add-to-cart, show an error message in chat.\n */\n private _handleCallbackFailure(eventName: string, _detail: Record<string, unknown>): void {\n if (eventName === 'gengage-cart-add') {\n const errorText = 'Üzgünüm sepete ekleyemedim, bir sorunla karşılaştım.';\n const botMsg = this._createMessage('assistant', errorText);\n if (this._currentThreadId) botMsg.threadId = this._currentThreadId;\n this._messages.push(botMsg);\n this._drawer?.addMessage(botMsg);\n // Note: _sendAction is NOT called here — onAddToCart already sent the backend\n // request unconditionally. Sending again would duplicate the cart-add action.\n }\n }\n\n /**\n * Re-render inline UISpec elements for a restored bot message.\n * Inserts them into the messages container after the message bubble.\n */\n private _restoreInlineUISpec(chatMsg: ChatMessage): void {\n if (!chatMsg.uiSpec || !this._drawer) return;\n const spec = chatMsg.uiSpec;\n const rootElement = spec.elements[spec.root];\n if (!rootElement) return;\n\n const componentType = rootElement.type;\n\n // ActionButtons are rendered as pills/chips, not inline\n if (componentType === 'ActionButtons') return;\n\n // Panel-only components should not be rendered inline.\n // Note: panelHint is a StreamEvent property not stored in UISpec elements,\n // so we identify panel-only status by component type.\n // ProductDetailsPanel is panel-only but gets a compact ProductSummaryCard below.\n // ComparisonTable is always panel-only.\n // ProductGrid with similarsAppend is panel-appended, not inline.\n if (componentType === 'ComparisonTable') return;\n if (componentType === 'ProductGrid' && rootElement.props?.['similarsAppend'] === true) return;\n\n const renderContext = this._buildRenderContext();\n const messagesContainer = this._shadow?.querySelector('.gengage-chat-messages');\n if (!messagesContainer) return;\n\n // ProductDetailsPanel: synthesize a compact ProductSummaryCard for inline rendering\n if (componentType === 'ProductDetailsPanel') {\n const product = rootElement.props?.['product'] as Record<string, unknown> | undefined;\n if (!product) return;\n const inlineSpec: UISpec = {\n root: 'root',\n elements: { root: { type: 'ProductSummaryCard', props: { product } } },\n };\n const inline = this._renderUISpec(inlineSpec, renderContext);\n if (chatMsg.threadId) inline.dataset['threadId'] = chatMsg.threadId;\n messagesContainer.appendChild(inline);\n return;\n }\n\n const inline = this._renderUISpec(spec, renderContext);\n if (chatMsg.threadId) {\n inline.dataset['threadId'] = chatMsg.threadId;\n }\n messagesContainer.appendChild(inline);\n }\n\n private _createMessage(role: 'user' | 'assistant', content: string): ChatMessage {\n this._currentMessageId++;\n return {\n id: `msg-${this._currentMessageId}`,\n role,\n content,\n timestamp: Date.now(),\n status: 'done',\n };\n }\n\n private _resolveI18n(config: ChatWidgetConfig): ChatI18n {\n const base = resolveChatLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry(): ChatUISpecRegistry {\n const baseRegistry = createDefaultChatUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: ChatUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultChatUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: ChatUISpecRenderContext) =>\n renderUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<ChatUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Convenience factory\n// ---------------------------------------------------------------------------\n\nexport function createChatWidget(): GengageChat {\n return new GengageChat();\n}\n\nexport type {\n ChatWidgetConfig,\n ChatMessage,\n ChatSession,\n ChatUIComponents,\n ChatI18n,\n ChatRendererConfig,\n ChatUISpecRenderContext,\n ChatUISpecRegistry,\n ProductSortState,\n SerializableChatMessage,\n} from './types.js';\nexport {\n renderUISpec,\n createDefaultChatUISpecRegistry,\n defaultChatUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { UISpecRenderContext } from './components/renderUISpec.js';\nexport { chatCatalog } from './catalog.js';\nexport type { ChatCatalog, ChatComponentName } from './catalog.js';\n","import { consumeStream } from '../common/streaming.js';\nimport { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { adaptV1Event } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent, UISpec } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface LauncherActionRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n page_type?: string;\n locale?: string;\n output_language?: string;\n mode?: string;\n}\n\nexport interface LauncherActionResult {\n uiSpecs: UISpec[];\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n}\n\nexport async function fetchLauncherActions(\n request: LauncherActionRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<LauncherActionResult> {\n const url = buildChatEndpointUrl('launcher_action', transport);\n const result: LauncherActionResult = { uiSpecs: [], actions: [] };\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const streamOpts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n\n if (!normalized) return;\n\n if (normalized.type === 'ui_spec') {\n result.uiSpecs.push(normalized.spec);\n }\n\n if (normalized.type === 'ui_spec' && normalized.spec.elements) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ActionButton' && el.props?.['action']) {\n const action = el.props['action'] as { title: string; type: string; payload?: unknown };\n result.actions.push(action);\n }\n }\n }\n },\n };\n if (signal !== undefined) streamOpts.signal = signal;\n\n await consumeStream(response, streamOpts);\n\n return result;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface ButtonRowOptions {\n actions: Array<{ title: string; type: string; payload?: unknown }>;\n onAction: (action: ActionPayload) => void;\n ctaText?: string;\n defaultCtaText?: string;\n onOpenChat?: () => void;\n orientation?: 'horizontal' | 'vertical';\n quickQuestionsAriaLabel?: string;\n}\n\nexport function renderButtonRow(options: ButtonRowOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-buttons';\n container.setAttribute('role', 'group');\n container.setAttribute('aria-label', options.quickQuestionsAriaLabel ?? 'Quick questions');\n\n if (options.orientation === 'vertical') {\n container.style.flexDirection = 'column';\n }\n\n for (const action of options.actions) {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.textContent = action.title;\n button.type = 'button';\n button.addEventListener('click', () => {\n const actionPayload: ActionPayload = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) actionPayload.payload = action.payload;\n options.onAction(actionPayload);\n });\n container.appendChild(button);\n }\n\n if (options.ctaText || options.onOpenChat) {\n const cta = document.createElement('button');\n cta.className = 'gengage-qna-cta';\n cta.textContent = options.ctaText ?? options.defaultCtaText ?? 'Başka bir şey sor';\n cta.type = 'button';\n cta.addEventListener('click', () => {\n options.onOpenChat?.();\n });\n container.appendChild(cta);\n }\n\n return container;\n}\n","import type { ActionPayload } from '../../common/types.js';\n\nexport interface TextInputOptions {\n placeholders?: string | string[];\n ctaLabel?: string;\n defaultInputPlaceholder?: string;\n askQuestionAriaLabel?: string;\n sendButtonText?: string;\n sendQuestionAriaLabel?: string;\n onSubmit: (action: ActionPayload) => void;\n}\n\nexport function renderTextInput(options: TextInputOptions): HTMLElement {\n const container = document.createElement('div');\n container.className = 'gengage-qna-input-wrapper';\n\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'gengage-qna-input';\n input.setAttribute('aria-label', options.askQuestionAriaLabel ?? 'Ask a question');\n\n // Rotating placeholders\n const placeholders = Array.isArray(options.placeholders)\n ? options.placeholders\n : options.placeholders\n ? [options.placeholders]\n : [options.defaultInputPlaceholder ?? 'Bir soru sorun...'];\n\n let placeholderIndex = 0;\n input.placeholder = placeholders[0] ?? '';\n\n let rotateTimer: ReturnType<typeof setInterval> | null = null;\n let fadeTimer: ReturnType<typeof setTimeout> | null = null;\n if (placeholders.length > 1) {\n rotateTimer = setInterval(() => {\n input.classList.add('gengage-qna-input--fade');\n fadeTimer = setTimeout(() => {\n placeholderIndex = (placeholderIndex + 1) % placeholders.length;\n input.placeholder = placeholders[placeholderIndex] ?? '';\n input.classList.remove('gengage-qna-input--fade');\n }, 180);\n }, 3000);\n }\n\n const sendBtn = document.createElement('button');\n sendBtn.className = 'gengage-qna-send';\n sendBtn.type = 'button';\n sendBtn.textContent = options.ctaLabel ?? options.sendButtonText ?? 'Sor';\n sendBtn.setAttribute('aria-label', options.sendQuestionAriaLabel ?? 'Send question');\n\n const submit = () => {\n const text = input.value.trim();\n if (!text) return;\n options.onSubmit({\n title: text,\n type: 'user_message',\n // Align with chat composer: user_message payload is plain string.\n payload: text,\n });\n input.value = '';\n };\n\n sendBtn.addEventListener('click', submit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n submit();\n }\n });\n\n container.appendChild(input);\n container.appendChild(sendBtn);\n\n // Cleanup method\n (container as HTMLElement & { _cleanup?: () => void })._cleanup = () => {\n if (rotateTimer) clearInterval(rotateTimer);\n if (fadeTimer) clearTimeout(fadeTimer);\n };\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, UIElement, ActionPayload } from '../../common/types.js';\nimport type { QNAUISpecRenderContext } from '../types.js';\nimport { renderButtonRow } from './ButtonRow.js';\nimport { renderTextInput } from './TextInput.js';\n\nexport type QNAUISpecRegistry = UISpecDomRegistry<QNAUISpecRenderContext>;\n\nfunction toActionPayload(raw: unknown, labelFallback?: string): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const type = obj['type'];\n if (typeof type !== 'string' || type.length === 0) return null;\n\n const titleRaw = obj['title'];\n const payload = obj['payload'];\n const title = typeof titleRaw === 'string' && titleRaw.length > 0 ? titleRaw : labelFallback;\n if (!title) return null;\n\n const action: ActionPayload = { title, type };\n if (payload !== undefined) action.payload = payload;\n return action;\n}\n\nfunction actionPayloadToRowAction(action: ActionPayload): { title: string; type: string; payload?: unknown } {\n const rowAction: { title: string; type: string; payload?: unknown } = {\n title: action.title,\n type: action.type,\n };\n if (action.payload !== undefined) rowAction.payload = action.payload;\n return rowAction;\n}\n\nfunction collectButtonRowActions(element: UIElement, spec: UISpec): ActionPayload[] {\n const actions: ActionPayload[] = [];\n\n const directActions = element.props?.['actions'];\n if (Array.isArray(directActions)) {\n for (const rawAction of directActions) {\n const normalized = toActionPayload(rawAction);\n if (normalized) actions.push(normalized);\n }\n }\n\n const directButtons = element.props?.['buttons'];\n if (Array.isArray(directButtons)) {\n for (const rawButton of directButtons) {\n if (!rawButton || typeof rawButton !== 'object') continue;\n const obj = rawButton as Record<string, unknown>;\n const label = typeof obj['label'] === 'string' ? obj['label'] : undefined;\n const action = toActionPayload(obj['action'], label);\n if (action) actions.push(action);\n }\n }\n\n if (element.children) {\n for (const childId of element.children) {\n const child = spec.elements[childId];\n if (!child || child.type !== 'ActionButton') continue;\n const label = typeof child.props?.['label'] === 'string' ? child.props['label'] : undefined;\n const action = toActionPayload(child.props?.['action'], label);\n if (action) actions.push(action);\n }\n }\n\n // Deduplicate by title — backend may provide same actions via props and children\n const seen = new Set<string>();\n return actions.filter((a) => {\n if (seen.has(a.title)) return false;\n seen.add(a.title);\n return true;\n });\n}\n\nconst DEFAULT_QNA_UI_SPEC_REGISTRY: QNAUISpecRegistry = {\n ButtonRow: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const orientation = element.props?.['orientation'];\n\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n if (orientation === 'horizontal' || orientation === 'vertical') options.orientation = orientation;\n return renderButtonRow(options);\n },\n\n ActionButtons: ({ element, spec, context }) => {\n const rowActions = collectButtonRowActions(element, spec).map(actionPayloadToRowAction);\n const options: import('./ButtonRow.js').ButtonRowOptions = {\n actions: rowActions,\n onAction: context.onAction,\n defaultCtaText: context.i18n.defaultCtaText,\n quickQuestionsAriaLabel: context.i18n.quickQuestionsAriaLabel,\n };\n if (context.onOpenChat !== undefined) options.onOpenChat = context.onOpenChat;\n if (context.ctaText !== undefined) options.ctaText = context.ctaText;\n return renderButtonRow(options);\n },\n\n ActionButton: ({ element, context }) => {\n const button = document.createElement('button');\n button.className = 'gengage-qna-button';\n button.type = 'button';\n\n const label = element.props?.['label'];\n if (typeof label === 'string') {\n button.textContent = label;\n } else {\n button.textContent = context.i18n.defaultCtaText;\n }\n\n const action = toActionPayload(element.props?.['action'], typeof label === 'string' ? label : undefined);\n if (action) {\n button.addEventListener('click', () => context.onAction(action));\n }\n return button;\n },\n\n TextInput: ({ element, context }) => {\n const placeholder = element.props?.['placeholder'];\n const placeholders =\n typeof placeholder === 'string' || Array.isArray(placeholder) ? placeholder : context.inputPlaceholder;\n // Keep input submit label independent from the quick-question CTA text.\n const ctaLabel = typeof element.props?.['ctaLabel'] === 'string' ? element.props['ctaLabel'] : undefined;\n\n const options: import('./TextInput.js').TextInputOptions = {\n onSubmit: context.onAction,\n askQuestionAriaLabel: context.i18n.askQuestionAriaLabel,\n defaultInputPlaceholder: context.i18n.defaultInputPlaceholder,\n sendButtonText: context.i18n.sendButton,\n sendQuestionAriaLabel: context.i18n.sendQuestionAriaLabel,\n };\n if (placeholders !== undefined) options.placeholders = placeholders;\n if (ctaLabel !== undefined) options.ctaLabel = ctaLabel;\n return renderTextInput(options);\n },\n\n QuestionHeading: ({ element }) => {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n const text = element.props?.['text'];\n heading.textContent = typeof text === 'string' ? text : '';\n return heading;\n },\n\n // ProductCard: no-op — QNA renders only question pills + text input.\n // Backend may send ProductCard but QNA intentionally skips it;\n // the product is shown once chat opens via openWithAction().\n ProductCard: () => null,\n};\n\nexport const defaultQnaUnknownUISpecRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:qna] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultQnaUISpecRegistry(): QNAUISpecRegistry {\n return { ...DEFAULT_QNA_UI_SPEC_REGISTRY };\n}\n\nexport function renderQnaUISpec(\n spec: UISpec,\n context: QNAUISpecRenderContext,\n registry = DEFAULT_QNA_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<QNAUISpecRenderContext> = defaultQnaUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-qna-uispec',\n unknownRenderer,\n });\n}\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_TR: QNAI18n = {\n quickQuestionsAriaLabel: 'Hızlı sorular',\n askQuestionAriaLabel: 'Soru sorun',\n defaultInputPlaceholder: 'Bir soru sorun...',\n sendButton: 'Sor',\n sendQuestionAriaLabel: 'Soruyu gönder',\n defaultCtaText: 'Başka bir şey sor',\n};\n","import type { QNAI18n } from '../types.js';\n\nexport const QNA_I18N_EN: QNAI18n = {\n quickQuestionsAriaLabel: 'Quick questions',\n askQuestionAriaLabel: 'Ask a question',\n defaultInputPlaceholder: 'Ask a question...',\n sendButton: 'Ask',\n sendQuestionAriaLabel: 'Send question',\n defaultCtaText: 'Ask something else',\n};\n","import type { QNAI18n } from '../types.js';\nimport { QNA_I18N_TR } from './tr.js';\nimport { QNA_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveQnaLocale(locale?: string): QNAI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return QNA_I18N_EN;\n default:\n return QNA_I18N_TR;\n }\n}\n\nexport { QNA_I18N_TR, QNA_I18N_EN };\n","/**\n * QNA widget -- public entry point.\n *\n * Renders contextual action buttons (and an optional free-text input) on\n * product or content pages. When a user taps a button, the widget opens\n * the Chat widget with that action pre-loaded.\n *\n * Backend: POST /chat/launcher_action\n * Protocol: NDJSON stream -> json-render UISpec -> ActionButton / ButtonRow / TextInput\n */\n\nimport type { ActionPayload, PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchLauncherActions } from './api.js';\nimport * as ga from '../common/ga-datalayer.js';\nimport {\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n renderQnaUISpec,\n} from './components/renderUISpec.js';\nimport type { QNAWidgetConfig, QNAI18n, QNAUISpecRenderContext } from './types.js';\nimport { QNA_I18N_TR, resolveQnaLocale } from './locales/index.js';\n\n// Inline CSS import marker - Vite will bundle this\nimport './components/qna.css';\n\nexport class GengageQNA extends BaseWidget<QNAWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: QNAI18n = QNA_I18N_TR;\n\n protected async onInit(config: QNAWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-qna-container';\n this.root.appendChild(this._contentEl);\n\n const sku = config.pageContext?.sku;\n if (sku) {\n this._lastSku = sku;\n await this._fetchAndRender(sku);\n }\n\n this.isVisible = true;\n ga.trackInit('qna');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n\n // Debounce rapid SPA navigations\n if (this._debounceTimer) clearTimeout(this._debounceTimer);\n this._debounceTimer = setTimeout(() => {\n this._debounceTimer = null;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }, 50);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.2s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched data for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._debounceTimer) {\n clearTimeout(this._debounceTimer);\n this._debounceTimer = null;\n }\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n /** Clean up TextInput placeholder rotation timers to prevent interval leaks. */\n private _cleanupTextInputTimers(): void {\n if (!this._contentEl) return;\n const wrappers = this._contentEl.querySelectorAll('.gengage-qna-input-wrapper');\n for (const wrapper of wrappers) {\n (wrapper as HTMLElement & { _cleanup?: () => void })._cleanup?.();\n }\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n\n if (!this._contentEl) return;\n // Clean up TextInput timers before clearing DOM to prevent interval leaks\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n\n // Show loading dots\n const loading = this._createLoadingIndicator();\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'launcher_action',\n request_id: requestId,\n widget: 'qna',\n }),\n );\n\n try {\n const launcherReq: import('./api.js').LauncherActionRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n locale: this.config.locale ?? 'tr',\n };\n const pageType = this.config.pageContext?.pageType;\n if (pageType !== undefined) launcherReq.page_type = pageType;\n\n const result = await fetchLauncherActions(launcherReq, transport, this._abortController.signal);\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: result.actions.length,\n widget: 'qna',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: result.actions.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'qna',\n }),\n );\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n const hasQuestionHeading = this._specIncludesType(result.uiSpecs, 'QuestionHeading');\n\n // Render heading if configured and backend didn't provide one\n if (!hasQuestionHeading && this.config.showStaticQuestion && this.config.staticQuestionText) {\n const heading = document.createElement('h3');\n heading.className = 'gengage-qna-heading';\n heading.textContent = this.config.staticQuestionText;\n this._contentEl.appendChild(heading);\n }\n\n const cfgPlaceholders = this.config.inputPlaceholder;\n const effectivePlaceholders =\n result.actions.length > 0 && cfgPlaceholders === true\n ? result.actions.map((a) => a.title)\n : cfgPlaceholders === true\n ? this._i18n.defaultInputPlaceholder\n : (cfgPlaceholders ?? this._i18n.defaultInputPlaceholder);\n\n const renderContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n onOpenChat: this._openChatHandler,\n };\n if (this.config.ctaText !== undefined) renderContext.ctaText = this.config.ctaText;\n if (effectivePlaceholders !== undefined) renderContext.inputPlaceholder = effectivePlaceholders;\n\n const fallbackSpec = this._buildFallbackActionsSpec(result.actions);\n const specsToRender = result.uiSpecs.length > 0 ? result.uiSpecs : [fallbackSpec];\n const nonEmptySpecs = specsToRender.filter((spec) => Object.keys(spec.elements).length > 0);\n\n for (const spec of nonEmptySpecs) {\n const rendered = this._renderUISpec(spec, renderContext);\n this._contentEl.appendChild(rendered);\n }\n\n if (nonEmptySpecs.length > 0) {\n ga.trackShow('qna');\n }\n\n const shouldRenderStandaloneInput = !this._specIncludesType(nonEmptySpecs, 'TextInput');\n if (shouldRenderStandaloneInput) {\n this._appendStandaloneInput(renderContext, effectivePlaceholders);\n }\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'qna',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'qna',\n }),\n );\n\n // Keep QNA usable during backend hiccups: render at least free-text input.\n if (this._contentEl) {\n this._cleanupTextInputTimers();\n this._contentEl.innerHTML = '';\n const fallbackPlaceholders =\n this.config.inputPlaceholder === true\n ? this._i18n.defaultInputPlaceholder\n : (this.config.inputPlaceholder ?? this._i18n.defaultInputPlaceholder);\n const fallbackContext: QNAUISpecRenderContext = {\n onAction: this._actionHandler,\n i18n: this._i18n,\n onOpenChat: this._openChatHandler,\n };\n if (this.config.ctaText !== undefined) fallbackContext.ctaText = this.config.ctaText;\n this._appendStandaloneInput(fallbackContext, fallbackPlaceholders);\n }\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:qna] Failed to fetch launcher actions:', err);\n }\n }\n }\n\n private _createLoadingIndicator(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'gengage-qna-loading';\n for (let i = 0; i < 3; i++) {\n const dot = document.createElement('div');\n dot.className = 'gengage-qna-loading-dot';\n el.appendChild(dot);\n }\n return el;\n }\n\n private _resolveI18n(config: QNAWidgetConfig): QNAI18n {\n const base = resolveQnaLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultQnaUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _renderUISpec(spec: UISpec, context: QNAUISpecRenderContext): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultQnaUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: QNAUISpecRenderContext) =>\n renderQnaUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<QNAUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _specIncludesType(specs: UISpec[], type: string): boolean {\n for (const spec of specs) {\n for (const element of Object.values(spec.elements)) {\n if (element.type === type) return true;\n }\n }\n return false;\n }\n\n private _buildFallbackActionsSpec(actions: Array<{ title: string; type: string; payload?: unknown }>): UISpec {\n if (actions.length === 0) {\n return { root: 'root', elements: {} };\n }\n\n const elements: Record<string, UIElement> = {};\n const childIds: string[] = [];\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i]!;\n const id = `action-${i}`;\n childIds.push(id);\n elements[id] = {\n type: 'ActionButton',\n props: {\n label: action.title,\n action: {\n title: action.title,\n type: action.type,\n payload: action.payload,\n },\n },\n };\n }\n elements['root'] = {\n type: 'ButtonRow',\n children: childIds,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _appendStandaloneInput(context: QNAUISpecRenderContext, placeholder?: string | string[]): void {\n if (!this._contentEl) return;\n const inputSpec: UISpec = {\n root: 'root',\n elements: {\n root: {\n type: 'TextInput',\n props: {\n placeholder,\n },\n },\n },\n };\n const renderedInput = this._renderUISpec(inputSpec, context);\n this._contentEl.appendChild(renderedInput);\n }\n\n private _handleAction(action: ActionPayload): void {\n ga.trackSuggestedQuestion(action.title, action.type);\n this.config.onActionSelected?.(action);\n dispatch('gengage:qna:action', action);\n }\n\n private _handleOpenChat(): void {\n // Couple CTA with the inline QNA text input when available.\n const input = this._contentEl?.querySelector<HTMLInputElement>('.gengage-qna-input');\n if (input) {\n input.focus();\n }\n this.config.onOpenChat?.();\n dispatch('gengage:qna:open-chat', {});\n }\n\n _actionHandler = this._handleAction.bind(this);\n _openChatHandler = this._handleOpenChat.bind(this);\n}\n\nexport function createQNAWidget(): GengageQNA {\n return new GengageQNA();\n}\n\nexport type { QNAWidgetConfig, QNAUIComponents, QNAI18n, QNAUISpecRenderContext, QNARendererConfig } from './types.js';\nexport {\n renderQnaUISpec,\n createDefaultQnaUISpecRegistry,\n defaultQnaUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { QNAUISpecRegistry } from './components/renderUISpec.js';\nexport { qnaCatalog } from './catalog.js';\nexport type { QNACatalog, QNAComponentName } from './catalog.js';\n","import { buildChatEndpointUrl } from '../common/api-paths.js';\nimport { consumeStream } from '../common/streaming.js';\nimport {\n adaptV1Event,\n normalizeSimilarProductsResponse,\n normalizeProductGroupingsResponse,\n} from '../common/v1-protocol-adapter.js';\nimport type { NormalizedProduct } from '../common/v1-protocol-adapter.js';\nimport type { StreamEvent } from '../common/types.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\n\nexport interface SimilarProductsRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n sku: string;\n domain?: string;\n limit?: number;\n output_language?: string;\n}\n\nexport interface ProductGroupingsRequest {\n account_id: string;\n session_id: string;\n correlation_id: string;\n skus: string[];\n output_language?: string;\n}\n\nexport interface ProductGroup {\n name: string;\n highlight?: string;\n products: NormalizedProduct[];\n}\n\nfunction isNDJSONResponse(response: Response): boolean {\n const ct = response.headers.get('Content-Type') ?? '';\n return ct.includes('application/x-ndjson') || ct.includes('text/event-stream');\n}\n\nasync function collectProductsFromStream(response: Response, signal?: AbortSignal): Promise<NormalizedProduct[]> {\n const products: NormalizedProduct[] = [];\n const opts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n if (!normalized || normalized.type !== 'ui_spec') return;\n\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ProductCard' && el.props) {\n const product = (el.props['product'] ?? el.props) as Record<string, unknown>;\n if (typeof product['sku'] === 'string' && typeof product['name'] === 'string') {\n products.push(product as unknown as NormalizedProduct);\n }\n }\n }\n },\n };\n if (signal !== undefined) opts.signal = signal;\n await consumeStream(response, opts);\n return products;\n}\n\nexport async function fetchSimilarProducts(\n request: SimilarProductsRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<NormalizedProduct[]> {\n const url = buildChatEndpointUrl('similar_products', transport);\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n if (isNDJSONResponse(response)) {\n return collectProductsFromStream(response, signal);\n }\n\n const text = await response.text();\n if (!text) return [];\n try {\n return normalizeSimilarProductsResponse(JSON.parse(text));\n } catch {\n throw new Error(`Invalid JSON from similar_products endpoint`);\n }\n}\n\nasync function collectGroupingsFromStream(response: Response, signal?: AbortSignal): Promise<ProductGroup[]> {\n const groups: ProductGroup[] = [];\n let currentGroup: ProductGroup | null = null;\n\n const opts: import('../common/streaming.js').StreamOptions = {\n onEvent: (event: StreamEvent) => {\n const normalized = adaptV1Event(event as unknown as Record<string, unknown>);\n if (!normalized) return;\n\n if (normalized.type === 'metadata' && normalized.meta) {\n const name = normalized.meta['group_name'];\n if (typeof name === 'string') {\n currentGroup = { name, products: [] };\n const highlight = normalized.meta['highlight'];\n if (typeof highlight === 'string') currentGroup.highlight = highlight;\n groups.push(currentGroup);\n }\n }\n\n if (normalized.type === 'ui_spec' && currentGroup) {\n for (const el of Object.values(normalized.spec.elements)) {\n if (el.type === 'ProductCard' && el.props) {\n const product = (el.props['product'] ?? el.props) as Record<string, unknown>;\n if (typeof product['sku'] === 'string' && typeof product['name'] === 'string') {\n currentGroup.products.push(product as unknown as NormalizedProduct);\n }\n }\n }\n }\n },\n };\n if (signal !== undefined) opts.signal = signal;\n await consumeStream(response, opts);\n\n return groups;\n}\n\nexport async function fetchProductGroupings(\n request: ProductGroupingsRequest,\n transport: ChatTransportConfig,\n signal?: AbortSignal,\n): Promise<ProductGroup[]> {\n const url = buildChatEndpointUrl('product_groupings', transport);\n\n const fetchInit: RequestInit = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n };\n if (signal !== undefined) fetchInit.signal = signal;\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n if (isNDJSONResponse(response)) {\n return collectGroupingsFromStream(response, signal);\n }\n\n const text = await response.text();\n if (!text) return [];\n try {\n return normalizeProductGroupingsResponse(JSON.parse(text));\n } catch {\n throw new Error(`Invalid JSON from product_groupings endpoint`);\n }\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { SimRelI18n } from '../types.js';\nimport type { PriceFormatConfig } from '../../common/price-formatter.js';\nimport { formatPrice } from '../../common/price-formatter.js';\nimport { sanitizeHtml, isSafeImageUrl } from '../../common/safe-html.js';\nimport { createQuantityStepper } from '../../common/quantity-stepper.js';\nimport { clampDiscount, addImageErrorHandler, renderStarRating } from '../../common/product-utils.js';\n\nexport interface ProductCardOptions {\n product: NormalizedProduct;\n index: number;\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n pricing?: PriceFormatConfig;\n}\n\nexport function renderProductCard(options: ProductCardOptions): HTMLElement {\n const { product, index, discountType, onClick, onAddToCart, renderCard } = options;\n const i18n = options.i18n;\n const pricing = options.pricing;\n\n // Custom card renderer (XSS warning: raw HTML injection)\n if (renderCard) {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-simrel-card gengage-simrel-card--custom';\n // Sanitize renderCard output to prevent XSS from user-provided renderers.\n wrapper.innerHTML = sanitizeHtml(renderCard(product, index));\n wrapper.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.gengage-simrel-atc')) return;\n if ((e.target as HTMLElement).closest('.gengage-chat-product-card-atc')) return;\n onClick(product);\n });\n return wrapper;\n }\n\n const card = document.createElement('article');\n // Intentional class coupling: reuse chat product-card classes so SimRel and chat stay visually identical.\n card.className = 'gengage-simrel-card gengage-chat-product-card';\n card.setAttribute('role', 'listitem');\n card.dataset['sku'] = product.sku;\n\n // Image\n const imgWrapper = document.createElement('div');\n imgWrapper.className = 'gengage-simrel-card-image gengage-chat-product-card-img-wrapper';\n if (product.imageUrl && isSafeImageUrl(product.imageUrl)) {\n const img = document.createElement('img');\n img.className = 'gengage-chat-product-card-img';\n img.src = product.imageUrl;\n img.alt = product.name;\n img.loading = 'lazy';\n addImageErrorHandler(img);\n imgWrapper.appendChild(img);\n }\n\n // Discount badge\n if (discountType === 'badge' && product.discountPercent && product.discountPercent > 0) {\n const badge = document.createElement('span');\n badge.className = 'gengage-simrel-badge gengage-chat-product-card-discount-badge';\n badge.textContent = `%${clampDiscount(product.discountPercent)}`;\n imgWrapper.appendChild(badge);\n }\n\n card.appendChild(imgWrapper);\n\n // Info section\n const info = document.createElement('div');\n info.className = 'gengage-simrel-card-info gengage-chat-product-card-body';\n\n // Brand\n if (product.brand) {\n const brandEl = document.createElement('div');\n brandEl.className = 'gengage-simrel-card-brand gengage-chat-product-card-brand';\n brandEl.textContent = product.brand;\n info.appendChild(brandEl);\n }\n\n // Name\n const nameEl = document.createElement('div');\n nameEl.className = 'gengage-simrel-card-name gengage-chat-product-card-name';\n nameEl.textContent = product.name;\n info.appendChild(nameEl);\n\n // Rating\n if (product.rating != null && product.rating > 0) {\n const ratingEl = document.createElement('div');\n ratingEl.className = 'gengage-simrel-card-rating gengage-chat-product-card-rating';\n ratingEl.textContent = renderStarRating(product.rating);\n if (product.reviewCount != null) {\n const count = document.createElement('span');\n count.className = 'gengage-simrel-card-review-count gengage-chat-product-card-review-count';\n count.textContent = ` (${product.reviewCount})`;\n ratingEl.appendChild(count);\n }\n info.appendChild(ratingEl);\n }\n\n // Price\n const priceContainer = document.createElement('div');\n priceContainer.className = 'gengage-simrel-card-price gengage-chat-product-card-price';\n\n if (product.originalPrice && product.originalPrice !== product.price) {\n if (discountType === 'strike-through' || !discountType) {\n const original = document.createElement('span');\n original.className = 'gengage-simrel-card-price-original gengage-chat-product-card-original-price';\n original.textContent = formatPrice(product.originalPrice, pricing);\n priceContainer.appendChild(original);\n }\n }\n\n if (product.price) {\n const current = document.createElement('span');\n current.className = 'gengage-simrel-card-price-current gengage-chat-product-card-price-current';\n current.textContent = formatPrice(product.price, pricing);\n priceContainer.appendChild(current);\n }\n\n info.appendChild(priceContainer);\n card.appendChild(info);\n\n // Keep SimRel cards aligned with chat product-card structure.\n const cta = document.createElement('button');\n cta.className = 'gengage-simrel-card-cta gengage-chat-product-card-cta';\n cta.type = 'button';\n cta.textContent = 'İncele';\n cta.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick(product);\n });\n card.appendChild(cta);\n\n // Add to cart stepper (only when in stock)\n if (product.cartCode && product.inStock !== false) {\n const cartCode = product.cartCode;\n const stepper = createQuantityStepper({\n compact: true,\n label: i18n?.addToCartButton ?? 'Sepete Ekle',\n onSubmit: (quantity) => {\n onAddToCart({ sku: product.sku, quantity, cartCode });\n },\n });\n stepper.classList.add('gengage-simrel-atc', 'gengage-chat-product-card-atc');\n card.appendChild(stepper);\n }\n\n // Card click → navigate\n card.addEventListener('click', (e) => {\n if ((e.target as HTMLElement).closest('.gengage-simrel-atc')) return;\n if ((e.target as HTMLElement).closest('.gengage-chat-product-card-atc')) return;\n if ((e.target as HTMLElement).closest('.gengage-chat-product-card-cta')) return;\n onClick(product);\n });\n\n return card;\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { SimRelI18n } from '../types.js';\nimport { renderProductCard } from './ProductCard.js';\nimport type { ProductCardOptions } from './ProductCard.js';\n\nexport interface ProductGridOptions {\n products: NormalizedProduct[];\n columns?: number;\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n}\n\nexport function renderProductGrid(options: ProductGridOptions): HTMLElement {\n const grid = document.createElement('div');\n grid.className = 'gengage-simrel-grid';\n grid.setAttribute('role', 'list');\n grid.setAttribute('aria-label', options.i18n?.similarProductsAriaLabel ?? 'Similar products');\n\n if (options.columns) {\n grid.style.setProperty('--gengage-simrel-columns', String(options.columns));\n }\n\n for (let i = 0; i < options.products.length; i++) {\n const product = options.products[i]!;\n const cardOpts: ProductCardOptions = {\n product,\n index: i,\n onClick: options.onClick,\n onAddToCart: options.onAddToCart,\n };\n if (options.i18n !== undefined) cardOpts.i18n = options.i18n;\n if (options.discountType !== undefined) cardOpts.discountType = options.discountType;\n if (options.renderCard !== undefined) cardOpts.renderCard = options.renderCard;\n const card = renderProductCard(cardOpts);\n grid.appendChild(card);\n }\n\n if (options.products.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = options.i18n?.emptyStateMessage ?? 'Benzer ürün bulunamadı.';\n grid.appendChild(empty);\n }\n\n return grid;\n}\n","import type { NormalizedProduct } from '../../common/v1-protocol-adapter.js';\nimport type { ProductGroup } from '../api.js';\nimport type { SimRelI18n } from '../types.js';\nimport { renderProductGrid } from './ProductGrid.js';\n\nexport interface GroupTabsOptions {\n groups: ProductGroup[];\n discountType?: 'strike-through' | 'badge';\n onClick: (product: NormalizedProduct) => void;\n onAddToCart: (params: { sku: string; quantity: number; cartCode: string }) => void;\n renderCard?: (product: NormalizedProduct, index: number) => string;\n i18n?: SimRelI18n;\n}\n\nlet _groupTabsInstanceCounter = 0;\n\nexport function renderGroupTabs(options: GroupTabsOptions): HTMLElement {\n const instanceId = _groupTabsInstanceCounter++;\n const container = document.createElement('div');\n container.className = 'gengage-simrel-groups';\n\n if (options.groups.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = options.i18n?.emptyStateMessage ?? 'Benzer ürün bulunamadı.';\n container.appendChild(empty);\n return container;\n }\n\n // Tab bar — WAI-ARIA tablist pattern\n const tabBar = document.createElement('div');\n tabBar.className = 'gengage-simrel-tabs';\n tabBar.setAttribute('role', 'tablist');\n\n const tabs: HTMLButtonElement[] = [];\n const panels: HTMLElement[] = [];\n\n const buildGridOptions = (group: ProductGroup): import('./ProductGrid.js').ProductGridOptions => {\n const gridOpts: import('./ProductGrid.js').ProductGridOptions = {\n products: group.products,\n onClick: options.onClick,\n onAddToCart: options.onAddToCart,\n };\n if (options.i18n !== undefined) gridOpts.i18n = options.i18n;\n if (options.discountType !== undefined) gridOpts.discountType = options.discountType;\n if (options.renderCard !== undefined) gridOpts.renderCard = options.renderCard;\n return gridOpts;\n };\n\n const activateTab = (index: number): void => {\n for (let j = 0; j < tabs.length; j++) {\n const isActive = j === index;\n tabs[j]!.classList.toggle('gengage-simrel-tab--active', isActive);\n tabs[j]!.setAttribute('aria-selected', String(isActive));\n tabs[j]!.tabIndex = isActive ? 0 : -1;\n }\n\n // Lazy-render the grid content for the active panel\n const group = options.groups[index]!;\n const panel = panels[index]!;\n panel.innerHTML = '';\n const grid = renderProductGrid(buildGridOptions(group));\n panel.appendChild(grid);\n\n // Show only the active panel and manage tabindex for keyboard access\n for (let j = 0; j < panels.length; j++) {\n const isActive = j === index;\n panels[j]!.style.display = isActive ? '' : 'none';\n panels[j]!.tabIndex = isActive ? 0 : -1;\n }\n };\n\n for (let i = 0; i < options.groups.length; i++) {\n const group = options.groups[i]!;\n const tabId = `gengage-simrel-tab-${instanceId}-${i}`;\n const panelId = `gengage-simrel-panel-${instanceId}-${i}`;\n\n // Tab button\n const tab = document.createElement('button');\n tab.className = 'gengage-simrel-tab';\n tab.type = 'button';\n tab.id = tabId;\n tab.textContent = group.name;\n tab.setAttribute('role', 'tab');\n tab.setAttribute('aria-controls', panelId);\n tab.setAttribute('aria-selected', String(i === 0));\n tab.tabIndex = i === 0 ? 0 : -1;\n if (i === 0) tab.classList.add('gengage-simrel-tab--active');\n\n tab.addEventListener('click', () => activateTab(i));\n tab.addEventListener('keydown', (e: KeyboardEvent) => {\n let next = -1;\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n next = (i + 1) % options.groups.length;\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n next = (i - 1 + options.groups.length) % options.groups.length;\n } else if (e.key === 'Home') {\n next = 0;\n } else if (e.key === 'End') {\n next = options.groups.length - 1;\n }\n if (next >= 0) {\n e.preventDefault();\n activateTab(next);\n tabs[next]!.focus();\n }\n });\n\n tabs.push(tab);\n tabBar.appendChild(tab);\n\n // Tab panel\n const panel = document.createElement('div');\n panel.className = 'gengage-simrel-tab-panel';\n panel.id = panelId;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', tabId);\n panel.tabIndex = i === 0 ? 0 : -1;\n if (i !== 0) panel.style.display = 'none';\n\n panels.push(panel);\n }\n\n container.appendChild(tabBar);\n\n // Render the initial (first) tab content\n const firstPanel = panels[0]!;\n const firstGrid = renderProductGrid(buildGridOptions(options.groups[0]!));\n firstPanel.appendChild(firstGrid);\n\n for (const panel of panels) container.appendChild(panel);\n\n return container;\n}\n","import { renderUISpecWithRegistry } from '../../common/renderer/index.js';\nimport type { UISpecDomRegistry, UISpecDomUnknownRenderer } from '../../common/renderer/index.js';\nimport type { UISpec, ActionPayload } from '../../common/types.js';\nimport type { SimRelUISpecRenderContext, SimilarProduct } from '../types.js';\nimport type { ProductGroup } from '../api.js';\nimport { renderProductCard } from './ProductCard.js';\nimport { renderGroupTabs } from './GroupTabs.js';\n\nexport type SimRelUISpecRegistry = UISpecDomRegistry<SimRelUISpecRenderContext>;\n\nfunction toSimRelProduct(raw: unknown): SimilarProduct | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n if (typeof obj['sku'] !== 'string' || typeof obj['name'] !== 'string' || typeof obj['url'] !== 'string') {\n return null;\n }\n\n const result: SimilarProduct = {\n sku: obj['sku'],\n name: obj['name'],\n url: obj['url'],\n };\n\n const imageUrl = obj['imageUrl'];\n if (typeof imageUrl === 'string') result.imageUrl = imageUrl;\n const price = obj['price'];\n if (typeof price === 'string') result.price = price;\n const originalPrice = obj['originalPrice'];\n if (typeof originalPrice === 'string') result.originalPrice = originalPrice;\n const discountPercent = obj['discountPercent'];\n if (typeof discountPercent === 'number') result.discountPercent = discountPercent;\n const brand = obj['brand'];\n if (typeof brand === 'string') result.brand = brand;\n const rating = obj['rating'];\n if (typeof rating === 'number') result.rating = rating;\n const reviewCount = obj['reviewCount'];\n if (typeof reviewCount === 'number') result.reviewCount = reviewCount;\n const cartCode = obj['cartCode'];\n if (typeof cartCode === 'string') result.cartCode = cartCode;\n const inStock = obj['inStock'];\n if (typeof inStock === 'boolean') result.inStock = inStock;\n\n return result;\n}\n\nfunction toActionPayload(raw: unknown): ActionPayload | null {\n if (!raw || typeof raw !== 'object') return null;\n const obj = raw as Record<string, unknown>;\n const title = obj['title'];\n const type = obj['type'];\n if (typeof title !== 'string' || typeof type !== 'string') return null;\n const action: ActionPayload = { title, type };\n if (obj['payload'] !== undefined) action.payload = obj['payload'];\n return action;\n}\n\nconst DEFAULT_SIMREL_UI_SPEC_REGISTRY: SimRelUISpecRegistry = {\n ProductGrid: ({ element, renderElement, context }) => {\n const grid = document.createElement('div');\n grid.className = 'gengage-simrel-grid';\n grid.setAttribute('role', 'list');\n\n const columns = element.props?.['columns'];\n if (typeof columns === 'number' && Number.isFinite(columns) && columns > 0) {\n grid.style.setProperty('--gengage-simrel-columns', String(columns));\n }\n\n for (const childId of element.children ?? []) {\n const rendered = renderElement(childId);\n if (rendered) grid.appendChild(rendered);\n }\n\n if (grid.children.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n empty.textContent = context.i18n.emptyStateMessage;\n grid.appendChild(empty);\n }\n\n return grid;\n },\n\n ProductCard: ({ element, context }) => {\n const productRaw = (element.props?.['product'] ?? element.props) as unknown;\n const product = toSimRelProduct(productRaw);\n if (!product) return null;\n\n const indexRaw = element.props?.['index'];\n const index = typeof indexRaw === 'number' && Number.isFinite(indexRaw) ? indexRaw : 0;\n const discountTypeRaw = element.props?.['discountType'];\n const discountType =\n discountTypeRaw === 'strike-through' || discountTypeRaw === 'badge' ? discountTypeRaw : context.discountType;\n\n const options: import('./ProductCard.js').ProductCardOptions = {\n product,\n index,\n onClick: context.onClick,\n onAddToCart: context.onAddToCart,\n i18n: context.i18n,\n };\n if (discountType !== undefined) options.discountType = discountType;\n if (context.renderCard !== undefined) options.renderCard = context.renderCard;\n if (context.pricing !== undefined) options.pricing = context.pricing;\n return renderProductCard(options);\n },\n\n GroupTabs: ({ element, context }) => {\n const groupsRaw = element.props?.['groups'];\n if (!Array.isArray(groupsRaw)) return null;\n const groups: ProductGroup[] = [];\n\n for (const entry of groupsRaw) {\n if (!entry || typeof entry !== 'object') continue;\n const obj = entry as Record<string, unknown>;\n if (typeof obj['name'] !== 'string') continue;\n\n const products: SimilarProduct[] = [];\n if (Array.isArray(obj['products'])) {\n for (const rawProduct of obj['products']) {\n const normalized = toSimRelProduct(rawProduct);\n if (normalized) products.push(normalized);\n }\n }\n\n const group: ProductGroup = {\n name: obj['name'],\n products,\n };\n if (typeof obj['highlight'] === 'string') group.highlight = obj['highlight'];\n groups.push(group);\n }\n\n const options: import('./GroupTabs.js').GroupTabsOptions = {\n groups,\n onClick: context.onClick,\n onAddToCart: context.onAddToCart,\n i18n: context.i18n,\n };\n if (context.discountType !== undefined) options.discountType = context.discountType;\n if (context.renderCard !== undefined) options.renderCard = context.renderCard;\n return renderGroupTabs(options);\n },\n\n EmptyState: ({ element, context }) => {\n const empty = document.createElement('div');\n empty.className = 'gengage-simrel-empty';\n const message = element.props?.['message'];\n empty.textContent = typeof message === 'string' ? message : context.i18n.emptyStateMessage;\n return empty;\n },\n\n AddToCartButton: ({ element, context }) => {\n const sku = element.props?.['sku'];\n const cartCode = element.props?.['cartCode'];\n if (typeof sku !== 'string' || typeof cartCode !== 'string') return null;\n\n const button = document.createElement('button');\n button.className = 'gengage-simrel-atc gengage-chat-product-card-cta';\n button.type = 'button';\n const label = element.props?.['label'];\n button.textContent = typeof label === 'string' ? label : context.i18n.addToCartButton;\n button.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n context.onAddToCart({ sku, quantity: 1, cartCode });\n });\n return button;\n },\n\n QuickActions: ({ element, context }) => {\n const wrapper = document.createElement('div');\n wrapper.className = 'gengage-simrel-quick-actions';\n const actions = element.props?.['actions'];\n if (!Array.isArray(actions) || !context.onAction) return wrapper;\n\n for (const raw of actions) {\n if (!raw || typeof raw !== 'object') continue;\n const actionObj = raw as Record<string, unknown>;\n const label = actionObj['label'];\n const action = toActionPayload(actionObj['action']);\n if (typeof label !== 'string' || !action) continue;\n\n const button = document.createElement('button');\n button.className = 'gengage-simrel-quick-action';\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', (e) => {\n e.preventDefault();\n e.stopPropagation();\n context.onAction?.(action);\n });\n wrapper.appendChild(button);\n }\n return wrapper;\n },\n};\n\nexport const defaultSimRelUnknownUISpecRenderer: UISpecDomUnknownRenderer<SimRelUISpecRenderContext> = ({\n element,\n renderElement,\n}) => {\n if (import.meta.env?.DEV) {\n console.warn(`[gengage:simrel] Unknown ui_spec component type: ${element.type}`);\n }\n if (!element.children || element.children.length === 0) {\n return null;\n }\n const wrapper = document.createElement('div');\n for (const childId of element.children) {\n const rendered = renderElement(childId);\n if (rendered) wrapper.appendChild(rendered);\n }\n return wrapper;\n};\n\nexport function createDefaultSimRelUISpecRegistry(): SimRelUISpecRegistry {\n return { ...DEFAULT_SIMREL_UI_SPEC_REGISTRY };\n}\n\nexport function renderSimRelUISpec(\n spec: UISpec,\n context: SimRelUISpecRenderContext,\n registry = DEFAULT_SIMREL_UI_SPEC_REGISTRY,\n unknownRenderer: UISpecDomUnknownRenderer<SimRelUISpecRenderContext> = defaultSimRelUnknownUISpecRenderer,\n): HTMLElement {\n return renderUISpecWithRegistry({\n spec,\n context,\n registry,\n containerClassName: 'gengage-simrel-uispec',\n unknownRenderer,\n });\n}\n","import type { SimRelI18n } from '../types.js';\n\nexport const SIMREL_I18N_TR: SimRelI18n = {\n similarProductsAriaLabel: 'Benzer ürünler',\n emptyStateMessage: 'Benzer ürün bulunamadı.',\n addToCartButton: 'Sepete Ekle',\n priceSuffix: ' TL',\n};\n","import type { SimRelI18n } from '../types.js';\n\nexport const SIMREL_I18N_EN: SimRelI18n = {\n similarProductsAriaLabel: 'Similar products',\n emptyStateMessage: 'No similar products found.',\n addToCartButton: 'Add to cart',\n priceSuffix: '',\n};\n","import type { SimRelI18n } from '../types.js';\nimport { SIMREL_I18N_TR } from './tr.js';\nimport { SIMREL_I18N_EN } from './en.js';\n\nfunction normalizeLocale(locale?: string): string {\n if (!locale) return 'tr';\n return locale.toLowerCase().split('-')[0] ?? 'tr';\n}\n\nexport function resolveSimRelLocale(locale?: string): SimRelI18n {\n switch (normalizeLocale(locale)) {\n case 'en':\n return SIMREL_I18N_EN;\n default:\n return SIMREL_I18N_TR;\n }\n}\n\nexport { SIMREL_I18N_TR, SIMREL_I18N_EN };\n","/**\n * Similar Products (SimRel) widget — public entry point.\n *\n * Fetches and renders similar / related products for the current SKU.\n * Backend: POST /chat/similar_products + /chat/product_groupings\n */\n\nimport type { PageContext, UISpec, UIElement } from '../common/types.js';\nimport type { NormalizedProduct } from '../common/v1-protocol-adapter.js';\nimport type { ChatTransportConfig } from '../common/api-paths.js';\nimport type { UISpecRenderHelpers } from '../common/renderer/index.js';\nimport { mergeUISpecRegistry } from '../common/renderer/index.js';\nimport { BaseWidget } from '../common/widget-base.js';\nimport { dispatch } from '../common/events.js';\nimport { getGlobalErrorMessage } from '../common/global-error-toast.js';\nimport {\n streamStartEvent,\n streamDoneEvent,\n streamErrorEvent,\n basketAddEvent,\n widgetHistorySnapshotEvent,\n} from '../common/analytics-events.js';\nimport { fetchSimilarProducts, fetchProductGroupings } from './api.js';\nimport {\n createDefaultSimRelUISpecRegistry,\n defaultSimRelUnknownUISpecRenderer,\n renderSimRelUISpec,\n} from './components/renderUISpec.js';\nimport type { SimRelWidgetConfig, SimilarProduct, SimRelI18n, SimRelUISpecRenderContext } from './types.js';\nimport { SIMREL_I18N_TR, resolveSimRelLocale } from './locales/index.js';\nimport * as ga from '../common/ga-datalayer.js';\n\nimport './components/simrel.css';\n\nexport class GengageSimRel extends BaseWidget<SimRelWidgetConfig> {\n private _abortController: AbortController | null = null;\n private _contentEl: HTMLElement | null = null;\n private _lastSku: string | undefined;\n private _i18n: SimRelI18n = SIMREL_I18N_TR;\n\n protected async onInit(config: SimRelWidgetConfig): Promise<void> {\n this._i18n = this._resolveI18n(config);\n\n this._contentEl = document.createElement('div');\n this._contentEl.className = 'gengage-simrel-container';\n this.root.appendChild(this._contentEl);\n\n this._lastSku = config.sku;\n await this._fetchAndRender(config.sku);\n this.isVisible = true;\n ga.trackInit('simrel');\n }\n\n protected onUpdate(context: Partial<PageContext>): void {\n const newSku = context.sku;\n if (!newSku || newSku === this._lastSku) return;\n this._lastSku = newSku;\n void this._fetchAndRender(newSku);\n }\n\n protected onShow(): void {\n if (this._contentEl) {\n this._contentEl.style.opacity = '0';\n this._contentEl.style.transition = 'opacity 0.3s ease-in';\n requestAnimationFrame(() => {\n if (this._contentEl) this._contentEl.style.opacity = '1';\n });\n }\n }\n\n protected onHide(): void {\n // Preserve fetched products for re-show\n }\n\n protected onDestroy(): void {\n this._abort();\n if (this._contentEl) {\n this._contentEl.remove();\n this._contentEl = null;\n }\n }\n\n // ---------------------------------------------------------------------------\n // Internal event dispatchers\n // ---------------------------------------------------------------------------\n\n _handleProductClick(product: NormalizedProduct): void {\n const simRelProduct: SimilarProduct = {\n sku: product.sku,\n name: product.name,\n url: product.url,\n };\n if (product.imageUrl !== undefined) simRelProduct.imageUrl = product.imageUrl;\n if (product.price !== undefined) simRelProduct.price = product.price;\n if (product.originalPrice !== undefined) simRelProduct.originalPrice = product.originalPrice;\n if (product.discountPercent !== undefined) simRelProduct.discountPercent = product.discountPercent;\n if (product.brand !== undefined) simRelProduct.brand = product.brand;\n if (product.rating !== undefined) simRelProduct.rating = product.rating;\n if (product.reviewCount !== undefined) simRelProduct.reviewCount = product.reviewCount;\n if (product.cartCode !== undefined) simRelProduct.cartCode = product.cartCode;\n if (product.inStock !== undefined) simRelProduct.inStock = product.inStock;\n\n if (this.config.onProductClick?.(simRelProduct) === false) return;\n\n ga.trackProductDetail(product.sku, product.name);\n const sessionId = this.config.session?.sessionId ?? null;\n dispatch('gengage:similar:product-click', {\n sku: product.sku,\n url: product.url,\n sessionId,\n });\n\n this.config.onProductNavigate?.(product.url, product.sku, sessionId);\n }\n\n _handleAddToCart(params: { sku: string; quantity: number; cartCode: string }): void {\n ga.trackCartAdd(params.sku, params.quantity);\n this.config.onAddToCart?.(params);\n dispatch('gengage:similar:add-to-cart', params);\n\n this.track(\n basketAddEvent(this.analyticsContext(), {\n attribution_source: 'simrel',\n attribution_action_id: crypto.randomUUID(),\n cart_value: 0, // Host page should enrich via event listener\n currency: 'TRY',\n line_items: params.quantity,\n sku: params.sku,\n }),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Private\n // ---------------------------------------------------------------------------\n\n private _abort(): void {\n this._abortController?.abort();\n this._abortController = null;\n }\n\n private async _fetchAndRender(sku: string): Promise<void> {\n this._abort();\n this._abortController = new AbortController();\n // Capture signal reference at invocation time to avoid race conditions:\n // if onUpdate fires between awaits, `this._abortController` gets swapped\n // but `signal` still refers to this invocation's controller.\n const signal = this._abortController.signal;\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n // Reset visibility in case a previous error set display:none\n this._contentEl.style.display = '';\n\n // Show loading spinner\n const loading = document.createElement('div');\n loading.className = 'gengage-simrel-loading';\n const spinner = document.createElement('div');\n spinner.className = 'gengage-simrel-spinner';\n loading.appendChild(spinner);\n this._contentEl.appendChild(loading);\n\n const transport: ChatTransportConfig = {\n middlewareUrl: this.config.middlewareUrl,\n };\n\n const requestId = crypto.randomUUID();\n const fetchStart = Date.now();\n\n this.track(\n streamStartEvent(this.analyticsContext(), {\n endpoint: 'similar_products',\n request_id: requestId,\n widget: 'simrel',\n }),\n );\n\n try {\n // Fetch similar products\n const simReq: import('./api.js').SimilarProductsRequest = {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n sku,\n };\n if (this.config.domain !== undefined) simReq.domain = this.config.domain;\n const products = await fetchSimilarProducts(simReq, transport, signal);\n\n if (!this._contentEl) return;\n this._contentEl.innerHTML = '';\n\n // Try to fetch product groupings for tabbed view\n if (products.length > 0) {\n try {\n const skus = products.map((p) => p.sku);\n const groups = await fetchProductGroupings(\n {\n account_id: this.config.accountId,\n session_id: this.config.session?.sessionId ?? '',\n correlation_id: this.config.session?.sessionId ?? '',\n skus,\n },\n transport,\n signal,\n );\n\n if (groups.length > 0 && this._contentEl) {\n const groupsSpec = this._buildGroupsSpec(groups);\n const renderedGroups = this._renderUISpec(groupsSpec);\n this._contentEl.appendChild(renderedGroups);\n\n ga.trackShow('simrel');\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: groups.reduce((n, g) => n + g.products.length, 0),\n widget: 'simrel',\n }),\n );\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: groups.reduce((n, g) => n + g.products.length, 0),\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'simrel',\n }),\n );\n return;\n }\n } catch {\n // Product groupings is optional; fall through to flat grid\n }\n }\n\n // Flat grid (no groupings or groupings failed)\n if (this._contentEl) {\n const gridSpec = this._buildProductsSpec(products);\n const renderedGrid = this._renderUISpec(gridSpec);\n this._contentEl.appendChild(renderedGrid);\n }\n\n if (products.length > 0) {\n ga.trackShow('simrel');\n }\n\n this.track(\n streamDoneEvent(this.analyticsContext(), {\n request_id: requestId,\n latency_ms: Date.now() - fetchStart,\n chunk_count: products.length,\n widget: 'simrel',\n }),\n );\n\n this.track(\n widgetHistorySnapshotEvent(this.analyticsContext(), {\n message_count: products.length,\n history_ref: requestId,\n redaction_level: 'none',\n widget: 'simrel',\n }),\n );\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return;\n\n dispatch('gengage:global:error', {\n source: 'simrel',\n code: 'FETCH_ERROR',\n message: getGlobalErrorMessage(this.config.locale),\n });\n\n this.track(\n streamErrorEvent(this.analyticsContext(), {\n request_id: requestId,\n error_code: 'FETCH_ERROR',\n error_message: err instanceof Error ? err.message : String(err),\n widget: 'simrel',\n }),\n );\n\n if (import.meta.env?.DEV) {\n console.error('[gengage:simrel] Failed to fetch similar products:', err);\n }\n // Hide the widget gracefully — no user-facing error for backend unavailability\n if (this._contentEl) {\n this._contentEl.innerHTML = '';\n this._contentEl.style.display = 'none';\n }\n }\n }\n\n private _resolveI18n(config: SimRelWidgetConfig): SimRelI18n {\n const base = resolveSimRelLocale(config.locale);\n return { ...base, ...config.i18n };\n }\n\n private _resolveUISpecRegistry() {\n const baseRegistry = createDefaultSimRelUISpecRegistry();\n return mergeUISpecRegistry(baseRegistry, this.config.renderer?.registry);\n }\n\n private _buildRenderContext(): SimRelUISpecRenderContext {\n const renderCard = this.config.renderCard as ((product: SimilarProduct, index: number) => string) | undefined;\n const context: SimRelUISpecRenderContext = {\n onClick: (product) => this._handleProductClick(product as unknown as NormalizedProduct),\n onAddToCart: (params) => this._handleAddToCart(params),\n i18n: this._i18n,\n };\n if (this.config.discountType !== undefined) context.discountType = this.config.discountType;\n if (renderCard !== undefined) context.renderCard = renderCard;\n if (this.config.pricing !== undefined) context.pricing = this.config.pricing;\n return context;\n }\n\n private _renderUISpec(spec: UISpec): HTMLElement {\n const registry = this._resolveUISpecRegistry();\n const context = this._buildRenderContext();\n const unknownRenderer = this.config.renderer?.unknownRenderer ?? defaultSimRelUnknownUISpecRenderer;\n const defaultRender = (inputSpec: UISpec, inputContext: SimRelUISpecRenderContext) =>\n renderSimRelUISpec(inputSpec, inputContext, registry, unknownRenderer);\n\n const override = this.config.renderer?.renderUISpec;\n if (!override) return defaultRender(spec, context);\n\n const helpers: UISpecRenderHelpers<SimRelUISpecRenderContext> = {\n registry,\n unknownRenderer,\n defaultRender,\n };\n return override(spec, context, helpers);\n }\n\n private _buildProductsSpec(products: NormalizedProduct[]): UISpec {\n const elements: Record<string, UIElement> = {};\n const children: string[] = [];\n for (let i = 0; i < products.length; i++) {\n const product = products[i]!;\n const id = `product-${i}`;\n children.push(id);\n elements[id] = {\n type: 'ProductCard',\n props: {\n product,\n index: i,\n discountType: this.config.discountType,\n },\n };\n }\n elements['root'] = {\n type: 'ProductGrid',\n props: {\n layout: 'grid',\n },\n children,\n };\n return {\n root: 'root',\n elements,\n };\n }\n\n private _buildGroupsSpec(\n groups: Array<{\n name: string;\n highlight?: string;\n products: NormalizedProduct[];\n }>,\n ): UISpec {\n return {\n root: 'root',\n elements: {\n root: {\n type: 'GroupTabs',\n props: { groups },\n },\n },\n };\n }\n}\n\nexport function createSimRelWidget(): GengageSimRel {\n return new GengageSimRel();\n}\n\nexport type {\n SimRelWidgetConfig,\n SimilarProduct,\n SimRelUIComponents,\n SimRelI18n,\n SimRelUISpecRenderContext,\n SimRelRendererConfig,\n} from './types.js';\nexport {\n renderSimRelUISpec,\n createDefaultSimRelUISpecRegistry,\n defaultSimRelUnknownUISpecRenderer,\n} from './components/renderUISpec.js';\nexport type { SimRelUISpecRegistry } from './components/renderUISpec.js';\nexport { simRelCatalog } from './catalog.js';\nexport type { SimRelCatalog, SimRelComponentName } from './catalog.js';\n","import { z } from 'zod';\n\nconst WidgetToggleSchema = z.object({\n enabled: z.boolean().default(true),\n});\n\nconst MountSelectorsSchema = z.object({\n chat: z.string().optional(),\n qna: z.string().optional(),\n simrel: z.string().optional(),\n});\n\nconst TransportSchema = z.object({});\n\nexport const AnalyticsAuthModeSchema = z.enum(['none', 'x-api-key-header', 'bearer-header', 'body-api-key']);\n\nconst AnalyticsAuthSchema = z.object({\n mode: AnalyticsAuthModeSchema.default('none'),\n key: z.string().optional(),\n headerName: z.string().optional(),\n bodyField: z.string().default('api_key'),\n});\n\nconst AnalyticsSchema = z.object({\n enabled: z.boolean().default(true),\n endpoint: z.string().default('/analytics'),\n auth: AnalyticsAuthSchema.default({ mode: 'none', bodyField: 'api_key' }),\n fireAndForget: z.boolean().default(true),\n useBeacon: z.boolean().default(true),\n keepaliveFetch: z.boolean().default(true),\n timeoutMs: z.number().int().positive().default(4000),\n maxRetries: z.number().int().min(0).max(5).default(1),\n});\n\nexport const DEFAULT_IDEMPOTENCY_KEY = '__gengageWidgetsInit';\n\nconst GTMSchema = z.object({\n idempotencyKey: z.string().default(DEFAULT_IDEMPOTENCY_KEY),\n requireDomReady: z.boolean().default(true),\n});\n\nexport const UnknownActionPolicySchema = z.enum(['log-and-ignore', 'throw', 'delegate']);\n\nconst ActionHandlingSchema = z.object({\n unknownActionPolicy: UnknownActionPolicySchema.default('log-and-ignore'),\n allowScriptCall: z.boolean().default(false),\n});\n\nexport const AccountRuntimeConfigSchema = z.object({\n version: z.literal('1'),\n accountId: z.string().min(1),\n middlewareUrl: z.string().url(),\n locale: z.string().optional(),\n widgets: z.object({\n chat: WidgetToggleSchema.default({ enabled: true }),\n qna: WidgetToggleSchema.default({ enabled: true }),\n simrel: WidgetToggleSchema.default({ enabled: true }),\n }),\n mounts: MountSelectorsSchema.default({}),\n transport: TransportSchema.default({}),\n analytics: AnalyticsSchema.default({\n enabled: true,\n endpoint: '/analytics',\n auth: { mode: 'none', bodyField: 'api_key' },\n fireAndForget: true,\n useBeacon: true,\n keepaliveFetch: true,\n timeoutMs: 4000,\n maxRetries: 1,\n }),\n gtm: GTMSchema.default({\n idempotencyKey: '__gengageWidgetsInit',\n requireDomReady: true,\n }),\n actionHandling: ActionHandlingSchema.default({\n unknownActionPolicy: 'log-and-ignore',\n allowScriptCall: false,\n }),\n});\n\nexport type AccountRuntimeConfig = z.infer<typeof AccountRuntimeConfigSchema>;\nexport type AnalyticsAuthMode = z.infer<typeof AnalyticsAuthModeSchema>;\nexport type UnknownActionPolicy = z.infer<typeof UnknownActionPolicySchema>;\n\nexport function parseAccountRuntimeConfig(input: unknown): AccountRuntimeConfig {\n return AccountRuntimeConfigSchema.parse(input);\n}\n\nexport function safeParseAccountRuntimeConfig(input: unknown): ReturnType<typeof AccountRuntimeConfigSchema.safeParse> {\n return AccountRuntimeConfigSchema.safeParse(input);\n}\n\nexport function createDefaultAccountRuntimeConfig(params: {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n}): AccountRuntimeConfig {\n return parseAccountRuntimeConfig({\n version: '1',\n accountId: params.accountId,\n middlewareUrl: params.middlewareUrl,\n locale: params.locale,\n widgets: {\n chat: { enabled: true },\n qna: { enabled: true },\n simrel: { enabled: true },\n },\n });\n}\n","import { GengageChat } from '../chat/index.js';\nimport type { ChatI18n, ChatWidgetConfig } from '../chat/types.js';\nimport { GengageQNA } from '../qna/index.js';\nimport type { QNAWidgetConfig } from '../qna/types.js';\nimport { GengageSimRel } from '../simrel/index.js';\nimport type { SimRelWidgetConfig } from '../simrel/types.js';\nimport { DEFAULT_IDEMPOTENCY_KEY } from './config-schema.js';\nimport { resolveSession } from './context.js';\nimport { wireQNAToChat } from './events.js';\nimport type { PageContext, SessionContext, WidgetTheme } from './types.js';\n\nconst DEFAULT_OVERLAY_KEY_PREFIX = `${DEFAULT_IDEMPOTENCY_KEY}_overlay_`;\nconst DEFAULT_QNA_MOUNT = '#gengage-qna';\nconst DEFAULT_SIMREL_MOUNT = '#gengage-simrel';\n\ninterface OverlayRegistryState {\n instances: Record<string, OverlayWidgetsRuntime>;\n pending: Record<string, Promise<OverlayWidgetsRuntime>>;\n}\n\ninterface WindowWithOverlayRegistry extends Window {\n __gengageOverlayRegistry?: OverlayRegistryState;\n}\n\nfunction getOverlayRegistry(): OverlayRegistryState {\n const win = window as WindowWithOverlayRegistry;\n if (!win.__gengageOverlayRegistry) {\n win.__gengageOverlayRegistry = {\n instances: {},\n pending: {},\n };\n }\n return win.__gengageOverlayRegistry;\n}\n\nfunction buildInitialPageContext(options: OverlayWidgetsOptions): PageContext {\n const base: PageContext = {\n pageType: options.pageContext?.pageType ?? (options.sku !== undefined ? 'pdp' : 'other'),\n };\n\n const incoming = options.pageContext;\n if (incoming?.sku !== undefined) base.sku = incoming.sku;\n if (incoming?.price !== undefined) base.price = incoming.price;\n if (incoming?.categoryTree !== undefined) base.categoryTree = incoming.categoryTree;\n if (incoming?.url !== undefined) base.url = incoming.url;\n if (incoming?.extra !== undefined) base.extra = incoming.extra;\n\n if (options.sku !== undefined) {\n base.sku = options.sku;\n }\n\n return base;\n}\n\nfunction mergePageContext(current: PageContext, patch: Partial<PageContext>): PageContext {\n const next: PageContext = {\n ...current,\n ...patch,\n pageType: patch.pageType ?? current.pageType,\n };\n if (patch.sku === undefined && current.sku !== undefined) {\n next.sku = current.sku;\n }\n return next;\n}\n\nfunction resolveMountTarget(target: HTMLElement | string): HTMLElement | string | null {\n if (target instanceof HTMLElement) return target;\n if (document.querySelector(target)) return target;\n return null;\n}\n\nfunction buildOverlayKey(options: OverlayWidgetsOptions): string {\n return options.idempotencyKey ?? `${DEFAULT_OVERLAY_KEY_PREFIX}${options.accountId}`;\n}\n\nexport interface OverlayChatOptions {\n enabled?: boolean;\n variant?: ChatWidgetConfig['variant'];\n mountTarget?: HTMLElement | string;\n launcherSvg?: string;\n headerTitle?: string;\n headerAvatarUrl?: string;\n headerBadge?: string;\n headerCartUrl?: string;\n headerFavoritesToggle?: boolean;\n hideMobileLauncher?: boolean;\n mobileBreakpoint?: number;\n mobileInitialState?: 'half' | 'full';\n i18n?: Partial<ChatI18n>;\n actionHandling?: ChatWidgetConfig['actionHandling'];\n}\n\nexport interface OverlayQNAOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n ctaText?: string;\n inputPlaceholder?: QNAWidgetConfig['inputPlaceholder'];\n}\n\nexport interface OverlaySimRelOptions {\n enabled?: boolean;\n mountTarget?: HTMLElement | string;\n discountType?: SimRelWidgetConfig['discountType'];\n}\n\nexport interface OverlayWidgetsOptions {\n accountId: string;\n middlewareUrl: string;\n locale?: string;\n session?: Partial<SessionContext>;\n pageContext?: Partial<PageContext>;\n sku?: string;\n theme?: WidgetTheme;\n /** Price formatting options. Defaults to Turkish locale. */\n pricing?: import('./price-formatter.js').PriceFormatConfig;\n idempotencyKey?: string;\n wireQnaToChat?: boolean;\n chat?: OverlayChatOptions;\n qna?: OverlayQNAOptions;\n simrel?: OverlaySimRelOptions;\n onAddToCart?: SimRelWidgetConfig['onAddToCart'];\n onProductNavigate?: SimRelWidgetConfig['onProductNavigate'];\n onScriptCall?: ChatWidgetConfig['onScriptCall'];\n}\n\nexport interface OverlayWidgetsController {\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n readonly chat: GengageChat | null;\n readonly qna: GengageQNA | null;\n readonly simrel: GengageSimRel | null;\n /** Shared analytics client for custom event tracking (null if not configured). */\n readonly analyticsClient: import('./analytics.js').AnalyticsClient | null;\n openChat(options?: { state?: 'half' | 'full' }): void;\n closeChat(): void;\n updateContext(patch: Partial<PageContext>): Promise<void>;\n updateSku(sku: string, pageType?: PageContext['pageType']): Promise<void>;\n destroy(): void;\n}\n\nclass OverlayWidgetsRuntime implements OverlayWidgetsController {\n private _chat: GengageChat | null = null;\n private _qna: GengageQNA | null = null;\n private _simrel: GengageSimRel | null = null;\n private _analyticsClient: import('./analytics.js').AnalyticsClient | null = null;\n private _offQnaWire: (() => void) | null = null;\n private _pageContext: PageContext;\n private _destroyed = false;\n private _queue: Promise<void> = Promise.resolve();\n private _warnedQnaMountMissing = false;\n private _warnedSimRelMountMissing = false;\n\n readonly idempotencyKey: string;\n readonly session: SessionContext;\n\n constructor(\n private readonly options: OverlayWidgetsOptions,\n private readonly onDestroy: () => void,\n ) {\n this.idempotencyKey = buildOverlayKey(options);\n this.session = resolveSession(options.session);\n this._pageContext = buildInitialPageContext(options);\n }\n\n get chat(): GengageChat | null {\n return this._chat;\n }\n\n get qna(): GengageQNA | null {\n return this._qna;\n }\n\n get simrel(): GengageSimRel | null {\n return this._simrel;\n }\n\n get analyticsClient(): import('./analytics.js').AnalyticsClient | null {\n return this._analyticsClient;\n }\n\n async init(): Promise<void> {\n if (!window.gengage) window.gengage = {};\n window.gengage.sessionId = this.session.sessionId;\n window.gengage.pageContext = this._pageContext;\n\n await this._initChat();\n\n if (this.options.wireQnaToChat !== false) {\n this._offQnaWire = wireQNAToChat();\n }\n\n await this._syncPdpWidgets();\n\n window.gengage.overlay = this;\n }\n\n openChat(options?: { state?: 'half' | 'full' }): void {\n this._chat?.open(options);\n }\n\n closeChat(): void {\n this._chat?.close();\n }\n\n async updateContext(patch: Partial<PageContext>): Promise<void> {\n if (this._destroyed) return;\n await this._enqueue(async () => {\n this._pageContext = mergePageContext(this._pageContext, patch);\n\n if (!window.gengage) window.gengage = {};\n window.gengage.pageContext = this._pageContext;\n\n this._chat?.update(patch);\n this._qna?.update(patch);\n this._simrel?.update(patch);\n await this._syncPdpWidgets();\n });\n }\n\n async updateSku(sku: string, pageType: PageContext['pageType'] = 'pdp'): Promise<void> {\n await this.updateContext({ sku, pageType });\n }\n\n destroy(): void {\n if (this._destroyed) return;\n this._destroyed = true;\n\n this._offQnaWire?.();\n this._offQnaWire = null;\n\n this._chat?.destroy();\n this._qna?.destroy();\n this._simrel?.destroy();\n\n this._chat = null;\n this._qna = null;\n this._simrel = null;\n\n if (window.gengage?.overlay === this) {\n delete window.gengage.overlay;\n }\n\n this.onDestroy();\n }\n\n private async _initChat(): Promise<void> {\n if (this.options.chat?.enabled === false) return;\n\n const middlewareUrl = this.options.middlewareUrl;\n\n const config: ChatWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: this._pageContext,\n variant: this.options.chat?.variant ?? 'floating',\n };\n\n if (this.options.theme !== undefined) config.theme = this.options.theme;\n if (this.options.locale !== undefined) config.locale = this.options.locale;\n if (this.options.pricing !== undefined) config.pricing = this.options.pricing;\n if (this.options.chat?.mountTarget !== undefined) config.mountTarget = this.options.chat.mountTarget;\n if (this.options.chat?.launcherSvg !== undefined) config.launcherSvg = this.options.chat.launcherSvg;\n if (this.options.chat?.headerTitle !== undefined) config.headerTitle = this.options.chat.headerTitle;\n if (this.options.chat?.headerAvatarUrl !== undefined) {\n config.headerAvatarUrl = this.options.chat.headerAvatarUrl;\n }\n if (this.options.chat?.headerBadge !== undefined) config.headerBadge = this.options.chat.headerBadge;\n if (this.options.chat?.headerCartUrl !== undefined) config.headerCartUrl = this.options.chat.headerCartUrl;\n if (this.options.chat?.headerFavoritesToggle !== undefined) {\n config.headerFavoritesToggle = this.options.chat.headerFavoritesToggle;\n }\n if (this.options.chat?.hideMobileLauncher !== undefined) {\n config.hideMobileLauncher = this.options.chat.hideMobileLauncher;\n }\n if (this.options.chat?.mobileBreakpoint !== undefined) {\n config.mobileBreakpoint = this.options.chat.mobileBreakpoint;\n }\n if (this.options.chat?.mobileInitialState !== undefined) {\n config.mobileInitialState = this.options.chat.mobileInitialState;\n }\n if (this.options.chat?.i18n !== undefined) config.i18n = this.options.chat.i18n;\n if (this.options.chat?.actionHandling !== undefined) {\n config.actionHandling = this.options.chat.actionHandling;\n }\n if (this.options.onScriptCall !== undefined) {\n config.onScriptCall = this.options.onScriptCall;\n }\n\n this._chat = new GengageChat();\n await this._chat.init(config);\n }\n\n private async _syncPdpWidgets(): Promise<void> {\n if (this._destroyed) return;\n const sku = this._pageContext.sku;\n const isPdp = this._pageContext.pageType === 'pdp' && sku !== undefined && sku.length > 0;\n\n if (!isPdp) {\n this._destroyPdpWidgets();\n return;\n }\n\n const middlewareUrl = this.options.middlewareUrl;\n\n if (this.options.qna?.enabled !== false) {\n const qnaTarget = this.options.qna?.mountTarget ?? DEFAULT_QNA_MOUNT;\n const mountTarget = resolveMountTarget(qnaTarget);\n\n if (mountTarget) {\n this._warnedQnaMountMissing = false;\n if (!this._qna) {\n const qna = new GengageQNA();\n const qnaConfig: QNAWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n pageContext: {\n pageType: 'pdp',\n sku,\n },\n mountTarget,\n };\n if (this.options.theme !== undefined) qnaConfig.theme = this.options.theme;\n if (this.options.qna?.ctaText !== undefined) qnaConfig.ctaText = this.options.qna.ctaText;\n if (this.options.qna?.inputPlaceholder !== undefined) {\n qnaConfig.inputPlaceholder = this.options.qna.inputPlaceholder;\n }\n await qna.init(qnaConfig);\n this._qna = qna;\n } else {\n this._qna.show();\n this._qna.update({ pageType: 'pdp', sku });\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n if (!this._warnedQnaMountMissing) {\n console.warn(`[gengage] QNA mount target not found: ${qnaTarget}`);\n this._warnedQnaMountMissing = true;\n }\n }\n } else {\n this._qna?.destroy();\n this._qna = null;\n }\n\n if (this.options.simrel?.enabled !== false) {\n const simRelTarget = this.options.simrel?.mountTarget ?? DEFAULT_SIMREL_MOUNT;\n const mountTarget = resolveMountTarget(simRelTarget);\n\n if (mountTarget) {\n this._warnedSimRelMountMissing = false;\n if (!this._simrel) {\n const simrel = new GengageSimRel();\n const simRelConfig: SimRelWidgetConfig = {\n accountId: this.options.accountId,\n middlewareUrl,\n session: this.session,\n sku,\n mountTarget,\n };\n if (this.options.theme !== undefined) simRelConfig.theme = this.options.theme;\n if (this.options.pricing !== undefined) simRelConfig.pricing = this.options.pricing;\n if (this.options.simrel?.discountType !== undefined) {\n simRelConfig.discountType = this.options.simrel.discountType;\n }\n if (this.options.onAddToCart !== undefined) {\n simRelConfig.onAddToCart = this.options.onAddToCart;\n }\n if (this.options.onProductNavigate !== undefined) {\n simRelConfig.onProductNavigate = this.options.onProductNavigate;\n } else {\n simRelConfig.onProductNavigate = (url, productSku, sessionId) => {\n this._chat?.saveSession(sessionId ?? this.session.sessionId, productSku);\n window.location.href = url;\n };\n }\n await simrel.init(simRelConfig);\n this._simrel = simrel;\n } else {\n this._simrel.show();\n this._simrel.update({ pageType: 'pdp', sku });\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n if (!this._warnedSimRelMountMissing) {\n console.warn(`[gengage] SimRel mount target not found: ${simRelTarget}`);\n this._warnedSimRelMountMissing = true;\n }\n }\n } else {\n this._simrel?.destroy();\n this._simrel = null;\n }\n }\n\n private _destroyPdpWidgets(): void {\n this._qna?.destroy();\n this._simrel?.destroy();\n this._qna = null;\n this._simrel = null;\n }\n\n private _enqueue(fn: () => Promise<void>): Promise<void> {\n const next = this._queue.then(fn);\n this._queue = next.catch((err) => {\n if (import.meta.env?.DEV) {\n console.error('[gengage:overlay] Queued operation failed:', err);\n }\n });\n return next;\n }\n}\n\nexport async function initOverlayWidgets(options: OverlayWidgetsOptions): Promise<OverlayWidgetsController> {\n const key = buildOverlayKey(options);\n const registry = getOverlayRegistry();\n\n const existing = registry.instances[key];\n if (existing) return existing;\n\n const pending = registry.pending[key];\n if (pending) return pending;\n\n const runtime = new OverlayWidgetsRuntime(options, () => {\n const liveRegistry = getOverlayRegistry();\n delete liveRegistry.instances[key];\n delete liveRegistry.pending[key];\n });\n\n const runtimeInit = runtime\n .init()\n .then(() => {\n registry.instances[key] = runtime;\n delete registry.pending[key];\n return runtime;\n })\n .catch((err) => {\n delete registry.pending[key];\n throw err;\n });\n\n registry.pending[key] = runtimeInit;\n return runtimeInit;\n}\n\nexport function getOverlayWidgets(idempotencyKey: string): OverlayWidgetsController | null {\n const registry = getOverlayRegistry();\n return registry.instances[idempotencyKey] ?? null;\n}\n\nexport function destroyOverlayWidgets(idempotencyKey: string): void {\n const controller = getOverlayWidgets(idempotencyKey);\n controller?.destroy();\n}\n\nexport function buildOverlayIdempotencyKey(accountId: string): string {\n return `${DEFAULT_OVERLAY_KEY_PREFIX}${accountId}`;\n}\n","import { initOverlayWidgets } from './overlay.js';\nimport type { OverlayWidgetsController, OverlayWidgetsOptions } from './overlay.js';\nimport type { PageContext } from './types.js';\n\nexport const DEFAULT_NATIVE_TRACKED_EVENTS = [\n 'gengage:chat:open',\n 'gengage:chat:close',\n 'gengage:chat:ready',\n 'gengage:chat:add-to-cart',\n 'gengage:qna:action',\n 'gengage:qna:open-chat',\n 'gengage:similar:product-click',\n 'gengage:similar:add-to-cart',\n 'gengage:global:error',\n 'gengage:context:update',\n] as const;\n\nexport type NativeTrackedEvent = (typeof DEFAULT_NATIVE_TRACKED_EVENTS)[number];\nexport type NativeInboundMessage = 'openChat' | 'closeChat' | 'updateContext' | 'updateSku' | 'setSession' | 'destroy';\n\nexport type NativeBridgeEnvironment = 'ios' | 'android' | 'react-native' | 'browser';\n\nexport interface NativeSessionPayload {\n sessionId?: string;\n userId?: string;\n}\n\nexport interface NativeBridgeMessage {\n type: string;\n payload?: unknown;\n}\n\nexport interface NativeWebViewBridgeOptions {\n iosHandlerName?: string;\n androidInterfaceName?: string;\n reactNativeInterfaceName?: string;\n trackedEvents?: NativeTrackedEvent[] | string[];\n /** Log unhandled inbound message types to console in addition to forwarding to postMessage. */\n logUnhandled?: boolean;\n /** Injected for tests; defaults to global window. */\n win?: Window;\n}\n\nexport interface NativeWebViewBridge {\n readonly env: NativeBridgeEnvironment;\n sendToNative(type: string, payload?: unknown): void;\n receive(message: NativeBridgeMessage | string): void;\n setController(controller: OverlayWidgetsController | null): void;\n destroy(): void;\n}\n\nexport interface NativeOverlayInitOptions extends OverlayWidgetsOptions {\n nativeBridge?: Omit<NativeWebViewBridgeOptions, 'win'>;\n emitReadyEvent?: boolean;\n}\n\nexport interface NativeOverlayInitResult {\n controller: OverlayWidgetsController;\n bridge: NativeWebViewBridge;\n destroy(): void;\n}\n\nconst MAX_QUEUED_NATIVE_COMMANDS = 32;\nconst DEFAULT_NATIVE_QNA_MOUNT = '#gengage-qna';\nconst DEFAULT_NATIVE_SIMREL_MOUNT = '#gengage-simrel';\n\ninterface NativeWindow extends Window {\n webkit?: {\n messageHandlers?: Record<string, { postMessage?: (message: unknown) => void }>;\n };\n GengageNative?: {\n postMessage?: (message: string) => void;\n };\n ReactNativeWebView?: {\n postMessage?: (message: string) => void;\n };\n gengageNative?: NativeWebViewBridge;\n}\n\nfunction toNativeWindow(win: Window): NativeWindow {\n return win as NativeWindow;\n}\n\nfunction parseNativeBridgeMessage(raw: NativeBridgeMessage | string): NativeBridgeMessage | null {\n let candidate: unknown = raw;\n\n if (typeof raw === 'string') {\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n\n // Allow plain command strings such as \"openChat\" from native evaluateJavaScript calls.\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return { type: trimmed };\n }\n\n try {\n candidate = JSON.parse(trimmed);\n } catch {\n return null;\n }\n }\n\n if (!candidate || typeof candidate !== 'object') return null;\n const obj = candidate as Record<string, unknown>;\n\n const typeCandidate = [obj['type'], obj['command'], obj['action'], obj['event']].find(\n (value): value is string => typeof value === 'string' && value.length > 0,\n );\n if (!typeCandidate) return null;\n\n let payload = obj['payload'];\n if (payload === undefined && 'data' in obj) payload = obj['data'];\n\n // Common native shorthand:\n // { type: \"setSession\", sessionId: \"...\", userId: \"...\" }\n if (typeCandidate === 'setSession' && payload === undefined) {\n const sessionPayload: NativeSessionPayload = {};\n if (typeof obj['sessionId'] === 'string') sessionPayload.sessionId = obj['sessionId'];\n if (typeof obj['userId'] === 'string') sessionPayload.userId = obj['userId'];\n if (sessionPayload.sessionId !== undefined || sessionPayload.userId !== undefined) {\n payload = sessionPayload;\n }\n }\n\n return payload === undefined ? { type: typeCandidate } : { type: typeCandidate, payload };\n}\n\nfunction parseUpdateSkuPayload(payload: unknown): { sku: string; pageType?: PageContext['pageType'] } | null {\n if (typeof payload === 'string' && payload.length > 0) {\n return { sku: payload };\n }\n if (payload && typeof payload === 'object' && 'sku' in payload) {\n const sku = (payload as { sku?: unknown }).sku;\n if (typeof sku === 'string' && sku.length > 0) {\n const pageType = (payload as { pageType?: PageContext['pageType'] }).pageType;\n return pageType !== undefined ? { sku, pageType } : { sku };\n }\n }\n return null;\n}\n\nfunction hasMountTarget(win: Window, target: HTMLElement | string): boolean {\n if (target instanceof HTMLElement) return true;\n if (typeof target !== 'string') return false;\n return win.document.querySelector(target) !== null;\n}\n\nfunction ensureMountTarget(\n win: Window,\n preferredTarget: HTMLElement | string,\n fallbackId: string,\n): HTMLElement | string {\n if (preferredTarget instanceof HTMLElement) return preferredTarget;\n if (hasMountTarget(win, preferredTarget)) return preferredTarget;\n if (typeof preferredTarget !== 'string') return preferredTarget;\n\n // If target is a simple #id selector, create that mount.\n if (preferredTarget.startsWith('#')) {\n const id = preferredTarget.slice(1);\n if (id.length > 0) {\n const existing = win.document.getElementById(id);\n if (existing) return existing;\n const mount = win.document.createElement('div');\n mount.id = id;\n win.document.body.appendChild(mount);\n return mount;\n }\n }\n\n const fallback = win.document.getElementById(fallbackId);\n if (fallback) return fallback;\n const mount = win.document.createElement('div');\n mount.id = fallbackId;\n win.document.body.appendChild(mount);\n return mount;\n}\n\nfunction getIosPostMessage(win: Window, handlerName: string): ((message: unknown) => void) | null {\n const handler = toNativeWindow(win).webkit?.messageHandlers?.[handlerName];\n if (handler && typeof handler.postMessage === 'function') {\n return handler.postMessage.bind(handler);\n }\n return null;\n}\n\nfunction getNamedBridge(win: Window, interfaceName: string): { postMessage: (message: string) => void } | null {\n const candidate = (win as Window & Record<string, unknown>)[interfaceName];\n if (candidate && typeof candidate === 'object') {\n const postMessage = (candidate as { postMessage?: unknown }).postMessage;\n if (typeof postMessage === 'function') {\n return candidate as { postMessage: (message: string) => void };\n }\n }\n return null;\n}\n\nfunction getAndroidBridge(win: Window, interfaceName: string): { postMessage: (message: string) => void } | null {\n return getNamedBridge(win, interfaceName);\n}\n\nfunction getReactNativeBridge(win: Window, interfaceName: string): { postMessage: (message: string) => void } | null {\n return getNamedBridge(win, interfaceName);\n}\n\nexport function detectNativeEnvironment(\n options: Pick<\n NativeWebViewBridgeOptions,\n 'iosHandlerName' | 'androidInterfaceName' | 'reactNativeInterfaceName' | 'win'\n > = {},\n): NativeBridgeEnvironment {\n const win = options.win ?? window;\n const iosHandlerName = options.iosHandlerName ?? 'gengage';\n const androidInterfaceName = options.androidInterfaceName ?? 'GengageNative';\n const reactNativeInterfaceName = options.reactNativeInterfaceName ?? 'ReactNativeWebView';\n\n if (getIosPostMessage(win, iosHandlerName)) return 'ios';\n if (getAndroidBridge(win, androidInterfaceName)) return 'android';\n if (getReactNativeBridge(win, reactNativeInterfaceName)) return 'react-native';\n return 'browser';\n}\n\n/**\n * Applies native-provided session identity so widgets can share correlation IDs\n * with the host app. Safe to call before or after widget initialization.\n */\nexport function applyNativeSession(\n payload: NativeSessionPayload,\n options: Pick<NativeWebViewBridgeOptions, 'win'> = {},\n): void {\n const win = options.win ?? window;\n\n if (payload.sessionId !== undefined) {\n win.__gengageSessionId = payload.sessionId;\n if (!win.gengage) win.gengage = {};\n win.gengage.sessionId = payload.sessionId;\n try {\n win.sessionStorage.setItem('gengage_session_id', payload.sessionId);\n } catch {\n // sessionStorage can be unavailable in restricted WebView modes.\n }\n }\n\n if (payload.userId !== undefined) {\n if (!win.gengage) win.gengage = {};\n const bag = win.gengage as unknown as Record<string, unknown>;\n const session = (bag['session'] as Record<string, unknown> | undefined) ?? {};\n session['userId'] = payload.userId;\n bag['session'] = session;\n }\n}\n\n/**\n * Installs a native WebView bridge compatible with:\n * - iOS WKWebView (`webkit.messageHandlers`)\n * - Android JavascriptInterface (`window.GengageNative`)\n * - React Native WebView (`window.ReactNativeWebView`)\n * and exposes it on `window.gengageNative`.\n */\nexport function createNativeWebViewBridge(options: NativeWebViewBridgeOptions = {}): NativeWebViewBridge {\n const win = options.win ?? window;\n const nativeWin = toNativeWindow(win);\n if (nativeWin.gengageNative) return nativeWin.gengageNative;\n\n const iosHandlerName = options.iosHandlerName ?? 'gengage';\n const androidInterfaceName = options.androidInterfaceName ?? 'GengageNative';\n const reactNativeInterfaceName = options.reactNativeInterfaceName ?? 'ReactNativeWebView';\n const trackedEvents = options.trackedEvents ?? [...DEFAULT_NATIVE_TRACKED_EVENTS];\n const env = detectNativeEnvironment({ win, iosHandlerName, androidInterfaceName, reactNativeInterfaceName });\n\n let controller: OverlayWidgetsController | null = win.gengage?.overlay ?? null;\n const queuedCommands: NativeBridgeMessage[] = [];\n\n const sendToNative = (type: string, payload?: unknown): void => {\n const message: NativeBridgeMessage = payload === undefined ? { type } : { type, payload };\n\n if (env === 'ios') {\n const postMessage = getIosPostMessage(win, iosHandlerName);\n postMessage?.(message);\n return;\n }\n\n if (env === 'android') {\n const androidBridge = getAndroidBridge(win, androidInterfaceName);\n androidBridge?.postMessage(JSON.stringify(message));\n return;\n }\n\n if (env === 'react-native') {\n const reactNativeBridge = getReactNativeBridge(win, reactNativeInterfaceName);\n reactNativeBridge?.postMessage(JSON.stringify(message));\n return;\n }\n\n // Browser fallback: no-op. Useful when running the same integration\n // outside a native WebView (desktop QA, local dev, docs previews).\n return;\n };\n\n const bridgeMessageHandler: EventListener = (event) => {\n const detail = (event as CustomEvent<{ namespace: string; type: string; payload?: unknown }>).detail;\n if (!detail || typeof detail.namespace !== 'string' || typeof detail.type !== 'string') return;\n sendToNative('bridge_message', {\n namespace: detail.namespace,\n type: detail.type,\n payload: detail.payload,\n });\n };\n\n win.addEventListener('gengage:bridge:message', bridgeMessageHandler);\n\n const trackedEventHandlers: Array<{ event: string; handler: EventListener }> = trackedEvents.map((eventName) => {\n const handler: EventListener = (event) => {\n const detail = (event as CustomEvent<unknown>).detail;\n sendToNative('widget_event', {\n event: eventName,\n detail,\n });\n };\n win.addEventListener(eventName, handler);\n return { event: eventName, handler };\n });\n\n const queueCommand = (command: NativeBridgeMessage): void => {\n if (queuedCommands.length >= MAX_QUEUED_NATIVE_COMMANDS) {\n queuedCommands.shift();\n }\n queuedCommands.push(command);\n };\n\n const flushQueuedCommands = (): void => {\n if (!controller || queuedCommands.length === 0) return;\n const pending = queuedCommands.splice(0, queuedCommands.length);\n for (const command of pending) {\n receive(command);\n }\n };\n\n const receive = (message: NativeBridgeMessage | string): void => {\n const incoming = parseNativeBridgeMessage(message);\n if (!incoming || typeof incoming.type !== 'string') {\n console.warn('[gengage:native-bridge] Invalid message:', message);\n return;\n }\n\n const type = incoming.type as NativeInboundMessage | string;\n const payload = incoming.payload;\n\n switch (type) {\n case 'openChat': {\n if (controller) {\n controller.openChat(\n payload && typeof payload === 'object'\n ? (payload as { state?: 'half' | 'full' })\n : payload === 'half' || payload === 'full'\n ? { state: payload }\n : undefined,\n );\n } else {\n queueCommand(incoming);\n }\n return;\n }\n\n case 'closeChat': {\n if (controller) {\n controller.closeChat();\n } else {\n queueCommand(incoming);\n }\n return;\n }\n\n case 'updateContext': {\n if (controller && payload && typeof payload === 'object') {\n void controller.updateContext(payload as Partial<PageContext>);\n } else if (!controller) {\n queueCommand(incoming);\n } else {\n console.warn('[gengage:native-bridge] updateContext: missing payload');\n }\n return;\n }\n\n case 'updateSku': {\n const parsed = parseUpdateSkuPayload(payload);\n if (controller && parsed) {\n void controller.updateSku(parsed.sku, parsed.pageType);\n return;\n }\n if (!controller) {\n queueCommand(incoming);\n } else {\n console.warn('[gengage:native-bridge] updateSku: missing sku');\n }\n return;\n }\n\n case 'setSession': {\n if (payload && typeof payload === 'object') {\n applyNativeSession(payload as NativeSessionPayload, { win });\n }\n return;\n }\n\n case 'destroy': {\n controller?.destroy();\n return;\n }\n\n default: {\n win.postMessage({ gengage: 'native', type, payload }, win.location.origin);\n if (options.logUnhandled) {\n console.warn('[gengage:native-bridge] Unhandled inbound type forwarded:', type);\n }\n }\n }\n };\n\n const bridge: NativeWebViewBridge = {\n env,\n sendToNative,\n receive,\n setController(nextController) {\n controller = nextController;\n flushQueuedCommands();\n },\n destroy() {\n win.removeEventListener('gengage:bridge:message', bridgeMessageHandler);\n for (const entry of trackedEventHandlers) {\n win.removeEventListener(entry.event, entry.handler);\n }\n queuedCommands.splice(0, queuedCommands.length);\n if (toNativeWindow(win).gengageNative === bridge) {\n delete toNativeWindow(win).gengageNative;\n }\n },\n };\n\n nativeWin.gengageNative = bridge;\n return bridge;\n}\n\n/**\n * Convenience helper for mobile WebViews:\n * 1) installs native bridge\n * 2) initializes overlay widgets\n * 3) sends a `ready` message to native\n */\nexport async function initNativeOverlayWidgets(options: NativeOverlayInitOptions): Promise<NativeOverlayInitResult> {\n const { nativeBridge, emitReadyEvent = true, ...overlayOptions } = options;\n const bridge = createNativeWebViewBridge(nativeBridge);\n const resolvedOptions: OverlayWidgetsOptions = { ...overlayOptions };\n\n // Mobile-app-friendly defaults:\n // 1) translate commerce callbacks to native bridge messages by default\n // 2) avoid noisy missing-mount warnings unless PDP widgets are explicitly requested\n if (!resolvedOptions.onAddToCart) {\n resolvedOptions.onAddToCart = (params) => {\n bridge.sendToNative('addToCart', {\n sku: params.sku,\n quantity: params.quantity,\n cartCode: params.cartCode,\n });\n };\n }\n\n if (!resolvedOptions.onProductNavigate) {\n resolvedOptions.onProductNavigate = (url, sku, sessionId) => {\n bridge.sendToNative('productNavigate', {\n url,\n sku,\n sessionId,\n });\n };\n }\n\n const qnaRequested = resolvedOptions.qna?.enabled === true || resolvedOptions.qna?.mountTarget !== undefined;\n if (resolvedOptions.qna?.enabled !== false) {\n if (qnaRequested) {\n const mountTarget = ensureMountTarget(\n window,\n resolvedOptions.qna?.mountTarget ?? DEFAULT_NATIVE_QNA_MOUNT,\n 'gengage-qna',\n );\n resolvedOptions.qna = { ...resolvedOptions.qna, enabled: true, mountTarget };\n } else if (!hasMountTarget(window, DEFAULT_NATIVE_QNA_MOUNT)) {\n resolvedOptions.qna = { enabled: false };\n }\n }\n\n const simrelRequested = resolvedOptions.simrel?.enabled === true || resolvedOptions.simrel?.mountTarget !== undefined;\n if (resolvedOptions.simrel?.enabled !== false) {\n if (simrelRequested) {\n const mountTarget = ensureMountTarget(\n window,\n resolvedOptions.simrel?.mountTarget ?? DEFAULT_NATIVE_SIMREL_MOUNT,\n 'gengage-simrel',\n );\n resolvedOptions.simrel = { ...resolvedOptions.simrel, enabled: true, mountTarget };\n } else if (!hasMountTarget(window, DEFAULT_NATIVE_SIMREL_MOUNT)) {\n resolvedOptions.simrel = { enabled: false };\n }\n }\n\n const controller = await initOverlayWidgets(resolvedOptions);\n bridge.setController(controller);\n\n if (emitReadyEvent) {\n bridge.sendToNative('ready', {\n sessionId: controller.session.sessionId,\n widgets: {\n chat: controller.chat !== null,\n qna: controller.qna !== null,\n simrel: controller.simrel !== null,\n },\n });\n }\n\n return {\n controller,\n bridge,\n destroy() {\n controller.destroy();\n bridge.destroy();\n },\n };\n}\n"],"names":["defaultUnknownUISpecRenderer","element","renderElement","wrapper","childId","rendered","renderUISpecWithRegistry","options","container","unknownRenderer","elementId","renderer","mergeUISpecRegistry","base","overrides","merged","componentName","streamStartEvent","ctx","payload","event","streamChunkEvent","eventPayload","streamUiSpecEvent","streamDoneEvent","streamErrorEvent","llmUsageEvent","meteringIncrementEvent","meteringSummaryEvent","chatHistorySnapshotEvent","widgetHistorySnapshotEvent","basketAddEvent","checkoutStartEvent","checkoutCompleteEvent","dispatch","name","detail","listen","handler","listener","e","extractFreeTextActionMessage","action","text","wireQNAToChat","warnedOnce","pendingActions","pendingOpenCount","pollTimer","pollStartedAt","pollIntervalMs","pollTimeoutMs","getChat","notifyUnavailable","routeActionToChat","chat","freeText","clearPollTimer","flushPendingToChat","queued","ensurePollTimer","offAction","offOpen","bootstrapSession","sessionId","resolveSession","DEFAULT_WIDGET_THEME_TOKENS","withDefaultWidgetTheme","theme","ROOT_ID","STYLE_ID","ROOT_VISIBLE_CLASS","DEFAULT_DURATION_MS","MIN_DURATION_MS","MAX_DURATION_MS","listenerRegistered","dismissTimer","getGlobalErrorMessage","locale","registerGlobalErrorToastListener","showGlobalErrorToast","message","ensureStyles","root","ensureRoot","toast","title","sourceTitle","body","dismissGlobalErrorToast","clampDuration","source","existing","durationMs","style","BaseWidget","config","mergedTheme","off","patch","err","context","fn","type","data","builder","args","h","input","target","el","div","key","value","prop","toKebab","str","uuidv7","now","bytes","hex","b","CommunicationBridge","handlers","isValidBridgeData","msg","origin","obj","defaultLogger","routeStreamAction","logger","handleUnknownAction","newTab","defaultNavigate","isRecord","policy","url","ALLOWED_TAGS","DISALLOWED_TAGS","ALLOWED_ATTRS","hasJavascriptProtocol","sanitizeNode","node","parent","tag","children","child","globalAllowed","tagAllowed","attrs","attr","href","trimmed","src","SAFE_URL_PROTOCOLS","isSafeImageUrl","isSafeUrl","parsed","safeSetAttribute","sanitizeHtml","raw","ALLOWED_MIME_TYPES","MAX_FILE_SIZE","validateImageFile","file","isMinimalStreamEvent","splitConcatenatedJson","parts","depth","inString","escape","start","i","ch","processLine","line","jsonStr","part","consumeStream","response","reader","decoder","buffer","idleTimeout","IDLE_TIMEOUT_SENTINEL","readerCancelled","readPromise","timer","result","r","resolve","done","lines","adaptV1Event","isNormalizedStreamEvent","adaptOutputText","adaptSuggestedActions","adaptProductList","adaptProductDetails","adaptProductDetailsSimilars","adaptComparisonTable","adaptContext","adaptChatStreamEnd","adaptLoading","adaptPanelLoading","adaptSimilarLoading","adaptRedirect","adaptV1Error","adaptNoop","adaptLauncherAction","adaptLauncherText","adaptProductItem","adaptLauncherTextImage","adaptLauncherQuickQna","adaptReviewHighlights","adaptAiProductSuggestions","adaptAiProductGroupings","adaptAiSuggestedSearches","adaptProsAndCons","adaptGetGroundingReview","adaptVoice","adaptVisitorDataResponse","adaptProductListPreview","adaptGroupList","adaptFormEvent","adaptLauncherContent","adaptHandoff","widget","spec","asRecord","renderText","firstNonEmptyString","plainText","mentions","m","skuMap","convMode","entries","label","actionPayload","requestDetailsToAction","buildActionButtonsUISpec","isNonNullable","buildProductGridUISpec","product","productToNormalized","buildEmptyUISpec","products","payloadRecord","framework","table","featuresList","normalizedProducts","p","norm","attributes","buildComparisonAttributes","recommendedSku","recommended","highlights","diff","specialCases","normalizeStringList","recommendedText","winnerHits","productActions","sku","props","firstValue","displayNames","fieldOrder","fieldName","values","v","rowMap","orderedSkus","collectComparisonFields","field","row","shortValue","longValue","stringifyComparisonValue","fields","seen","_event","quickQnaPayload","launcherType","textImagePayload","imageUrl","launcherTextPayload","payloadObj","buildSingleProductUISpec","fallbackPayload","item","review","suggestions","items","suggestion","suggestionToNormalizedProduct","payloadGroupings","grouping","fallbackRequest","entry","filteredLabels","x","searches","search","shortName","requestDetailsRecord","requestPayload","requestGroupSkus","requestedAction","detailedMessage","whyDifferent","groupList","groups","group","groupName","filterTags","elements","childIds","id","btn","fallbackSku","fallbackName","productObj","productRecordToNormalized","brand","images","stringArray","image","priceDiscounted","toNumber","price","rating","reviewCount","cartCode","requestDetails","details","normalized","originalPrice","discountPercent","normalizedName","normalizeSimilarProductsResponse","json","normalizeProductGroupingsResponse","CHAT_ENDPOINT_PATHS","ACAP_ENDPOINT_MAP","normalizeMiddlewareUrl","buildChatEndpointUrl","endpoint","baseUrl","accountId","acapPath","enrichActionPayload","merge","additions","ACTION_TYPE_MAP","buildRequestBody","request","flatType","flatPayload","rest","rawType","rawPayload","mappedType","buildAcapRequestBody","screenContext","sendChatMessage","callbacks","transport","controller","requestBody","useFormData","fetchInit","formData","doneFired","fireDone","fetchProactiveAction","res","CHAT_I18N_TR","CHAT_I18N_EN","normalizeLocale","resolveChatLocale","isVoiceInputSupported","getSpeechRecognitionConstructor","w","VoiceInput","Ctor","recognition","interim","latestFinal","alt","code","mapErrorCode","state","error","createKvkkBanner","banner","content","dismiss","PanelTopBar","canBack","canForward","ThumbnailsColumn","unique","thumb","img","SUGGESTED_ACTION_ICONS","DEFAULT_I18N","ChatDrawer","header","headerLeft","avatar","headerInfo","titleRow","badge","powered","headerRight","cartLink","favBtn","closeBtn","chevron","touchStartX","touchStartY","swipeThreshold","touch","deltaX","deltaY","nextCollapsed","conversation","scrollRafPending","scrollTop","scrollHeight","clientHeight","threadId","pillsScroll","pillsArrow","pillsRafPending","atEnd","inputArea","attachBtn","previewThumb","removeBtn","pill","_code","_message","footer","bubble","thumbEl","blobUrl","links","link","rollbackBtn","searchText","indicator","sparkle","onRetry","errEl","textEl","retryBtn","pills","scroll","svgHtml","iconSpan","textWrap","desc","arrow","html","onDismiss","contentType","skeleton","imgBlock","grid","card","block","collapsed","chevronBtn","list","step","marker","focusable","first","last","active","attachment","force","messageId","allBubbles","lastThreadId","chips","chip","DEFAULT_SVG","createLauncher","contentArea","button","tooltipEl","contentAreaBottom","createProactivePopup","popup","messageEl","actions","autoDismissTimer","clearAndRemove","ab","acceptBtn","dismissBtn","timeout","ActivityTracker","docHeight","bucket","ALLOWED_AUDIO_TYPES","playTtsAudio","base64","baseType","audio","HeartbeatManager","TURKISH_DEFAULTS","formatPrice","num","resolved","fixed","dotIdx","intPart","decPart","withSeparators","formatted","CRITERIA_DISPLAY_NAMES","formatCriteriaName","rawName","c","renderComparisonTable","onProductClick","i18n","heading","recCard","recLabel","recBody","info","hlSection","hlLabel","ul","hl","li","recExplanation","kdSection","kdHeading","kdContent","formatKeyDifferences","special","summary","sc","appendSpecialCaseListItems","thead","headerRow","emptyTh","th","prc","tbody","labelTd","td","btnRow","l","sanitized","template","nestedItems","nestedItem","looksLikeHtml","renderReviewHighlights","reviews","empty","counts","tabBar","filters","activeFilter","itemsContainer","renderItems","filtered","cls","tagEl","ratingEl","f","tab","t","tagCounts","pillsRow","icon","tagText","clampRating","clampDiscount","renderStarRating","halfStars","clamped","full","half","rounded","addImageErrorHandler","resolveActionSku","productSku","ROLE_LABELS","getRoleLabel","role","renderAITopPicks","cardsWrap","renderTopPickCard","renderCompactCard","discountBadge","nameEl","reasonEl","renderSentimentChips","score","maxScale","priceRow","orig","current","spinner","cta","roleLabel","roleEl","priceEl","labels","renderGroundingReviewCard","ctaLabel","titleEl","subtitle","normalizeGroupingAction","normalizedPayload","groupSkus","renderAIGroupingCards","labelsEl","renderAISuggestedSearchCards","renderFloatingComparisonButton","selectedSkus","renderProsAndCons","productName","pros","cons","prosList","pro","consList","con","renderCategoriesContainer","tabs","panels","activateTab","index","j","isActive","tabId","panelId","next","panel","renderCategoryProductCard","tagsContainer","tagBtn","renderHandoffNotice","summaryEl","renderProductSummaryCard","imgWrap","needsBrand","ratingRow","count","createQuantityStepper","rawMin","rawMax","min","max","initial","compact","quantity","decBtn","valueEl","incBtn","submitBtn","updateButtons","isMobileViewport","DEFAULT_CHAT_UI_SPEC_REGISTRY","renderActionButtons","renderActionButton","renderProductCard","renderProductDetailsPanel","renderProductGrid","renderReviewHighlightsComponent","renderComparisonTableElement","renderDivider","defaultChatUnknownUISpecRenderer","createDefaultChatUISpecRegistry","renderUISpec","registry","buttons","imgWrapper","findSimilarSku","favSku","heart","isFav","svgFill","svg","brandEl","inStock","stock","promotions","promoBadges","promo","stepper","checkbox","detailsSku","media","mainImg","firstSafe","u","thumbStrip","activeThumb","activeThumbIdx","imgUrl","SWIPE_THRESHOLD","touchEndX","thumbEls","nextIdx","currentPrice","oldPrice","variants","variantSection","variantLabel","variantList","variant","variantName","variantSku","labelText","variantPrice","actionRow","actionBtn","shareUrl","addCircle","cx","cy","svgNS","addLine","x1","y1","x2","y2","shareBtn","shareLabel","description","specifications","renderProductDetailTabs","tabPanels","keyCell","valCell","tabEl","idx","pIdx","getSortedChildIds","sort","withPrice","a","resortGrid","sorted","childMap","elId","toolbar","separator","compareBtn","sortedIds","viewMoreBtn","floatingBtn","keyDifferencesHtml","hr","labelEl","BLOCK_ELEMENTS","splitIntoBlocks","nodes","blocks","currentInline","containsTable","prefersReducedMotion","typewriteHtml","delayMs","onTick","onComplete","currentIndex","timerId","running","revealNext","isWordChar","char","linkProductMentions","mentionMap","lowerName","mention","walker","found","prevChar","nextChar","before","match","after","INPUT_AREA_ICONS","INPUT_AREA_TYPES","isInputAreaAction","SESSION_STORAGE_KEY","createChoicePrompter","headingEl","suggestionEl","markDismissed","isChoicePrompterDismissed","DB_NAME","DB_VERSION","STORE_SESSIONS","STORE_CONTEXT","STORE_PAYLOAD","STORE_FAVORITES","requestToPromise","reject","transactionComplete","tx","GengageIndexedDB","dbName","version","db","oldVersion","userId","appId","cursor","store","range","results","BASE_PANEL_CONTENT_TYPES","ExtendedModeManager","types","hidden","shown","fav","PanelManager","deps","drawer","contentEl","clone","snapshot","shadow","snapshotType","extended","bridge","componentType","backendTitle","isSearchLikeActionType","currentThreadId","pendingType","panelType","panelRoot","actionType","SessionPersistence","params","serializableMessages","sm","panelSnapshotHtml","msgId","persistFn","attempt","favs","KVKK_STORAGE_KEY","KVKK_TEXT_MARKERS","KVKK_LAW_NUMBER_RE","containsKvkk","lower","isKvkkShown","markKvkkShown","stripKvkkBlock","extractKvkkBlock","doc","LOCALE_TO_LANGUAGE","localeToOutputLanguage","isGAAvailable","pushEvent","eventName","trackInit","trackShow","trackSuggestedQuestion","trackFindSimilars","trackComparePreselection","trackCompareSelected","skus","trackCompareClear","trackCompareReceived","productCount","trackLikeProduct","trackLikeList","trackSearch","query","resultCount","trackProductDetail","trackCartAdd","trackMessageSent","trackMessageReceived","trackConversationStart","trackVoiceInput","$constructor","initializer","init","inst","def","_","proto","keys","k","Parent","Definition","_a","$ZodAsyncError","$ZodEncodeError","globalConfig","newConfig","getEnumValues","numericValues","jsonStringifyReplacer","cached","getter","nullish","cleanRegex","end","floatSafeRemainder","val","valDecCount","stepString","stepDecCount","decCount","valInt","stepInt","EVALUATING","defineLazy","object","assignProp","mergeDefs","defs","mergedDescriptors","descriptors","esc","slugify","captureStackTrace","_args","isObject","allowsEval","F","isPlainObject","o","ctor","prot","shallowClone","propertyKeyTypes","escapeRegex","cl","normalizeParams","_params","optionalKeys","shape","NUMBER_FORMAT_RANGES","pick","schema","mask","currDef","checks","newShape","omit","extend","existingShape","_shape","safeExtend","partial","Class","oldShape","required","aborted","startIndex","prefixIssues","path","issues","iss","unwrapMessage","finalizeIssue","getLengthableOrigin","issue","util.jsonStringifyReplacer","$ZodError","$ZodRealError","flattenError","mapper","fieldErrors","formErrors","sub","formatError","processError","curr","_parse","_Err","_ctx","core.$ZodAsyncError","util.finalizeIssue","core.config","util.captureStackTrace","_parseAsync","_safeParse","errors.$ZodError","safeParse","errors.$ZodRealError","_safeParseAsync","safeParseAsync","_encode","_decode","_encodeAsync","_decodeAsync","_safeEncode","_safeDecode","_safeEncodeAsync","_safeDecodeAsync","cuid","cuid2","ulid","xid","ksuid","nanoid","duration","guid","uuid","email","_emoji","emoji","ipv4","ipv6","cidrv4","cidrv6","base64url","e164","dateSource","date","timeSource","hhmm","time","datetime","opts","timeRegex","string","regex","integer","number","boolean","lowercase","uppercase","$ZodCheck","core.$constructor","numericOriginMap","$ZodCheckLessThan","bag","$ZodCheckGreaterThan","$ZodCheckMultipleOf","util.floatSafeRemainder","$ZodCheckNumberFormat","isInt","minimum","maximum","util.NUMBER_FORMAT_RANGES","regexes.integer","$ZodCheckMaxLength","util.nullish","util.getLengthableOrigin","$ZodCheckMinLength","$ZodCheckLengthEquals","length","tooBig","$ZodCheckStringFormat","_b","$ZodCheckRegex","$ZodCheckLowerCase","regexes.lowercase","$ZodCheckUpperCase","regexes.uppercase","$ZodCheckIncludes","escapedRegex","util.escapeRegex","pattern","$ZodCheckStartsWith","$ZodCheckEndsWith","$ZodCheckOverwrite","Doc","arg","minIndent","dedented","$ZodType","runChecks","isAborted","util.aborted","asyncResult","currLen","handleCanaryResult","canary","checkResult","util.defineLazy","$ZodString","regexes.string","$ZodStringFormat","checks.$ZodCheckStringFormat","$ZodGUID","regexes.guid","$ZodUUID","regexes.uuid","$ZodEmail","regexes.email","$ZodURL","$ZodEmoji","regexes.emoji","$ZodNanoID","regexes.nanoid","$ZodCUID","regexes.cuid","$ZodCUID2","regexes.cuid2","$ZodULID","regexes.ulid","$ZodXID","regexes.xid","$ZodKSUID","regexes.ksuid","$ZodISODateTime","regexes.datetime","$ZodISODate","regexes.date","$ZodISOTime","regexes.time","$ZodISODuration","regexes.duration","$ZodIPv4","regexes.ipv4","$ZodIPv6","regexes.ipv6","$ZodCIDRv4","regexes.cidrv4","$ZodCIDRv6","regexes.cidrv6","address","prefix","prefixNum","isValidBase64","$ZodBase64","regexes.base64","isValidBase64URL","regexes.base64url","padded","$ZodBase64URL","$ZodE164","regexes.e164","isValidJWT","token","algorithm","tokensParts","parsedHeader","$ZodJWT","$ZodNumber","regexes.number","received","$ZodNumberFormat","checks.$ZodCheckNumberFormat","$ZodBoolean","regexes.boolean","$ZodUnknown","$ZodNever","handleArrayResult","final","util.prefixIssues","$ZodArray","proms","handlePropertyResult","isOptionalOut","normalizeDef","okeys","util.optionalKeys","handleCatchall","unrecognized","keySet","_catchall","$ZodObject","sh","newSh","_normalized","util.cached","propValues","util.isObject","catchall","$ZodObjectJIT","superParse","generateFastpass","parseStr","util.esc","ids","counter","fastpass","jit","core.globalConfig","fastEnabled","util.allowsEval","handleUnionResults","nonaborted","$ZodUnion","option","patterns","util.cleanRegex","single","async","$ZodIntersection","left","right","handleIntersectionResults","mergeValues","util.isPlainObject","bKeys","sharedKeys","newObj","sharedValue","newArray","itemA","itemB","unrecKeys","unrecIssue","bothKeys","$ZodEnum","util.getEnumValues","valuesSet","util.propertyKeyTypes","$ZodLiteral","$ZodTransform","core.$ZodEncodeError","_out","output","handleOptionalResult","$ZodOptional","$ZodExactOptional","$ZodNullable","$ZodDefault","handleDefaultResult","$ZodPrefault","$ZodNonOptional","handleNonOptionalResult","$ZodCatch","$ZodPipe","handlePipeResult","$ZodReadonly","handleReadonlyResult","$ZodCustom","checks.$ZodCheck","handleRefineResult","_iss","util.issue","$ZodRegistry","_meta","meta","pm","globalRegistry","_string","util.normalizeParams","_email","_guid","_uuid","_uuidv4","_uuidv6","_uuidv7","_url","_nanoid","_cuid","_cuid2","_ulid","_xid","_ksuid","_ipv4","_ipv6","_cidrv4","_cidrv6","_base64","_base64url","_e164","_jwt","_isoDateTime","_isoDate","_isoTime","_isoDuration","_number","_int","_boolean","_unknown","_never","_lt","checks.$ZodCheckLessThan","_lte","_gt","checks.$ZodCheckGreaterThan","_gte","_multipleOf","checks.$ZodCheckMultipleOf","_maxLength","checks.$ZodCheckMaxLength","_minLength","checks.$ZodCheckMinLength","_length","checks.$ZodCheckLengthEquals","_regex","checks.$ZodCheckRegex","_lowercase","checks.$ZodCheckLowerCase","_uppercase","checks.$ZodCheckUpperCase","_includes","includes","checks.$ZodCheckIncludes","_startsWith","checks.$ZodCheckStartsWith","_endsWith","suffix","checks.$ZodCheckEndsWith","_overwrite","checks.$ZodCheckOverwrite","_normalize","form","_trim","_toLowerCase","_toUpperCase","_slugify","util.slugify","_array","_refine","_superRefine","_check","_issue","initializeContext","process","overrideSchema","_json","processor","isTransforming","extractDefs","idToSchema","makeURI","defsSegment","externalId","uriGenerator","defUriPrefix","defId","extractToDef","ref","ext","finalize","flattenRef","zodSchema","_cached","refSeen","refSchema","parentSeen","finalized","createStandardJSONSchemaMethod","_schema","createToJSONSchemaMethod","processors","io","libraryOptions","formatMap","stringProcessor","format","contentEncoding","regexes","numberProcessor","multipleOf","exclusiveMaximum","exclusiveMinimum","booleanProcessor","neverProcessor","unknownProcessor","enumProcessor","literalProcessor","vals","customProcessor","transformProcessor","arrayProcessor","objectProcessor","allKeys","requiredKeys","unionProcessor","isExclusive","intersectionProcessor","isSimpleIntersection","allOf","nullableProcessor","inner","nonoptionalProcessor","defaultProcessor","prefaultProcessor","catchProcessor","catchValue","pipeProcessor","innerType","readonlyProcessor","optionalProcessor","ZodISODateTime","core.$ZodISODateTime","schemas.ZodStringFormat","core._isoDateTime","ZodISODate","core.$ZodISODate","core._isoDate","ZodISOTime","core.$ZodISOTime","core._isoTime","ZodISODuration","core.$ZodISODuration","core._isoDuration","ZodRealError","core.formatError","core.flattenError","parse","core._parse","parseAsync","core._parseAsync","core._safeParse","core._safeParseAsync","encode","core._encode","decode","core._decode","encodeAsync","core._encodeAsync","decodeAsync","core._decodeAsync","safeEncode","core._safeEncode","safeDecode","core._safeDecode","safeEncodeAsync","core._safeEncodeAsync","safeDecodeAsync","core._safeDecodeAsync","ZodType","core.$ZodType","util.mergeDefs","core.clone","reg","parse.parse","parse.safeParse","parse.parseAsync","parse.safeParseAsync","parse.encode","parse.decode","parse.encodeAsync","parse.decodeAsync","parse.safeEncode","parse.safeDecode","parse.safeEncodeAsync","parse.safeDecodeAsync","check","refine","refinement","superRefine","checks.overwrite","optional","exactOptional","nullable","nonoptional","array","union","intersection","pipe","transform","_default","prefault","_catch","readonly","core.globalRegistry","_ZodString","core.$ZodString","processors.stringProcessor","checks.regex","checks.includes","checks.startsWith","checks.endsWith","checks.minLength","checks.maxLength","checks.length","checks.lowercase","checks.uppercase","checks.trim","checks.normalize","checks.toLowerCase","checks.toUpperCase","checks.slugify","ZodString","core._email","ZodEmail","core._url","ZodURL","core._jwt","ZodJWT","core._emoji","ZodEmoji","core._guid","ZodGUID","core._uuid","ZodUUID","core._uuidv4","core._uuidv6","core._uuidv7","core._nanoid","ZodNanoID","core._cuid","ZodCUID","core._cuid2","ZodCUID2","core._ulid","ZodULID","core._base64","ZodBase64","core._base64url","ZodBase64URL","core._xid","ZodXID","core._ksuid","ZodKSUID","core._ipv4","ZodIPv4","core._ipv6","ZodIPv6","core._cidrv4","ZodCIDRv4","core._cidrv6","ZodCIDRv6","core._e164","ZodE164","iso.datetime","iso.date","iso.time","iso.duration","core._string","ZodStringFormat","core.$ZodStringFormat","core.$ZodEmail","core.$ZodGUID","core.$ZodUUID","core.$ZodURL","core.$ZodEmoji","core.$ZodNanoID","core.$ZodCUID","core.$ZodCUID2","core.$ZodULID","core.$ZodXID","core.$ZodKSUID","core.$ZodIPv4","core.$ZodIPv6","core.$ZodCIDRv4","core.$ZodCIDRv6","core.$ZodBase64","core.$ZodBase64URL","core.$ZodE164","core.$ZodJWT","ZodNumber","core.$ZodNumber","processors.numberProcessor","checks.gt","checks.gte","checks.lt","checks.lte","int","checks.multipleOf","core._number","ZodNumberFormat","core.$ZodNumberFormat","core._int","ZodBoolean","core.$ZodBoolean","processors.booleanProcessor","core._boolean","ZodUnknown","core.$ZodUnknown","processors.unknownProcessor","unknown","core._unknown","ZodNever","core.$ZodNever","processors.neverProcessor","never","core._never","ZodArray","core.$ZodArray","processors.arrayProcessor","minLength","maxLength","len","core._array","ZodObject","core.$ZodObjectJIT","processors.objectProcessor","_enum","incoming","util.extend","util.safeExtend","other","util.merge","util.pick","util.omit","util.partial","ZodOptional","util.required","ZodNonOptional","ZodUnion","core.$ZodUnion","processors.unionProcessor","ZodIntersection","core.$ZodIntersection","processors.intersectionProcessor","ZodEnum","core.$ZodEnum","processors.enumProcessor","newEntries","ZodLiteral","core.$ZodLiteral","processors.literalProcessor","literal","ZodTransform","core.$ZodTransform","processors.transformProcessor","core.$ZodOptional","processors.optionalProcessor","ZodExactOptional","core.$ZodExactOptional","ZodNullable","core.$ZodNullable","processors.nullableProcessor","ZodDefault","core.$ZodDefault","processors.defaultProcessor","defaultValue","util.shallowClone","ZodPrefault","core.$ZodPrefault","processors.prefaultProcessor","core.$ZodNonOptional","processors.nonoptionalProcessor","ZodCatch","core.$ZodCatch","processors.catchProcessor","ZodPipe","core.$ZodPipe","processors.pipeProcessor","in_","out","ZodReadonly","core.$ZodReadonly","processors.readonlyProcessor","ZodCustom","core.$ZodCustom","processors.customProcessor","core._refine","core._superRefine","isSafeCSSColor","isActionLike","GengageChat","chatStyles","rootEl","launcherOpts","drawerContainer","ga.trackLikeList","tid","restoredCollapsedPanel","panelMode","restoreSessionId","restoreSku","hasHandoff","idb","onResize","onViewportResize","offset","minDepth","heartbeatActions","sa","pending","ga.trackInit","ga.trackShow","callback","set","nested","color","sid","actionButtons","popupOpts","pageType","rd","ts","elapsed","cooldown","hideLauncher","mobileHalf","mobileFull","ga.trackMessageSent","ga.trackConversationStart","cutoff","removed","isPreservePanel","isPdpAutoLaunch","userMsg","fallback","botMsg","localBotText","chatHistory","enrichedAction","requestId","streamStart","chunkIndex","panelLoadingSeen","panelContentReceived","streamController","isFinal","extra","displayText","acctId","kvkkHtml","existingBubble","ga.trackMessageReceived","bubbleTextEl","panelHint","rootElement","renderContext","ga.trackCompareReceived","childCount","ga.trackSearch","panelSpec","shouldRenderInline","titleType","inlineSpec","messagesContainer","inline","previewImageUrls","mountSelector","mountEl","inputChips","pillButtons","routerOpts","voiceEvent","allowed","ga.trackVoiceInput","voicePayload","hadPanelContent","msgs","panelEl","targetBot","currentSku","shouldRestore","session","maxMsgNum","chatMsg","idNum","uiSpec","panelBot","lastPanelThread","lastPanelBot","ga.trackCompareClear","s","ga.trackComparePreselection","gridWrapper","toggleBtn","cards","cb","wrappers","existingFloating","ga.trackCompareSelected","ga.trackSuggestedQuestion","ga.trackFindSimilars","preservePanel","ga.trackProductDetail","ga.trackCartAdd","detailSpec","ga.trackLikeProduct","_detail","baseRegistry","defaultRender","inputSpec","inputContext","override","fetchLauncherActions","signal","streamOpts","renderButtonRow","renderTextInput","placeholders","placeholderIndex","rotateTimer","fadeTimer","sendBtn","submit","toActionPayload","labelFallback","titleRaw","actionPayloadToRowAction","rowAction","collectButtonRowActions","directActions","rawAction","directButtons","rawButton","DEFAULT_QNA_UI_SPEC_REGISTRY","rowActions","orientation","placeholder","defaultQnaUnknownUISpecRenderer","createDefaultQnaUISpecRegistry","renderQnaUISpec","QNA_I18N_TR","QNA_I18N_EN","resolveQnaLocale","GengageQNA","newSku","loading","fetchStart","launcherReq","cfgPlaceholders","effectivePlaceholders","fallbackSpec","nonEmptySpecs","fallbackPlaceholders","fallbackContext","dot","specs","renderedInput","isNDJSONResponse","ct","collectProductsFromStream","fetchSimilarProducts","collectGroupingsFromStream","currentGroup","highlight","fetchProductGroupings","discountType","onClick","onAddToCart","renderCard","pricing","priceContainer","original","cardOpts","_groupTabsInstanceCounter","renderGroupTabs","instanceId","buildGridOptions","gridOpts","firstPanel","firstGrid","toSimRelProduct","DEFAULT_SIMREL_UI_SPEC_REGISTRY","columns","productRaw","indexRaw","discountTypeRaw","groupsRaw","rawProduct","actionObj","defaultSimRelUnknownUISpecRenderer","createDefaultSimRelUISpecRegistry","renderSimRelUISpec","SIMREL_I18N_TR","SIMREL_I18N_EN","resolveSimRelLocale","GengageSimRel","simRelProduct","simReq","groupsSpec","renderedGroups","n","g","gridSpec","renderedGrid","WidgetToggleSchema","z.object","z.boolean","MountSelectorsSchema","z.string","TransportSchema","AnalyticsAuthModeSchema","z.enum","AnalyticsAuthSchema","AnalyticsSchema","z.number","DEFAULT_IDEMPOTENCY_KEY","GTMSchema","UnknownActionPolicySchema","ActionHandlingSchema","z.literal","DEFAULT_OVERLAY_KEY_PREFIX","DEFAULT_QNA_MOUNT","DEFAULT_SIMREL_MOUNT","getOverlayRegistry","win","buildInitialPageContext","mergePageContext","resolveMountTarget","buildOverlayKey","OverlayWidgetsRuntime","onDestroy","middlewareUrl","qnaTarget","mountTarget","qna","qnaConfig","simRelTarget","simrel","simRelConfig","initOverlayWidgets","runtime","liveRegistry","runtimeInit","DEFAULT_NATIVE_TRACKED_EVENTS","MAX_QUEUED_NATIVE_COMMANDS","DEFAULT_NATIVE_QNA_MOUNT","DEFAULT_NATIVE_SIMREL_MOUNT","toNativeWindow","parseNativeBridgeMessage","candidate","typeCandidate","sessionPayload","parseUpdateSkuPayload","hasMountTarget","ensureMountTarget","preferredTarget","fallbackId","mount","getIosPostMessage","handlerName","getNamedBridge","interfaceName","getAndroidBridge","getReactNativeBridge","detectNativeEnvironment","iosHandlerName","androidInterfaceName","reactNativeInterfaceName","applyNativeSession","createNativeWebViewBridge","nativeWin","trackedEvents","env","queuedCommands","sendToNative","bridgeMessageHandler","trackedEventHandlers","queueCommand","command","flushQueuedCommands","receive","nextController","initNativeOverlayWidgets","nativeBridge","emitReadyEvent","overlayOptions","resolvedOptions","qnaRequested","simrelRequested"],"mappings":"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","x_google_ignoreList":[55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71]}