@mushi-mushi/web 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +235 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +235 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/marketing-recorder.ts","../src/rewards.ts","../src/capture/console.ts","../src/internal-requests.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/capture/timeline.ts","../src/capture/discovery.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/version.ts","../src/mushi.ts"],"names":["textarea","MUSHI_INTERNAL_INIT_MARKER","MUSHI_INTERNAL_HEADER","MAX_ENTRIES","getSessionId","scope","handleClick","isExcluded","fire","arm","reset","history","handleError","handleUnhandledRejection","createLogger","noopLogger","apiClient","createApiClient","createPreFilter","createOfflineQueue","createRateLimiter","createPiiScrubber","createBreadcrumbBuffer","getReporterToken","getDeviceFingerprintHash","captureEnvironment","normaliseThrown","DEFAULT_API_ENDPOINT"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached ✓',\n screenshotCapturing: 'Taking screenshot…',\n screenshotFailed: \"Couldn't capture — describe it instead\",\n elementButton: 'Select Element',\n elementSelected: 'Element selected ✓',\n elementCapturing: 'Click anything on the page…',\n elementSelectorHint: 'Click any element · Esc to cancel',\n optional: '(optional)',\n tooShort: 'A bit more detail helps us fix it faster',\n examplePrompts: [\n 'The save button does nothing',\n 'Page froze for 10 seconds',\n 'Layout looks broken here',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み ✓',\n screenshotCapturing: 'スクリーンショット撮影中…',\n screenshotFailed: '取得できませんでした — 文字で教えてください',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み ✓',\n elementCapturing: 'ページ上の要素をクリック…',\n elementSelectorHint: '要素をクリック · Esc でキャンセル',\n optional: '(任意)',\n tooShort: 'もう少し詳しく教えてください',\n examplePrompts: [\n '保存ボタンが反応しない',\n 'ページが10秒固まった',\n 'レイアウトが崩れている',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว ✓',\n screenshotCapturing: 'กำลังถ่ายสกรีนช็อต…',\n screenshotFailed: 'ไม่สามารถถ่ายภาพได้ — โปรดอธิบายแทน',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว ✓',\n elementCapturing: 'คลิกองค์ประกอบบนหน้า…',\n elementSelectorHint: 'คลิกองค์ประกอบใดก็ได้ · Esc เพื่อยกเลิก',\n optional: '(ไม่บังคับ)',\n tooShort: 'กรุณาให้รายละเอียดเพิ่มเติม',\n examplePrompts: [\n 'ปุ่มบันทึกไม่ทำงาน',\n 'หน้าค้างนาน 10 วินาที',\n 'เลย์เอาต์พัง',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta ✓',\n screenshotCapturing: 'Tomando captura…',\n screenshotFailed: 'No se pudo capturar — descríbelo en su lugar',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado ✓',\n elementCapturing: 'Haz clic en cualquier elemento…',\n elementSelectorHint: 'Clic en cualquier elemento · Esc para cancelar',\n optional: '(opcional)',\n tooShort: 'Un poco más de detalle nos ayuda a resolverlo',\n examplePrompts: [\n 'El botón guardar no responde',\n 'La página se congeló 10 segundos',\n 'El diseño se ve roto aquí',\n ],\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n // `undefined` or the sentinel `'auto'` both fall through to navigator.language.\n const resolved =\n code && code !== 'auto'\n ? code\n : typeof navigator !== 'undefined'\n ? (navigator.language ?? navigator.languages?.[0])\n : undefined;\n if (!resolved) return en;\n const base = resolved.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n --mushi-ok: ${isDark ? '#4ade80' : '#16a34a'};\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n /* First-session welcome pulse. Three soft halos at 800ms each, then\n auto-clear. Uses a box-shadow ring rather than transform/scale so it\n can compose with the hover transform without fighting it. Respects\n prefers-reduced-motion. */\n @keyframes mushi-trigger-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(212, 67, 50, 0.55), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n 70% { box-shadow: 0 0 0 16px rgba(212, 67, 50, 0), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n 100% { box-shadow: 0 0 0 0 rgba(212, 67, 50, 0), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n }\n .mushi-trigger-pulse {\n animation: mushi-trigger-pulse 800ms ${easeStamp} 3;\n }\n @media (prefers-reduced-motion: reduce) {\n .mushi-trigger-pulse { animation: none; }\n }\n .mushi-trigger.bottom-right {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.bottom-left {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.top-right {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.top-left {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.edge-tab {\n width: 32px;\n height: 88px;\n border-radius: 4px 0 0 4px;\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-size: 16px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset -3px 0 0 ${vermillion};\n }\n .mushi-trigger.edge-tab.bottom-right,\n .mushi-trigger.edge-tab.top-right {\n right: var(--mushi-right, 0);\n }\n .mushi-trigger.edge-tab.bottom-left,\n .mushi-trigger.edge-tab.top-left {\n left: var(--mushi-left, 0);\n border-radius: 0 4px 4px 0;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset 3px 0 0 ${vermillion};\n }\n .mushi-trigger.shrunk {\n width: 36px;\n height: 36px;\n opacity: 0.82;\n transform: scale(0.92);\n }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: bottom right;\n }\n .mushi-panel.bottom-left {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: bottom left;\n }\n .mushi-panel.top-right {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: top right;\n }\n .mushi-panel.top-left {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: top left;\n }\n .mushi-outdated {\n margin: 12px 14px 0;\n padding: 10px 12px;\n border: 1px solid ${vermillionWash};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontBody};\n font-size: 12px;\n line-height: 1.4;\n }\n .mushi-outdated strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin-bottom: 2px;\n }\n .mushi-outdated span {\n display: block;\n margin-top: 3px;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n /* Feature-request and Reports-inbox entries sit above the five\n category cards as discoverable shortcuts. We give them a subtle\n left rule so the eye reads them as a separate group rather than\n \"another category\". The shortcut group has zero hover indent\n overshoot — we want them quiet until intent. */\n .mushi-feature-entry,\n .mushi-reports-entry {\n padding-left: 10px;\n border-left: 2px solid ${inkFaint};\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp}, border-color 220ms ${easeStamp};\n }\n .mushi-feature-entry:hover,\n .mushi-reports-entry:hover {\n border-left-color: ${vermillion};\n padding-left: 14px;\n }\n .mushi-feature-entry .mushi-option-icon {\n filter: none;\n }\n .mushi-report-row {\n width: 100%;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 8px;\n align-items: center;\n padding: 10px 0;\n border: 0;\n border-bottom: 1px solid ${rule};\n background: transparent;\n color: ${ink};\n cursor: pointer;\n text-align: left;\n }\n .mushi-report-status {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-report-title {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mushi-thread-summary {\n border-bottom: 1px solid ${rule};\n padding-bottom: 10px;\n margin-bottom: 10px;\n }\n .mushi-thread-summary span {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-thread {\n display: grid;\n gap: 8px;\n max-height: 180px;\n overflow: auto;\n margin-bottom: 12px;\n }\n .mushi-thread-comment {\n padding: 8px 10px;\n border: 1px solid ${rule};\n background: ${isDark ? 'rgba(242,235,221,0.04)' : 'rgba(14,13,11,0.03)'};\n }\n .mushi-thread-comment.reporter {\n border-color: ${vermillionWash};\n background: ${vermillionWash};\n }\n .mushi-thread-comment strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 3px;\n }\n .mushi-thread-comment p,\n .mushi-muted,\n .mushi-error-inline {\n font-size: 12px;\n color: ${inkMuted};\n line-height: 1.45;\n }\n .mushi-error-inline { color: ${vermillion}; }\n\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n /* Example starter chips — reduce first-report activation energy */\n .mushi-example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 10px;\n }\n .mushi-example-chip {\n padding: 4px 10px;\n border: 1px solid ${rule};\n border-radius: 12px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 11px;\n cursor: pointer;\n transition: color 150ms ${easeStamp}, border-color 150ms ${easeStamp}, background 150ms ${easeStamp};\n white-space: nowrap;\n }\n .mushi-example-chip:hover {\n color: ${ink};\n border-color: ${inkMuted};\n background: ${isDark ? 'rgba(242,235,221,0.06)' : 'rgba(14,13,11,0.04)'};\n }\n .mushi-example-chip:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* Textarea wrapper to position char counter */\n .mushi-textarea-wrap {\n position: relative;\n }\n .mushi-char-counter {\n position: absolute;\n bottom: 4px;\n right: 0;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.04em;\n color: ${inkFaint};\n pointer-events: none;\n transition: color 200ms ${easeStamp};\n }\n\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.danger {\n color: ${vermillionInk};\n border-color: ${vermillionWash};\n background: transparent;\n }\n .mushi-attach-btn.danger:hover {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.loading {\n opacity: 0.7;\n cursor: wait;\n }\n .mushi-attach-btn.error {\n color: ${vermillion};\n border-color: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n @keyframes mushi-spin {\n to { transform: rotate(360deg); }\n }\n @keyframes mushi-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .mushi-spinner {\n display: inline-block;\n width: 10px;\n height: 10px;\n border: 1.5px solid currentColor;\n border-top-color: transparent;\n border-radius: 50%;\n animation: mushi-spin 0.7s linear infinite;\n }\n\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n .mushi-brand-footer {\n padding: 9px 14px 11px;\n border-top: 1px solid ${rule};\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 9px;\n letter-spacing: 0.16em;\n text-align: center;\n text-transform: uppercase;\n }\n\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n /* ── Two-way receipt (success step) ──────────────────────────── */\n /* The receipt block sits below the stamp/meta. Three states: */\n /* 1. delivering... (spinner pill, while host onSubmit awaits) */\n /* 2. confirmed (Receipt #abc12345 + Track on Mushi link) */\n /* 3. queued offline (warn pill — degrade gracefully) */\n .mushi-success-receipt {\n margin-top: 14px;\n width: 100%;\n max-width: 280px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: stretch;\n }\n .mushi-success-receipt-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.05em;\n color: ${inkMuted};\n }\n .mushi-success-receipt-label {\n text-transform: uppercase;\n letter-spacing: 0.10em;\n color: ${inkMuted};\n }\n .mushi-success-receipt-id {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: 4px;\n background: transparent;\n border: 1px dashed ${rule};\n color: inherit;\n font-family: ${fontMono};\n font-size: 12px;\n letter-spacing: 0.02em;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n }\n .mushi-success-receipt-id:hover,\n .mushi-success-receipt-id:focus-visible {\n background: rgba(217, 65, 47, 0.06);\n border-color: ${vermillion};\n color: ${vermillion};\n outline: none;\n }\n .mushi-success-receipt-copy {\n font-size: 11px;\n opacity: 0.7;\n }\n .mushi-success-receipt-track {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px 10px;\n border-radius: 4px;\n background: ${vermillion};\n color: #fff;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n text-decoration: none;\n transition: filter 120ms ease;\n }\n .mushi-success-receipt-track:hover,\n .mushi-success-receipt-track:focus-visible {\n filter: brightness(0.95);\n outline: none;\n }\n .mushi-success-receipt-spinner {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n border: 1.5px solid ${rule};\n border-top-color: ${vermillion};\n animation: mushi-receipt-spin 0.8s linear infinite;\n }\n @keyframes mushi-receipt-spin {\n to { transform: rotate(360deg); }\n }\n .mushi-success-receipt-hint {\n color: ${inkMuted};\n font-style: italic;\n }\n .mushi-success-receipt-warn {\n color: ${vermillion};\n }\n .mushi-success-sla {\n margin-top: 2px;\n font-family: ${fontDisplay};\n font-size: 12px;\n line-height: 1.45;\n text-align: center;\n color: ${inkMuted};\n max-width: 260px;\n }\n .mushi-success-sla-default {\n opacity: 0.85;\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards nudge (category step) ───────────────────────────── */\n .mushi-rewards-nudge {\n border-top: 1px solid ${rule};\n padding: 10px 0 4px;\n margin-top: 6px;\n }\n .mushi-rewards-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 8px;\n }\n .mushi-tier-pip {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n .mushi-rewards-tier-name {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: ${ink};\n }\n .mushi-rewards-pts-count {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n margin-right: auto;\n }\n .mushi-rewards-pts-earn {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n .mushi-tier-bar-track {\n height: 3px;\n background: ${ruleStrong};\n border-radius: 2px;\n overflow: hidden;\n margin-bottom: 5px;\n }\n .mushi-tier-bar-fill {\n height: 100%;\n background: ${vermillion};\n border-radius: 2px;\n transition: width 600ms ${easeStamp};\n }\n .mushi-rewards-next-label {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${inkMuted};\n text-align: right;\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards on success step ─────────────────────────────────── */\n .mushi-success-rewards {\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid ${rule};\n width: 100%;\n }\n .mushi-success-pts-award {\n font-family: ${fontMono};\n font-size: 22px;\n font-weight: 700;\n color: ${vermillion};\n text-align: center;\n letter-spacing: 0.06em;\n margin-bottom: 10px;\n opacity: 0;\n animation: mushi-pts-pop 420ms ${easeStamp} 900ms forwards;\n }\n .success-bar { margin: 0 0 5px; }\n\n @keyframes mushi-pts-pop {\n from { opacity: 0; transform: scale(0.75) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n /* ─── Beta mode strip (category step) ─────────────────────────────── */\n\n .mushi-beta-strip {\n margin: 0 16px 2px;\n padding: 9px 12px;\n background: rgba(99, 102, 241, 0.07);\n border: 1px solid rgba(99, 102, 241, 0.18);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mushi-beta-strip-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .mushi-beta-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 4px;\n background: rgba(245, 158, 11, 0.15);\n border: 1px solid rgba(245, 158, 11, 0.35);\n color: #b45309;\n font-family: var(--mushi-font-mono);\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.08em;\n line-height: 1.6;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-tag {\n background: rgba(245, 158, 11, 0.12);\n border-color: rgba(245, 158, 11, 0.28);\n color: #fbbf24;\n }\n }\n\n .mushi-beta-msg {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.45;\n }\n\n .mushi-beta-contact-hint {\n font-size: 10px;\n color: var(--mushi-text-dim);\n opacity: 0.72;\n font-family: var(--mushi-font-mono);\n }\n\n .mushi-beta-perks {\n list-style: none;\n margin: 2px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-beta-perks li {\n font-size: 10.5px;\n color: #4f46e5;\n font-weight: 500;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-perks li {\n color: #818cf8;\n }\n }\n\n /* ─── Beta changelog (collapsible What's new) ──────────────────────── */\n\n .mushi-changelog {\n margin-top: 5px;\n }\n\n .mushi-changelog-summary {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 4px;\n user-select: none;\n }\n\n .mushi-changelog-summary::before {\n content: '▶';\n font-size: 7px;\n opacity: 0.6;\n transition: transform 0.15s ease;\n }\n\n .mushi-changelog[open] .mushi-changelog-summary::before {\n transform: rotate(90deg);\n }\n\n .mushi-changelog-list {\n margin: 5px 0 0 4px;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-changelog-list li {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n /* ─── Beta success footer ───────────────────────────────────────────── */\n\n .mushi-beta-success-footer {\n margin-top: 14px;\n padding: 10px 14px;\n background: rgba(99, 102, 241, 0.06);\n border: 1px solid rgba(99, 102, 241, 0.14);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n text-align: left;\n }\n\n .mushi-beta-success-line {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n .mushi-beta-success-dim {\n opacity: 0.65;\n font-size: 10.5px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n .mushi-success-pts-award { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type {\n MushiReportCategory,\n MushiReporterComment,\n MushiReporterReport,\n MushiWidgetConfig,\n} from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success' | 'reports' | 'report-detail';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/**\n * Wire-format \"feature request\" intent string. Always written into the\n * report's `user_category` field (not `category`) so we don't have to\n * widen the DB CHECK constraint on `reports.category`. The widget UI\n * presents it as a first-class card alongside the five real categories\n * because beta apps live or die by how easy it is to file a feature\n * request — burying it as an intent under \"Other\" suppresses signal.\n */\nconst FEATURE_REQUEST_INTENT = 'Feature request';\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n reports: 1,\n 'report-detail': 1,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport interface WidgetRewardsState {\n tier: { slug: string; displayName: string; pointsThreshold: number } | null;\n nextTier: { displayName: string; pointsThreshold: number } | null;\n totalPoints: number;\n /** Expected base points for a `report_submit` action (default 50). */\n pointsForReport: number;\n}\n\nexport interface WidgetSubmitOutcome {\n /** Server-confirmed report id. When `null` the report was queued\n * offline / failed-and-queued for retry; the success step degrades\n * gracefully (no \"track on console\" link, just the receipt stamp). */\n reportId: string | null;\n /** Convenience flag for the widget to decide whether to render the\n * optimistic copy (\"queued offline, we'll send it when you're back\")\n * versus the confirmed copy (\"received — track at #abc12345\"). */\n queuedOffline?: boolean;\n}\n\nexport interface WidgetCallbacks {\n /**\n * Returns the outcome of the submission so the widget can render a\n * real receipt (report id, deep link). Older callers that return\n * `void` still work — the widget falls back to the legacy stamp.\n */\n onSubmit(\n data: { category: MushiReportCategory; description: string; intent?: string },\n ): void | Promise<WidgetSubmitOutcome | void>;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onScreenshotRemove?(): void;\n onElementSelectorRequest?(): void;\n onReporterReportsRequest?(): Promise<MushiReporterReport[]>;\n onReporterCommentsRequest?(reportId: string): Promise<MushiReporterComment[]>;\n onReporterReply?(reportId: string, body: string): Promise<void>;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n /**\n * True when the user took the \"Feature request\" shortcut. We track this\n * separately from `selectedCategory='other'` so the Back button on the\n * details step jumps straight back to the category picker instead of\n * landing on the intent picker the user explicitly skipped.\n */\n private viaFeatureRequest = false;\n private screenshotAttached = false;\n private screenshotCapturing = false;\n private screenshotError = false;\n private allowScreenshotRemove = true;\n private elementSelected = false;\n private elementCapturing = false;\n private submitting = false;\n /** Hint element injected outside the shadow DOM during element selection. */\n private selectorHint: HTMLDivElement | null = null;\n private triggerVisible = true;\n private triggerShrunk = false;\n private triggerHiddenByScroll = false;\n /** Milliseconds since mount — used for the 30s first-time nudge gate. */\n private mountedAt: number | null = null;\n private nudgeShown = false;\n private nudgeEl: HTMLDivElement | null = null;\n private nudgeTimer: ReturnType<typeof setTimeout> | null = null;\n private sdkFreshness: { latest: string | null; current: string; deprecated: boolean; message?: string | null } | null = null;\n private reporterReports: MushiReporterReport[] = [];\n private reporterComments: MushiReporterComment[] = [];\n private selectedReportId: string | null = null;\n private reporterLoading = false;\n private reporterError: string | null = null;\n private attachedLaunchers: Array<() => void> = [];\n private smartHideCleanup: (() => void) | null = null;\n private smartHideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private rewardsState: WidgetRewardsState | null = null;\n /** Server-confirmed id for the just-submitted report. Surfaces in\n * the success step as a copyable receipt + optional deep link to\n * the Mushi console (when `dashboardUrl` is configured). Cleared\n * on every new `open()` so a re-opened widget never reuses a\n * stale id from the previous session. */\n private lastReportId: string | null = null;\n /** True when the just-submitted report was queued offline (no\n * network, or the API errored and went into the retry queue).\n * Drives a different success copy so the user knows the report\n * hasn't actually reached the console yet. */\n private lastSubmitQueuedOffline = false;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks, private readonly sdkVersion = '0.7.0') {\n this.config = {\n position: config.position ?? 'bottom-right',\n anchor: config.anchor ?? {},\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n trigger: config.trigger ?? 'auto',\n attachToSelector: config.attachToSelector ?? '',\n inset: config.inset ?? {},\n respectSafeArea: config.respectSafeArea ?? true,\n hideOnSelector: config.hideOnSelector ?? '',\n hideOnRoutes: config.hideOnRoutes ?? [],\n environments: config.environments ?? {},\n smartHide: config.smartHide ?? false,\n draggable: config.draggable ?? false,\n brandFooter: config.brandFooter ?? true,\n outdatedBanner: config.outdatedBanner ?? 'auto',\n betaMode: config.betaMode ?? {},\n minDescriptionLength: config.minDescriptionLength ?? 20,\n dashboardUrl: config.dashboardUrl ?? '',\n responseSlaLabel: config.responseSlaLabel ?? '',\n featureRequestCard: config.featureRequestCard ?? true,\n featureRequestLabel: config.featureRequestLabel ?? '',\n featureRequestDescription: config.featureRequestDescription ?? '',\n };\n this.callbacks = callbacks;\n // Passing undefined when locale is 'auto' lets getLocale() resolve via\n // navigator.language automatically.\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n if (this.host.isConnected) return;\n document.body.appendChild(this.host);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n this.mountedAt = Date.now();\n }\n\n getIsMounted(): boolean {\n return this.host.isConnected;\n }\n\n updateConfig(config: MushiWidgetConfig = {}): void {\n this.config = {\n ...this.config,\n ...(config.position ? { position: config.position } : {}),\n ...(config.anchor !== undefined ? { anchor: config.anchor } : {}),\n ...(config.theme ? { theme: config.theme } : {}),\n ...(config.triggerText !== undefined ? { triggerText: config.triggerText || '\\uD83D\\uDC1B' } : {}),\n ...(config.expandedTitle !== undefined ? { expandedTitle: config.expandedTitle } : {}),\n ...(config.mode ? { mode: config.mode } : {}),\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.zIndex !== undefined ? { zIndex: config.zIndex } : {}),\n ...(config.trigger ? { trigger: config.trigger } : {}),\n ...(config.attachToSelector !== undefined ? { attachToSelector: config.attachToSelector } : {}),\n ...(config.inset !== undefined ? { inset: config.inset } : {}),\n ...(config.respectSafeArea !== undefined ? { respectSafeArea: config.respectSafeArea } : {}),\n ...(config.hideOnSelector !== undefined ? { hideOnSelector: config.hideOnSelector } : {}),\n ...(config.hideOnRoutes !== undefined ? { hideOnRoutes: config.hideOnRoutes } : {}),\n ...(config.environments !== undefined ? { environments: config.environments } : {}),\n ...(config.smartHide !== undefined ? { smartHide: config.smartHide } : {}),\n ...(config.draggable !== undefined ? { draggable: config.draggable } : {}),\n ...(config.brandFooter !== undefined ? { brandFooter: config.brandFooter } : {}),\n ...(config.outdatedBanner !== undefined ? { outdatedBanner: config.outdatedBanner } : {}),\n ...(config.betaMode !== undefined ? { betaMode: config.betaMode } : {}),\n ...(config.minDescriptionLength !== undefined ? { minDescriptionLength: config.minDescriptionLength } : {}),\n ...(config.dashboardUrl !== undefined ? { dashboardUrl: config.dashboardUrl } : {}),\n ...(config.responseSlaLabel !== undefined ? { responseSlaLabel: config.responseSlaLabel } : {}),\n ...(config.featureRequestCard !== undefined ? { featureRequestCard: config.featureRequestCard } : {}),\n ...(config.featureRequestLabel !== undefined ? { featureRequestLabel: config.featureRequestLabel } : {}),\n ...(config.featureRequestDescription !== undefined ? { featureRequestDescription: config.featureRequestDescription } : {}),\n };\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory; featureRequest?: boolean }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.screenshotCapturing = false;\n this.screenshotError = false;\n this.elementSelected = false;\n this.elementCapturing = false;\n this.submitting = false;\n this.submittedAt = null;\n this.removeSelectorHint();\n this.lastReportId = null;\n this.lastSubmitQueuedOffline = false;\n this.viaFeatureRequest = false;\n\n if (options?.featureRequest) {\n // External callers can deep-link straight into the feature-request\n // shortcut, e.g. a \"Suggest a feature\" button on the marketing page.\n this.selectedCategory = 'other';\n this.selectedIntent = FEATURE_REQUEST_INTENT;\n this.viaFeatureRequest = true;\n this.step = 'details';\n } else if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n /**\n * Briefly highlight the trigger button (a soft pulse + tooltip) without\n * opening the full reporter panel. Use for first-session welcome nudges\n * and other \"by the way, this exists\" prompts where forcing the panel\n * open would feel aggressive. Honours `position: 'none'` (no-op when\n * the trigger button is hidden).\n */\n pulseTrigger(): void {\n if (this.isOpen) return;\n const trigger = this.shadow.querySelector<HTMLButtonElement>('.mushi-trigger');\n // No-op if the trigger element is hidden (e.g. host app uses\n // `triggerVisible: false` for a custom launcher); the pulse only\n // makes sense when the user can actually see what we're highlighting.\n if (!trigger) return;\n trigger.classList.add('mushi-trigger-pulse');\n // Auto-clear after the animation finishes so a subsequent pulse can\n // restart it cleanly. Three pulses x 800ms = 2.4s total.\n window.setTimeout(() => {\n trigger.classList.remove('mushi-trigger-pulse');\n }, 2400);\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n showTrigger(): void {\n this.triggerVisible = true;\n this.render();\n }\n\n hideTrigger(): void {\n this.triggerVisible = false;\n this.render();\n }\n\n setTrigger(trigger: NonNullable<MushiWidgetConfig['trigger']>): void {\n this.updateConfig({ trigger });\n }\n\n attachTo(selectorOrElement: string | Element, options: MushiWidgetConfig = {}): () => void {\n const elements = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n : [selectorOrElement];\n const cleanups = elements.map((el) => {\n const onClick = (event: Event) => {\n event.preventDefault();\n this.updateConfig(options);\n this.open();\n };\n el.addEventListener('click', onClick);\n return () => el.removeEventListener('click', onClick);\n });\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setAllowScreenshotRemove(allow: boolean): void {\n this.allowScreenshotRemove = allow;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n this.elementCapturing = false;\n this.removeSelectorHint();\n if (this.isOpen) this.render();\n }\n\n setScreenshotCapturing(capturing: boolean): void {\n this.screenshotCapturing = capturing;\n this.screenshotError = false;\n if (this.isOpen) this.render();\n }\n\n setScreenshotError(failed: boolean): void {\n this.screenshotError = failed;\n this.screenshotCapturing = false;\n if (this.isOpen) this.render();\n }\n\n setElementCapturing(capturing: boolean): void {\n this.elementCapturing = capturing;\n if (capturing) {\n this.showSelectorHint();\n } else {\n this.removeSelectorHint();\n }\n if (this.isOpen) this.render();\n }\n\n /** Hide the widget panel (but keep the host element) during element selection\n * so the user can click any element on the page without the panel\n * intercepting the event. */\n hidePanel(): void {\n const panel = this.shadow.querySelector('.mushi-panel') as HTMLElement | null;\n if (panel) panel.style.display = 'none';\n }\n\n showPanel(): void {\n const panel = this.shadow.querySelector('.mushi-panel') as HTMLElement | null;\n if (panel) panel.style.display = '';\n }\n\n private showSelectorHint(): void {\n this.removeSelectorHint();\n const hint = document.createElement('div');\n hint.id = 'mushi-selector-hint';\n hint.setAttribute('role', 'status');\n hint.setAttribute('aria-live', 'polite');\n hint.style.cssText = `\n position: fixed;\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 2147483646;\n background: rgba(17,17,17,0.92);\n color: #fff;\n font-family: ui-monospace, SFMono-Regular, monospace;\n font-size: 12px;\n letter-spacing: 0.04em;\n padding: 8px 16px;\n border-radius: 20px;\n pointer-events: none;\n white-space: nowrap;\n backdrop-filter: blur(4px);\n box-shadow: 0 2px 12px rgba(0,0,0,0.35);\n `;\n hint.textContent = this.locale.step3.elementSelectorHint;\n document.body.appendChild(hint);\n this.selectorHint = hint;\n }\n\n private removeSelectorHint(): void {\n this.selectorHint?.remove();\n this.selectorHint = null;\n // Also remove any orphaned hints from previous sessions.\n document.getElementById('mushi-selector-hint')?.remove();\n }\n\n private showNudge(): void {\n if (this.nudgeShown || this.nudgeEl) return;\n this.nudgeShown = true;\n\n // Find the trigger position to anchor the bubble.\n const trigger = this.shadow.querySelector('.mushi-trigger') as HTMLElement | null;\n const rect = trigger?.getBoundingClientRect();\n\n const nudge = document.createElement('div');\n nudge.id = 'mushi-nudge-bubble';\n nudge.setAttribute('role', 'tooltip');\n const isRight = this.config.position.includes('right');\n nudge.style.cssText = `\n position: fixed;\n z-index: 2147483645;\n ${rect\n ? `bottom: ${window.innerHeight - rect.top + 8}px; ${isRight ? `right: ${window.innerWidth - rect.right}px;` : `left: ${rect.left}px;`}`\n : 'bottom: 80px; right: 24px;'}\n background: rgba(17,17,17,0.92);\n color: #fff;\n font-family: ui-sans-serif, system-ui, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n padding: 8px 12px;\n border-radius: 8px;\n max-width: 200px;\n pointer-events: none;\n backdrop-filter: blur(4px);\n box-shadow: 0 2px 12px rgba(0,0,0,0.35);\n animation: mushi-fade-in 0.15s ease forwards;\n `;\n nudge.textContent = this.locale.step3.tooShort.startsWith('A bit')\n ? \"Found a bug? One sentence is enough \\uD83D\\uDC1B\"\n : \"\\u30D0\\u30B0\\u3092\\u898B\\u3064\\u3051\\u305F\\uFF1F\\u4E00\\u884C\\u3067\\u5927\\u4E08\\u592B\\u3067\\u3059 \\uD83D\\uDC1B\";\n document.body.appendChild(nudge);\n this.nudgeEl = nudge;\n\n // Auto-remove after 5s.\n if (this.nudgeTimer !== null) clearTimeout(this.nudgeTimer);\n this.nudgeTimer = setTimeout(() => this.removeNudge(), 5000);\n }\n\n private removeNudge(): void {\n if (this.nudgeTimer !== null) {\n clearTimeout(this.nudgeTimer);\n this.nudgeTimer = null;\n }\n this.nudgeEl?.remove();\n this.nudgeEl = null;\n document.getElementById('mushi-nudge-bubble')?.remove();\n }\n\n setSdkFreshness(info: { latest: string | null; current: string; deprecated: boolean; message?: string | null }): void {\n this.sdkFreshness = info;\n if (this.isOpen) this.render();\n }\n\n setRewardsState(state: WidgetRewardsState | null): void {\n this.rewardsState = state;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n if (this.smartHideTimer !== null) {\n clearTimeout(this.smartHideTimer);\n this.smartHideTimer = null;\n }\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n this.removeSelectorHint();\n this.removeNudge();\n this.host.remove();\n }\n\n private syncAttachedLaunchers(): void {\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n if (this.config.trigger !== 'attach' || !this.config.attachToSelector) return;\n if (typeof document === 'undefined') return;\n this.attachedLaunchers.push(this.attachTo(this.config.attachToSelector));\n }\n\n private syncSmartHide(): void {\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.triggerShrunk = false;\n this.triggerHiddenByScroll = false;\n if (!this.config.smartHide || typeof window === 'undefined') return;\n\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const, onScroll: 'shrink' as const, onIdleMs: 900 }\n : this.config.smartHide;\n if (!smart.onScroll) return;\n\n const onScroll = () => {\n if (smart.onScroll === 'hide') {\n this.triggerHiddenByScroll = true;\n } else {\n this.triggerShrunk = true;\n }\n this.render();\n if (this.smartHideTimer !== null) clearTimeout(this.smartHideTimer);\n this.smartHideTimer = setTimeout(() => {\n this.triggerHiddenByScroll = false;\n this.triggerShrunk = false;\n this.render();\n }, smart.onIdleMs ?? 900);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this.smartHideCleanup = () => window.removeEventListener('scroll', onScroll);\n }\n\n private shouldRenderTrigger(): boolean {\n if (!this.triggerVisible) return false;\n if (this.triggerHiddenByScroll) return false;\n if (this.config.trigger === 'manual' || this.config.trigger === 'hidden' || this.config.trigger === 'attach') {\n return false;\n }\n if (this.isMobileSmartHidden()) return false;\n if (this.isRouteHidden()) return false;\n if (this.config.hideOnSelector && document.querySelector(this.config.hideOnSelector)) return false;\n const action = this.config.environments[this.detectEnvironment()];\n return action !== 'never' && action !== 'manual';\n }\n\n private effectiveTrigger(): NonNullable<MushiWidgetConfig['trigger']> {\n if (!this.config.smartHide || typeof window === 'undefined') return this.config.trigger;\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const }\n : this.config.smartHide;\n if (window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'edge-tab') {\n return 'edge-tab';\n }\n return this.config.trigger;\n }\n\n private isMobileSmartHidden(): boolean {\n if (!this.config.smartHide || typeof window === 'undefined') return false;\n const smart = this.config.smartHide === true ? { onMobile: 'edge-tab' as const } : this.config.smartHide;\n return window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'hide';\n }\n\n private detectEnvironment(): 'production' | 'staging' | 'development' {\n const host = typeof location !== 'undefined' ? location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (/\\b(staging|stage|preview|dev)\\b/i.test(host)) return 'staging';\n return 'production';\n }\n\n private isRouteHidden(): boolean {\n if (!this.config.hideOnRoutes.length || typeof location === 'undefined') return false;\n return this.config.hideOnRoutes.some((route) => location.pathname.includes(route));\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n if (this.shouldRenderTrigger()) {\n const effectiveTrigger = this.effectiveTrigger();\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}${effectiveTrigger === 'edge-tab' ? ' edge-tab' : ''}${this.triggerShrunk ? ' shrunk' : ''}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n this.applyInsetVars(trigger);\n trigger.addEventListener('click', () => {\n this.removeNudge();\n if (this.isOpen) this.close();\n else this.open();\n });\n trigger.addEventListener('mouseenter', () => {\n const onPageMs = this.mountedAt ? Date.now() - this.mountedAt : 0;\n if (!this.nudgeShown && !this.isOpen && onPageMs >= 30_000) {\n this.showNudge();\n }\n });\n trigger.addEventListener('mouseleave', () => {\n // Keep for 2s after hover ends so the user can read it.\n if (this.nudgeEl) {\n if (this.nudgeTimer !== null) clearTimeout(this.nudgeTimer);\n this.nudgeTimer = setTimeout(() => this.removeNudge(), 2000);\n }\n });\n this.shadow.appendChild(trigger);\n }\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n this.applyInsetVars(panel);\n\n if (this.isOpen) {\n panel.innerHTML = `${this.renderOutdatedBanner()}${this.renderStep()}${this.renderBrandFooter()}`;\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private applyInsetVars(el: HTMLElement): void {\n const { anchor } = this.config;\n if (anchor && Object.keys(anchor).length > 0) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = anchor[edge];\n if (value !== undefined) el.style.setProperty(`--mushi-${edge}`, value);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n return;\n }\n\n const { inset } = this.config;\n if (!this.config.respectSafeArea) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n if (inset[edge] === undefined) el.style.setProperty(`--mushi-${edge}`, '24px');\n });\n }\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = inset[edge];\n if (value === undefined) return;\n el.style.setProperty(`--mushi-${edge}`, value === 'auto' ? 'auto' : `${value}px`);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n case 'reports': return this.renderReportsStep();\n case 'report-detail': return this.renderReportDetailStep();\n }\n }\n\n private renderOutdatedBanner(): string {\n if (!this.sdkFreshness) return '';\n if (this.config.outdatedBanner === 'off' || this.config.outdatedBanner === 'console-only') return '';\n const { latest, current, deprecated, message } = this.sdkFreshness;\n if (!latest && !deprecated) return '';\n return `\n <div class=\"mushi-outdated\" role=\"status\">\n <strong>Mushi SDK ${escapeHtml(current)}</strong>\n ${latest ? `latest is ${escapeHtml(latest)}.` : 'needs attention.'}\n ${message ? `<span>${escapeHtml(message)}</span>` : ''}\n </div>\n `;\n }\n\n private renderBrandFooter(): string {\n if (this.config.brandFooter === false) return '';\n return `<div class=\"mushi-brand-footer\">Powered by Mushi v${escapeHtml(this.sdkVersion)}</div>`;\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n ${this.config.betaMode?.enabled ? this.renderBetaStrip() : ''}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n <button type=\"button\" class=\"mushi-option-btn mushi-reports-entry\" data-action=\"reports\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\uD83D\\uDCEC</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">Your reports${this.unreadCount() ? ` (${this.unreadCount()} new)` : ''}</span>\n <span class=\"mushi-option-desc\">See status, developer replies, and respond</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n ${this.renderFeatureRequestEntry()}\n ${categories}\n ${this.rewardsState ? this.renderRewardsNudge() : ''}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n /**\n * First-class \"Feature request\" entry rendered at the top of the\n * category step. Beta apps consistently get more useful signal when\n * the user has a no-friction path to say \"I wish this did X\" — burying\n * it as an intent under the \"Other\" category drops feature submissions\n * by ~40% in industry studies (Userpilot, Usersnap 2025).\n *\n * Wire format: still routes through the standard `other` category with\n * a `user_category = 'Feature request'` stamp, so we don't need a DB\n * migration. The admin console filters on that string to surface the\n * Feature-request swimlane.\n */\n private renderFeatureRequestEntry(): string {\n const enabled = this.config.featureRequestCard !== false;\n if (!enabled) return '';\n const label = this.config.featureRequestLabel ?? 'Feature request';\n const desc = this.config.featureRequestDescription\n ?? 'Suggest something new — even rough ideas help us prioritise';\n return `\n <button\n type=\"button\"\n class=\"mushi-option-btn mushi-feature-entry\"\n data-action=\"feature-request\"\n aria-label=\"${escapeHtml(label)}\"\n >\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\u2728</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${escapeHtml(label)}</span>\n <span class=\"mushi-option-desc\">${escapeHtml(desc)}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `;\n }\n\n /** Collapsible \"What's new\" changelog row. Closes the reporter feedback loop. */\n private renderBetaChangelog(): string {\n const entries = this.config.betaMode?.changelogItems;\n if (!entries?.length) return '';\n const latest = entries[0];\n const items = latest.items.map((item) => `<li>\\u2022 ${escapeHtml(item)}</li>`).join('');\n const label = latest.date\n ? `What\\u2019s new in ${escapeHtml(latest.version)} \\u00B7 ${escapeHtml(latest.date)}`\n : `What\\u2019s new in ${escapeHtml(latest.version)}`;\n return `\n <details class=\"mushi-changelog\">\n <summary class=\"mushi-changelog-summary\">${label}</summary>\n <ul class=\"mushi-changelog-list\">${items}</ul>\n </details>\n `;\n }\n\n /**\n * Discreet beta status strip: communicates \"work in progress\", invites\n * feedback, and sets expectations — reducing user frustration while\n * nudging the reciprocity instinct (\"your reports help us build this\").\n */\n private renderBetaStrip(): string {\n const beta = this.config.betaMode!;\n const appName = escapeHtml(beta.appName ?? 'This app');\n const message = beta.message\n ? escapeHtml(beta.message)\n : `${appName} is in early development — updates ship weekly`;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const perks = beta.perks ?? [];\n\n return `\n <div class=\"mushi-beta-strip\" role=\"note\" aria-label=\"Beta status\">\n <div class=\"mushi-beta-strip-row\">\n <span class=\"mushi-beta-tag\" aria-hidden=\"true\">BETA</span>\n <span class=\"mushi-beta-msg\">${message}</span>\n </div>\n ${email ? `<div class=\"mushi-beta-contact-hint\">Reports go to ${email} · reviewed by the team</div>` : ''}\n ${perks.length > 0 ? `\n <ul class=\"mushi-beta-perks\" aria-label=\"Beta tester perks\">\n ${perks.map((p) => `<li>\\u2713 ${escapeHtml(p)}</li>`).join('')}\n </ul>\n ` : ''}\n ${this.renderBetaChangelog()}\n </div>\n `;\n }\n\n private renderReportsStep(): string {\n const reports = this.reporterReports.map((report) => `\n <button type=\"button\" class=\"mushi-report-row\" data-report-id=\"${escapeHtml(report.id)}\">\n <span class=\"mushi-report-status\">${escapeHtml(report.status)}</span>\n <span class=\"mushi-report-title\">${escapeHtml(report.summary ?? report.description ?? `Report ${report.id.slice(0, 8)}`)}</span>\n ${report.unread_count ? `<b>${report.unread_count}</b>` : ''}\n </button>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Your reports', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading reports…</p>' : ''}\n ${this.reporterError ? `<p class=\"mushi-error-inline\">${escapeHtml(this.reporterError)}</p>` : ''}\n ${reports || (!this.reporterLoading ? '<p class=\"mushi-muted\">No reports from this browser yet.</p>' : '')}\n </div>\n `;\n }\n\n private renderReportDetailStep(): string {\n const report = this.reporterReports.find((r) => r.id === this.selectedReportId);\n const comments = this.reporterComments.map((comment) => `\n <div class=\"mushi-thread-comment ${comment.author_kind}\">\n <strong>${escapeHtml(comment.author_kind === 'reporter' ? 'You' : (comment.author_name ?? 'Developer'))}</strong>\n <p>${escapeHtml(comment.body)}</p>\n </div>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Report thread', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-thread-summary\">\n <span>${escapeHtml(report?.status ?? 'unknown')}</span>\n <p>${escapeHtml(report?.summary ?? report?.description ?? 'Report details')}</p>\n </div>\n <div class=\"mushi-thread\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading thread…</p>' : comments || '<p class=\"mushi-muted\">No developer replies yet.</p>'}\n </div>\n <textarea class=\"mushi-textarea\" data-role=\"reporter-reply\" rows=\"3\" placeholder=\"Reply to the developer…\"></textarea>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"reporter-reply\">\n <span>Reply</span><span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private effectiveMinLength(): number {\n const base = this.config.minDescriptionLength ?? 20;\n // CJK scripts pack more meaning per character. Halve the floor for Japanese,\n // Chinese, and Korean locales so an 8-character Japanese sentence isn't\n // blocked by an English-calibrated minimum.\n const lang = this.config.locale === 'auto'\n ? (typeof navigator !== 'undefined' ? (navigator.language ?? '') : '')\n : (this.config.locale ?? '');\n const isCjk = /^(ja|zh|ko)/i.test(lang);\n return isCjk ? Math.max(4, Math.floor(base / 2)) : base;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n const minLen = this.effectiveMinLength();\n\n const screenshotLabel = this.screenshotCapturing\n ? t.step3.screenshotCapturing\n : this.screenshotError\n ? t.step3.screenshotFailed\n : this.screenshotAttached\n ? t.step3.screenshotAttached\n : t.step3.screenshotButton;\n\n const screenshotClass = [\n 'mushi-attach-btn',\n this.screenshotAttached ? 'active' : '',\n this.screenshotError ? 'error' : '',\n this.screenshotCapturing ? 'loading' : '',\n ].filter(Boolean).join(' ');\n\n const elementLabel = this.elementCapturing\n ? t.step3.elementCapturing\n : this.elementSelected\n ? t.step3.elementSelected\n : t.step3.elementButton;\n\n const elementClass = [\n 'mushi-attach-btn',\n this.elementSelected ? 'active' : '',\n this.elementCapturing ? 'loading' : '',\n ].filter(Boolean).join(' ');\n\n const exampleChips = t.step3.examplePrompts\n .map((p) => `<button type=\"button\" class=\"mushi-example-chip\" data-example=\"${escapeHtml(p)}\">${escapeHtml(p)}</button>`)\n .join('');\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <div class=\"mushi-example-chips\" aria-label=\"Example prompts\">${exampleChips}</div>\n <div class=\"mushi-textarea-wrap\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-char-counter\" data-role=\"char-counter\" aria-hidden=\"true\">\n <span data-role=\"char-current\">0</span>/<span data-role=\"char-min\">${minLen}</span>\n </div>\n </div>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"${screenshotClass}\"\n data-action=\"screenshot\"\n ${this.screenshotCapturing ? 'disabled' : ''}\n aria-label=\"${escapeHtml(screenshotLabel)}\"\n >\n ${this.screenshotCapturing ? '<span class=\"mushi-spinner\" aria-hidden=\"true\"></span>' : '\\uD83D\\uDCF8'}\n ${escapeHtml(screenshotLabel)}\n </button>\n ${this.screenshotAttached && this.allowScreenshotRemove\n ? '<button type=\"button\" class=\"mushi-attach-btn danger\" data-action=\"remove-screenshot\" aria-label=\"Remove screenshot\">\\u2715 Remove</button>'\n : ''}\n <button type=\"button\" class=\"${elementClass}\"\n data-action=\"element\"\n ${this.elementCapturing ? 'disabled' : ''}\n aria-label=\"${escapeHtml(elementLabel)}\"\n >\n ${this.elementCapturing ? '<span class=\"mushi-spinner\" aria-hidden=\"true\"></span>' : '\\uD83C\\uDFAF'}\n ${escapeHtml(elementLabel)}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n ${this.renderSuccessReceipt()}\n ${this.rewardsState ? this.renderSuccessRewards() : ''}\n ${this.config.betaMode?.enabled ? this.renderBetaSuccessFooter() : ''}\n </div>\n </div>\n `;\n }\n\n /**\n * Two-way receipt block. Until the host's `onSubmit` resolves with a\n * server-confirmed report id, we show a discreet \"delivering...\" pill so\n * the user knows their submission is still in flight. Once we have the\n * id, we surface a short monospaced id + a copy button + an optional\n * \"Track on Mushi\" deep link to `dashboardUrl/reports/<id>` so the user\n * can watch the status walk through queued -> classified -> fixed in\n * real time (Peak-End rule: the last impression sticks). If we never\n * get an id (offline retry queue), we say so explicitly rather than\n * pretending everything is fine.\n */\n private renderSuccessReceipt(): string {\n if (this.lastSubmitQueuedOffline) {\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row mushi-success-receipt-warn\">\n <span class=\"mushi-success-receipt-label\">Queued offline</span>\n <span class=\"mushi-success-receipt-hint\">We’ll send it the moment you’re back online.</span>\n </div>\n </div>\n `;\n }\n\n if (!this.lastReportId) {\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row\">\n <span class=\"mushi-success-receipt-spinner\" aria-hidden=\"true\"></span>\n <span class=\"mushi-success-receipt-hint\">Delivering to the team\\u2026</span>\n </div>\n ${this.renderSlaLine()}\n </div>\n `;\n }\n\n const idShort = `#${this.lastReportId.slice(0, 8)}`;\n const dashboard = (this.config.dashboardUrl ?? '').replace(/\\/$/, '');\n const trackHref = dashboard ? `${dashboard}/reports/${encodeURIComponent(this.lastReportId)}` : '';\n\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row\">\n <span class=\"mushi-success-receipt-label\">Receipt</span>\n <button\n type=\"button\"\n class=\"mushi-success-receipt-id\"\n data-action=\"copy-report-id\"\n data-copy-id=\"${escapeHtml(this.lastReportId)}\"\n title=\"Copy report id ${escapeHtml(this.lastReportId)}\"\n aria-label=\"Copy report id ${escapeHtml(this.lastReportId)}\"\n >${escapeHtml(idShort)}<span class=\"mushi-success-receipt-copy\" aria-hidden=\"true\">\\u2398</span></button>\n </div>\n ${trackHref ? `\n <a\n class=\"mushi-success-receipt-track\"\n href=\"${escapeHtml(trackHref)}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >Track on Mushi <span aria-hidden=\"true\">\\u2197</span></a>\n ` : ''}\n ${this.renderSlaLine()}\n </div>\n `;\n }\n\n private renderSlaLine(): string {\n const sla = (this.config.responseSlaLabel ?? '').trim();\n if (sla) {\n return `<div class=\"mushi-success-sla\">${escapeHtml(sla)}</div>`;\n }\n // Default copy is intentionally vague but reassuring -- under-promise,\n // over-deliver. Hosts that want a hard SLA set it via responseSlaLabel.\n return `<div class=\"mushi-success-sla mushi-success-sla-default\">A human will look at this within a working day.</div>`;\n }\n\n /**\n * Reciprocity footer on the success step: closes the feedback loop by\n * attributing where the report goes, sets a response expectation, and\n * reinforces the \"beta tester\" identity (Peak-End Rule — the last thing\n * the user sees shapes their entire impression of the interaction).\n */\n private renderBetaSuccessFooter(): string {\n const beta = this.config.betaMode!;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const appName = escapeHtml(beta.appName ?? 'the team');\n return `\n <div class=\"mushi-beta-success-footer\" role=\"note\" aria-label=\"Beta feedback acknowledgement\">\n ${email\n ? `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${email}</div>`\n : `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${appName}</div>`\n }\n <div class=\"mushi-beta-success-line mushi-beta-success-dim\">We aim to review within 48h · thank you for helping build this</div>\n </div>\n `;\n }\n\n private tierColor(slug: string): string {\n const colors: Record<string, string> = {\n free: '#6b7280',\n explorer: '#3b82f6',\n contributor: '#8b5cf6',\n champion: '#f59e0b',\n };\n return colors[slug] ?? '#6c47ff';\n }\n\n /** Compact rewards nudge rendered at the bottom of the category-step body. */\n private renderRewardsNudge(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const tierName = tier?.displayName ?? 'Free';\n const tierSlug = tier?.slug ?? 'free';\n const color = this.tierColor(tierSlug);\n\n let pct = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pct = ceiling > base ? Math.round(Math.min(1, (totalPoints - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - totalPoints);\n nextLabel = `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`;\n }\n\n return `\n <div class=\"mushi-rewards-nudge\" aria-label=\"Rewards progress\">\n <div class=\"mushi-rewards-row\">\n <span class=\"mushi-tier-pip\" style=\"background:${color}\" aria-hidden=\"true\"></span>\n <span class=\"mushi-rewards-tier-name\">${escapeHtml(tierName)}</span>\n <span class=\"mushi-rewards-pts-count\">${totalPoints.toLocaleString()} pts</span>\n <span class=\"mushi-rewards-pts-earn\">+${pointsForReport} pts for a report</span>\n </div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n /** Points earned + tier progress shown on the success step. */\n private renderSuccessRewards(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const projected = totalPoints + pointsForReport;\n\n let pctAfter = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pctAfter = ceiling > base ? Math.round(Math.min(1, (projected - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - projected);\n nextLabel = remaining > 0\n ? `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`\n : `\\uD83C\\uDF89 ${escapeHtml(nextTier.displayName)} reached!`;\n }\n\n return `\n <div class=\"mushi-success-rewards\">\n <div class=\"mushi-success-pts-award\">+${pointsForReport} pts</div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track success-bar\" role=\"progressbar\" aria-valuenow=\"${pctAfter}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pctAfter}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') {\n if (this.viaFeatureRequest) {\n this.step = 'category';\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.viaFeatureRequest = false;\n } else {\n this.step = 'intent';\n this.selectedIntent = null;\n }\n }\n else if (this.step === 'reports') { this.step = 'category'; }\n else if (this.step === 'report-detail') { this.step = 'reports'; this.selectedReportId = null; }\n this.render();\n });\n\n panel.querySelector('[data-action=\"reports\"]')?.addEventListener('click', () => {\n void this.loadReporterReports();\n });\n\n panel.querySelector('[data-action=\"feature-request\"]')?.addEventListener('click', () => {\n // Feature-request shortcut: pre-fill the wire format and skip the\n // intent step. The user lands directly on the description box so\n // there's only one screen between \"I have an idea\" and \"submitted\".\n this.selectedCategory = 'other';\n this.selectedIntent = FEATURE_REQUEST_INTENT;\n this.viaFeatureRequest = true;\n this.step = 'details';\n this.render();\n });\n\n panel.querySelectorAll('[data-report-id]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const reportId = (btn as HTMLElement).dataset.reportId;\n if (reportId) void this.loadReporterComments(reportId);\n });\n });\n\n panel.querySelector('[data-action=\"reporter-reply\"]')?.addEventListener('click', () => {\n void this.submitReporterReply(panel);\n });\n\n // Receipt-copy on the success step. We do the clipboard work\n // inside the widget rather than emitting a callback so the\n // optical feedback (button label flips to \"Copied\") is instant\n // and the host doesn't have to wire anything to enjoy it.\n panel.querySelector('[data-action=\"copy-report-id\"]')?.addEventListener('click', (e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n const id = btn.dataset.copyId;\n if (!id) return;\n const restore = btn.innerHTML;\n const done = () => {\n btn.innerHTML = 'Copied \\u2713';\n // Hold the \"Copied\" state briefly then bounce back to the\n // ledger id so a second copy still feels like an action.\n window.setTimeout(() => {\n if (btn.isConnected) btn.innerHTML = restore;\n }, 1600);\n };\n try {\n if (navigator.clipboard?.writeText) {\n void navigator.clipboard.writeText(id).then(done).catch(() => done());\n } else {\n done();\n }\n } catch {\n done();\n }\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n // Wire live char counter so users see their progress as they type.\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const charCurrentEl = panel.querySelector('[data-role=\"char-current\"]') as HTMLElement | null;\n if (textarea && charCurrentEl) {\n const minLen = this.effectiveMinLength();\n const updateCounter = () => {\n const len = textarea.value.trim().length;\n charCurrentEl.textContent = String(len);\n const counterEl = panel.querySelector('[data-role=\"char-counter\"]') as HTMLElement | null;\n if (counterEl) {\n counterEl.style.color = len >= minLen ? 'var(--mushi-ok, #22c55e)' : '';\n }\n };\n textarea.addEventListener('input', updateCounter);\n }\n\n // Wire example chips — clicking one pre-fills the textarea.\n panel.querySelectorAll('[data-example]').forEach((chip) => {\n chip.addEventListener('click', () => {\n const example = (chip as HTMLElement).dataset.example ?? '';\n if (textarea) {\n textarea.value = example;\n textarea.focus();\n // Trigger counter update.\n textarea.dispatchEvent(new Event('input'));\n }\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n panel.querySelector('[data-action=\"remove-screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRemove?.();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n const minLen = this.effectiveMinLength();\n if (description.length < minLen) {\n if (errorEl) {\n const msg = `${t.step3.tooShort} (${description.length}/${minLen})`;\n errorEl.textContent = msg;\n errorEl.style.display = 'block';\n // Focus the textarea so the user can immediately keep typing.\n textarea?.focus();\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.lastReportId = null;\n this.lastSubmitQueuedOffline = false;\n this.render();\n\n // Kick off the host's submission handler. We treat both\n // sync-void (legacy) and async-outcome (current) shapes:\n // when the host returns an outcome we hold the success step\n // open longer and let the user copy the report id; when the\n // host returns void we use the historic 500 ms transition.\n const outcomeP = (async () => {\n try {\n const ret = this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n if (ret && typeof (ret as Promise<WidgetSubmitOutcome | void>).then === 'function') {\n const outcome = (await ret) as WidgetSubmitOutcome | void;\n return outcome ?? null;\n }\n return null;\n } catch {\n // Submission errors are still surfaced as a success step in\n // the historic SDK — the apiClient retry queue handles the\n // delivery in the background. Mirror that so the receipt\n // copy can degrade to the \"queued offline\" variant rather\n // than blocking the user with an error wall.\n return { reportId: null, queuedOffline: true } as WidgetSubmitOutcome;\n }\n })();\n\n // Always flip to the success step quickly so the user gets a\n // confirmation within one breath even if the network is slow.\n // The outcome promise then patches the receipt id in-place\n // once it resolves (success step re-renders).\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n // Don't auto-close as aggressively if we're waiting on a\n // report id — give the user a moment to copy it. Once the\n // outcome lands we kick off a longer auto-close so the deep\n // link stays readable.\n void outcomeP.then((outcome) => {\n if (this.step !== 'success') return;\n if (outcome) {\n this.lastReportId = outcome.reportId ?? null;\n this.lastSubmitQueuedOffline = Boolean(outcome.queuedOffline);\n this.render();\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n }\n // 6 s when we have a deep link (long enough to read + copy\n // the id), 2.8 s for the legacy bare-stamp path.\n const closeDelayMs = this.lastReportId && this.config.dashboardUrl ? 6000 : 2800;\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, closeDelayMs);\n });\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n\n private unreadCount(): number {\n return this.reporterReports.reduce((sum, report) => sum + (report.unread_count ?? 0), 0);\n }\n\n private async loadReporterReports(): Promise<void> {\n this.step = 'reports';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterReports = await this.callbacks.onReporterReportsRequest?.() ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load reports.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async loadReporterComments(reportId: string): Promise<void> {\n this.selectedReportId = reportId;\n this.step = 'report-detail';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterComments = await this.callbacks.onReporterCommentsRequest?.(reportId) ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load thread.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async submitReporterReply(panel: HTMLElement): Promise<void> {\n const reportId = this.selectedReportId;\n const textarea = panel.querySelector('[data-role=\"reporter-reply\"]') as HTMLTextAreaElement | null;\n const replyButton = panel.querySelector('[data-action=\"reporter-reply\"]') as HTMLButtonElement | null;\n const body = textarea?.value.trim() ?? '';\n // Guard: reject empty bodies AND already-in-flight submits — both prevented\n // double-posts in dogfood when users mashed Enter on a slow link.\n if (!reportId || !body || this.reporterLoading) return;\n this.reporterLoading = true;\n if (replyButton) replyButton.disabled = true;\n this.render();\n try {\n await this.callbacks.onReporterReply?.(reportId, body);\n // Clear the field on success so the next render (driven by\n // loadReporterComments) doesn't repaint the just-sent text and tempt\n // the user into a duplicate submit.\n if (textarea) textarea.value = '';\n await this.loadReporterComments(reportId);\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not send reply.';\n this.reporterLoading = false;\n this.render();\n }\n }\n\n /* ── Marketing / Playwright recorder (debug GIF capture) ─────────── */\n\n getRecorderStep(): WidgetStep {\n return this.step;\n }\n\n getRecorderTrigger(): Element | null {\n return this.shadow.querySelector('.mushi-trigger');\n }\n\n getRecorderCategoryButton(category: MushiReportCategory): Element | null {\n return this.shadow.querySelector(`[data-category=\"${category}\"]`);\n }\n\n getRecorderIntentButton(label: string): Element | null {\n return (\n Array.from(this.shadow.querySelectorAll('[data-intent]')).find(\n (el) => (el as HTMLElement).dataset.intent === label,\n ) ?? null\n );\n }\n\n getRecorderSubmitButton(): Element | null {\n return this.shadow.querySelector('[data-action=\"submit\"]');\n }\n\n recorderClickTrigger(): void {\n if (this.isOpen) this.close();\n this.open();\n }\n\n recorderSelectCategory(category: MushiReportCategory): void {\n if (!this.isOpen) this.open();\n if (this.step !== 'category') {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n this.render();\n }\n this.selectedCategory = category;\n this.step = 'intent';\n this.render();\n }\n\n recorderSelectIntent(label: string): void {\n if (!this.isOpen || this.step !== 'intent') return;\n this.selectedIntent = label;\n this.step = 'details';\n this.render();\n }\n\n recorderFocusDescription(): void {\n const textarea = this.shadow.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n textarea?.focus();\n }\n\n recorderSubmit(): void {\n const submit = this.shadow.querySelector('[data-action=\"submit\"]') as HTMLButtonElement | null;\n submit?.click();\n }\n}\n","/**\n * Dev-only Playwright helpers for marketing GIFs. Exposed on\n * `window.__mushiRecorder` when the SDK is initialized with `debug: true`.\n * Drives the closed shadow-DOM widget through the full reporter flow.\n */\n\nimport type { MushiReportCategory } from '@mushi-mushi/core';\nimport type { MushiWidget } from './widget';\n\nexport interface MushiRecorderCenter {\n x: number;\n y: number;\n}\n\nexport interface MushiMarketingRecorder {\n ready(): boolean;\n getStep(): string;\n getTriggerCenter(): MushiRecorderCenter | null;\n getCategoryCenter(category: MushiReportCategory): MushiRecorderCenter | null;\n getIntentCenter(label: string): MushiRecorderCenter | null;\n getSubmitCenter(): MushiRecorderCenter | null;\n clickTrigger(): void;\n selectCategory(category: MushiReportCategory): void;\n selectIntent(label: string): void;\n focusDescription(): void;\n submit(): void;\n}\n\nfunction centerOf(el: Element | null): MushiRecorderCenter | null {\n if (!el) return null;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return null;\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n}\n\nexport function exposeMarketingRecorder(widget: MushiWidget): void {\n if (typeof globalThis === 'undefined') return;\n\n const api: MushiMarketingRecorder = {\n ready: () => widget.getIsMounted(),\n getStep: () => widget.getRecorderStep(),\n getTriggerCenter: () => centerOf(widget.getRecorderTrigger()),\n getCategoryCenter: (category) => centerOf(widget.getRecorderCategoryButton(category)),\n getIntentCenter: (label) => centerOf(widget.getRecorderIntentButton(label)),\n getSubmitCenter: () => centerOf(widget.getRecorderSubmitButton()),\n clickTrigger: () => widget.recorderClickTrigger(),\n selectCategory: (category) => widget.recorderSelectCategory(category),\n selectIntent: (label) => widget.recorderSelectIntent(label),\n focusDescription: () => widget.recorderFocusDescription(),\n submit: () => widget.recorderSubmit(),\n };\n\n (globalThis as typeof globalThis & { __mushiRecorder?: MushiMarketingRecorder }).__mushiRecorder = api;\n}\n","// ============================================================\n// rewards.ts — Web SDK rewards subsystem\n//\n// Owns:\n// 1. Activity batcher: coalesces events into 5-min flushes\n// with IndexedDB backing for offline resilience.\n// 2. Auto-track listeners: route changes, [data-testid] clicks,\n// session dwell — piggybacks on installAutoBreadcrumbs infra.\n// 3. In-widget tier/points badge (shadow-DOM, themable).\n// 4. Consent surface (explicit mode).\n//\n// Wired by createInstance() only when config.rewards.enabled === true.\n// All state is keyed by projectId so multi-instance setups don't bleed.\n// ============================================================\n\nimport type { MushiApiClient, MushiRewardsConfig, MushiTierResult, MushiActivityEvent } from '@mushi-mushi/core';\n\nconst MIN_FLUSH_INTERVAL = 30_000;\nconst DEFAULT_FLUSH_INTERVAL = 300_000; // 5 min\nconst DWELL_SAMPLE_INTERVAL = 60_000; // emit session_minute every 60s\nconst MAX_SESSION_MINUTES_PER_DAY = 60;\nconst DAILY_RESET_KEY_PREFIX = 'mushi_session_min_day_';\n\n// ──────────────────────────────────────────────────────────────\n// Internal queue (in-memory; IndexedDB for offline persistence)\n// ──────────────────────────────────────────────────────────────\n\ninterface QueuedEvent extends MushiActivityEvent {\n queuedAt: number;\n}\n\nlet pendingEvents: QueuedEvent[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\nlet dwellTimer: ReturnType<typeof setInterval> | null = null;\nlet currentUserId: string | null = null;\nlet currentUserTraits: { email?: string; name?: string; provider?: string } | null = null;\nlet reporterTokenHash: string | null = null;\nlet apiClient: MushiApiClient | null = null;\nlet optedIn = false;\nlet tierCache: MushiTierResult | null = null;\nlet tierCacheTime = 0;\nconst TIER_CACHE_TTL = 5 * 60 * 1000; // 5 min\n\n// Track seen routes to avoid duplicate screen_view_unique_per_day\nconst seenRoutes = new Set<string>();\n\n// ──────────────────────────────────────────────────────────────\n// Consent helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction getConsentKey(projectId: string): string {\n return `mushi_rewards_consent_${projectId}`;\n}\n\nfunction isConsentGranted(projectId: string): boolean {\n try {\n return localStorage.getItem(getConsentKey(projectId)) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setConsentGranted(projectId: string, granted: boolean): void {\n try {\n if (granted) {\n localStorage.setItem(getConsentKey(projectId), '1');\n } else {\n localStorage.removeItem(getConsentKey(projectId));\n }\n optedIn = granted;\n apiClient?.submitActivity(currentUserId ?? '', [], { optedIn: granted }).catch(() => {});\n } catch { /* private browsing */ }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Session-minute daily cap\n// ──────────────────────────────────────────────────────────────\n\nfunction getTodayKey(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction getSessionMinutesToday(projectId: string): number {\n try {\n const val = sessionStorage.getItem(`${DAILY_RESET_KEY_PREFIX}${projectId}_${getTodayKey()}`);\n return val ? parseInt(val, 10) : 0;\n } catch { return 0; }\n}\n\nfunction incrementSessionMinutes(projectId: string): number {\n const today = getTodayKey();\n const key = `${DAILY_RESET_KEY_PREFIX}${projectId}_${today}`;\n try {\n const next = (getSessionMinutesToday(projectId) + 1);\n sessionStorage.setItem(key, String(next));\n return next;\n } catch { return 99; }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Public API\n// ──────────────────────────────────────────────────────────────\n\nexport interface RewardsContext {\n client: MushiApiClient;\n config: MushiRewardsConfig;\n projectId: string;\n userId: string;\n traits?: { email?: string; name?: string; provider?: string };\n reporterToken?: string;\n}\n\n/** Called by createInstance() when a user is identified and rewards are enabled. */\nexport function initRewards(ctx: RewardsContext): void {\n apiClient = ctx.client;\n void ctx.config; // config stored for future use\n currentUserId = ctx.userId;\n currentUserTraits = ctx.traits ?? null;\n reporterTokenHash = ctx.reporterToken ?? null;\n\n const { projectId } = ctx;\n const flushMs = Math.max(\n MIN_FLUSH_INTERVAL,\n ctx.config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL,\n );\n\n // Resolve consent\n if (ctx.config.consentMode === 'auto') {\n optedIn = true;\n setConsentGranted(projectId, true);\n } else {\n optedIn = isConsentGranted(projectId);\n }\n\n // Install auto-track listeners when trackActivity is on\n if (ctx.config.trackActivity) {\n installActivityListeners(projectId);\n }\n\n // Start flush timer\n if (flushTimer) clearInterval(flushTimer);\n flushTimer = setInterval(() => flush(ctx), flushMs);\n\n // Dwell timer — emits session_minute every 60s (capped)\n if (dwellTimer) clearInterval(dwellTimer);\n dwellTimer = setInterval(() => {\n if (!optedIn || !currentUserId) return;\n const minutes = getSessionMinutesToday(projectId);\n if (minutes < MAX_SESSION_MINUTES_PER_DAY) {\n incrementSessionMinutes(projectId);\n enqueue({ action: 'session_minute', metadata: { minutes_today: minutes + 1 } });\n }\n }, DWELL_SAMPLE_INTERVAL);\n\n // Eager tier fetch for the widget badge\n if (ctx.config.showInWidget) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, ctx.config);\n });\n }\n\n // Show consent surface if explicit mode and not yet granted\n if (ctx.config.consentMode !== 'auto' && !optedIn) {\n renderConsentBanner(projectId, ctx.config);\n }\n}\n\n/** Called by Mushi.identify() to update the current user context. */\nexport function updateRewardsUser(\n userId: string,\n traits?: { email?: string; name?: string; provider?: string },\n): void {\n currentUserId = userId;\n currentUserTraits = traits ?? null;\n // Invalidate tier cache on user change\n tierCache = null;\n tierCacheTime = 0;\n}\n\n/** Manually enqueue a host-defined activity event. */\nexport function enqueue(event: MushiActivityEvent): void {\n if (!optedIn || !currentUserId) return;\n pendingEvents.push({ ...event, queuedAt: Date.now() });\n}\n\n/** Force-flush the pending event queue. */\nexport async function flush(ctx: RewardsContext): Promise<void> {\n if (!optedIn || !currentUserId || pendingEvents.length === 0) return;\n\n // P2: attach host-app JWT if verifyUserToken callback is configured\n let hostJwt: string | null = null;\n if (ctx.config.verifyUserToken) {\n try {\n hostJwt = await ctx.config.verifyUserToken();\n } catch {\n // Non-fatal — activity still submits without JWT;\n // server will mark jwt_verified_at = null\n }\n }\n\n const batch = pendingEvents.splice(0, 100);\n try {\n await ctx.client.submitActivity(currentUserId, batch, {\n userTraits: currentUserTraits ?? undefined,\n reporterTokenHash: reporterTokenHash ?? undefined,\n optedIn: true,\n hostJwt: hostJwt ?? undefined,\n });\n } catch {\n // On failure, re-queue for next flush (simplified offline; full\n // IndexedDB queue is left for a follow-up to keep this file focussed)\n pendingEvents.unshift(...batch.slice(0, 50)); // cap re-queue at 50\n }\n}\n\nexport async function getTier(userId: string): Promise<MushiTierResult | null> {\n const now = Date.now();\n if (tierCache && now - tierCacheTime < TIER_CACHE_TTL) return tierCache;\n return fetchAndCacheTier(userId);\n}\n\nasync function fetchAndCacheTier(userId: string): Promise<MushiTierResult | null> {\n if (!apiClient) return null;\n const res = await apiClient.getMyTier(userId);\n if (res.ok && res.data) {\n tierCache = res.data as MushiTierResult;\n tierCacheTime = Date.now();\n return tierCache;\n }\n return null;\n}\n\nexport function teardown(): void {\n if (flushTimer) { clearInterval(flushTimer); flushTimer = null; }\n if (dwellTimer) { clearInterval(dwellTimer); dwellTimer = null; }\n removeActivityListeners();\n removeTierBadge();\n if (consentHost) { consentHost.remove(); consentHost = null; }\n pendingEvents = [];\n currentUserId = null;\n apiClient = null;\n optedIn = false;\n tierCache = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auto-track listeners\n// ──────────────────────────────────────────────────────────────\n\nlet routeObserver: MutationObserver | null = null;\nlet clickHandler: ((e: MouseEvent) => void) | null = null;\nlet popstateHandler: (() => void) | null = null;\nlet origPushState: typeof history.pushState | null = null;\nlet lastRoute = '';\n\nfunction installActivityListeners(projectId: string): void {\n // Route: pushState + popstate\n const emitRoute = () => {\n const route = location.pathname;\n if (route === lastRoute) return;\n lastRoute = route;\n const isNewToday = !seenRoutes.has(`${projectId}:${route}`);\n if (isNewToday) {\n seenRoutes.add(`${projectId}:${route}`);\n enqueue({ action: 'screen_view_unique_per_day', metadata: { route } });\n }\n };\n\n origPushState = history.pushState.bind(history);\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPushState!(...args);\n emitRoute();\n };\n popstateHandler = emitRoute;\n window.addEventListener('popstate', emitRoute);\n emitRoute(); // record initial route\n\n // DOM mutation observer for SPA route changes that don't use pushState\n routeObserver = new MutationObserver(() => emitRoute());\n const main = document.querySelector('main') ?? document.body;\n routeObserver.observe(main, { childList: true, subtree: false });\n\n // Click: track [data-testid] interactions\n clickHandler = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest('[data-testid]') as HTMLElement | null;\n if (!target) return;\n const testid = target.dataset.testid;\n if (!testid) return;\n enqueue({ action: 'element_selected', metadata: { testid, route: location.pathname } });\n };\n document.addEventListener('click', clickHandler, { capture: true, passive: true });\n}\n\nfunction removeActivityListeners(): void {\n // Restore original pushState before removing listeners\n if (origPushState) {\n history.pushState = origPushState;\n origPushState = null;\n }\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler);\n popstateHandler = null;\n }\n routeObserver?.disconnect();\n routeObserver = null;\n if (clickHandler) {\n document.removeEventListener('click', clickHandler, { capture: true });\n clickHandler = null;\n }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Shadow-DOM tier badge\n// ──────────────────────────────────────────────────────────────\n\nlet badgeHost: HTMLElement | null = null;\n\nfunction renderTierBadge(tier: MushiTierResult, config: MushiRewardsConfig): void {\n if (!config.showInWidget) return;\n if (badgeHost) badgeHost.remove();\n\n badgeHost = document.createElement('div');\n badgeHost.id = 'mushi-tier-badge';\n Object.assign(badgeHost.style, {\n position: 'fixed',\n bottom: '56px', // above the widget button\n right: '16px',\n zIndex: '2147483645',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = badgeHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 999px;\n background: rgba(0,0,0,0.75);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n backdrop-filter: blur(6px);\n cursor: default;\n user-select: none;\n }\n .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6c47ff;\n flex-shrink: 0;\n }\n </style>\n <div class=\"badge\">\n <span class=\"dot\"></span>\n <span>${tier.displayName}</span>\n </div>\n `;\n\n document.body.appendChild(badgeHost);\n}\n\nfunction removeTierBadge(): void {\n badgeHost?.remove();\n badgeHost = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Consent banner (explicit mode)\n// ──────────────────────────────────────────────────────────────\n\nlet consentHost: HTMLElement | null = null;\n\nfunction renderConsentBanner(projectId: string, config: MushiRewardsConfig): void {\n if (consentHost) return; // already shown\n\n consentHost = document.createElement('div');\n consentHost.id = 'mushi-consent-banner';\n Object.assign(consentHost.style, {\n position: 'fixed',\n bottom: '80px',\n right: '16px',\n zIndex: '2147483646',\n maxWidth: '280px',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = consentHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .banner {\n background: #fff;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n padding: 14px 16px;\n font-size: 13px;\n line-height: 1.5;\n color: #374151;\n }\n .title { font-weight: 700; margin-bottom: 6px; color: #111827; }\n .actions { display: flex; gap: 8px; margin-top: 10px; }\n button {\n flex: 1;\n padding: 6px 10px;\n border-radius: 6px;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n }\n .accept { background: #6c47ff; color: #fff; }\n .decline { background: #f3f4f6; color: #374151; }\n </style>\n <div class=\"banner\">\n <div class=\"title\">🎯 Earn rewards</div>\n <div>Help improve this app and earn points, badges, and perks for your contributions.</div>\n <div class=\"actions\">\n <button class=\"accept\" id=\"accept\">Enable</button>\n <button class=\"decline\" id=\"decline\">No thanks</button>\n </div>\n </div>\n `;\n\n shadow.getElementById('accept')?.addEventListener('click', () => {\n setConsentGranted(projectId, true);\n consentHost?.remove();\n consentHost = null;\n if (config.showInWidget && currentUserId) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, config);\n });\n }\n });\n\n shadow.getElementById('decline')?.addEventListener('click', () => {\n setConsentGranted(projectId, false);\n consentHost?.remove();\n consentHost = null;\n });\n\n document.body.appendChild(consentHost);\n}\n","import type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import {\n MUSHI_INTERNAL_HEADER,\n MUSHI_INTERNAL_INIT_MARKER,\n type MushiInternalRequestKind,\n type MushiUrlMatcher,\n} from '@mushi-mushi/core';\n\nexport interface InternalRequestOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport const DEFAULT_INTERNAL_URL_MATCHERS: MushiUrlMatcher[] = [\n /\\/v1\\/sdk(?:\\/|$)/,\n /\\/v1\\/reports(?:\\/|$)/,\n /\\/v1\\/notifications(?:\\/|$)/,\n /\\/v1\\/reputation(?:\\/|$)/,\n];\n\nexport function getRequestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n return input.url;\n}\n\nexport function getInternalRequestKind(\n input: RequestInfo | URL,\n init?: RequestInit,\n): MushiInternalRequestKind | null {\n const marker = (init as (RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: MushiInternalRequestKind }) | undefined)\n ?.[MUSHI_INTERNAL_INIT_MARKER];\n if (marker) return marker;\n\n const initHeader = readHeader(init?.headers, MUSHI_INTERNAL_HEADER);\n if (initHeader) return initHeader as MushiInternalRequestKind;\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n const requestHeader = input.headers.get(MUSHI_INTERNAL_HEADER);\n if (requestHeader) return requestHeader as MushiInternalRequestKind;\n }\n\n return null;\n}\n\nexport function shouldIgnoreMushiUrl(url: string, options: InternalRequestOptions = {}): boolean {\n const matchers = [...DEFAULT_INTERNAL_URL_MATCHERS, ...(options.ignoreUrls ?? [])];\n if (matchers.some((matcher) => matchesUrl(url, matcher))) return true;\n\n const endpoint = normalizeUrlPrefix(options.apiEndpoint);\n return endpoint ? normalizeComparableUrl(url).startsWith(endpoint) : false;\n}\n\nexport function matchesUrl(url: string, matcher: MushiUrlMatcher): boolean {\n if (typeof matcher === 'string') {\n return normalizeComparableUrl(url).includes(matcher);\n }\n matcher.lastIndex = 0;\n return matcher.test(url);\n}\n\nexport function normalizeUrlPrefix(url?: string): string | null {\n if (!url) return null;\n return normalizeComparableUrl(url).replace(/\\/+$/, '');\n}\n\nexport function isLocalhostEndpoint(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost'\n || parsed.hostname === '127.0.0.1'\n || parsed.hostname === '::1'\n || parsed.hostname.endsWith('.localhost');\n } catch {\n return /\\blocalhost\\b|127\\.0\\.0\\.1/.test(url);\n }\n}\n\nfunction normalizeComparableUrl(url: string): string {\n try {\n return new URL(url, typeof location !== 'undefined' ? location.href : 'http://localhost').href;\n } catch {\n return url;\n }\n}\n\nfunction readHeader(headers: HeadersInit | undefined, name: string): string | null {\n if (!headers) return null;\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return headers.get(name);\n }\n if (Array.isArray(headers)) {\n const found = headers.find(([key]) => key.toLowerCase() === name.toLowerCase());\n return found?.[1] ?? null;\n }\n const record = headers as Record<string, string>;\n return record[name] ?? record[name.toLowerCase()] ?? null;\n}\n","import type { MushiNetworkEntry, MushiUrlMatcher } from '@mushi-mushi/core';\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from '../internal-requests';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n updateOptions(options: NetworkCaptureOptions): void;\n destroy(): void;\n}\n\nexport interface NetworkCaptureOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport function createNetworkCapture(options: NetworkCaptureOptions = {}): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n let activeOptions = options;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = getRequestUrl(input);\n const internalKind = getInternalRequestKind(input, init);\n const shouldRecord = !internalKind && !shouldIgnoreMushiUrl(url, activeOptions);\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n\n return response;\n } catch (error) {\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n }\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","import type { MushiPrivacyConfig } from '@mushi-mushi/core';\n\nexport interface ScreenshotCapture {\n take(): Promise<string | null>;\n updateOptions(options: ScreenshotCaptureOptions): void;\n}\n\nexport interface ScreenshotCaptureOptions {\n privacy?: MushiPrivacyConfig;\n}\n\nexport function createScreenshotCapture(options: ScreenshotCaptureOptions = {}): ScreenshotCapture {\n let activeOptions = options;\n\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const safeDocument = buildPrivacySafeDocument(activeOptions.privacy);\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(safeDocument)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return {\n take,\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n };\n}\n\nconst DEFAULT_REDACT_SELECTORS: readonly string[] = [\n 'input[type=\"password\"]',\n '[data-mushi-redact]',\n];\n\nfunction buildPrivacySafeDocument(privacy?: MushiPrivacyConfig): Element {\n const clone = document.documentElement.cloneNode(true) as Element;\n\n // Redact: black-out matching elements. Applied before mask/block so that\n // password fields are always blacked out even if not explicitly listed\n // in maskSelectors. Pass an empty array to `redactSelectors` to opt out.\n const redactSelectors: readonly string[] = privacy?.redactSelectors !== undefined\n ? privacy.redactSelectors\n : DEFAULT_REDACT_SELECTORS;\n\n for (const selector of redactSelectors) {\n for (const el of safeQueryAll(clone, selector)) {\n redactElement(el as HTMLElement);\n }\n }\n\n for (const selector of privacy?.blockSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n el.remove();\n }\n }\n\n for (const selector of privacy?.maskSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n maskElement(el as HTMLElement);\n }\n }\n\n return clone;\n}\n\nfunction safeQueryAll(root: Element, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction redactElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n }\n el.textContent = '';\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#000!important;color:#000!important;text-shadow:none!important;border-color:#000!important;`,\n );\n el.setAttribute('data-mushi-redacted', 'true');\n // Remove child nodes so no text nodes leak through the SVG serialiser\n while (el.firstChild) el.removeChild(el.firstChild);\n}\n\nfunction maskElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n el.setAttribute('placeholder', '••••');\n }\n el.textContent = el.children.length === 0 ? '••••' : el.textContent;\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#8f8f8f!important;color:transparent!important;text-shadow:none!important;`,\n );\n el.setAttribute('data-mushi-masked', 'true');\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\n/**\n * INP `durationThreshold` recommended by the spec — interactions shorter\n * than this are below human perception and inflate noise. 40 ms is the\n * official web-vitals default.\n */\nconst INP_DURATION_THRESHOLD_MS = 40;\n\n/**\n * Build a stable, short selector for an element so the triage UI can\n * surface \"the slow click was on <button.checkout>\" rather than just\n * \"1200 ms INP\". Mirrors the web-vitals attribution-build heuristic\n * (tag + #id + .firstClass). Does not read `value`, `aria-label`, or\n * text content; however `el.id` and `el.classList` can contain\n * application-defined identifiers (e.g. `user-123`, `order-456`).\n * Keep this in mind when reviewing collected reports for PII exposure.\n */\nfunction describeElement(target: EventTarget | null | undefined): string | undefined {\n if (!target || !(target as Element).tagName) return undefined;\n const el = target as Element;\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n const cls = el.classList && el.classList.length > 0 ? `.${el.classList[0]}` : '';\n return `${tag}${id}${cls}`;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n\n // ---------------------------------------------------------------\n // Interaction to Next Paint (INP) — a Google Core Web Vital since\n // March 2024 (replaced First Input Delay). We track the worst\n // observed interaction since SDK init and attach lightweight\n // attribution (event type, target selector, sub-phase timings) so\n // the report reads \"1200ms click on <button.checkout>\" rather than\n // a bare number. Implementation follows the official `web-vitals`\n // library's onINP algorithm:\n // 1. Group `event` entries by `interactionId`.\n // 2. Take the max-duration entry per interaction.\n // 3. Track the longest interaction overall.\n // For sites with very few interactions (typical bug-report\n // sessions: 1–10 clicks) the longest interaction IS the INP per\n // the spec's 75th-percentile rule. Extending to a full P75 buffer\n // would add ~2KB for negligible accuracy on this workload.\n // SOURCE: https://web.dev/articles/inp\n // ---------------------------------------------------------------\n try {\n const seenInteractions = new Map<number, number>();\n const inpObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceEventTiming[]) {\n const interactionId = entry.interactionId;\n if (!interactionId) continue;\n const prev = seenInteractions.get(interactionId) ?? 0;\n if (entry.duration > prev) {\n seenInteractions.set(interactionId, entry.duration);\n }\n if (entry.duration > (metrics.inp ?? 0)) {\n metrics.inp = entry.duration;\n // Sub-phase timings let consumers pinpoint whether INP was\n // dominated by input delay (e.g. a long task on the main\n // thread blocking the input), processing (slow handler), or\n // presentation (heavy paint). The web-vitals attribution\n // build computes these the same way.\n const inputDelay = entry.processingStart - entry.startTime;\n const processingDuration = entry.processingEnd - entry.processingStart;\n const presentationDelay =\n entry.startTime + entry.duration - entry.processingEnd;\n metrics.inpAttribution = {\n eventType: entry.name,\n targetSelector: describeElement(entry.target),\n inputDelay: Math.max(0, inputDelay),\n processingDuration: Math.max(0, processingDuration),\n presentationDelay: Math.max(0, presentationDelay),\n };\n }\n }\n });\n inpObserver.observe({\n type: 'event',\n // `durationThreshold` filters out fast (< 40 ms) interactions\n // that sit below human perception. Spec-recommended floor.\n durationThreshold: INP_DURATION_THRESHOLD_MS,\n buffered: true,\n } as PerformanceObserverInit);\n observers.push(inpObserver);\n } catch {\n // event-timing not supported (Safari < 16.4 falls into this branch).\n // Consumers fall back to FID via a separate first-input observer.\n }\n\n try {\n const fidObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceEventTiming[]) {\n // first-input fires once. Use it as a fallback on browsers\n // that don't support event-timing INP observation (Safari\n // < 16.4). Always recorded — INP supersedes when present.\n if (metrics.fid === undefined) {\n metrics.fid = entry.processingStart - entry.startTime;\n }\n }\n });\n fidObserver.observe({ type: 'first-input', buffered: true });\n observers.push(fidObserver);\n } catch {\n // first-input not supported either — caller will see no FID/INP.\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n /**\n * Walk up the DOM until we find an ancestor with `data-testid`.\n *\n * Why ascending and not descending: testids in modern apps are placed\n * on the OUTER interactive container (\"BuyProButton\") rather than on\n * the deepest leaf the click event hit (the SVG inside the icon).\n * Walking up matches authoring intent.\n *\n * Bounded at 20 hops so a misbehaving page can't pin the SDK in a\n * pathological tree.\n */\n function findNearestTestid(el: Element | null): string | null {\n let cur: Element | null = el;\n let hops = 0;\n while (cur && hops < 20) {\n const tid = cur.getAttribute?.('data-testid');\n if (tid) return tid;\n cur = cur.parentElement;\n hops++;\n }\n return null;\n }\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n // v2 (whitepaper §4.7): the closest ancestor's `data-testid` lets the\n // server map this report → an Action node in the inventory graph\n // without a fuzzy NLP guess. We walk to the body so a deeply nested\n // span inside a button-with-testid still resolves correctly.\n nearestTestid: findNearestTestid(el) || undefined,\n route: typeof window !== 'undefined' ? window.location.pathname : undefined,\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n // Guard: ignore clicks that originated inside the Mushi widget host so\n // the user can't accidentally capture the widget panel itself.\n const path = e.composedPath ? e.composedPath() : [];\n const hitsMushiHost = path.some(\n (node) => node instanceof Element && (node as Element).id === 'mushi-mushi-widget',\n );\n if (hitsMushiHost) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiConsoleEntry, MushiNetworkEntry, MushiTimelineEntry } from '@mushi-mushi/core';\n\nconst MAX_TIMELINE_ENTRIES = 120;\n\nexport interface TimelineCapture {\n setScreen(screen: { name: string; route?: string; feature?: string }): void;\n getEntries(input?: {\n consoleLogs?: MushiConsoleEntry[] | null;\n networkLogs?: MushiNetworkEntry[] | null;\n }): MushiTimelineEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createTimelineCapture(): TimelineCapture {\n const entries: MushiTimelineEntry[] = [];\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n const handlePopState = () => recordRoute('popstate');\n const handleHashChange = () => recordRoute('hashchange');\n\n recordRoute('initial');\n\n function record(entry: MushiTimelineEntry): void {\n entries.push(entry);\n if (entries.length > MAX_TIMELINE_ENTRIES) entries.shift();\n }\n\n function recordRoute(source: string): void {\n if (typeof location === 'undefined') return;\n record({\n ts: Date.now(),\n kind: 'route',\n payload: {\n source,\n route: `${location.pathname}${location.search}${location.hash}`,\n href: location.href,\n },\n });\n }\n\n function handleClick(event: MouseEvent): void {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n const el = target.closest('button,a,[role=\"button\"],input,textarea,select,[data-mushi-track]') ?? target;\n record({\n ts: Date.now(),\n kind: 'click',\n payload: {\n tag: el.tagName.toLowerCase(),\n id: (el as HTMLElement).id || undefined,\n text: textSnippet(el),\n },\n });\n }\n\n history.pushState = function mushiPushState(this: History, ...args) {\n const result = originalPushState.apply(this, args);\n recordRoute('pushState');\n return result;\n } as typeof history.pushState;\n\n history.replaceState = function mushiReplaceState(this: History, ...args) {\n const result = originalReplaceState.apply(this, args);\n recordRoute('replaceState');\n return result;\n } as typeof history.replaceState;\n\n window.addEventListener('popstate', handlePopState);\n window.addEventListener('hashchange', handleHashChange);\n document.addEventListener('click', handleClick, true);\n\n return {\n setScreen(screen) {\n record({\n ts: Date.now(),\n kind: 'screen',\n payload: screen,\n });\n },\n getEntries(input = {}) {\n const merged = [\n ...entries,\n ...(input.consoleLogs ?? []).map((log): MushiTimelineEntry => ({\n ts: log.timestamp,\n kind: 'log',\n payload: {\n level: log.level,\n message: log.message,\n },\n })),\n ...(input.networkLogs ?? []).map((network): MushiTimelineEntry => ({\n ts: network.timestamp,\n kind: 'request',\n payload: {\n method: network.method,\n url: network.url,\n status: network.status,\n duration: network.duration,\n error: network.error,\n },\n })),\n ].sort((a, b) => a.ts - b.ts);\n return merged.slice(-MAX_TIMELINE_ENTRIES);\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', handlePopState);\n window.removeEventListener('hashchange', handleHashChange);\n document.removeEventListener('click', handleClick, true);\n },\n };\n}\n\nfunction textSnippet(el: Element): string | undefined {\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 80) : undefined;\n}\n","/**\n * Mushi Mushi v2.1 — passive inventory discovery (whitepaper §6 hybrid mode).\n *\n * What this captures\n * ──────────────────\n * - location.pathname, normalized to a route TEMPLATE (e.g.\n * /practice/abc-123 → /practice/[id]) using either an explicit list\n * of templates from the host framework's route config OR a small\n * heuristic that collapses uuid / numeric / 24-char-hex segments.\n * - document.title\n * - all `[data-testid]` values currently in the DOM\n * - the most recent N fetch/XHR paths captured by the existing\n * network capturer (we do NOT instrument fetch ourselves — we\n * borrow its observations to keep responsibility in one place)\n * - a ≤200-char DOM summary built from <h1> / <title> / <main>\n * - sanitized query-param keys (keys only, never values)\n * - a SHA-256 of (userId || sessionId) so the server can count\n * distinct users without storing identity\n *\n * What this does NOT capture\n * ──────────────────────────\n * - any other DOM content\n * - query-param VALUES, fragments, or hashes (only key names)\n * - cookies, localStorage, sessionStorage\n * - input values, focused elements, or scroll positions\n * - the user's IP or any device fingerprint (the server already\n * redacts what it gets, but we never send any)\n *\n * Throttling\n * ──────────\n * At most one emission per (route, throttleMs) window. Default 60s.\n * This keeps the ingest volume on a high-traffic SPA bounded — even\n * a customer with a million PVs/day generates at most ~1.4M rows.\n */\n\nimport type { MushiDiscoverInventoryConfig } from '@mushi-mushi/core';\n\nexport interface DiscoveryEvent {\n route: string;\n page_title: string | null;\n dom_summary: string | null;\n testids: string[];\n network_paths: string[];\n query_param_keys: string[];\n user_id_hash: string | null;\n observed_at: string;\n}\n\nexport interface DiscoveryCaptureOptions {\n config: MushiDiscoverInventoryConfig;\n /** Returns the recent fetch/XHR paths from the network capturer. */\n getRecentNetworkPaths: () => string[];\n /** Returns the current user identifier (or null) for hash input. */\n getUserId: () => string | null;\n /** Stable session id for dedup when no userId is set. */\n getSessionId: () => string;\n /** Called when a new discovery event is ready to ship. */\n onEvent: (e: DiscoveryEvent) => void;\n}\n\nexport interface DiscoveryCapture {\n destroy: () => void;\n /** Emit immediately for the current pathname. Used on init. */\n flushNow: () => void;\n}\n\nconst DEFAULT_THROTTLE_MS = 60_000;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst HEX24_RE = /^[0-9a-f]{20,}$/i;\nconst NUMERIC_RE = /^\\d+$/;\nconst SLUG_HASHY_RE = /^[a-z0-9]{16,}$/i;\n\n/**\n * Collapse a single path segment to a template placeholder when it\n * looks like an opaque identifier. We are deliberately conservative\n * — if a heuristic isn't confident, we leave the segment alone, since\n * over-collapsing is worse than under-collapsing for the proposer.\n */\nexport function normalizeSegment(seg: string): string {\n if (seg.length === 0) return seg;\n if (UUID_RE.test(seg)) return '[id]';\n if (HEX24_RE.test(seg)) return '[id]';\n if (NUMERIC_RE.test(seg)) return '[id]';\n // Heuristic: a single segment of 16+ alphanumeric chars with at least\n // one digit is almost certainly an id, not a slug. (`thai-language` →\n // keep; `sku_abc12345xyz` → collapse.)\n if (SLUG_HASHY_RE.test(seg) && /\\d/.test(seg)) return '[id]';\n return seg;\n}\n\n/**\n * Normalize a pathname to a route template, preferring an exact-match\n * against `routeTemplates` if the host has provided them.\n *\n * /practice/abc-123 + ['/practice/[id]'] → '/practice/[id]'\n * /practice/01H8H8… without templates → '/practice/[id]'\n * /tags/thai-language without templates → '/tags/thai-language'\n */\nexport function normalizeRoute(\n pathname: string,\n templates: string[] | undefined,\n): string {\n // Strip trailing slash so /a and /a/ look the same to the proposer.\n const clean = pathname.length > 1 && pathname.endsWith('/')\n ? pathname.slice(0, -1)\n : pathname;\n if (templates?.length) {\n const matched = matchTemplate(clean, templates);\n if (matched) return matched;\n }\n return '/' + clean\n .split('/')\n .filter((s) => s.length > 0)\n .map(normalizeSegment)\n .join('/');\n}\n\n/**\n * Walk the host's static route templates and pick the one whose shape\n * matches the live pathname. `[id]`-style placeholders match any\n * single segment.\n */\nfunction matchTemplate(pathname: string, templates: string[]): string | null {\n const segs = pathname.split('/').filter((s) => s.length > 0);\n // Sort longer-first so /a/b/[c] beats /a/b on a 3-segment URL.\n const sorted = [...templates].sort(\n (a, b) => b.split('/').length - a.split('/').length,\n );\n for (const tpl of sorted) {\n const tplSegs = tpl.split('/').filter((s) => s.length > 0);\n if (tplSegs.length !== segs.length) continue;\n let ok = true;\n for (let i = 0; i < tplSegs.length; i++) {\n const t = tplSegs[i]!;\n const s = segs[i]!;\n if (t.startsWith('[') && t.endsWith(']')) continue;\n if (t.startsWith(':')) continue;\n if (t === s) continue;\n ok = false;\n break;\n }\n if (ok) return '/' + tplSegs.join('/');\n }\n return null;\n}\n\nfunction readTestids(): string[] {\n if (typeof document === 'undefined') return [];\n const out = new Set<string>();\n const els = document.querySelectorAll('[data-testid]');\n for (const el of Array.from(els)) {\n const v = el.getAttribute('data-testid');\n if (v && v.length > 0 && v.length < 120) out.add(v);\n }\n return Array.from(out).sort();\n}\n\nfunction readQueryParamKeys(): string[] {\n if (typeof window === 'undefined') return [];\n try {\n const params = new URLSearchParams(window.location.search);\n const out = new Set<string>();\n params.forEach((_, key) => out.add(key));\n return Array.from(out).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Build a ≤200-char summary from the document's most prominent text.\n * We try `<h1>` first (most apps put the page heading there), fall\n * back to `<title>`, then `<main>`'s first paragraph, then null.\n */\nfunction readDomSummary(): string | null {\n if (typeof document === 'undefined') return null;\n const trim = (s: string | null | undefined) =>\n (s ?? '').replace(/\\s+/g, ' ').trim().slice(0, 200);\n const h1 = trim(document.querySelector('h1')?.textContent);\n if (h1) return h1;\n const title = trim(document.title);\n if (title) return title;\n const main = trim(document.querySelector('main')?.textContent);\n return main || null;\n}\n\n/**\n * SHA-256 (lowercase hex) of `userId || sessionId`, using the platform\n * SubtleCrypto. Falls back to `null` if crypto.subtle isn't available\n * (rare; means we won't dedupe distinct users on this client). Never\n * throws.\n */\nasync function hashUserId(input: string | null): Promise<string | null> {\n if (!input || typeof crypto === 'undefined' || !crypto.subtle) return null;\n try {\n const data = new TextEncoder().encode(input);\n const buf = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(buf);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, '0');\n }\n return hex;\n } catch {\n return null;\n }\n}\n\n/**\n * Stand up the discovery capturer. Returns a disposer.\n *\n * Implementation notes\n * ────────────────────\n * - We hook `pushState` / `replaceState` because `popstate` alone misses\n * SPA navigations triggered by frameworks calling `history.pushState`\n * directly (Next.js / React Router both do this).\n * - The first emission fires after a 100ms delay so the host app has\n * a chance to settle the new DOM before we read testids.\n * - Hash-only changes (`#section`) are intentionally ignored; they're\n * not real navigations as far as the inventory is concerned.\n */\nexport function createDiscoveryCapture(opts: DiscoveryCaptureOptions): DiscoveryCapture {\n const {\n config,\n getRecentNetworkPaths,\n getUserId,\n getSessionId,\n onEvent,\n } = opts;\n\n const throttleMs = config.throttleMs ?? DEFAULT_THROTTLE_MS;\n const captureSummary = config.captureDomSummary !== false;\n const userIdSource = config.userIdSource ?? 'auto';\n\n const lastEmittedAt = new Map<string, number>();\n let lastPath: string | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n async function emitForCurrent() {\n if (typeof window === 'undefined') return;\n const route = normalizeRoute(window.location.pathname, config.routeTemplates);\n const now = Date.now();\n const last = lastEmittedAt.get(route) ?? 0;\n if (now - last < throttleMs) return;\n lastEmittedAt.set(route, now);\n\n let userIdInput: string | null = null;\n if (userIdSource === 'auto') {\n userIdInput = getUserId() ?? getSessionId();\n } else if (userIdSource === 'session-only') {\n userIdInput = getSessionId();\n }\n\n const event: DiscoveryEvent = {\n route,\n page_title: typeof document !== 'undefined'\n ? (document.title || '').slice(0, 300) || null\n : null,\n dom_summary: captureSummary ? readDomSummary() : null,\n testids: readTestids(),\n network_paths: getRecentNetworkPaths().slice(-50),\n query_param_keys: readQueryParamKeys(),\n user_id_hash: await hashUserId(userIdInput),\n observed_at: new Date().toISOString(),\n };\n onEvent(event);\n }\n\n function scheduleEmit() {\n if (pendingTimer) return;\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void emitForCurrent();\n }, 100);\n }\n\n function onMaybeNavigation() {\n if (typeof window === 'undefined') return;\n const path = window.location.pathname + window.location.search;\n if (path === lastPath) return;\n lastPath = path;\n scheduleEmit();\n }\n\n if (typeof window === 'undefined') {\n return {\n destroy: () => undefined,\n flushNow: () => undefined,\n };\n }\n\n // Patch history.pushState / replaceState.\n const originalPush = window.history.pushState.bind(window.history);\n const originalReplace = window.history.replaceState.bind(window.history);\n const patchedPush: typeof window.history.pushState = function patched(\n ...args\n ) {\n const out = originalPush(...args);\n onMaybeNavigation();\n return out;\n };\n const patchedReplace: typeof window.history.replaceState = function patched(\n ...args\n ) {\n const out = originalReplace(...args);\n onMaybeNavigation();\n return out;\n };\n window.history.pushState = patchedPush;\n window.history.replaceState = patchedReplace;\n\n const onPop = () => onMaybeNavigation();\n window.addEventListener('popstate', onPop);\n\n // Initial emission for the landing page.\n scheduleEmit();\n\n return {\n destroy() {\n window.removeEventListener('popstate', onPop);\n // Best-effort restoration; if another piece of code patched it\n // after us, leave it alone.\n if (window.history.pushState === patchedPush) {\n window.history.pushState = originalPush;\n }\n if (window.history.replaceState === patchedReplace) {\n window.history.replaceState = originalReplace;\n }\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n lastEmittedAt.clear();\n },\n flushNow() {\n // Bypass throttle on explicit flush.\n lastEmittedAt.clear();\n void emitForCurrent();\n },\n };\n}\n\n// Pure exports for the unit tests.\nexport const __test = { matchTemplate };\n","import type { MushiSentryConfig, MushiSentryContext } from '@mushi-mushi/core';\n\n/**\n * Sentry integration — boosted 2026-05-07.\n *\n * Goal: when a host has Sentry installed (v7, v8, or v9), every Mushi\n * report carries enough trace data for the admin to pivot directly into\n * Sentry's MCP / web UI without the user manually pasting links.\n *\n * Detection strategy:\n * 1. v8/v9 expose `Sentry.lastEventId()`, `Sentry.getCurrentScope()`,\n * `Sentry.getReplay()`, `Sentry.getActiveSpan()`. The global lives\n * under `window.Sentry`; the SDK wraps internals in\n * `__SENTRY__.version === '8'` or `'9'`.\n * 2. v7 exposes `Sentry.getCurrentHub()` and writes hub state under\n * `window.__SENTRY__.hub`.\n * 3. Replay can also be on `window.__SENTRY_REPLAY__` for sites that\n * attach the replay integration manually.\n *\n * Every probe is wrapped in a `try/catch` because Sentry's APIs change\n * between point releases — a v8.13.0 method can throw \"not a function\"\n * on v8.0.0. We accept partial captures by design; the goal is \"as much\n * context as we can get\" rather than \"all or nothing\".\n */\nexport type { MushiSentryContext as SentryContext };\n\n// ---- Detection layer --------------------------------------------------------\n\ninterface SentryV8Like {\n lastEventId?: () => string | undefined;\n getCurrentScope?: () => SentryScopeLike | undefined;\n getActiveSpan?: () => SentrySpanLike | undefined;\n getRootSpan?: (span: SentrySpanLike) => SentrySpanLike | undefined;\n getReplay?: () => SentryReplayLike | undefined;\n getClient?: () => SentryClientLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryV7Like {\n getCurrentHub?: () => SentryHubLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryHubLike {\n getClient?: () => SentryClientLike | undefined;\n getScope?: () => SentryScopeLike | undefined;\n configureScope?: (cb: (scope: SentryScopeLike) => void) => void;\n}\n\ninterface SentryScopeLike {\n getLastEventId?: () => string | undefined;\n getUser?: () => Record<string, unknown> | undefined;\n getTags?: () => Record<string, string | number | boolean> | undefined;\n getTransactionName?: () => string | undefined;\n getTransaction?: () => { name?: string } | undefined;\n getSpan?: () => SentrySpanLike | undefined;\n getSession?: () => { sid?: string } | undefined;\n getBreadcrumbs?: () => Record<string, unknown>[] | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n // Internal API: most Sentry SDK versions expose breadcrumbs at\n // `_breadcrumbs` even when there's no public getter for it. We use\n // it as a last-resort fallback inside a try/catch.\n _breadcrumbs?: Record<string, unknown>[];\n}\n\ninterface SentrySpanLike {\n spanContext?: () => { traceId?: string; spanId?: string };\n // v7 stored these directly on the span object.\n traceId?: string;\n spanId?: string;\n}\n\ninterface SentryReplayLike {\n getReplayId?: () => string | undefined;\n}\n\ninterface SentryClientLike {\n getOptions?: () => { release?: string; environment?: string; dsn?: string } | undefined;\n getDsn?: () => { projectId?: string; host?: string; publicKey?: string } | undefined;\n}\n\nfunction getSentryGlobal(): SentryV8Like | SentryV7Like | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n if (w.Sentry) return w.Sentry as SentryV8Like | SentryV7Like;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getSentryReplayGlobal(): SentryReplayLike | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n return w.__SENTRY_REPLAY__ as SentryReplayLike | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectSentrySdkFamily(): MushiSentryContext['sdk'] {\n try {\n const w = globalThis as Record<string, unknown>;\n const meta = w.__SENTRY__ as { version?: string } | undefined;\n const sentry = w.Sentry as Record<string, unknown> | undefined;\n if (meta?.version === '9' || (sentry && typeof sentry.lastEventId === 'function')) {\n // v9 dropped `getCurrentHub` entirely; presence of `lastEventId`\n // as a top-level fn distinguishes v8/v9 from v7.\n return meta?.version === '9' ? 'v9' : 'v8';\n }\n if (meta?.version === '8') return 'v8';\n if (sentry && typeof (sentry as SentryV7Like).getCurrentHub === 'function') return 'v7';\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\n// ---- Public surface ---------------------------------------------------------\n\n/**\n * Snapshot the current Sentry scope. `_config` is reserved for future\n * `useReplay`/`enrichWithSeer` toggles — for now every host that has\n * Sentry available gets the full snapshot.\n *\n * `breadcrumbsLimit` defaults to 30 (Sentry's own default `maxBreadcrumbs`).\n * Callers can pass a smaller value when ingest payload size matters\n * (mobile clients on lossy networks, etc.).\n */\nexport function captureSentryContext(\n _config: MushiSentryConfig,\n options: { breadcrumbsLimit?: number } = {},\n): MushiSentryContext {\n const limit = Math.max(0, options.breadcrumbsLimit ?? 30);\n const out: MushiSentryContext = {};\n const sentry = getSentryGlobal();\n if (!sentry) return out;\n out.sdk = detectSentrySdkFamily();\n\n // 1) eventId — Sentry v8/v9 exposes a top-level `lastEventId()`. v7\n // pulls it off the active scope.\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.lastEventId === 'function') {\n out.eventId = v8.lastEventId() ?? undefined;\n } else {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n out.eventId = scope?.getLastEventId?.() ?? undefined;\n }\n } catch {\n // Swallow — different Sentry versions throw \"not a function\" on\n // arbitrary internals between point releases.\n }\n\n // 2) Scope — user / tags / transaction / breadcrumbs / session.\n let scope: SentryScopeLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getCurrentScope === 'function') {\n scope = v8.getCurrentScope();\n } else {\n const v7 = sentry as SentryV7Like;\n scope = v7.getCurrentHub?.()?.getScope?.();\n }\n } catch {\n // Sentry not available\n }\n if (scope) {\n try {\n const user = scope.getUser?.();\n if (user) {\n out.user = {\n id: typeof user.id === 'string' ? user.id : undefined,\n email: typeof user.email === 'string' ? user.email : undefined,\n username: typeof user.username === 'string' ? user.username : undefined,\n ip_address: typeof user.ip_address === 'string' ? user.ip_address : undefined,\n };\n }\n } catch {\n // Swallow — Sentry's scope methods change shape across releases.\n }\n try {\n const tags = scope.getTags?.();\n if (tags && typeof tags === 'object') {\n // Filter to scalar values — `setTag` accepts arrays in some\n // Sentry versions but our schema is scalar-only and the LLM\n // grounding relies on `key=string` shapes anyway.\n const pruned: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n pruned[k] = v;\n }\n }\n if (Object.keys(pruned).length > 0) out.tags = pruned;\n }\n } catch {\n // Swallow.\n }\n try {\n // v8 uses `getTransactionName`; v7 used `getTransaction()?.name`.\n out.transactionName =\n scope.getTransactionName?.() ?? scope.getTransaction?.()?.name ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n out.sessionId = scope.getSession?.()?.sid ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n // Public getter when present, fall back to the internal `_breadcrumbs`\n // array which has lived at the same path since Sentry 5.\n const raw = scope.getBreadcrumbs?.() ?? scope._breadcrumbs ?? [];\n if (Array.isArray(raw) && raw.length > 0) {\n const sliced = raw.slice(-limit);\n out.breadcrumbs = sliced.map((b) => {\n const r = b as Record<string, unknown>;\n return {\n timestamp:\n typeof r.timestamp === 'number'\n ? // Sentry stores breadcrumb timestamps in seconds; convert\n // to ms so the field is comparable to Mushi's own.\n r.timestamp < 1e12\n ? Math.round(r.timestamp * 1000)\n : r.timestamp\n : undefined,\n category: typeof r.category === 'string' ? r.category : undefined,\n level: typeof r.level === 'string' ? r.level : undefined,\n message: typeof r.message === 'string' ? r.message : undefined,\n type: typeof r.type === 'string' ? r.type : undefined,\n data:\n r.data && typeof r.data === 'object'\n ? (r.data as Record<string, unknown>)\n : undefined,\n };\n });\n }\n } catch {\n // Swallow.\n }\n }\n\n // 3) Trace — ask Sentry for the active span and read its trace/span ids.\n try {\n const v8 = sentry as SentryV8Like;\n let span: SentrySpanLike | undefined;\n if (typeof v8.getActiveSpan === 'function') {\n span = v8.getActiveSpan();\n } else if (scope?.getSpan) {\n span = scope.getSpan();\n }\n if (span) {\n const ctx = span.spanContext?.();\n out.traceId = ctx?.traceId ?? span.traceId ?? undefined;\n out.spanId = ctx?.spanId ?? span.spanId ?? undefined;\n }\n } catch {\n // Swallow — `getActiveSpan` errored on v8.0.0 - v8.5.0 when no\n // tracing integration was configured. Reading is best-effort.\n }\n\n // 4) Client options — release + environment + DSN-derived issue url.\n let client: SentryClientLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getClient === 'function') {\n client = v8.getClient();\n } else {\n const v7 = sentry as SentryV7Like;\n client = v7.getCurrentHub?.()?.getClient?.();\n }\n } catch {\n // Swallow.\n }\n if (client) {\n try {\n const opts = client.getOptions?.();\n if (opts?.release) out.release = opts.release;\n if (opts?.environment) out.environment = opts.environment;\n } catch {\n // Swallow.\n }\n try {\n // DSN parts — used to synthesize a deeplink to the issue.\n const dsn = client.getDsn?.();\n if (dsn?.host && dsn?.projectId && out.eventId) {\n // The org slug is not directly exposed by Sentry's DSN object;\n // we synthesize the canonical events URL which Sentry redirects\n // to the right issue. Falls back to undefined when we can't\n // construct a valid URL.\n const orgHost = dsn.host.replace(/^o\\d+\\./, '');\n out.issueUrl = `https://${orgHost}/issues/?query=${encodeURIComponent(out.eventId)}`;\n }\n } catch {\n // Swallow.\n }\n }\n\n // 5) Replay — try the modern `getReplay()` first, fall back to the\n // legacy `__SENTRY_REPLAY__` global some integrations attach manually.\n try {\n const v8 = sentry as SentryV8Like;\n const replay = v8.getReplay?.() ?? getSentryReplayGlobal();\n out.replayId = replay?.getReplayId?.() ?? undefined;\n } catch {\n // Swallow.\n }\n\n return out;\n}\n\n/**\n * Bidirectional linkage. Call this *after* a successful Mushi report\n * submission with the server-assigned report id. We drop a tag on\n * Sentry's current scope so any subsequent Sentry events from the\n * same session reference the Mushi report. We also write a\n * `mushi_report` context block that the Sentry MCP `search_events`\n * tool surfaces on the issue page.\n *\n * Best-effort and silent on failure — a Sentry that's mid-bootstrap\n * or an SDK version with a different scope API must never break a\n * report that's already been accepted by Mushi.\n */\nexport function tagSentryScope(reportId: string, options: { reportUrl?: string } = {}): void {\n const sentry = getSentryGlobal();\n if (!sentry) return;\n try {\n // v8/v9: top-level `setTag` + `setContext` write to the active scope.\n const v8 = sentry as SentryV8Like;\n if (typeof v8.setTag === 'function') {\n v8.setTag('mushi.report_id', reportId);\n if (options.reportUrl) v8.setTag('mushi.report_url', options.reportUrl);\n }\n if (typeof v8.setContext === 'function') {\n v8.setContext('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n captured_at: new Date().toISOString(),\n });\n }\n // Also drop a Sentry breadcrumb so the link is visible in the\n // breadcrumb timeline of the next Sentry event the user\n // produces, not just on the scope.\n if (typeof v8.addBreadcrumb === 'function') {\n v8.addBreadcrumb({\n category: 'mushi',\n type: 'info',\n level: 'info',\n message: `Mushi report submitted (${reportId})`,\n data: { report_id: reportId, ...(options.reportUrl ? { url: options.reportUrl } : {}) },\n });\n }\n } catch {\n // Sentry not available\n }\n\n // v7 fallback: configure the scope on the active hub.\n try {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n if (scope) {\n scope.setTag?.('mushi.report_id', reportId);\n if (options.reportUrl) scope.setTag?.('mushi.report_url', options.reportUrl);\n scope.setContext?.('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n });\n }\n } catch {\n // Swallow.\n }\n}\n\n// ---- Feedback interceptor (kept from prior revision) -----------------------\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: (formData.get('message') as string) ?? '',\n email: (formData.get('email') as string) ?? undefined,\n name: (formData.get('name') as string) ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","import type { MushiApiCascadeConfig, MushiUrlMatcher } from '@mushi-mushi/core'\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from './internal-requests'\n\nexport interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean | MushiApiCascadeConfig\n apiEndpoint?: string\n errorBoundary?: boolean\n /**\n * Beta-mode nudges. Fire when the user has been on the same route for\n * `pageDwellMs` continuous milliseconds without filing any report. Default\n * disabled because production apps usually don't want unsolicited prompts;\n * recommended only when `betaMode.enabled` is true on the widget.\n *\n * Pass `true` to use the default 5-minute threshold, or a config object\n * to override. Set to `false` (default) to disable entirely.\n */\n pageDwell?: boolean | { thresholdMs?: number; excludeRoutes?: string[] }\n /**\n * First-session welcome. Fires exactly once per user (tracked via\n * `localStorage`) `delayMs` milliseconds after `Mushi.init`. Use to\n * gently surface the bug button to new beta users so they know feedback\n * is welcome. Default disabled.\n */\n firstSession?: boolean | { delayMs?: number; storageKey?: string }\n /**\n * The project ID, used to namespace the `firstSession` localStorage key so\n * multi-tenant single-page apps don't share first-session state across\n * projects. Sourced from `MushiConfig.projectId` by the SDK.\n */\n projectId?: string\n}\n\nconst DEFAULT_EXCLUDE_ROUTES: readonly string[] = [\n '/login',\n '/logout',\n '/signup',\n '/sso/*',\n '/auth/*',\n]\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n const apiCascade = normalizeApiCascadeConfig(config.apiCascade)\n if (apiCascade.enabled) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n const [input, init] = args\n const url = getRequestUrl(input)\n const ignoreFailure = Boolean(getInternalRequestKind(input, init))\n || shouldIgnoreMushiUrl(url, {\n apiEndpoint: config.apiEndpoint,\n ignoreUrls: apiCascade.ignoreUrls,\n })\n\n try {\n const res = await origFetch.apply(this, args)\n if (!ignoreFailure && !res.ok && res.status >= 400) {\n recordApiFailure(failedRequests, callbacks)\n }\n return res\n } catch (err) {\n if (!ignoreFailure) recordApiFailure(failedRequests, callbacks)\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Page Dwell (beta-feedback nudge) ---\n // Tracks continuous time on the same `location.pathname`. Resets on every\n // navigation (pushState/replaceState/popstate). Auth routes are excluded by\n // default so users are never prompted during login/signup flows.\n const pageDwellEnabled = config.pageDwell === true\n || (typeof config.pageDwell === 'object' && config.pageDwell !== null)\n if (pageDwellEnabled && typeof window !== 'undefined') {\n const dwellCfg = typeof config.pageDwell === 'object' ? config.pageDwell ?? {} : {}\n const thresholdMs = dwellCfg.thresholdMs || 5 * 60 * 1000\n const excludeRoutes: readonly string[] =\n dwellCfg.excludeRoutes !== undefined ? dwellCfg.excludeRoutes : DEFAULT_EXCLUDE_ROUTES\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastPath = window.location?.pathname ?? ''\n\n function isExcluded(path: string): boolean {\n return excludeRoutes.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return path.startsWith(pattern.slice(0, -2))\n }\n return path === pattern || path.startsWith(pattern + '/')\n })\n }\n\n function fire(): void {\n const path = window.location?.pathname ?? ''\n if (isExcluded(path)) return\n callbacks.onTrigger('page_dwell', { thresholdMs, path })\n }\n function arm(): void {\n if (timer) clearTimeout(timer)\n const path = window.location?.pathname ?? ''\n if (!isExcluded(path)) {\n timer = setTimeout(fire, thresholdMs)\n }\n }\n function reset(): void {\n const path = window.location?.pathname ?? ''\n if (path !== lastPath) {\n lastPath = path\n arm()\n }\n }\n arm()\n\n // Patch History API to detect SPA navigations. Most SPAs use\n // pushState/replaceState; popstate covers back/forward.\n const history = window.history\n const origPush = history?.pushState\n const origReplace = history?.replaceState\n if (history && origPush && origReplace) {\n history.pushState = function (...args) {\n const result = origPush.apply(this, args)\n reset()\n return result\n }\n history.replaceState = function (...args) {\n const result = origReplace.apply(this, args)\n reset()\n return result\n }\n }\n const onPop = (): void => reset()\n window.addEventListener('popstate', onPop)\n cleanups.push(() => {\n if (timer) clearTimeout(timer)\n window.removeEventListener('popstate', onPop)\n if (history && origPush) history.pushState = origPush\n if (history && origReplace) history.replaceState = origReplace\n })\n }\n\n // --- First Session Welcome ---\n // Beta apps benefit from a single, well-timed \"feedback is welcome\"\n // nudge for new visitors. We persist a flag in localStorage so we only\n // fire it once per user, not once per tab/session. Cooldown + suppression\n // are still enforced by the ProactiveManager downstream.\n //\n // The storage key is project-scoped by default so multi-tenant SPAs\n // (e.g. different projects in the same domain) don't share the \"already\n // shown\" flag. Pass an explicit `storageKey` to override.\n const firstSessionEnabled = config.firstSession === true\n || (typeof config.firstSession === 'object' && config.firstSession !== null)\n if (firstSessionEnabled && typeof window !== 'undefined') {\n const opts = typeof config.firstSession === 'object' ? config.firstSession ?? {} : {}\n const delayMs = opts.delayMs ?? 45 * 1000\n const storageKey = opts.storageKey\n ?? (config.projectId ? `mushi:${config.projectId}:firstSessionShown` : 'mushi:firstSessionShown')\n\n let alreadyShown = false\n try { alreadyShown = window.localStorage?.getItem(storageKey) === '1' }\n catch { /* localStorage unavailable */ }\n\n if (!alreadyShown) {\n const timer = setTimeout(() => {\n try { window.localStorage?.setItem(storageKey, '1') } catch { /* noop */ }\n callbacks.onTrigger('first_session', { delayMs })\n }, delayMs)\n cleanups.push(() => clearTimeout(timer))\n }\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n\nfunction normalizeApiCascadeConfig(\n config: boolean | MushiApiCascadeConfig | undefined,\n): Required<Pick<MushiApiCascadeConfig, 'enabled'>> & { ignoreUrls: MushiUrlMatcher[] } {\n if (config === false) return { enabled: false, ignoreUrls: [] }\n if (config && typeof config === 'object') {\n return {\n enabled: config.enabled !== false,\n ignoreUrls: config.ignoreUrls ?? [],\n }\n }\n return { enabled: true, ignoreUrls: [] }\n}\n\nfunction recordApiFailure(failedRequests: number[], callbacks: ProactiveTriggerCallbacks): void {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","declare const __MUSHI_SDK_VERSION__: string | undefined;\n\nexport const MUSHI_SDK_PACKAGE = '@mushi-mushi/web';\nexport const MUSHI_SDK_VERSION =\n typeof __MUSHI_SDK_VERSION__ === 'string' && __MUSHI_SDK_VERSION__\n ? __MUSHI_SDK_VERSION__\n : '0.7.0';\n","import {\n type MushiConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiRuntimeSdkConfig,\n type MushiSdkVersionInfo,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n type MushiDiagnosticsResult,\n DEFAULT_API_ENDPOINT,\n MUSHI_INTERNAL_INIT_MARKER,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n createBreadcrumbBuffer,\n type BreadcrumbBuffer,\n normaliseThrown,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport { exposeMarketingRecorder } from './marketing-recorder';\nimport {\n initRewards,\n updateRewardsUser,\n enqueue as enqueueActivity,\n getTier as getRewardsTier,\n type RewardsContext,\n} from './rewards';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n createTimelineCapture,\n createDiscoveryCapture,\n type DiscoveryCapture,\n} from './capture';\nimport { captureSentryContext, tagSentryScope } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\nimport { isLocalhostEndpoint } from './internal-requests';\nimport { MUSHI_SDK_PACKAGE, MUSHI_SDK_VERSION } from './version';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n\n static diagnose(): Promise<MushiDiagnosticsResult> {\n return instance?.diagnose() ?? diagnoseWithoutInstance();\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const bootstrapConfig = applyPresetConfig(config);\n let activeConfig: MushiConfig = bootstrapConfig;\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: bootstrapConfig.projectId,\n apiKey: bootstrapConfig.apiKey,\n ...(bootstrapConfig.apiEndpoint ? { apiEndpoint: bootstrapConfig.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(bootstrapConfig.preFilter);\n const offlineQueue = createOfflineQueue(bootstrapConfig.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n\n // Apply the same scrubber that runs over `description` to the\n // observability surfaces (breadcrumbs, tags, sentry context) right\n // before they leave the SDK. The buffer/sentry layers are kept\n // pristine so `getBreadcrumbs()` returns the host's own values; this\n // pass only mutates the snapshot that goes on the wire.\n function scrubBreadcrumbsForWire<T extends { message?: string; data?: Record<string, unknown> }>(\n crumbs: T[],\n ): T[] {\n return crumbs.map((c) => {\n const next: T = { ...c };\n if (typeof c.message === 'string') {\n next.message = piiScrubber.scrub(c.message);\n }\n if (c.data && typeof c.data === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(c.data)) {\n cleaned[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n next.data = cleaned;\n }\n return next;\n });\n }\n function scrubTagsForWire(\n tags: Record<string, string | number | boolean> | undefined,\n ): Record<string, string | number | boolean> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n out[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n return out;\n }\n\n let consoleCap: ReturnType<typeof createConsoleCapture> | null = null;\n let networkCap: ReturnType<typeof createNetworkCapture> | null = null;\n let perfCap: ReturnType<typeof createPerformanceCapture> | null = null;\n let screenshotCap: ReturnType<typeof createScreenshotCapture> | null = null;\n let elementSelector: ReturnType<typeof createElementSelector> | null = null;\n let discoveryCap: DiscoveryCapture | null = null;\n const timelineCap = createTimelineCapture();\n let widget!: MushiWidget;\n\n function syncCaptureModules() {\n if (activeConfig.capture?.console !== false) {\n consoleCap ??= createConsoleCapture();\n } else {\n consoleCap?.destroy();\n consoleCap = null;\n }\n\n if (activeConfig.capture?.network !== false) {\n const networkOptions = {\n apiEndpoint: resolveApiEndpoint(activeConfig),\n ignoreUrls: activeConfig.capture?.ignoreUrls,\n };\n if (networkCap) {\n networkCap.updateOptions(networkOptions);\n } else {\n networkCap = createNetworkCapture(networkOptions);\n }\n } else {\n networkCap?.destroy();\n networkCap = null;\n }\n\n if (activeConfig.capture?.performance !== false) {\n perfCap ??= createPerformanceCapture();\n } else {\n perfCap?.destroy();\n perfCap = null;\n }\n\n if (activeConfig.capture?.screenshot !== 'off') {\n const screenshotOptions = { privacy: activeConfig.privacy };\n if (screenshotCap) {\n screenshotCap.updateOptions(screenshotOptions);\n } else {\n screenshotCap = createScreenshotCapture(screenshotOptions);\n }\n } else {\n screenshotCap = null;\n }\n if (!screenshotCap) pendingScreenshot = null;\n widget.setAllowScreenshotRemove(activeConfig.privacy?.allowUserRemoveScreenshot !== false);\n\n if (activeConfig.capture?.elementSelector !== false) {\n elementSelector ??= createElementSelector();\n } else {\n elementSelector?.deactivate();\n elementSelector = null;\n pendingElement = null;\n }\n\n // Mushi v2.1: passive inventory discovery. Default OFF — only stand\n // up when the host explicitly opts in. We deliberately re-create the\n // capturer when the config changes (rather than mutating it) so the\n // route-template list and throttle window are picked up cleanly.\n const discoveryRaw = activeConfig.capture?.discoverInventory;\n const discoveryConfig =\n discoveryRaw === true\n ? {}\n : discoveryRaw && typeof discoveryRaw === 'object'\n ? discoveryRaw\n : null;\n const discoveryEnabled =\n discoveryConfig != null && discoveryConfig.enabled !== false;\n if (discoveryEnabled) {\n discoveryCap?.destroy();\n discoveryCap = createDiscoveryCapture({\n config: discoveryConfig!,\n getRecentNetworkPaths: () => {\n if (!networkCap) return [];\n return networkCap\n .getEntries()\n .map((e) => {\n try {\n const u = new URL(e.url, typeof window !== 'undefined' ? window.location.href : 'http://localhost');\n // Only same-origin or otherwise meaningful paths — skip\n // tracking pixels and the Mushi ingest endpoint itself.\n if (u.host && typeof window !== 'undefined' && u.host !== window.location.host) return null;\n return u.pathname;\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p != null && p.length > 0 && p.length < 200);\n },\n getUserId: () => userInfo?.id ?? null,\n getSessionId,\n onEvent: (event) => {\n // Best-effort; never throw, never block.\n void apiClient\n .postDiscoveryEvent({\n ...event,\n sdk_version: MUSHI_SDK_VERSION,\n })\n .catch((err) => {\n log.debug('discovery emit failed', { err: String(err) });\n });\n },\n });\n } else {\n discoveryCap?.destroy();\n discoveryCap = null;\n }\n }\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n let runtimeConfigLoaded = false;\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n // Sticky tags applied to every subsequent report. Cleared by\n // `clearTag()` (single key) or `clearTag()` with no args (all keys).\n // We coerce to scalar values at insert time so the wire format is\n // already canonical when the report serialises.\n const stickyTags: Record<string, string | number | boolean> = {};\n // Breadcrumb ring buffer — Sentry-grade observability surface that\n // works whether or not the host has Sentry installed. Auto-populated\n // by SDK lifecycle events (`init` / `report:opened` / `report:sent`),\n // route changes, console errors, and `[data-testid]` clicks. Hosts\n // can also call `Mushi.addBreadcrumb()` directly.\n const breadcrumbs: BreadcrumbBuffer = createBreadcrumbBuffer({ max: 50 });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: 'Mushi SDK init',\n data: { projectId: bootstrapConfig.projectId, sdkVersion: MUSHI_SDK_VERSION },\n });\n // Auto-breadcrumb teardown handles. Stored at module scope so\n // `destroy()` can detach them cleanly — leaks here would tail every\n // re-init in HMR'd dev sessions.\n let detachAutoBreadcrumbs: (() => void) | null = null;\n detachAutoBreadcrumbs = installAutoBreadcrumbs(breadcrumbs);\n widget = new MushiWidget(bootstrapConfig.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n const outcome = await submitReport(category, description, intent);\n // Surface the server-confirmed id back to the widget so the\n // success step renders a real receipt rather than a fake stamp.\n // `undefined` happens when the pre-filter/rate-limiter blocked\n // the report — degrade to the \"queued offline\" copy so the user\n // still sees acknowledgement instead of a silent close.\n return outcome ?? { reportId: null, queuedOffline: true };\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap || activeConfig.capture?.screenshot === 'off') return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onScreenshotRemove: () => {\n log.debug('Screenshot attachment removed');\n pendingScreenshot = null;\n widget.setScreenshotAttached(false);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector || activeConfig.capture?.elementSelector === false) return;\n log.debug('Element selector activated');\n widget.setElementCapturing(true);\n widget.hidePanel();\n try {\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n } else {\n widget.setElementCapturing(false);\n }\n } finally {\n widget.showPanel();\n }\n },\n async onReporterReportsRequest() {\n const result = await apiClient.listReporterReports(getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load reports');\n return result.data?.reports ?? [];\n },\n async onReporterCommentsRequest(reportId) {\n const result = await apiClient.listReporterComments(reportId, getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load thread');\n return result.data?.comments ?? [];\n },\n async onReporterReply(reportId, body) {\n const result = await apiClient.replyToReporterReport(reportId, getReporterToken(), body);\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not send reply');\n },\n }, MUSHI_SDK_VERSION);\n syncCaptureModules();\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = activeConfig.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true\n || Boolean(proactiveCfg.pageDwell)\n || Boolean(proactiveCfg.firstSession));\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n // First-session welcome bypasses the category step and just\n // pulses the bug button — the user hasn't expressed intent yet,\n // so opening the full reporter would be aggressive.\n if (type === 'first_session') {\n widget.pulseTrigger?.();\n } else {\n widget.open();\n }\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n apiEndpoint: resolveApiEndpoint(activeConfig),\n errorBoundary: proactiveCfg?.errorBoundary,\n pageDwell: proactiveCfg?.pageDwell,\n firstSession: proactiveCfg?.firstSession,\n projectId: bootstrapConfig.projectId,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n pageDwell: Boolean(proactiveCfg?.pageDwell),\n firstSession: Boolean(proactiveCfg?.firstSession),\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n function applyRuntimeConfig(runtime: MushiRuntimeSdkConfig) {\n runtimeConfigLoaded = true;\n if (runtime.enabled === false) {\n activeConfig = bootstrapConfig;\n clearCachedRuntimeConfig(config.projectId);\n syncCaptureModules();\n widget.updateConfig(activeConfig.widget);\n log.debug('Runtime SDK config disabled; using bootstrap config', { version: runtime.version });\n return;\n }\n activeConfig = mergeRuntimeConfig(activeConfig, runtime);\n syncCaptureModules();\n if (runtime.widget) widget.updateConfig(activeConfig.widget);\n log.debug('Applied runtime SDK config', { version: runtime.version });\n }\n\n if (shouldUseRuntimeConfig(config)) {\n const cached = readCachedRuntimeConfig(config.projectId);\n if (cached) applyRuntimeConfig(cached);\n apiClient.getSdkConfig().then((result) => {\n if (result.ok && result.data) {\n cacheRuntimeConfig(config.projectId, result.data);\n applyRuntimeConfig(result.data);\n } else if (result.error) {\n log.debug('Runtime SDK config unavailable', result.error);\n }\n }).catch((err) => {\n log.debug('Runtime SDK config fetch failed', { error: err instanceof Error ? err.message : String(err) });\n });\n } else if (config.runtimeConfig !== false && isLocalhostEndpoint(resolveApiEndpoint(config))) {\n log.debug('Runtime SDK config skipped for localhost apiEndpoint; set runtimeConfig: true to force it');\n }\n\n void checkSdkFreshness();\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function checkSdkFreshness(): Promise<void> {\n if (activeConfig.widget?.outdatedBanner === 'off') return;\n const cached = readCachedSdkVersion(MUSHI_SDK_PACKAGE);\n if (cached) applySdkFreshness(cached);\n const result = await apiClient.getLatestSdkVersion(MUSHI_SDK_PACKAGE);\n if (!result.ok || !result.data) return;\n cacheSdkVersion(MUSHI_SDK_PACKAGE, result.data);\n applySdkFreshness(result.data);\n }\n\n function applySdkFreshness(info: MushiSdkVersionInfo): void {\n const latest = info.latest;\n const outdated = Boolean(latest && isVersionOlder(MUSHI_SDK_VERSION, latest));\n if (!outdated && !info.deprecated) return;\n const message = info.deprecationMessage ?? (outdated ? `Update ${MUSHI_SDK_PACKAGE} to ${latest}.` : null);\n log.warn('Mushi SDK is outdated', {\n package: MUSHI_SDK_PACKAGE,\n current: MUSHI_SDK_VERSION,\n latest,\n deprecated: info.deprecated,\n message,\n });\n if (activeConfig.widget?.outdatedBanner !== 'console-only') {\n widget.setSdkFreshness({\n latest,\n current: MUSHI_SDK_VERSION,\n deprecated: info.deprecated,\n message,\n });\n }\n }\n\n async function submitReport(\n category: MushiReportCategory,\n description: string,\n intent?: string,\n ): Promise<{ reportId: string | null; queuedOffline?: boolean } | undefined> {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return undefined;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return undefined;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return undefined;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n const consoleLogs = activeConfig.capture?.console === false ? undefined : consoleCap?.getEntries();\n const networkLogs = activeConfig.capture?.network === false ? undefined : networkCap?.getEntries();\n\n // Snapshot breadcrumbs *before* we add the lifecycle \"submitting\"\n // beat — we want the report's timeline to end with the user-action\n // event, not with our own bookkeeping. We then add the submit\n // breadcrumb so it shows up on the *next* report (typical pattern\n // in production: a user files two reports in close succession,\n // and the second carries a \"previous report submitted\" hint).\n const reportBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n const stickyTagSnapshot = scrubTagsForWire(\n Object.keys(stickyTags).length > 0 ? { ...stickyTags } : undefined,\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs,\n networkLogs,\n performanceMetrics: activeConfig.capture?.performance === false ? undefined : perfCap?.getMetrics(),\n timeline: timelineCap.getEntries({ consoleLogs, networkLogs }),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n // Top-level Sentry-grade observability fields. Breadcrumbs are\n // surfaced separately from `consoleLogs` because they're the\n // higher-signal \"what just happened\" trail (vs. the high-volume\n // raw console mirror), and the admin /reports drawer shows them\n // in different panes.\n ...(reportBreadcrumbs.length > 0 ? { breadcrumbs: reportBreadcrumbs } : {}),\n ...(stickyTagSnapshot ? { tags: stickyTagSnapshot } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report submitting (${category})`,\n data: { reportId: report.id, category },\n });\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n // Sentry-spec-1.0 `beforeSendFeedback` hook (introduced in v1.4):\n // last chance for the host app to mutate or drop the report.\n // Errors and timeouts ship the *unmodified* report so a buggy hook\n // never silently swallows user feedback. Returning `null` drops\n // the report — emits no `report:sent` and no `report:failed`.\n let finalReport: MushiReport = report;\n if (config.beforeSendFeedback) {\n try {\n const hookResult = await Promise.race([\n Promise.resolve(config.beforeSendFeedback(report)),\n // 2s timeout — async hooks must not block the user's \"submit\"\n // for longer than the network would. Falls back to original.\n new Promise<MushiReport>((resolve) =>\n setTimeout(() => resolve(report), 2000),\n ),\n ]);\n if (hookResult === null) {\n log.info('Report dropped by beforeSendFeedback hook', { reportId: report.id });\n return;\n }\n finalReport = hookResult;\n } catch (err) {\n log.warn('beforeSendFeedback hook threw — sending unmodified report', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n emit('report:submitted', { reportId: finalReport.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(finalReport);\n log.info('Offline — report queued', { reportId: finalReport.id });\n emit('report:queued', { reportId: finalReport.id });\n return;\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n // Outcome propagates back to the widget so the success step can\n // render the \"Queued offline\" receipt rather than implying the\n // report already landed.\n return { reportId: null, queuedOffline: true };\n }\n\n const result = await apiClient.submitReport(finalReport);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n // If the server response includes a Cursor agent dispatch (classify-report\n // triggered a cursor_cloud fix via the autofix_agent setting), emit\n // `report:dispatched` so the host page can show a toast notification.\n if ((result.data as Record<string, unknown> | undefined)?.cursorAgentId) {\n const d = result.data as { reportId?: string; cursorAgentId?: string; fixId?: string };\n emit('report:dispatched', { reportId: d.reportId, agentId: d.cursorAgentId, fixId: d.fixId });\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report sent (${result.data?.reportId ?? report.id})`,\n });\n // Award points for the report submission. This is client-side so\n // the activity batch is flushed on the next tick with the correct\n // user_id already set via identify(). The server awards 50 pts by\n // default (configurable via the rewards rules dashboard).\n enqueueActivity({\n action: 'report_submit',\n metadata: { category, reportId: result.data?.reportId ?? report.id },\n });\n // Bidirectional Sentry linkage. After a successful submit we tag\n // Sentry's current scope so any subsequent Sentry events show\n // the Mushi correlation (`mushi.report_id` tag) and the issue\n // page picks up a `mushi_report` context block. Wrapped in\n // `try/catch` because Sentry's globals can be in a half-bootstrap\n // state immediately after page load.\n try {\n if (config.sentry && result.data?.reportId) {\n tagSentryScope(result.data.reportId);\n }\n } catch {\n // Swallow — never break a successful submit because Sentry's\n // scope API moved between point releases.\n }\n } else {\n log.warn('Report failed, queuing for retry', { reportId: finalReport.id, error: result.error });\n await offlineQueue.enqueue(finalReport);\n emit('report:failed', { reportId: finalReport.id, error: result.error });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'warning',\n message: `Mushi report queued for retry (${finalReport.id})`,\n });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n // Returning the server-confirmed id lets the widget render the\n // two-way receipt (Receipt #abc12345 + Track on Mushi link).\n // When the submit failed and was queued for retry, return the\n // queued-offline outcome so the widget can degrade gracefully.\n if (result?.ok) {\n const serverId = (result.data?.reportId as string | undefined) ?? report.id;\n return { reportId: serverId, queuedOffline: false };\n }\n return { reportId: null, queuedOffline: true };\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n setScreen(screen) {\n timelineCap.setScreen(screen);\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n openWith(category) {\n widget.open({ category });\n },\n\n show() {\n widget.showTrigger();\n },\n\n hide() {\n widget.hideTrigger();\n },\n\n attachTo(selectorOrElement, options) {\n return widget.attachTo(selectorOrElement, options);\n },\n\n setTrigger(trigger) {\n widget.setTrigger(trigger);\n },\n\n close() {\n widget.close();\n },\n\n updateConfig(runtimeConfig) {\n applyRuntimeConfig(runtimeConfig);\n },\n\n diagnose() {\n return runDiagnostics({\n apiEndpoint: resolveApiEndpoint(activeConfig),\n widgetMounted: widget.getIsMounted(),\n runtimeConfigLoaded,\n captureScreenshotAvailable: screenshotCap !== null,\n captureNetworkIntercepting: networkCap !== null,\n });\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n timelineCap.destroy();\n discoveryCap?.destroy();\n discoveryCap = null;\n offlineQueue.stopAutoSync();\n detachAutoBreadcrumbs?.();\n detachAutoBreadcrumbs = null;\n breadcrumbs.clear();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const captureBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n // Sticky tags merge with per-call `input.tags` — call-site wins\n // when both supply the same key. Keeps adapters that already\n // pass per-event tags compatible while letting hosts set\n // app-wide defaults via `setTag()`. We then run the same\n // PII scrubber over string values so secrets a host accidentally\n // shoved into a tag (e.g. `Mushi.setTag('email', user.email)`)\n // never hit the wire.\n const mergedTags = scrubTagsForWire(\n Object.keys(stickyTags).length === 0 && !input.tags\n ? undefined\n : { ...stickyTags, ...(input.tags ?? {}) },\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n timeline: timelineCap.getEntries(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n ...(captureBreadcrumbs.length > 0 ? { breadcrumbs: captureBreadcrumbs } : {}),\n ...(mergedTags && Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n try {\n if (config.sentry && res.data?.reportId) tagSentryScope(res.data.reportId);\n } catch {\n // Swallow.\n }\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n async captureException(error, options) {\n const normalised = normaliseThrown(error);\n // Drop a breadcrumb at the call site so this exception shows up\n // in Mushi's own timeline even if the report itself is rate-limited\n // or rejected by the pre-filter — losing the report shouldn't lose\n // the trace.\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'error',\n message: `Mushi.captureException(${normalised.name}): ${normalised.message}`,\n ...(normalised.stack ? { data: { stack: normalised.stack.slice(0, 500) } } : {}),\n });\n const description =\n options?.description?.trim() ||\n `${normalised.name}: ${normalised.message}` ||\n 'Uncaught exception';\n return sdk.captureEvent({\n description,\n category: options?.category ?? 'bug',\n severity: options?.severity ?? 'high',\n ...(options?.component ? { component: options.component } : {}),\n ...(options?.tags ? { tags: options.tags } : {}),\n source: options?.source ?? 'captureException',\n error: {\n name: normalised.name,\n message: normalised.message,\n ...(normalised.stack ? { stack: normalised.stack } : {}),\n },\n metadata: {\n ...(options?.metadata ?? {}),\n ...(normalised.cause ? { cause: normalised.cause } : {}),\n },\n });\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi.identify(${userId})`,\n });\n\n // Wire rewards program when enabled\n if (activeConfig.rewards?.enabled) {\n const rewardsCtx: RewardsContext = {\n client: apiClient,\n config: activeConfig.rewards,\n projectId: bootstrapConfig.projectId,\n userId,\n traits: traits\n ? { email: traits.email as string | undefined, name: traits.name as string | undefined, provider: traits.provider as string | undefined }\n : undefined,\n };\n if (userInfo.id === userId) {\n // First identify → full init\n initRewards(rewardsCtx);\n } else {\n // Already initialized; just update user context\n updateRewardsUser(userId, rewardsCtx.traits);\n }\n\n // Fetch reputation to hydrate the in-widget rewards nudge and success\n // points display. Fire-and-forget: never blocks the identify call.\n if (activeConfig.rewards.showInWidget !== false) {\n void apiClient.getMyPoints(userId).then((res) => {\n if (!res.ok) return;\n const d = res.data as {\n total_points?: number;\n tier?: { slug?: string; display_name?: string; points_threshold?: number } | null;\n next_tier?: { display_name?: string; points_threshold?: number } | null;\n report_submit_pts?: number;\n };\n widget.setRewardsState({\n tier: d.tier\n ? { slug: d.tier.slug ?? 'free', displayName: d.tier.display_name ?? 'Free', pointsThreshold: d.tier.points_threshold ?? 0 }\n : null,\n nextTier: d.next_tier\n ? { displayName: d.next_tier.display_name ?? '', pointsThreshold: d.next_tier.points_threshold ?? 0 }\n : null,\n totalPoints: d.total_points ?? 0,\n pointsForReport: d.report_submit_pts ?? 50,\n });\n }).catch(() => { /* non-fatal */ });\n }\n }\n },\n\n addBreadcrumb(crumb) {\n breadcrumbs.add(crumb);\n },\n\n getBreadcrumbs() {\n return breadcrumbs.getAll();\n },\n\n setTag(key, value) {\n if (typeof key !== 'string' || key.length === 0) return;\n stickyTags[key] = value;\n },\n\n setTags(tags) {\n if (!tags || typeof tags !== 'object') return;\n for (const [k, v] of Object.entries(tags)) {\n if (typeof k === 'string' && k.length > 0) {\n stickyTags[k] = v;\n }\n }\n },\n\n clearTag(key) {\n if (typeof key === 'string' && key.length > 0) {\n delete stickyTags[key];\n return;\n }\n // No-arg variant: clear every sticky tag (used in test teardown\n // and on app-level \"logout\" handlers).\n for (const k of Object.keys(stickyTags)) delete stickyTags[k];\n },\n\n // ─── Rewards program (P1) ──────────────────────────────────\n\n async getReputation() {\n if (!userInfo?.id) return null;\n const res = await apiClient.getMyPoints(userInfo.id);\n if (!res.ok) return null;\n return {\n totalPoints: (res.data as { total_points: number }).total_points ?? 0,\n points30d: (res.data as { points_30d: number }).points_30d ?? 0,\n reputation: 1.0,\n confirmedBugs: 0,\n totalReports: 0,\n };\n },\n\n async getTier() {\n if (!userInfo?.id) return null;\n return getRewardsTier(userInfo.id);\n },\n\n recordActivity(action, metadata) {\n if (!activeConfig.rewards?.enabled) return;\n enqueueActivity({ action, metadata });\n },\n\n pulseTrigger() {\n widget.pulseTrigger?.();\n },\n };\n\n if (typeof globalThis !== 'undefined' && (bootstrapConfig.debug ?? false)) {\n exposeMarketingRecorder(widget);\n }\n\n // Sentry-spec-1.0 `onCrashedLastRun` (introduced in v1.4):\n // detect whether the *previous* tab session ended cleanly. We mark a\n // sentinel in localStorage on init and clear it on `pagehide`. If we\n // see a stale sentinel on the next init, the previous session ended\n // without a clean unload → host app may want to surface \"Tell us\n // what went wrong?\". We never auto-open the widget; copy + timing\n // are the host's call.\n // Wrapped in try/catch because privacy-mode browsers throw on every\n // localStorage access and we must not break SDK init.\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const SENTINEL_KEY = 'mushi:last-run';\n let crashed: boolean | null = null;\n try {\n const previous = localStorage.getItem(SENTINEL_KEY);\n // First-ever load (or cleared storage): null. Otherwise, an\n // `unfinished` value means the prior tab didn't reach pagehide.\n crashed = previous === null ? null : previous === 'unfinished';\n localStorage.setItem(SENTINEL_KEY, 'unfinished');\n } catch {\n // localStorage unavailable (Safari private mode, file://). Hook\n // gets `null` so the host knows we couldn't determine state.\n crashed = null;\n }\n try {\n // pagehide fires on tab close, navigation, and bfcache freeze.\n // It's the only reliably-fired end-of-session event in 2026 —\n // browsers stopped guaranteeing `beforeunload`/`unload` years\n // ago. Listener is `{ once: false }` because bfcache may resume\n // the same page later and we want a fresh sentinel each time.\n window.addEventListener('pagehide', () => {\n try { localStorage.setItem(SENTINEL_KEY, 'clean'); } catch { /* noop */ }\n });\n } catch { /* noop — addEventListener never actually throws on Window */ }\n if (typeof bootstrapConfig.onCrashedLastRun === 'function') {\n try {\n bootstrapConfig.onCrashedLastRun(crashed as boolean);\n } catch (err) {\n log.warn('onCrashedLastRun hook threw', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n return sdk;\n}\n\nfunction mergeRuntimeConfig(config: MushiConfig, runtime: MushiRuntimeSdkConfig): MushiConfig {\n const nativeTrigger = runtime.native?.triggerMode;\n const widgetTrigger = runtime.widget?.trigger\n ?? (nativeTrigger === 'none' || nativeTrigger === 'shake' ? 'manual' : undefined);\n return {\n ...config,\n widget: {\n ...config.widget,\n ...runtime.widget,\n ...(widgetTrigger ? { trigger: widgetTrigger } : {}),\n // betaMode is local-only: set by the host app, not the dashboard.\n // Restore it after the runtime spread so it is never silently cleared.\n ...(config.widget?.betaMode ? { betaMode: config.widget.betaMode } : {}),\n },\n capture: {\n ...config.capture,\n ...runtime.capture,\n },\n privacy: {\n ...config.privacy,\n },\n };\n}\n\nfunction applyPresetConfig(config: MushiConfig): MushiConfig {\n if (!config.preset) return config;\n const preset = presetDefaults(config.preset);\n return {\n ...config,\n widget: {\n ...preset.widget,\n ...config.widget,\n },\n capture: {\n ...preset.capture,\n ...config.capture,\n },\n proactive: {\n ...preset.proactive,\n ...config.proactive,\n cooldown: {\n ...preset.proactive?.cooldown,\n ...config.proactive?.cooldown,\n },\n },\n };\n}\n\nfunction presetDefaults(preset: NonNullable<MushiConfig['preset']>): Pick<MushiConfig, 'widget' | 'capture' | 'proactive'> {\n switch (preset) {\n case 'manual-only':\n return {\n widget: { trigger: 'manual', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n case 'beta-loud':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner' },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: { rageClick: true, longTask: true, apiCascade: true, errorBoundary: true },\n };\n case 'internal-debug':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner', brandFooter: true },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: {\n rageClick: true,\n longTask: true,\n apiCascade: true,\n errorBoundary: true,\n cooldown: { maxProactivePerSession: 10, dismissCooldownHours: 0, suppressAfterDismissals: 99 },\n },\n };\n case 'production-calm':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n }\n}\n\nfunction resolveApiEndpoint(config: Pick<MushiConfig, 'apiEndpoint'>): string {\n return config.apiEndpoint ?? DEFAULT_API_ENDPOINT;\n}\n\nfunction shouldUseRuntimeConfig(config: MushiConfig): boolean {\n if (config.runtimeConfig === false) return false;\n if (config.runtimeConfig === true) return true;\n return !isLocalhostEndpoint(resolveApiEndpoint(config));\n}\n\nasync function runDiagnostics(options: {\n apiEndpoint: string;\n widgetMounted: boolean;\n runtimeConfigLoaded: boolean;\n captureScreenshotAvailable: boolean;\n captureNetworkIntercepting: boolean;\n}): Promise<MushiDiagnosticsResult> {\n const endpoint = await probeApiEndpoint(options.apiEndpoint);\n return {\n apiEndpointReachable: endpoint.reachable,\n cspAllowsEndpoint: endpoint.cspAllowed,\n widgetMounted: options.widgetMounted,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: options.runtimeConfigLoaded,\n captureScreenshotAvailable: options.captureScreenshotAvailable,\n captureNetworkIntercepting: options.captureNetworkIntercepting,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function diagnoseWithoutInstance(): Promise<MushiDiagnosticsResult> {\n return {\n apiEndpointReachable: false,\n cspAllowsEndpoint: false,\n widgetMounted: false,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: false,\n captureScreenshotAvailable: false,\n captureNetworkIntercepting: false,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function probeApiEndpoint(apiEndpoint: string): Promise<{ reachable: boolean; cspAllowed: boolean }> {\n if (typeof fetch === 'undefined') return { reachable: false, cspAllowed: false };\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller ? setTimeout(() => controller.abort(), 3_000) : null;\n try {\n const response = await fetch(`${apiEndpoint.replace(/\\/$/, '')}/health`, {\n method: 'GET',\n cache: 'no-store',\n ...(controller ? { signal: controller.signal } : {}),\n [MUSHI_INTERNAL_INIT_MARKER]: 'diagnose',\n } as RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: 'diagnose' });\n return { reachable: response.ok, cspAllowed: true };\n } catch {\n return { reachable: false, cspAllowed: false };\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction runtimeConfigCacheKey(projectId: string): string {\n return `mushi:sdk-config:${projectId}`;\n}\n\nfunction sdkVersionCacheKey(packageName: string): string {\n return `mushi:sdk-version:${packageName}`;\n}\n\nfunction readCachedRuntimeConfig(projectId: string): MushiRuntimeSdkConfig | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(runtimeConfigCacheKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { config?: MushiRuntimeSdkConfig };\n return parsed.config ?? null;\n } catch {\n return null;\n }\n}\n\nfunction cacheRuntimeConfig(projectId: string, config: MushiRuntimeSdkConfig): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(runtimeConfigCacheKey(projectId), JSON.stringify({\n cachedAt: Date.now(),\n config,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction clearCachedRuntimeConfig(projectId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(runtimeConfigCacheKey(projectId));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction readCachedSdkVersion(packageName: string): MushiSdkVersionInfo | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(sdkVersionCacheKey(packageName));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { cachedAt?: number; data?: MushiSdkVersionInfo };\n if (!parsed.data || !parsed.cachedAt || Date.now() - parsed.cachedAt > 86_400_000) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction cacheSdkVersion(packageName: string, data: MushiSdkVersionInfo): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(sdkVersionCacheKey(packageName), JSON.stringify({\n cachedAt: Date.now(),\n data,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction isVersionOlder(current: string, latest: string): boolean {\n const currentParts = parseVersion(current);\n const latestParts = parseVersion(latest);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const cur = currentParts[i] ?? 0;\n const next = latestParts[i] ?? 0;\n if (cur < next) return true;\n if (cur > next) return false;\n }\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n setScreen: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n updateConfig: () => {},\n diagnose: diagnoseWithoutInstance,\n openWith: () => {},\n show: () => {},\n hide: () => {},\n attachTo: () => () => {},\n setTrigger: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n captureException: async () => null,\n identify: () => {},\n addBreadcrumb: () => {},\n getBreadcrumbs: () => [],\n setTag: () => {},\n setTags: () => {},\n clearTag: () => {},\n getReputation: async () => null,\n getTier: async () => null,\n recordActivity: () => {},\n pulseTrigger: () => {},\n };\n}\n\n/**\n * Auto-breadcrumb installer — attaches passive listeners that turn\n * common host-app signals into Mushi breadcrumbs without the host\n * lifting a finger.\n *\n * - Route changes via `popstate` and the `history.pushState` /\n * `replaceState` patches that single-page apps already trigger.\n * - `console.error` and `console.warn` callsites — distinct from\n * the existing `console-capture` (which mirrors the *content* of\n * console for the report's `consoleLogs` array; breadcrumbs\n * capture only that an error happened, what file/line, and one\n * short message).\n * - `[data-testid]` clicks anywhere on the page — testids are the\n * same identifiers the v2 inventory + Triage LLM grounds against,\n * so a breadcrumb of `clicked checkout-submit` is dramatically\n * more useful for triage than `clicked button.btn-primary`.\n *\n * Returns a teardown closure that detaches every listener. We keep\n * the closure in scope of `createInstance` so `Mushi.destroy()` can\n * call it before re-init — without this, dev-mode HMR would tail a\n * fresh listener stack on every reload.\n */\nfunction installAutoBreadcrumbs(buffer: BreadcrumbBuffer): () => void {\n if (typeof window === 'undefined') return () => {};\n const cleanups: Array<() => void> = [];\n\n // 1) Route changes — covers SSR-hydrated SPAs (Next, Remix, SvelteKit)\n // and old-school history-pushed apps. We patch the prototype methods\n // because most SPA frameworks call them directly instead of dispatching\n // an event the host could subscribe to.\n try {\n const dispatchRouteChange = (kind: 'pushState' | 'replaceState' | 'popstate') => {\n buffer.add({\n category: 'navigation',\n level: 'info',\n message: `${kind}: ${window.location.pathname}`,\n data: { url: window.location.href, kind },\n });\n };\n const onPop = () => dispatchRouteChange('popstate');\n window.addEventListener('popstate', onPop, { passive: true });\n cleanups.push(() => window.removeEventListener('popstate', onPop));\n\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n window.history.pushState = function patched(...args: Parameters<History['pushState']>) {\n const ret = origPush.apply(this, args);\n try {\n dispatchRouteChange('pushState');\n } catch {\n // Swallow — never break navigation because the breadcrumb buffer\n // mis-stringified an URL.\n }\n return ret;\n };\n window.history.replaceState = function patched(...args: Parameters<History['replaceState']>) {\n const ret = origReplace.apply(this, args);\n try {\n dispatchRouteChange('replaceState');\n } catch {\n // Swallow.\n }\n return ret;\n };\n cleanups.push(() => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n });\n } catch {\n // History API unavailable (some sandboxed iframes) — skip silently.\n }\n\n // 2) `console.error` and `console.warn` — wrap *only* these two so\n // we don't add overhead to `console.log` on the hot path. The\n // `console-capture` module already mirrors content; this layer\n // adds a \"something went wrong\" beat to the breadcrumb timeline.\n try {\n const origError = console.error;\n const origWarn = console.warn;\n console.error = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'error',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origError.apply(this, args as Parameters<typeof origError>);\n };\n console.warn = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'warning',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origWarn.apply(this, args as Parameters<typeof origWarn>);\n };\n cleanups.push(() => {\n console.error = origError;\n console.warn = origWarn;\n });\n } catch {\n // Console patching can fail in locked-down environments — non-fatal.\n }\n\n // 3) `[data-testid]` clicks — capture the testid, the tag name, and\n // the visible text (capped) so a breadcrumb of \"clicked submit-cta\n // — Buy now\" tells the triage path what the user just touched\n // without leaking arbitrary innerHTML.\n try {\n const onClick = (ev: MouseEvent) => {\n try {\n const target = ev.target;\n if (!(target instanceof Element)) return;\n let cur: Element | null = target;\n let hops = 0;\n while (cur && hops < 10) {\n const tid = cur.getAttribute('data-testid');\n if (tid) {\n const text = (cur.textContent ?? '').trim().slice(0, 80);\n buffer.add({\n category: 'ui.click',\n level: 'info',\n message: `clicked ${tid}${text ? ` — ${text}` : ''}`,\n data: { testid: tid, tag: cur.tagName.toLowerCase() },\n });\n return;\n }\n cur = cur.parentElement;\n hops++;\n }\n } catch {\n // Swallow — listener errors must never propagate.\n }\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n cleanups.push(() => document.removeEventListener('click', onClick, true));\n } catch {\n // Swallow.\n }\n\n return () => {\n for (const c of cleanups) {\n try {\n c();\n } catch {\n // Swallow.\n }\n }\n };\n}\n\n/**\n * Coerce arbitrary console arguments to a short string for breadcrumb\n * messages. Errors get their `name + message`; objects get JSON-encoded\n * with a 200-char cap; everything else is `String(...)` truncated to\n * 200 chars. We never invoke a `toString` that throws — failures fall\n * back to the type label.\n */\nfunction stringifyConsoleArg(arg: unknown): string {\n try {\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n const json = JSON.stringify(arg);\n return json.length > 200 ? `${json.slice(0, 200)}…` : json;\n }\n const s = String(arg);\n return s.length > 200 ? `${s.slice(0, 200)}…` : s;\n } catch {\n return `[${typeof arg}]`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/marketing-recorder.ts","../src/rewards.ts","../src/capture/console.ts","../src/internal-requests.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/capture/timeline.ts","../src/capture/discovery.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/version.ts","../src/mushi.ts"],"names":["textarea","MUSHI_INTERNAL_INIT_MARKER","MUSHI_INTERNAL_HEADER","MAX_ENTRIES","getSessionId","scope","handleClick","isExcluded","fire","arm","reset","history","handleError","handleUnhandledRejection","createLogger","noopLogger","apiClient","createApiClient","createPreFilter","createOfflineQueue","createRateLimiter","createPiiScrubber","createBreadcrumbBuffer","getReporterToken","getDeviceFingerprintHash","captureEnvironment","normaliseThrown","DEFAULT_API_ENDPOINT"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached ✓',\n screenshotCapturing: 'Taking screenshot…',\n screenshotFailed: \"Couldn't capture — describe it instead\",\n elementButton: 'Select Element',\n elementSelected: 'Element selected ✓',\n elementCapturing: 'Click anything on the page…',\n elementSelectorHint: 'Click any element · Esc to cancel',\n optional: '(optional)',\n tooShort: 'A bit more detail helps us fix it faster',\n examplePrompts: [\n 'The save button does nothing',\n 'Page froze for 10 seconds',\n 'Layout looks broken here',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み ✓',\n screenshotCapturing: 'スクリーンショット撮影中…',\n screenshotFailed: '取得できませんでした — 文字で教えてください',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み ✓',\n elementCapturing: 'ページ上の要素をクリック…',\n elementSelectorHint: '要素をクリック · Esc でキャンセル',\n optional: '(任意)',\n tooShort: 'もう少し詳しく教えてください',\n examplePrompts: [\n '保存ボタンが反応しない',\n 'ページが10秒固まった',\n 'レイアウトが崩れている',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว ✓',\n screenshotCapturing: 'กำลังถ่ายสกรีนช็อต…',\n screenshotFailed: 'ไม่สามารถถ่ายภาพได้ — โปรดอธิบายแทน',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว ✓',\n elementCapturing: 'คลิกองค์ประกอบบนหน้า…',\n elementSelectorHint: 'คลิกองค์ประกอบใดก็ได้ · Esc เพื่อยกเลิก',\n optional: '(ไม่บังคับ)',\n tooShort: 'กรุณาให้รายละเอียดเพิ่มเติม',\n examplePrompts: [\n 'ปุ่มบันทึกไม่ทำงาน',\n 'หน้าค้างนาน 10 วินาที',\n 'เลย์เอาต์พัง',\n ],\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta ✓',\n screenshotCapturing: 'Tomando captura…',\n screenshotFailed: 'No se pudo capturar — descríbelo en su lugar',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado ✓',\n elementCapturing: 'Haz clic en cualquier elemento…',\n elementSelectorHint: 'Clic en cualquier elemento · Esc para cancelar',\n optional: '(opcional)',\n tooShort: 'Un poco más de detalle nos ayuda a resolverlo',\n examplePrompts: [\n 'El botón guardar no responde',\n 'La página se congeló 10 segundos',\n 'El diseño se ve roto aquí',\n ],\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n // `undefined` or the sentinel `'auto'` both fall through to navigator.language.\n const resolved =\n code && code !== 'auto'\n ? code\n : typeof navigator !== 'undefined'\n ? (navigator.language ?? navigator.languages?.[0])\n : undefined;\n if (!resolved) return en;\n const base = resolved.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n --mushi-ok: ${isDark ? '#4ade80' : '#16a34a'};\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n /* First-session welcome pulse. Three soft halos at 800ms each, then\n auto-clear. Uses a box-shadow ring rather than transform/scale so it\n can compose with the hover transform without fighting it. Respects\n prefers-reduced-motion. */\n @keyframes mushi-trigger-pulse {\n 0% { box-shadow: 0 0 0 0 rgba(212, 67, 50, 0.55), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n 70% { box-shadow: 0 0 0 16px rgba(212, 67, 50, 0), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n 100% { box-shadow: 0 0 0 0 rgba(212, 67, 50, 0), 0 1px 0 ${rule}, 0 10px 24px -14px rgba(14,13,11,0.45); }\n }\n .mushi-trigger-pulse {\n animation: mushi-trigger-pulse 800ms ${easeStamp} 3;\n }\n @media (prefers-reduced-motion: reduce) {\n .mushi-trigger-pulse { animation: none; }\n }\n .mushi-trigger.bottom-right {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.bottom-left {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.top-right {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.top-left {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.edge-tab {\n width: 32px;\n height: 88px;\n border-radius: 4px 0 0 4px;\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-size: 16px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset -3px 0 0 ${vermillion};\n }\n .mushi-trigger.edge-tab.bottom-right,\n .mushi-trigger.edge-tab.top-right {\n right: var(--mushi-right, 0);\n }\n .mushi-trigger.edge-tab.bottom-left,\n .mushi-trigger.edge-tab.top-left {\n left: var(--mushi-left, 0);\n border-radius: 0 4px 4px 0;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset 3px 0 0 ${vermillion};\n }\n .mushi-trigger.shrunk {\n width: 36px;\n height: 36px;\n opacity: 0.82;\n transform: scale(0.92);\n }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: bottom right;\n }\n .mushi-panel.bottom-left {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: bottom left;\n }\n .mushi-panel.top-right {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: top right;\n }\n .mushi-panel.top-left {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: top left;\n }\n .mushi-outdated {\n margin: 12px 14px 0;\n padding: 10px 12px;\n border: 1px solid ${vermillionWash};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontBody};\n font-size: 12px;\n line-height: 1.4;\n }\n .mushi-outdated strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin-bottom: 2px;\n }\n .mushi-outdated span {\n display: block;\n margin-top: 3px;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n /* Feature-request and Reports-inbox entries sit above the five\n category cards as discoverable shortcuts. We give them a subtle\n left rule so the eye reads them as a separate group rather than\n \"another category\". The shortcut group has zero hover indent\n overshoot — we want them quiet until intent. */\n .mushi-feature-entry,\n .mushi-reports-entry {\n padding-left: 10px;\n border-left: 2px solid ${inkFaint};\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp}, border-color 220ms ${easeStamp};\n }\n .mushi-feature-entry:hover,\n .mushi-reports-entry:hover {\n border-left-color: ${vermillion};\n padding-left: 14px;\n }\n .mushi-feature-entry .mushi-option-icon {\n filter: none;\n }\n .mushi-report-row {\n width: 100%;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 8px;\n align-items: center;\n padding: 10px 0;\n border: 0;\n border-bottom: 1px solid ${rule};\n background: transparent;\n color: ${ink};\n cursor: pointer;\n text-align: left;\n }\n .mushi-report-status {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-report-title {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mushi-thread-summary {\n border-bottom: 1px solid ${rule};\n padding-bottom: 10px;\n margin-bottom: 10px;\n }\n .mushi-thread-summary span {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-thread {\n display: grid;\n gap: 8px;\n max-height: 180px;\n overflow: auto;\n margin-bottom: 12px;\n }\n .mushi-thread-comment {\n padding: 8px 10px;\n border: 1px solid ${rule};\n background: ${isDark ? 'rgba(242,235,221,0.04)' : 'rgba(14,13,11,0.03)'};\n }\n .mushi-thread-comment.reporter {\n border-color: ${vermillionWash};\n background: ${vermillionWash};\n }\n .mushi-thread-comment strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 3px;\n }\n .mushi-thread-comment p,\n .mushi-muted,\n .mushi-error-inline {\n font-size: 12px;\n color: ${inkMuted};\n line-height: 1.45;\n }\n .mushi-error-inline { color: ${vermillion}; }\n\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n /* Example starter chips — reduce first-report activation energy */\n .mushi-example-chips {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 10px;\n }\n .mushi-example-chip {\n padding: 4px 10px;\n border: 1px solid ${rule};\n border-radius: 12px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 11px;\n cursor: pointer;\n transition: color 150ms ${easeStamp}, border-color 150ms ${easeStamp}, background 150ms ${easeStamp};\n white-space: nowrap;\n }\n .mushi-example-chip:hover {\n color: ${ink};\n border-color: ${inkMuted};\n background: ${isDark ? 'rgba(242,235,221,0.06)' : 'rgba(14,13,11,0.04)'};\n }\n .mushi-example-chip:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* Textarea wrapper to position char counter */\n .mushi-textarea-wrap {\n position: relative;\n }\n .mushi-char-counter {\n position: absolute;\n bottom: 4px;\n right: 0;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.04em;\n color: ${inkFaint};\n pointer-events: none;\n transition: color 200ms ${easeStamp};\n }\n\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.danger {\n color: ${vermillionInk};\n border-color: ${vermillionWash};\n background: transparent;\n }\n .mushi-attach-btn.danger:hover {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.loading {\n opacity: 0.7;\n cursor: wait;\n }\n .mushi-attach-btn.error {\n color: ${vermillion};\n border-color: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n @keyframes mushi-spin {\n to { transform: rotate(360deg); }\n }\n @keyframes mushi-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n .mushi-spinner {\n display: inline-block;\n width: 10px;\n height: 10px;\n border: 1.5px solid currentColor;\n border-top-color: transparent;\n border-radius: 50%;\n animation: mushi-spin 0.7s linear infinite;\n }\n\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n .mushi-brand-footer {\n padding: 9px 14px 11px;\n border-top: 1px solid ${rule};\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 9px;\n letter-spacing: 0.16em;\n text-align: center;\n text-transform: uppercase;\n }\n\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n /* ── Two-way receipt (success step) ──────────────────────────── */\n /* The receipt block sits below the stamp/meta. Three states: */\n /* 1. delivering... (spinner pill, while host onSubmit awaits) */\n /* 2. confirmed (Receipt #abc12345 + Track on Mushi link) */\n /* 3. queued offline (warn pill — degrade gracefully) */\n .mushi-success-receipt {\n margin-top: 14px;\n width: 100%;\n max-width: 280px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n align-items: stretch;\n }\n .mushi-success-receipt-row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.05em;\n color: ${inkMuted};\n }\n .mushi-success-receipt-label {\n text-transform: uppercase;\n letter-spacing: 0.10em;\n color: ${inkMuted};\n }\n .mushi-success-receipt-id {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n border-radius: 4px;\n background: transparent;\n border: 1px dashed ${rule};\n color: inherit;\n font-family: ${fontMono};\n font-size: 12px;\n letter-spacing: 0.02em;\n cursor: pointer;\n transition: background 120ms ease, border-color 120ms ease;\n }\n .mushi-success-receipt-id:hover,\n .mushi-success-receipt-id:focus-visible {\n background: rgba(217, 65, 47, 0.06);\n border-color: ${vermillion};\n color: ${vermillion};\n outline: none;\n }\n .mushi-success-receipt-copy {\n font-size: 11px;\n opacity: 0.7;\n }\n .mushi-success-receipt-track {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 6px 10px;\n border-radius: 4px;\n background: ${vermillion};\n color: #fff;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n text-decoration: none;\n transition: filter 120ms ease;\n }\n .mushi-success-receipt-track:hover,\n .mushi-success-receipt-track:focus-visible {\n filter: brightness(0.95);\n outline: none;\n }\n .mushi-success-receipt-spinner {\n width: 11px;\n height: 11px;\n border-radius: 50%;\n border: 1.5px solid ${rule};\n border-top-color: ${vermillion};\n animation: mushi-receipt-spin 0.8s linear infinite;\n }\n @keyframes mushi-receipt-spin {\n to { transform: rotate(360deg); }\n }\n .mushi-success-receipt-hint {\n color: ${inkMuted};\n font-style: italic;\n }\n .mushi-success-receipt-warn {\n color: ${vermillion};\n }\n .mushi-success-sla {\n margin-top: 2px;\n font-family: ${fontDisplay};\n font-size: 12px;\n line-height: 1.45;\n text-align: center;\n color: ${inkMuted};\n max-width: 260px;\n }\n .mushi-success-sla-default {\n opacity: 0.85;\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards nudge (category step) ───────────────────────────── */\n .mushi-rewards-nudge {\n border-top: 1px solid ${rule};\n padding: 10px 0 4px;\n margin-top: 6px;\n }\n .mushi-rewards-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 8px;\n }\n .mushi-tier-pip {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n .mushi-rewards-tier-name {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: ${ink};\n }\n .mushi-rewards-pts-count {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n margin-right: auto;\n }\n .mushi-rewards-pts-earn {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n .mushi-tier-bar-track {\n height: 3px;\n background: ${ruleStrong};\n border-radius: 2px;\n overflow: hidden;\n margin-bottom: 5px;\n }\n .mushi-tier-bar-fill {\n height: 100%;\n background: ${vermillion};\n border-radius: 2px;\n transition: width 600ms ${easeStamp};\n }\n .mushi-rewards-next-label {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${inkMuted};\n text-align: right;\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards on success step ─────────────────────────────────── */\n .mushi-success-rewards {\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid ${rule};\n width: 100%;\n }\n .mushi-success-pts-award {\n font-family: ${fontMono};\n font-size: 22px;\n font-weight: 700;\n color: ${vermillion};\n text-align: center;\n letter-spacing: 0.06em;\n margin-bottom: 10px;\n opacity: 0;\n animation: mushi-pts-pop 420ms ${easeStamp} 900ms forwards;\n }\n .success-bar { margin: 0 0 5px; }\n\n @keyframes mushi-pts-pop {\n from { opacity: 0; transform: scale(0.75) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n /* ─── Beta mode strip (category step) ─────────────────────────────── */\n\n .mushi-beta-strip {\n margin: 0 16px 2px;\n padding: 9px 12px;\n background: rgba(99, 102, 241, 0.07);\n border: 1px solid rgba(99, 102, 241, 0.18);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mushi-beta-strip-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .mushi-beta-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 4px;\n background: rgba(245, 158, 11, 0.15);\n border: 1px solid rgba(245, 158, 11, 0.35);\n color: #b45309;\n font-family: var(--mushi-font-mono);\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.08em;\n line-height: 1.6;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-tag {\n background: rgba(245, 158, 11, 0.12);\n border-color: rgba(245, 158, 11, 0.28);\n color: #fbbf24;\n }\n }\n\n .mushi-beta-msg {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.45;\n }\n\n .mushi-beta-contact-hint {\n font-size: 10px;\n color: var(--mushi-text-dim);\n opacity: 0.72;\n font-family: var(--mushi-font-mono);\n }\n\n .mushi-beta-perks {\n list-style: none;\n margin: 2px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-beta-perks li {\n font-size: 10.5px;\n color: #4f46e5;\n font-weight: 500;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-perks li {\n color: #818cf8;\n }\n }\n\n /* ─── Beta changelog (collapsible What's new) ──────────────────────── */\n\n .mushi-changelog {\n margin-top: 5px;\n }\n\n .mushi-changelog-summary {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 4px;\n user-select: none;\n }\n\n .mushi-changelog-summary::before {\n content: '▶';\n font-size: 7px;\n opacity: 0.6;\n transition: transform 0.15s ease;\n }\n\n .mushi-changelog[open] .mushi-changelog-summary::before {\n transform: rotate(90deg);\n }\n\n .mushi-changelog-list {\n margin: 5px 0 0 4px;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-changelog-list li {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n /* ─── Beta success footer ───────────────────────────────────────────── */\n\n .mushi-beta-success-footer {\n margin-top: 14px;\n padding: 10px 14px;\n background: rgba(99, 102, 241, 0.06);\n border: 1px solid rgba(99, 102, 241, 0.14);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n text-align: left;\n }\n\n .mushi-beta-success-line {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n .mushi-beta-success-dim {\n opacity: 0.65;\n font-size: 10.5px;\n }\n\n /* ─── Banner launcher (trigger: 'banner') ─────────────────────────────── */\n\n .mushi-banner {\n position: fixed;\n left: 0;\n right: 0;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 0 16px;\n font-family: ${fontMono};\n font-size: 11.5px;\n letter-spacing: 0.04em;\n white-space: nowrap;\n overflow: hidden;\n z-index: var(--mushi-banner-z, 99998);\n animation: mushi-banner-slide-in 0.3s ${easeStamp} both;\n }\n\n .mushi-banner.top { top: 0; }\n .mushi-banner.bottom { bottom: 0; }\n\n /* --- neon variant (electric lime — dev / beta tool aesthetic) --- */\n .mushi-banner.neon {\n background: #0FFF50;\n color: #0a1a0a;\n border-bottom: 1.5px solid #00C43A;\n }\n .mushi-banner.neon.bottom {\n border-top: 1.5px solid #00C43A;\n border-bottom: none;\n }\n .mushi-banner.neon .mushi-banner-btn {\n background: rgba(0,0,0,0.14);\n color: #0a1a0a;\n border: 1px solid rgba(0,0,0,0.22);\n }\n .mushi-banner.neon .mushi-banner-btn:hover {\n background: rgba(0,0,0,0.22);\n }\n\n /* --- brand variant (vermillion — editorial, app-quality) --- */\n .mushi-banner.brand {\n background: ${vermillion};\n color: #fff;\n border-bottom: 1.5px solid ${isDark ? '#C4321E' : '#B52F1F'};\n }\n .mushi-banner.brand.bottom {\n border-top: 1.5px solid ${isDark ? '#C4321E' : '#B52F1F'};\n border-bottom: none;\n }\n .mushi-banner.brand .mushi-banner-btn {\n background: rgba(255,255,255,0.18);\n color: #fff;\n border: 1px solid rgba(255,255,255,0.32);\n }\n .mushi-banner.brand .mushi-banner-btn:hover {\n background: rgba(255,255,255,0.28);\n }\n\n /* --- subtle variant (hairline, muted — least disruptive) --- */\n .mushi-banner.subtle {\n background: ${isDark ? 'rgba(242,235,221,0.06)' : 'rgba(14,13,11,0.04)'};\n color: ${inkMuted};\n border-bottom: 1px solid ${rule};\n }\n .mushi-banner.subtle.bottom {\n border-top: 1px solid ${rule};\n border-bottom: none;\n }\n .mushi-banner.subtle .mushi-banner-btn {\n background: ${isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.07)'};\n color: ${ink};\n border: 1px solid ${rule};\n }\n .mushi-banner.subtle .mushi-banner-btn:hover {\n background: ${isDark ? 'rgba(242,235,221,0.16)' : 'rgba(14,13,11,0.12)'};\n }\n\n .mushi-banner-label {\n flex: 1;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .mushi-banner-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 3px 10px;\n border-radius: 3px;\n cursor: pointer;\n font: inherit;\n letter-spacing: inherit;\n transition: background 0.15s ease, opacity 0.15s ease;\n flex-shrink: 0;\n height: 24px;\n line-height: 1;\n }\n .mushi-banner-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n .mushi-banner-dismiss {\n background: transparent !important;\n border: none !important;\n opacity: 0.65;\n cursor: pointer;\n font-size: 14px;\n line-height: 1;\n padding: 4px 8px;\n margin-left: auto;\n flex-shrink: 0;\n color: inherit;\n border-radius: 3px;\n transition: opacity 0.15s, background 0.15s;\n }\n .mushi-banner-dismiss:hover {\n opacity: 1;\n background: rgba(0,0,0,0.12) !important;\n }\n .mushi-banner.neon .mushi-banner-dismiss:hover { background: rgba(0,0,0,0.18) !important; }\n\n @keyframes mushi-banner-slide-in {\n from { transform: translateY(calc(-1 * 100%)); opacity: 0.5; }\n to { transform: translateY(0); opacity: 1; }\n }\n .mushi-banner.bottom {\n animation-name: mushi-banner-slide-in-bottom;\n }\n @keyframes mushi-banner-slide-in-bottom {\n from { transform: translateY(100%); opacity: 0.5; }\n to { transform: translateY(0); opacity: 1; }\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n .mushi-success-pts-award { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type {\n MushiReportCategory,\n MushiReporterComment,\n MushiReporterReport,\n MushiWidgetConfig,\n} from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success' | 'reports' | 'report-detail';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/**\n * Wire-format \"feature request\" intent string. Always written into the\n * report's `user_category` field (not `category`) so we don't have to\n * widen the DB CHECK constraint on `reports.category`. The widget UI\n * presents it as a first-class card alongside the five real categories\n * because beta apps live or die by how easy it is to file a feature\n * request — burying it as an intent under \"Other\" suppresses signal.\n */\nconst FEATURE_REQUEST_INTENT = 'Feature request';\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n reports: 1,\n 'report-detail': 1,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport interface WidgetRewardsState {\n tier: { slug: string; displayName: string; pointsThreshold: number } | null;\n nextTier: { displayName: string; pointsThreshold: number } | null;\n totalPoints: number;\n /** Expected base points for a `report_submit` action (default 50). */\n pointsForReport: number;\n}\n\nexport interface WidgetSubmitOutcome {\n /** Server-confirmed report id. When `null` the report was queued\n * offline / failed-and-queued for retry; the success step degrades\n * gracefully (no \"track on console\" link, just the receipt stamp). */\n reportId: string | null;\n /** Convenience flag for the widget to decide whether to render the\n * optimistic copy (\"queued offline, we'll send it when you're back\")\n * versus the confirmed copy (\"received — track at #abc12345\"). */\n queuedOffline?: boolean;\n}\n\nexport interface WidgetCallbacks {\n /**\n * Returns the outcome of the submission so the widget can render a\n * real receipt (report id, deep link). Older callers that return\n * `void` still work — the widget falls back to the legacy stamp.\n */\n onSubmit(\n data: { category: MushiReportCategory; description: string; intent?: string },\n ): void | Promise<WidgetSubmitOutcome | void>;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onScreenshotRemove?(): void;\n onElementSelectorRequest?(): void;\n onReporterReportsRequest?(): Promise<MushiReporterReport[]>;\n onReporterCommentsRequest?(reportId: string): Promise<MushiReporterComment[]>;\n onReporterReply?(reportId: string, body: string): Promise<void>;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n /**\n * True when the user took the \"Feature request\" shortcut. We track this\n * separately from `selectedCategory='other'` so the Back button on the\n * details step jumps straight back to the category picker instead of\n * landing on the intent picker the user explicitly skipped.\n */\n private viaFeatureRequest = false;\n private screenshotAttached = false;\n private screenshotCapturing = false;\n private screenshotError = false;\n private allowScreenshotRemove = true;\n private elementSelected = false;\n private elementCapturing = false;\n private submitting = false;\n /** Hint element injected outside the shadow DOM during element selection. */\n private selectorHint: HTMLDivElement | null = null;\n private triggerVisible = true;\n private triggerShrunk = false;\n private triggerHiddenByScroll = false;\n /** Milliseconds since mount — used for the 30s first-time nudge gate. */\n private mountedAt: number | null = null;\n private nudgeShown = false;\n private nudgeEl: HTMLDivElement | null = null;\n private nudgeTimer: ReturnType<typeof setTimeout> | null = null;\n private sdkFreshness: { latest: string | null; current: string; deprecated: boolean; message?: string | null } | null = null;\n private reporterReports: MushiReporterReport[] = [];\n private reporterComments: MushiReporterComment[] = [];\n private selectedReportId: string | null = null;\n private reporterLoading = false;\n private reporterError: string | null = null;\n private attachedLaunchers: Array<() => void> = [];\n private smartHideCleanup: (() => void) | null = null;\n private smartHideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private rewardsState: WidgetRewardsState | null = null;\n /** Server-confirmed id for the just-submitted report. Surfaces in\n * the success step as a copyable receipt + optional deep link to\n * the Mushi console (when `dashboardUrl` is configured). Cleared\n * on every new `open()` so a re-opened widget never reuses a\n * stale id from the previous session. */\n private lastReportId: string | null = null;\n /** True when the just-submitted report was queued offline (no\n * network, or the API errored and went into the retry queue).\n * Drives a different success copy so the user knows the report\n * hasn't actually reached the console yet. */\n private lastSubmitQueuedOffline = false;\n /** Whether the user has clicked ✕ on the header banner this session. */\n private bannerDismissed = false;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks, private readonly sdkVersion = '0.7.0') {\n this.config = {\n position: config.position ?? 'bottom-right',\n anchor: config.anchor ?? {},\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n trigger: config.trigger ?? 'auto',\n bannerConfig: config.bannerConfig ?? {},\n attachToSelector: config.attachToSelector ?? '',\n inset: config.inset ?? {},\n respectSafeArea: config.respectSafeArea ?? true,\n hideOnSelector: config.hideOnSelector ?? '',\n hideOnRoutes: config.hideOnRoutes ?? [],\n environments: config.environments ?? {},\n smartHide: config.smartHide ?? false,\n draggable: config.draggable ?? false,\n brandFooter: config.brandFooter ?? true,\n outdatedBanner: config.outdatedBanner ?? 'auto',\n betaMode: config.betaMode ?? {},\n minDescriptionLength: config.minDescriptionLength ?? 20,\n dashboardUrl: config.dashboardUrl ?? '',\n responseSlaLabel: config.responseSlaLabel ?? '',\n featureRequestCard: config.featureRequestCard ?? true,\n featureRequestLabel: config.featureRequestLabel ?? '',\n featureRequestDescription: config.featureRequestDescription ?? '',\n };\n this.callbacks = callbacks;\n // Passing undefined when locale is 'auto' lets getLocale() resolve via\n // navigator.language automatically.\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n if (this.host.isConnected) return;\n document.body.appendChild(this.host);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n this.mountedAt = Date.now();\n }\n\n getIsMounted(): boolean {\n return this.host.isConnected;\n }\n\n updateConfig(config: MushiWidgetConfig = {}): void {\n this.config = {\n ...this.config,\n ...(config.position ? { position: config.position } : {}),\n ...(config.anchor !== undefined ? { anchor: config.anchor } : {}),\n ...(config.theme ? { theme: config.theme } : {}),\n ...(config.triggerText !== undefined ? { triggerText: config.triggerText || '\\uD83D\\uDC1B' } : {}),\n ...(config.expandedTitle !== undefined ? { expandedTitle: config.expandedTitle } : {}),\n ...(config.mode ? { mode: config.mode } : {}),\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.zIndex !== undefined ? { zIndex: config.zIndex } : {}),\n ...(config.trigger ? { trigger: config.trigger } : {}),\n ...(config.attachToSelector !== undefined ? { attachToSelector: config.attachToSelector } : {}),\n ...(config.inset !== undefined ? { inset: config.inset } : {}),\n ...(config.respectSafeArea !== undefined ? { respectSafeArea: config.respectSafeArea } : {}),\n ...(config.hideOnSelector !== undefined ? { hideOnSelector: config.hideOnSelector } : {}),\n ...(config.hideOnRoutes !== undefined ? { hideOnRoutes: config.hideOnRoutes } : {}),\n ...(config.environments !== undefined ? { environments: config.environments } : {}),\n ...(config.smartHide !== undefined ? { smartHide: config.smartHide } : {}),\n ...(config.draggable !== undefined ? { draggable: config.draggable } : {}),\n ...(config.brandFooter !== undefined ? { brandFooter: config.brandFooter } : {}),\n ...(config.outdatedBanner !== undefined ? { outdatedBanner: config.outdatedBanner } : {}),\n ...(config.betaMode !== undefined ? { betaMode: config.betaMode } : {}),\n ...(config.minDescriptionLength !== undefined ? { minDescriptionLength: config.minDescriptionLength } : {}),\n ...(config.dashboardUrl !== undefined ? { dashboardUrl: config.dashboardUrl } : {}),\n ...(config.responseSlaLabel !== undefined ? { responseSlaLabel: config.responseSlaLabel } : {}),\n ...(config.featureRequestCard !== undefined ? { featureRequestCard: config.featureRequestCard } : {}),\n ...(config.featureRequestLabel !== undefined ? { featureRequestLabel: config.featureRequestLabel } : {}),\n ...(config.featureRequestDescription !== undefined ? { featureRequestDescription: config.featureRequestDescription } : {}),\n };\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory; featureRequest?: boolean }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.screenshotCapturing = false;\n this.screenshotError = false;\n this.elementSelected = false;\n this.elementCapturing = false;\n this.submitting = false;\n this.submittedAt = null;\n this.removeSelectorHint();\n this.lastReportId = null;\n this.lastSubmitQueuedOffline = false;\n this.viaFeatureRequest = false;\n\n if (options?.featureRequest) {\n // External callers can deep-link straight into the feature-request\n // shortcut, e.g. a \"Suggest a feature\" button on the marketing page.\n this.selectedCategory = 'other';\n this.selectedIntent = FEATURE_REQUEST_INTENT;\n this.viaFeatureRequest = true;\n this.step = 'details';\n } else if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n /**\n * Briefly highlight the trigger button (a soft pulse + tooltip) without\n * opening the full reporter panel. Use for first-session welcome nudges\n * and other \"by the way, this exists\" prompts where forcing the panel\n * open would feel aggressive. Honours `position: 'none'` (no-op when\n * the trigger button is hidden).\n */\n pulseTrigger(): void {\n if (this.isOpen) return;\n const trigger = this.shadow.querySelector<HTMLButtonElement>('.mushi-trigger');\n // No-op if the trigger element is hidden (e.g. host app uses\n // `triggerVisible: false` for a custom launcher); the pulse only\n // makes sense when the user can actually see what we're highlighting.\n if (!trigger) return;\n trigger.classList.add('mushi-trigger-pulse');\n // Auto-clear after the animation finishes so a subsequent pulse can\n // restart it cleanly. Three pulses x 800ms = 2.4s total.\n window.setTimeout(() => {\n trigger.classList.remove('mushi-trigger-pulse');\n }, 2400);\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n showTrigger(): void {\n this.triggerVisible = true;\n this.render();\n }\n\n hideTrigger(): void {\n this.triggerVisible = false;\n this.render();\n }\n\n setTrigger(trigger: NonNullable<MushiWidgetConfig['trigger']>): void {\n this.updateConfig({ trigger });\n }\n\n attachTo(selectorOrElement: string | Element, options: MushiWidgetConfig = {}): () => void {\n const elements = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n : [selectorOrElement];\n const cleanups = elements.map((el) => {\n const onClick = (event: Event) => {\n event.preventDefault();\n this.updateConfig(options);\n this.open();\n };\n el.addEventListener('click', onClick);\n return () => el.removeEventListener('click', onClick);\n });\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setAllowScreenshotRemove(allow: boolean): void {\n this.allowScreenshotRemove = allow;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n this.elementCapturing = false;\n this.removeSelectorHint();\n if (this.isOpen) this.render();\n }\n\n setScreenshotCapturing(capturing: boolean): void {\n this.screenshotCapturing = capturing;\n this.screenshotError = false;\n if (this.isOpen) this.render();\n }\n\n setScreenshotError(failed: boolean): void {\n this.screenshotError = failed;\n this.screenshotCapturing = false;\n if (this.isOpen) this.render();\n }\n\n setElementCapturing(capturing: boolean): void {\n this.elementCapturing = capturing;\n if (capturing) {\n this.showSelectorHint();\n } else {\n this.removeSelectorHint();\n }\n if (this.isOpen) this.render();\n }\n\n /** Hide the widget panel (but keep the host element) during element selection\n * so the user can click any element on the page without the panel\n * intercepting the event. */\n hidePanel(): void {\n const panel = this.shadow.querySelector('.mushi-panel') as HTMLElement | null;\n if (panel) panel.style.display = 'none';\n }\n\n showPanel(): void {\n const panel = this.shadow.querySelector('.mushi-panel') as HTMLElement | null;\n if (panel) panel.style.display = '';\n }\n\n private showSelectorHint(): void {\n this.removeSelectorHint();\n const hint = document.createElement('div');\n hint.id = 'mushi-selector-hint';\n hint.setAttribute('role', 'status');\n hint.setAttribute('aria-live', 'polite');\n hint.style.cssText = `\n position: fixed;\n bottom: 24px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 2147483646;\n background: rgba(17,17,17,0.92);\n color: #fff;\n font-family: ui-monospace, SFMono-Regular, monospace;\n font-size: 12px;\n letter-spacing: 0.04em;\n padding: 8px 16px;\n border-radius: 20px;\n pointer-events: none;\n white-space: nowrap;\n backdrop-filter: blur(4px);\n box-shadow: 0 2px 12px rgba(0,0,0,0.35);\n `;\n hint.textContent = this.locale.step3.elementSelectorHint;\n document.body.appendChild(hint);\n this.selectorHint = hint;\n }\n\n private removeSelectorHint(): void {\n this.selectorHint?.remove();\n this.selectorHint = null;\n // Also remove any orphaned hints from previous sessions.\n document.getElementById('mushi-selector-hint')?.remove();\n }\n\n private showNudge(): void {\n if (this.nudgeShown || this.nudgeEl) return;\n this.nudgeShown = true;\n\n // Find the trigger position to anchor the bubble.\n const trigger = this.shadow.querySelector('.mushi-trigger') as HTMLElement | null;\n const rect = trigger?.getBoundingClientRect();\n\n const nudge = document.createElement('div');\n nudge.id = 'mushi-nudge-bubble';\n nudge.setAttribute('role', 'tooltip');\n const isRight = this.config.position.includes('right');\n nudge.style.cssText = `\n position: fixed;\n z-index: 2147483645;\n ${rect\n ? `bottom: ${window.innerHeight - rect.top + 8}px; ${isRight ? `right: ${window.innerWidth - rect.right}px;` : `left: ${rect.left}px;`}`\n : 'bottom: 80px; right: 24px;'}\n background: rgba(17,17,17,0.92);\n color: #fff;\n font-family: ui-sans-serif, system-ui, sans-serif;\n font-size: 12px;\n line-height: 1.4;\n padding: 8px 12px;\n border-radius: 8px;\n max-width: 200px;\n pointer-events: none;\n backdrop-filter: blur(4px);\n box-shadow: 0 2px 12px rgba(0,0,0,0.35);\n animation: mushi-fade-in 0.15s ease forwards;\n `;\n nudge.textContent = this.locale.step3.tooShort.startsWith('A bit')\n ? \"Found a bug? One sentence is enough \\uD83D\\uDC1B\"\n : \"\\u30D0\\u30B0\\u3092\\u898B\\u3064\\u3051\\u305F\\uFF1F\\u4E00\\u884C\\u3067\\u5927\\u4E08\\u592B\\u3067\\u3059 \\uD83D\\uDC1B\";\n document.body.appendChild(nudge);\n this.nudgeEl = nudge;\n\n // Auto-remove after 5s.\n if (this.nudgeTimer !== null) clearTimeout(this.nudgeTimer);\n this.nudgeTimer = setTimeout(() => this.removeNudge(), 5000);\n }\n\n private removeNudge(): void {\n if (this.nudgeTimer !== null) {\n clearTimeout(this.nudgeTimer);\n this.nudgeTimer = null;\n }\n this.nudgeEl?.remove();\n this.nudgeEl = null;\n document.getElementById('mushi-nudge-bubble')?.remove();\n }\n\n setSdkFreshness(info: { latest: string | null; current: string; deprecated: boolean; message?: string | null }): void {\n this.sdkFreshness = info;\n if (this.isOpen) this.render();\n }\n\n setRewardsState(state: WidgetRewardsState | null): void {\n this.rewardsState = state;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n if (this.smartHideTimer !== null) {\n clearTimeout(this.smartHideTimer);\n this.smartHideTimer = null;\n }\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n this.removeSelectorHint();\n this.removeNudge();\n this.host.remove();\n }\n\n private syncAttachedLaunchers(): void {\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n if (this.config.trigger !== 'attach' || !this.config.attachToSelector) return;\n if (typeof document === 'undefined') return;\n this.attachedLaunchers.push(this.attachTo(this.config.attachToSelector));\n }\n\n private syncSmartHide(): void {\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.triggerShrunk = false;\n this.triggerHiddenByScroll = false;\n if (!this.config.smartHide || typeof window === 'undefined') return;\n\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const, onScroll: 'shrink' as const, onIdleMs: 900 }\n : this.config.smartHide;\n if (!smart.onScroll) return;\n\n const onScroll = () => {\n if (smart.onScroll === 'hide') {\n this.triggerHiddenByScroll = true;\n } else {\n this.triggerShrunk = true;\n }\n this.render();\n if (this.smartHideTimer !== null) clearTimeout(this.smartHideTimer);\n this.smartHideTimer = setTimeout(() => {\n this.triggerHiddenByScroll = false;\n this.triggerShrunk = false;\n this.render();\n }, smart.onIdleMs ?? 900);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this.smartHideCleanup = () => window.removeEventListener('scroll', onScroll);\n }\n\n private shouldRenderTrigger(): boolean {\n if (!this.triggerVisible) return false;\n if (this.triggerHiddenByScroll) return false;\n if (\n this.config.trigger === 'manual' ||\n this.config.trigger === 'hidden' ||\n this.config.trigger === 'attach' ||\n this.config.trigger === 'banner'\n ) {\n return false;\n }\n if (this.isMobileSmartHidden()) return false;\n if (this.isRouteHidden()) return false;\n if (this.config.hideOnSelector && document.querySelector(this.config.hideOnSelector)) return false;\n const action = this.config.environments[this.detectEnvironment()];\n return action !== 'never' && action !== 'manual';\n }\n\n /** Height of the banner in px — kept in sync with the CSS `.mushi-banner` height (36px). */\n private static readonly BANNER_HEIGHT = 36;\n\n /** CSS property applied to document.body so host-app content doesn't slide under the banner. */\n private static readonly BODY_NUDGE_PROP = '--mushi-banner-offset';\n\n private applyBodyNudge(position: 'top' | 'bottom'): void {\n const h = `${MushiWidget.BANNER_HEIGHT}px`;\n if (position === 'top') {\n document.documentElement.style.setProperty(MushiWidget.BODY_NUDGE_PROP, h);\n // Only nudge if the host hasn't already set an explicit body padding-top\n // (check inline style only — computed style includes CSS rules we shouldn't clobber).\n if (!document.body.style.paddingTop) {\n document.body.style.paddingTop = h;\n document.body.dataset.mushiBannerNudged = 'top';\n }\n } else {\n document.documentElement.style.setProperty(MushiWidget.BODY_NUDGE_PROP, h);\n if (!document.body.style.paddingBottom) {\n document.body.style.paddingBottom = h;\n document.body.dataset.mushiBannerNudged = 'bottom';\n }\n }\n }\n\n private removeBodyNudge(): void {\n document.documentElement.style.removeProperty(MushiWidget.BODY_NUDGE_PROP);\n const nudged = document.body.dataset.mushiBannerNudged;\n if (nudged === 'top') {\n document.body.style.paddingTop = '';\n delete document.body.dataset.mushiBannerNudged;\n } else if (nudged === 'bottom') {\n document.body.style.paddingBottom = '';\n delete document.body.dataset.mushiBannerNudged;\n }\n }\n\n private renderBanner(): void {\n if (this.config.trigger !== 'banner') return;\n if (this.bannerDismissed) { this.removeBodyNudge(); return; }\n if (!this.triggerVisible) return;\n if (this.isRouteHidden()) return;\n\n const bc = this.config.bannerConfig ?? {};\n const variant = bc.variant ?? 'brand';\n const position = bc.position ?? 'top';\n const bugLabel = bc.bugCta ?? '🐛 Report a bug';\n const showFeat = bc.featureCta !== false;\n const featLabel = bc.featureCtaLabel ?? '✨ Request feature';\n const zIdx = bc.zIndex ?? (this.config.zIndex ?? 99999) - 1;\n\n const banner = document.createElement('div');\n banner.className = `mushi-banner ${variant} ${position}`;\n banner.style.setProperty('--mushi-banner-z', String(zIdx));\n banner.setAttribute('role', 'banner');\n\n const bugBtn = document.createElement('button');\n bugBtn.className = 'mushi-banner-btn';\n bugBtn.textContent = bugLabel;\n bugBtn.addEventListener('click', () => this.open());\n\n const dismissBtn = document.createElement('button');\n dismissBtn.className = 'mushi-banner-dismiss';\n dismissBtn.textContent = '✕';\n dismissBtn.setAttribute('aria-label', 'Dismiss feedback banner');\n dismissBtn.addEventListener('click', () => {\n this.bannerDismissed = true;\n this.removeBodyNudge();\n this.render();\n });\n\n banner.appendChild(bugBtn);\n\n if (showFeat) {\n const featBtn = document.createElement('button');\n featBtn.className = 'mushi-banner-btn';\n featBtn.textContent = featLabel;\n featBtn.addEventListener('click', () => this.open({ featureRequest: true }));\n banner.appendChild(featBtn);\n }\n\n banner.appendChild(dismissBtn);\n this.shadow.appendChild(banner);\n\n // Push body content so the banner doesn't overlap the host app's navigation.\n this.applyBodyNudge(position);\n }\n\n private effectiveTrigger(): NonNullable<MushiWidgetConfig['trigger']> {\n if (!this.config.smartHide || typeof window === 'undefined') return this.config.trigger;\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const }\n : this.config.smartHide;\n if (window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'edge-tab') {\n return 'edge-tab';\n }\n return this.config.trigger;\n }\n\n private isMobileSmartHidden(): boolean {\n if (!this.config.smartHide || typeof window === 'undefined') return false;\n const smart = this.config.smartHide === true ? { onMobile: 'edge-tab' as const } : this.config.smartHide;\n return window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'hide';\n }\n\n private detectEnvironment(): 'production' | 'staging' | 'development' {\n const host = typeof location !== 'undefined' ? location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (/\\b(staging|stage|preview|dev)\\b/i.test(host)) return 'staging';\n return 'production';\n }\n\n private isRouteHidden(): boolean {\n if (!this.config.hideOnRoutes.length || typeof location === 'undefined') return false;\n return this.config.hideOnRoutes.some((route) => location.pathname.includes(route));\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n this.renderBanner();\n\n if (this.shouldRenderTrigger()) {\n const effectiveTrigger = this.effectiveTrigger();\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}${effectiveTrigger === 'edge-tab' ? ' edge-tab' : ''}${this.triggerShrunk ? ' shrunk' : ''}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n this.applyInsetVars(trigger);\n trigger.addEventListener('click', () => {\n this.removeNudge();\n if (this.isOpen) this.close();\n else this.open();\n });\n trigger.addEventListener('mouseenter', () => {\n const onPageMs = this.mountedAt ? Date.now() - this.mountedAt : 0;\n if (!this.nudgeShown && !this.isOpen && onPageMs >= 30_000) {\n this.showNudge();\n }\n });\n trigger.addEventListener('mouseleave', () => {\n // Keep for 2s after hover ends so the user can read it.\n if (this.nudgeEl) {\n if (this.nudgeTimer !== null) clearTimeout(this.nudgeTimer);\n this.nudgeTimer = setTimeout(() => this.removeNudge(), 2000);\n }\n });\n this.shadow.appendChild(trigger);\n }\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n this.applyInsetVars(panel);\n\n if (this.isOpen) {\n panel.innerHTML = `${this.renderOutdatedBanner()}${this.renderStep()}${this.renderBrandFooter()}`;\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private applyInsetVars(el: HTMLElement): void {\n const { anchor } = this.config;\n if (anchor && Object.keys(anchor).length > 0) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = anchor[edge];\n if (value !== undefined) el.style.setProperty(`--mushi-${edge}`, value);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n return;\n }\n\n const { inset } = this.config;\n if (!this.config.respectSafeArea) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n if (inset[edge] === undefined) el.style.setProperty(`--mushi-${edge}`, '24px');\n });\n }\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = inset[edge];\n if (value === undefined) return;\n el.style.setProperty(`--mushi-${edge}`, value === 'auto' ? 'auto' : `${value}px`);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n case 'reports': return this.renderReportsStep();\n case 'report-detail': return this.renderReportDetailStep();\n }\n }\n\n private renderOutdatedBanner(): string {\n if (!this.sdkFreshness) return '';\n if (this.config.outdatedBanner === 'off' || this.config.outdatedBanner === 'console-only') return '';\n const { latest, current, deprecated, message } = this.sdkFreshness;\n if (!latest && !deprecated) return '';\n return `\n <div class=\"mushi-outdated\" role=\"status\">\n <strong>Mushi SDK ${escapeHtml(current)}</strong>\n ${latest ? `latest is ${escapeHtml(latest)}.` : 'needs attention.'}\n ${message ? `<span>${escapeHtml(message)}</span>` : ''}\n </div>\n `;\n }\n\n private renderBrandFooter(): string {\n if (this.config.brandFooter === false) return '';\n return `<div class=\"mushi-brand-footer\">Powered by Mushi v${escapeHtml(this.sdkVersion)}</div>`;\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n ${this.config.betaMode?.enabled ? this.renderBetaStrip() : ''}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n <button type=\"button\" class=\"mushi-option-btn mushi-reports-entry\" data-action=\"reports\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\uD83D\\uDCEC</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">Your reports${this.unreadCount() ? ` (${this.unreadCount()} new)` : ''}</span>\n <span class=\"mushi-option-desc\">See status, developer replies, and respond</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n ${this.renderFeatureRequestEntry()}\n ${categories}\n ${this.rewardsState ? this.renderRewardsNudge() : ''}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n /**\n * First-class \"Feature request\" entry rendered at the top of the\n * category step. Beta apps consistently get more useful signal when\n * the user has a no-friction path to say \"I wish this did X\" — burying\n * it as an intent under the \"Other\" category drops feature submissions\n * by ~40% in industry studies (Userpilot, Usersnap 2025).\n *\n * Wire format: still routes through the standard `other` category with\n * a `user_category = 'Feature request'` stamp, so we don't need a DB\n * migration. The admin console filters on that string to surface the\n * Feature-request swimlane.\n */\n private renderFeatureRequestEntry(): string {\n const enabled = this.config.featureRequestCard !== false;\n if (!enabled) return '';\n const label = this.config.featureRequestLabel ?? 'Feature request';\n const desc = this.config.featureRequestDescription\n ?? 'Suggest something new — even rough ideas help us prioritise';\n return `\n <button\n type=\"button\"\n class=\"mushi-option-btn mushi-feature-entry\"\n data-action=\"feature-request\"\n aria-label=\"${escapeHtml(label)}\"\n >\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\u2728</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${escapeHtml(label)}</span>\n <span class=\"mushi-option-desc\">${escapeHtml(desc)}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `;\n }\n\n /** Collapsible \"What's new\" changelog row. Closes the reporter feedback loop. */\n private renderBetaChangelog(): string {\n const entries = this.config.betaMode?.changelogItems;\n if (!entries?.length) return '';\n const latest = entries[0];\n const items = latest.items.map((item) => `<li>\\u2022 ${escapeHtml(item)}</li>`).join('');\n const label = latest.date\n ? `What\\u2019s new in ${escapeHtml(latest.version)} \\u00B7 ${escapeHtml(latest.date)}`\n : `What\\u2019s new in ${escapeHtml(latest.version)}`;\n return `\n <details class=\"mushi-changelog\">\n <summary class=\"mushi-changelog-summary\">${label}</summary>\n <ul class=\"mushi-changelog-list\">${items}</ul>\n </details>\n `;\n }\n\n /**\n * Discreet beta status strip: communicates \"work in progress\", invites\n * feedback, and sets expectations — reducing user frustration while\n * nudging the reciprocity instinct (\"your reports help us build this\").\n */\n private renderBetaStrip(): string {\n const beta = this.config.betaMode!;\n const appName = escapeHtml(beta.appName ?? 'This app');\n const message = beta.message\n ? escapeHtml(beta.message)\n : `${appName} is in early development — updates ship weekly`;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const perks = beta.perks ?? [];\n\n return `\n <div class=\"mushi-beta-strip\" role=\"note\" aria-label=\"Beta status\">\n <div class=\"mushi-beta-strip-row\">\n <span class=\"mushi-beta-tag\" aria-hidden=\"true\">BETA</span>\n <span class=\"mushi-beta-msg\">${message}</span>\n </div>\n ${email ? `<div class=\"mushi-beta-contact-hint\">Reports go to ${email} · reviewed by the team</div>` : ''}\n ${perks.length > 0 ? `\n <ul class=\"mushi-beta-perks\" aria-label=\"Beta tester perks\">\n ${perks.map((p) => `<li>\\u2713 ${escapeHtml(p)}</li>`).join('')}\n </ul>\n ` : ''}\n ${this.renderBetaChangelog()}\n </div>\n `;\n }\n\n private renderReportsStep(): string {\n const reports = this.reporterReports.map((report) => `\n <button type=\"button\" class=\"mushi-report-row\" data-report-id=\"${escapeHtml(report.id)}\">\n <span class=\"mushi-report-status\">${escapeHtml(report.status)}</span>\n <span class=\"mushi-report-title\">${escapeHtml(report.summary ?? report.description ?? `Report ${report.id.slice(0, 8)}`)}</span>\n ${report.unread_count ? `<b>${report.unread_count}</b>` : ''}\n </button>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Your reports', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading reports…</p>' : ''}\n ${this.reporterError ? `<p class=\"mushi-error-inline\">${escapeHtml(this.reporterError)}</p>` : ''}\n ${reports || (!this.reporterLoading ? '<p class=\"mushi-muted\">No reports from this browser yet.</p>' : '')}\n </div>\n `;\n }\n\n private renderReportDetailStep(): string {\n const report = this.reporterReports.find((r) => r.id === this.selectedReportId);\n const comments = this.reporterComments.map((comment) => `\n <div class=\"mushi-thread-comment ${comment.author_kind}\">\n <strong>${escapeHtml(comment.author_kind === 'reporter' ? 'You' : (comment.author_name ?? 'Developer'))}</strong>\n <p>${escapeHtml(comment.body)}</p>\n </div>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Report thread', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-thread-summary\">\n <span>${escapeHtml(report?.status ?? 'unknown')}</span>\n <p>${escapeHtml(report?.summary ?? report?.description ?? 'Report details')}</p>\n </div>\n <div class=\"mushi-thread\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading thread…</p>' : comments || '<p class=\"mushi-muted\">No developer replies yet.</p>'}\n </div>\n <textarea class=\"mushi-textarea\" data-role=\"reporter-reply\" rows=\"3\" placeholder=\"Reply to the developer…\"></textarea>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"reporter-reply\">\n <span>Reply</span><span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private effectiveMinLength(): number {\n const base = this.config.minDescriptionLength ?? 20;\n // CJK scripts pack more meaning per character. Halve the floor for Japanese,\n // Chinese, and Korean locales so an 8-character Japanese sentence isn't\n // blocked by an English-calibrated minimum.\n const lang = this.config.locale === 'auto'\n ? (typeof navigator !== 'undefined' ? (navigator.language ?? '') : '')\n : (this.config.locale ?? '');\n const isCjk = /^(ja|zh|ko)/i.test(lang);\n return isCjk ? Math.max(4, Math.floor(base / 2)) : base;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n const minLen = this.effectiveMinLength();\n\n const screenshotLabel = this.screenshotCapturing\n ? t.step3.screenshotCapturing\n : this.screenshotError\n ? t.step3.screenshotFailed\n : this.screenshotAttached\n ? t.step3.screenshotAttached\n : t.step3.screenshotButton;\n\n const screenshotClass = [\n 'mushi-attach-btn',\n this.screenshotAttached ? 'active' : '',\n this.screenshotError ? 'error' : '',\n this.screenshotCapturing ? 'loading' : '',\n ].filter(Boolean).join(' ');\n\n const elementLabel = this.elementCapturing\n ? t.step3.elementCapturing\n : this.elementSelected\n ? t.step3.elementSelected\n : t.step3.elementButton;\n\n const elementClass = [\n 'mushi-attach-btn',\n this.elementSelected ? 'active' : '',\n this.elementCapturing ? 'loading' : '',\n ].filter(Boolean).join(' ');\n\n const exampleChips = t.step3.examplePrompts\n .map((p) => `<button type=\"button\" class=\"mushi-example-chip\" data-example=\"${escapeHtml(p)}\">${escapeHtml(p)}</button>`)\n .join('');\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <div class=\"mushi-example-chips\" aria-label=\"Example prompts\">${exampleChips}</div>\n <div class=\"mushi-textarea-wrap\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-char-counter\" data-role=\"char-counter\" aria-hidden=\"true\">\n <span data-role=\"char-current\">0</span>/<span data-role=\"char-min\">${minLen}</span>\n </div>\n </div>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"${screenshotClass}\"\n data-action=\"screenshot\"\n ${this.screenshotCapturing ? 'disabled' : ''}\n aria-label=\"${escapeHtml(screenshotLabel)}\"\n >\n ${this.screenshotCapturing ? '<span class=\"mushi-spinner\" aria-hidden=\"true\"></span>' : '\\uD83D\\uDCF8'}\n ${escapeHtml(screenshotLabel)}\n </button>\n ${this.screenshotAttached && this.allowScreenshotRemove\n ? '<button type=\"button\" class=\"mushi-attach-btn danger\" data-action=\"remove-screenshot\" aria-label=\"Remove screenshot\">\\u2715 Remove</button>'\n : ''}\n <button type=\"button\" class=\"${elementClass}\"\n data-action=\"element\"\n ${this.elementCapturing ? 'disabled' : ''}\n aria-label=\"${escapeHtml(elementLabel)}\"\n >\n ${this.elementCapturing ? '<span class=\"mushi-spinner\" aria-hidden=\"true\"></span>' : '\\uD83C\\uDFAF'}\n ${escapeHtml(elementLabel)}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n ${this.renderSuccessReceipt()}\n ${this.rewardsState ? this.renderSuccessRewards() : ''}\n ${this.config.betaMode?.enabled ? this.renderBetaSuccessFooter() : ''}\n </div>\n </div>\n `;\n }\n\n /**\n * Two-way receipt block. Until the host's `onSubmit` resolves with a\n * server-confirmed report id, we show a discreet \"delivering...\" pill so\n * the user knows their submission is still in flight. Once we have the\n * id, we surface a short monospaced id + a copy button + an optional\n * \"Track on Mushi\" deep link to `dashboardUrl/reports/<id>` so the user\n * can watch the status walk through queued -> classified -> fixed in\n * real time (Peak-End rule: the last impression sticks). If we never\n * get an id (offline retry queue), we say so explicitly rather than\n * pretending everything is fine.\n */\n private renderSuccessReceipt(): string {\n if (this.lastSubmitQueuedOffline) {\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row mushi-success-receipt-warn\">\n <span class=\"mushi-success-receipt-label\">Queued offline</span>\n <span class=\"mushi-success-receipt-hint\">We’ll send it the moment you’re back online.</span>\n </div>\n </div>\n `;\n }\n\n if (!this.lastReportId) {\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row\">\n <span class=\"mushi-success-receipt-spinner\" aria-hidden=\"true\"></span>\n <span class=\"mushi-success-receipt-hint\">Delivering to the team\\u2026</span>\n </div>\n ${this.renderSlaLine()}\n </div>\n `;\n }\n\n const idShort = `#${this.lastReportId.slice(0, 8)}`;\n const dashboard = (this.config.dashboardUrl ?? '').replace(/\\/$/, '');\n const trackHref = dashboard ? `${dashboard}/reports/${encodeURIComponent(this.lastReportId)}` : '';\n\n return `\n <div class=\"mushi-success-receipt\" role=\"status\">\n <div class=\"mushi-success-receipt-row\">\n <span class=\"mushi-success-receipt-label\">Receipt</span>\n <button\n type=\"button\"\n class=\"mushi-success-receipt-id\"\n data-action=\"copy-report-id\"\n data-copy-id=\"${escapeHtml(this.lastReportId)}\"\n title=\"Copy report id ${escapeHtml(this.lastReportId)}\"\n aria-label=\"Copy report id ${escapeHtml(this.lastReportId)}\"\n >${escapeHtml(idShort)}<span class=\"mushi-success-receipt-copy\" aria-hidden=\"true\">\\u2398</span></button>\n </div>\n ${trackHref ? `\n <a\n class=\"mushi-success-receipt-track\"\n href=\"${escapeHtml(trackHref)}\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >Track on Mushi <span aria-hidden=\"true\">\\u2197</span></a>\n ` : ''}\n ${this.renderSlaLine()}\n </div>\n `;\n }\n\n private renderSlaLine(): string {\n const sla = (this.config.responseSlaLabel ?? '').trim();\n if (sla) {\n return `<div class=\"mushi-success-sla\">${escapeHtml(sla)}</div>`;\n }\n // Default copy is intentionally vague but reassuring -- under-promise,\n // over-deliver. Hosts that want a hard SLA set it via responseSlaLabel.\n return `<div class=\"mushi-success-sla mushi-success-sla-default\">A human will look at this within a working day.</div>`;\n }\n\n /**\n * Reciprocity footer on the success step: closes the feedback loop by\n * attributing where the report goes, sets a response expectation, and\n * reinforces the \"beta tester\" identity (Peak-End Rule — the last thing\n * the user sees shapes their entire impression of the interaction).\n */\n private renderBetaSuccessFooter(): string {\n const beta = this.config.betaMode!;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const appName = escapeHtml(beta.appName ?? 'the team');\n return `\n <div class=\"mushi-beta-success-footer\" role=\"note\" aria-label=\"Beta feedback acknowledgement\">\n ${email\n ? `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${email}</div>`\n : `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${appName}</div>`\n }\n <div class=\"mushi-beta-success-line mushi-beta-success-dim\">We aim to review within 48h · thank you for helping build this</div>\n </div>\n `;\n }\n\n private tierColor(slug: string): string {\n const colors: Record<string, string> = {\n free: '#6b7280',\n explorer: '#3b82f6',\n contributor: '#8b5cf6',\n champion: '#f59e0b',\n };\n return colors[slug] ?? '#6c47ff';\n }\n\n /** Compact rewards nudge rendered at the bottom of the category-step body. */\n private renderRewardsNudge(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const tierName = tier?.displayName ?? 'Free';\n const tierSlug = tier?.slug ?? 'free';\n const color = this.tierColor(tierSlug);\n\n let pct = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pct = ceiling > base ? Math.round(Math.min(1, (totalPoints - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - totalPoints);\n nextLabel = `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`;\n }\n\n return `\n <div class=\"mushi-rewards-nudge\" aria-label=\"Rewards progress\">\n <div class=\"mushi-rewards-row\">\n <span class=\"mushi-tier-pip\" style=\"background:${color}\" aria-hidden=\"true\"></span>\n <span class=\"mushi-rewards-tier-name\">${escapeHtml(tierName)}</span>\n <span class=\"mushi-rewards-pts-count\">${totalPoints.toLocaleString()} pts</span>\n <span class=\"mushi-rewards-pts-earn\">+${pointsForReport} pts for a report</span>\n </div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n /** Points earned + tier progress shown on the success step. */\n private renderSuccessRewards(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const projected = totalPoints + pointsForReport;\n\n let pctAfter = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pctAfter = ceiling > base ? Math.round(Math.min(1, (projected - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - projected);\n nextLabel = remaining > 0\n ? `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`\n : `\\uD83C\\uDF89 ${escapeHtml(nextTier.displayName)} reached!`;\n }\n\n return `\n <div class=\"mushi-success-rewards\">\n <div class=\"mushi-success-pts-award\">+${pointsForReport} pts</div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track success-bar\" role=\"progressbar\" aria-valuenow=\"${pctAfter}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pctAfter}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') {\n if (this.viaFeatureRequest) {\n this.step = 'category';\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.viaFeatureRequest = false;\n } else {\n this.step = 'intent';\n this.selectedIntent = null;\n }\n }\n else if (this.step === 'reports') { this.step = 'category'; }\n else if (this.step === 'report-detail') { this.step = 'reports'; this.selectedReportId = null; }\n this.render();\n });\n\n panel.querySelector('[data-action=\"reports\"]')?.addEventListener('click', () => {\n void this.loadReporterReports();\n });\n\n panel.querySelector('[data-action=\"feature-request\"]')?.addEventListener('click', () => {\n // Feature-request shortcut: pre-fill the wire format and skip the\n // intent step. The user lands directly on the description box so\n // there's only one screen between \"I have an idea\" and \"submitted\".\n this.selectedCategory = 'other';\n this.selectedIntent = FEATURE_REQUEST_INTENT;\n this.viaFeatureRequest = true;\n this.step = 'details';\n this.render();\n });\n\n panel.querySelectorAll('[data-report-id]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const reportId = (btn as HTMLElement).dataset.reportId;\n if (reportId) void this.loadReporterComments(reportId);\n });\n });\n\n panel.querySelector('[data-action=\"reporter-reply\"]')?.addEventListener('click', () => {\n void this.submitReporterReply(panel);\n });\n\n // Receipt-copy on the success step. We do the clipboard work\n // inside the widget rather than emitting a callback so the\n // optical feedback (button label flips to \"Copied\") is instant\n // and the host doesn't have to wire anything to enjoy it.\n panel.querySelector('[data-action=\"copy-report-id\"]')?.addEventListener('click', (e) => {\n const btn = e.currentTarget as HTMLButtonElement;\n const id = btn.dataset.copyId;\n if (!id) return;\n const restore = btn.innerHTML;\n const done = () => {\n btn.innerHTML = 'Copied \\u2713';\n // Hold the \"Copied\" state briefly then bounce back to the\n // ledger id so a second copy still feels like an action.\n window.setTimeout(() => {\n if (btn.isConnected) btn.innerHTML = restore;\n }, 1600);\n };\n try {\n if (navigator.clipboard?.writeText) {\n void navigator.clipboard.writeText(id).then(done).catch(() => done());\n } else {\n done();\n }\n } catch {\n done();\n }\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n // Wire live char counter so users see their progress as they type.\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const charCurrentEl = panel.querySelector('[data-role=\"char-current\"]') as HTMLElement | null;\n if (textarea && charCurrentEl) {\n const minLen = this.effectiveMinLength();\n const updateCounter = () => {\n const len = textarea.value.trim().length;\n charCurrentEl.textContent = String(len);\n const counterEl = panel.querySelector('[data-role=\"char-counter\"]') as HTMLElement | null;\n if (counterEl) {\n counterEl.style.color = len >= minLen ? 'var(--mushi-ok, #22c55e)' : '';\n }\n };\n textarea.addEventListener('input', updateCounter);\n }\n\n // Wire example chips — clicking one pre-fills the textarea.\n panel.querySelectorAll('[data-example]').forEach((chip) => {\n chip.addEventListener('click', () => {\n const example = (chip as HTMLElement).dataset.example ?? '';\n if (textarea) {\n textarea.value = example;\n textarea.focus();\n // Trigger counter update.\n textarea.dispatchEvent(new Event('input'));\n }\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n panel.querySelector('[data-action=\"remove-screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRemove?.();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n const minLen = this.effectiveMinLength();\n if (description.length < minLen) {\n if (errorEl) {\n const msg = `${t.step3.tooShort} (${description.length}/${minLen})`;\n errorEl.textContent = msg;\n errorEl.style.display = 'block';\n // Focus the textarea so the user can immediately keep typing.\n textarea?.focus();\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.lastReportId = null;\n this.lastSubmitQueuedOffline = false;\n this.render();\n\n // Kick off the host's submission handler. We treat both\n // sync-void (legacy) and async-outcome (current) shapes:\n // when the host returns an outcome we hold the success step\n // open longer and let the user copy the report id; when the\n // host returns void we use the historic 500 ms transition.\n const outcomeP = (async () => {\n try {\n const ret = this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n if (ret && typeof (ret as Promise<WidgetSubmitOutcome | void>).then === 'function') {\n const outcome = (await ret) as WidgetSubmitOutcome | void;\n return outcome ?? null;\n }\n return null;\n } catch {\n // Submission errors are still surfaced as a success step in\n // the historic SDK — the apiClient retry queue handles the\n // delivery in the background. Mirror that so the receipt\n // copy can degrade to the \"queued offline\" variant rather\n // than blocking the user with an error wall.\n return { reportId: null, queuedOffline: true } as WidgetSubmitOutcome;\n }\n })();\n\n // Always flip to the success step quickly so the user gets a\n // confirmation within one breath even if the network is slow.\n // The outcome promise then patches the receipt id in-place\n // once it resolves (success step re-renders).\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n // Don't auto-close as aggressively if we're waiting on a\n // report id — give the user a moment to copy it. Once the\n // outcome lands we kick off a longer auto-close so the deep\n // link stays readable.\n void outcomeP.then((outcome) => {\n if (this.step !== 'success') return;\n if (outcome) {\n this.lastReportId = outcome.reportId ?? null;\n this.lastSubmitQueuedOffline = Boolean(outcome.queuedOffline);\n this.render();\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n }\n // 6 s when we have a deep link (long enough to read + copy\n // the id), 2.8 s for the legacy bare-stamp path.\n const closeDelayMs = this.lastReportId && this.config.dashboardUrl ? 6000 : 2800;\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, closeDelayMs);\n });\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n\n private unreadCount(): number {\n return this.reporterReports.reduce((sum, report) => sum + (report.unread_count ?? 0), 0);\n }\n\n private async loadReporterReports(): Promise<void> {\n this.step = 'reports';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterReports = await this.callbacks.onReporterReportsRequest?.() ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load reports.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async loadReporterComments(reportId: string): Promise<void> {\n this.selectedReportId = reportId;\n this.step = 'report-detail';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterComments = await this.callbacks.onReporterCommentsRequest?.(reportId) ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load thread.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async submitReporterReply(panel: HTMLElement): Promise<void> {\n const reportId = this.selectedReportId;\n const textarea = panel.querySelector('[data-role=\"reporter-reply\"]') as HTMLTextAreaElement | null;\n const replyButton = panel.querySelector('[data-action=\"reporter-reply\"]') as HTMLButtonElement | null;\n const body = textarea?.value.trim() ?? '';\n // Guard: reject empty bodies AND already-in-flight submits — both prevented\n // double-posts in dogfood when users mashed Enter on a slow link.\n if (!reportId || !body || this.reporterLoading) return;\n this.reporterLoading = true;\n if (replyButton) replyButton.disabled = true;\n this.render();\n try {\n await this.callbacks.onReporterReply?.(reportId, body);\n // Clear the field on success so the next render (driven by\n // loadReporterComments) doesn't repaint the just-sent text and tempt\n // the user into a duplicate submit.\n if (textarea) textarea.value = '';\n await this.loadReporterComments(reportId);\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not send reply.';\n this.reporterLoading = false;\n this.render();\n }\n }\n\n /* ── Marketing / Playwright recorder (debug GIF capture) ─────────── */\n\n getRecorderStep(): WidgetStep {\n return this.step;\n }\n\n getRecorderTrigger(): Element | null {\n return this.shadow.querySelector('.mushi-trigger');\n }\n\n getRecorderCategoryButton(category: MushiReportCategory): Element | null {\n return this.shadow.querySelector(`[data-category=\"${category}\"]`);\n }\n\n getRecorderIntentButton(label: string): Element | null {\n return (\n Array.from(this.shadow.querySelectorAll('[data-intent]')).find(\n (el) => (el as HTMLElement).dataset.intent === label,\n ) ?? null\n );\n }\n\n getRecorderSubmitButton(): Element | null {\n return this.shadow.querySelector('[data-action=\"submit\"]');\n }\n\n recorderClickTrigger(): void {\n if (this.isOpen) this.close();\n this.open();\n }\n\n recorderSelectCategory(category: MushiReportCategory): void {\n if (!this.isOpen) this.open();\n if (this.step !== 'category') {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n this.render();\n }\n this.selectedCategory = category;\n this.step = 'intent';\n this.render();\n }\n\n recorderSelectIntent(label: string): void {\n if (!this.isOpen || this.step !== 'intent') return;\n this.selectedIntent = label;\n this.step = 'details';\n this.render();\n }\n\n recorderFocusDescription(): void {\n const textarea = this.shadow.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n textarea?.focus();\n }\n\n recorderSubmit(): void {\n const submit = this.shadow.querySelector('[data-action=\"submit\"]') as HTMLButtonElement | null;\n submit?.click();\n }\n}\n","/**\n * Dev-only Playwright helpers for marketing GIFs. Exposed on\n * `window.__mushiRecorder` when the SDK is initialized with `debug: true`.\n * Drives the closed shadow-DOM widget through the full reporter flow.\n */\n\nimport type { MushiReportCategory } from '@mushi-mushi/core';\nimport type { MushiWidget } from './widget';\n\nexport interface MushiRecorderCenter {\n x: number;\n y: number;\n}\n\nexport interface MushiMarketingRecorder {\n ready(): boolean;\n getStep(): string;\n getTriggerCenter(): MushiRecorderCenter | null;\n getCategoryCenter(category: MushiReportCategory): MushiRecorderCenter | null;\n getIntentCenter(label: string): MushiRecorderCenter | null;\n getSubmitCenter(): MushiRecorderCenter | null;\n clickTrigger(): void;\n selectCategory(category: MushiReportCategory): void;\n selectIntent(label: string): void;\n focusDescription(): void;\n submit(): void;\n}\n\nfunction centerOf(el: Element | null): MushiRecorderCenter | null {\n if (!el) return null;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return null;\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n}\n\nexport function exposeMarketingRecorder(widget: MushiWidget): void {\n if (typeof globalThis === 'undefined') return;\n\n const api: MushiMarketingRecorder = {\n ready: () => widget.getIsMounted(),\n getStep: () => widget.getRecorderStep(),\n getTriggerCenter: () => centerOf(widget.getRecorderTrigger()),\n getCategoryCenter: (category) => centerOf(widget.getRecorderCategoryButton(category)),\n getIntentCenter: (label) => centerOf(widget.getRecorderIntentButton(label)),\n getSubmitCenter: () => centerOf(widget.getRecorderSubmitButton()),\n clickTrigger: () => widget.recorderClickTrigger(),\n selectCategory: (category) => widget.recorderSelectCategory(category),\n selectIntent: (label) => widget.recorderSelectIntent(label),\n focusDescription: () => widget.recorderFocusDescription(),\n submit: () => widget.recorderSubmit(),\n };\n\n (globalThis as typeof globalThis & { __mushiRecorder?: MushiMarketingRecorder }).__mushiRecorder = api;\n}\n","// ============================================================\n// rewards.ts — Web SDK rewards subsystem\n//\n// Owns:\n// 1. Activity batcher: coalesces events into 5-min flushes\n// with IndexedDB backing for offline resilience.\n// 2. Auto-track listeners: route changes, [data-testid] clicks,\n// session dwell — piggybacks on installAutoBreadcrumbs infra.\n// 3. In-widget tier/points badge (shadow-DOM, themable).\n// 4. Consent surface (explicit mode).\n//\n// Wired by createInstance() only when config.rewards.enabled === true.\n// All state is keyed by projectId so multi-instance setups don't bleed.\n// ============================================================\n\nimport type { MushiApiClient, MushiRewardsConfig, MushiTierResult, MushiActivityEvent } from '@mushi-mushi/core';\n\nconst MIN_FLUSH_INTERVAL = 30_000;\nconst DEFAULT_FLUSH_INTERVAL = 300_000; // 5 min\nconst DWELL_SAMPLE_INTERVAL = 60_000; // emit session_minute every 60s\nconst MAX_SESSION_MINUTES_PER_DAY = 60;\nconst DAILY_RESET_KEY_PREFIX = 'mushi_session_min_day_';\n\n// ──────────────────────────────────────────────────────────────\n// Internal queue (in-memory; IndexedDB for offline persistence)\n// ──────────────────────────────────────────────────────────────\n\ninterface QueuedEvent extends MushiActivityEvent {\n queuedAt: number;\n}\n\nlet pendingEvents: QueuedEvent[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\nlet dwellTimer: ReturnType<typeof setInterval> | null = null;\nlet currentUserId: string | null = null;\nlet currentUserTraits: { email?: string; name?: string; provider?: string } | null = null;\nlet reporterTokenHash: string | null = null;\nlet apiClient: MushiApiClient | null = null;\nlet optedIn = false;\nlet tierCache: MushiTierResult | null = null;\nlet tierCacheTime = 0;\nconst TIER_CACHE_TTL = 5 * 60 * 1000; // 5 min\n\n// Track seen routes to avoid duplicate screen_view_unique_per_day\nconst seenRoutes = new Set<string>();\n\n// ──────────────────────────────────────────────────────────────\n// Consent helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction getConsentKey(projectId: string): string {\n return `mushi_rewards_consent_${projectId}`;\n}\n\nfunction isConsentGranted(projectId: string): boolean {\n try {\n return localStorage.getItem(getConsentKey(projectId)) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setConsentGranted(projectId: string, granted: boolean): void {\n try {\n if (granted) {\n localStorage.setItem(getConsentKey(projectId), '1');\n } else {\n localStorage.removeItem(getConsentKey(projectId));\n }\n optedIn = granted;\n apiClient?.submitActivity(currentUserId ?? '', [], { optedIn: granted }).catch(() => {});\n } catch { /* private browsing */ }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Session-minute daily cap\n// ──────────────────────────────────────────────────────────────\n\nfunction getTodayKey(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction getSessionMinutesToday(projectId: string): number {\n try {\n const val = sessionStorage.getItem(`${DAILY_RESET_KEY_PREFIX}${projectId}_${getTodayKey()}`);\n return val ? parseInt(val, 10) : 0;\n } catch { return 0; }\n}\n\nfunction incrementSessionMinutes(projectId: string): number {\n const today = getTodayKey();\n const key = `${DAILY_RESET_KEY_PREFIX}${projectId}_${today}`;\n try {\n const next = (getSessionMinutesToday(projectId) + 1);\n sessionStorage.setItem(key, String(next));\n return next;\n } catch { return 99; }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Public API\n// ──────────────────────────────────────────────────────────────\n\nexport interface RewardsContext {\n client: MushiApiClient;\n config: MushiRewardsConfig;\n projectId: string;\n userId: string;\n traits?: { email?: string; name?: string; provider?: string };\n reporterToken?: string;\n}\n\n/** Called by createInstance() when a user is identified and rewards are enabled. */\nexport function initRewards(ctx: RewardsContext): void {\n apiClient = ctx.client;\n void ctx.config; // config stored for future use\n currentUserId = ctx.userId;\n currentUserTraits = ctx.traits ?? null;\n reporterTokenHash = ctx.reporterToken ?? null;\n\n const { projectId } = ctx;\n const flushMs = Math.max(\n MIN_FLUSH_INTERVAL,\n ctx.config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL,\n );\n\n // Resolve consent\n if (ctx.config.consentMode === 'auto') {\n optedIn = true;\n setConsentGranted(projectId, true);\n } else {\n optedIn = isConsentGranted(projectId);\n }\n\n // Install auto-track listeners when trackActivity is on\n if (ctx.config.trackActivity) {\n installActivityListeners(projectId);\n }\n\n // Start flush timer\n if (flushTimer) clearInterval(flushTimer);\n flushTimer = setInterval(() => flush(ctx), flushMs);\n\n // Dwell timer — emits session_minute every 60s (capped)\n if (dwellTimer) clearInterval(dwellTimer);\n dwellTimer = setInterval(() => {\n if (!optedIn || !currentUserId) return;\n const minutes = getSessionMinutesToday(projectId);\n if (minutes < MAX_SESSION_MINUTES_PER_DAY) {\n incrementSessionMinutes(projectId);\n enqueue({ action: 'session_minute', metadata: { minutes_today: minutes + 1 } });\n }\n }, DWELL_SAMPLE_INTERVAL);\n\n // Eager tier fetch for the widget badge\n if (ctx.config.showInWidget) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, ctx.config);\n });\n }\n\n // Show consent surface if explicit mode and not yet granted\n if (ctx.config.consentMode !== 'auto' && !optedIn) {\n renderConsentBanner(projectId, ctx.config);\n }\n}\n\n/** Called by Mushi.identify() to update the current user context. */\nexport function updateRewardsUser(\n userId: string,\n traits?: { email?: string; name?: string; provider?: string },\n): void {\n currentUserId = userId;\n currentUserTraits = traits ?? null;\n // Invalidate tier cache on user change\n tierCache = null;\n tierCacheTime = 0;\n}\n\n/** Manually enqueue a host-defined activity event. */\nexport function enqueue(event: MushiActivityEvent): void {\n if (!optedIn || !currentUserId) return;\n pendingEvents.push({ ...event, queuedAt: Date.now() });\n}\n\n/** Force-flush the pending event queue. */\nexport async function flush(ctx: RewardsContext): Promise<void> {\n if (!optedIn || !currentUserId || pendingEvents.length === 0) return;\n\n // P2: attach host-app JWT if verifyUserToken callback is configured\n let hostJwt: string | null = null;\n if (ctx.config.verifyUserToken) {\n try {\n hostJwt = await ctx.config.verifyUserToken();\n } catch {\n // Non-fatal — activity still submits without JWT;\n // server will mark jwt_verified_at = null\n }\n }\n\n const batch = pendingEvents.splice(0, 100);\n try {\n await ctx.client.submitActivity(currentUserId, batch, {\n userTraits: currentUserTraits ?? undefined,\n reporterTokenHash: reporterTokenHash ?? undefined,\n optedIn: true,\n hostJwt: hostJwt ?? undefined,\n });\n } catch {\n // On failure, re-queue for next flush (simplified offline; full\n // IndexedDB queue is left for a follow-up to keep this file focussed)\n pendingEvents.unshift(...batch.slice(0, 50)); // cap re-queue at 50\n }\n}\n\nexport async function getTier(userId: string): Promise<MushiTierResult | null> {\n const now = Date.now();\n if (tierCache && now - tierCacheTime < TIER_CACHE_TTL) return tierCache;\n return fetchAndCacheTier(userId);\n}\n\nasync function fetchAndCacheTier(userId: string): Promise<MushiTierResult | null> {\n if (!apiClient) return null;\n const res = await apiClient.getMyTier(userId);\n if (res.ok && res.data) {\n tierCache = res.data as MushiTierResult;\n tierCacheTime = Date.now();\n return tierCache;\n }\n return null;\n}\n\nexport function teardown(): void {\n if (flushTimer) { clearInterval(flushTimer); flushTimer = null; }\n if (dwellTimer) { clearInterval(dwellTimer); dwellTimer = null; }\n removeActivityListeners();\n removeTierBadge();\n if (consentHost) { consentHost.remove(); consentHost = null; }\n pendingEvents = [];\n currentUserId = null;\n apiClient = null;\n optedIn = false;\n tierCache = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auto-track listeners\n// ──────────────────────────────────────────────────────────────\n\nlet routeObserver: MutationObserver | null = null;\nlet clickHandler: ((e: MouseEvent) => void) | null = null;\nlet popstateHandler: (() => void) | null = null;\nlet origPushState: typeof history.pushState | null = null;\nlet lastRoute = '';\n\nfunction installActivityListeners(projectId: string): void {\n // Route: pushState + popstate\n const emitRoute = () => {\n const route = location.pathname;\n if (route === lastRoute) return;\n lastRoute = route;\n const isNewToday = !seenRoutes.has(`${projectId}:${route}`);\n if (isNewToday) {\n seenRoutes.add(`${projectId}:${route}`);\n enqueue({ action: 'screen_view_unique_per_day', metadata: { route } });\n }\n };\n\n origPushState = history.pushState.bind(history);\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPushState!(...args);\n emitRoute();\n };\n popstateHandler = emitRoute;\n window.addEventListener('popstate', emitRoute);\n emitRoute(); // record initial route\n\n // DOM mutation observer for SPA route changes that don't use pushState\n routeObserver = new MutationObserver(() => emitRoute());\n const main = document.querySelector('main') ?? document.body;\n routeObserver.observe(main, { childList: true, subtree: false });\n\n // Click: track [data-testid] interactions\n clickHandler = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest('[data-testid]') as HTMLElement | null;\n if (!target) return;\n const testid = target.dataset.testid;\n if (!testid) return;\n enqueue({ action: 'element_selected', metadata: { testid, route: location.pathname } });\n };\n document.addEventListener('click', clickHandler, { capture: true, passive: true });\n}\n\nfunction removeActivityListeners(): void {\n // Restore original pushState before removing listeners\n if (origPushState) {\n history.pushState = origPushState;\n origPushState = null;\n }\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler);\n popstateHandler = null;\n }\n routeObserver?.disconnect();\n routeObserver = null;\n if (clickHandler) {\n document.removeEventListener('click', clickHandler, { capture: true });\n clickHandler = null;\n }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Shadow-DOM tier badge\n// ──────────────────────────────────────────────────────────────\n\nlet badgeHost: HTMLElement | null = null;\n\nfunction renderTierBadge(tier: MushiTierResult, config: MushiRewardsConfig): void {\n if (!config.showInWidget) return;\n if (badgeHost) badgeHost.remove();\n\n badgeHost = document.createElement('div');\n badgeHost.id = 'mushi-tier-badge';\n Object.assign(badgeHost.style, {\n position: 'fixed',\n bottom: '56px', // above the widget button\n right: '16px',\n zIndex: '2147483645',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = badgeHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 999px;\n background: rgba(0,0,0,0.75);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n backdrop-filter: blur(6px);\n cursor: default;\n user-select: none;\n }\n .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6c47ff;\n flex-shrink: 0;\n }\n </style>\n <div class=\"badge\">\n <span class=\"dot\"></span>\n <span>${tier.displayName}</span>\n </div>\n `;\n\n document.body.appendChild(badgeHost);\n}\n\nfunction removeTierBadge(): void {\n badgeHost?.remove();\n badgeHost = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Consent banner (explicit mode)\n// ──────────────────────────────────────────────────────────────\n\nlet consentHost: HTMLElement | null = null;\n\nfunction renderConsentBanner(projectId: string, config: MushiRewardsConfig): void {\n if (consentHost) return; // already shown\n\n consentHost = document.createElement('div');\n consentHost.id = 'mushi-consent-banner';\n Object.assign(consentHost.style, {\n position: 'fixed',\n bottom: '80px',\n right: '16px',\n zIndex: '2147483646',\n maxWidth: '280px',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = consentHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .banner {\n background: #fff;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n padding: 14px 16px;\n font-size: 13px;\n line-height: 1.5;\n color: #374151;\n }\n .title { font-weight: 700; margin-bottom: 6px; color: #111827; }\n .actions { display: flex; gap: 8px; margin-top: 10px; }\n button {\n flex: 1;\n padding: 6px 10px;\n border-radius: 6px;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n }\n .accept { background: #6c47ff; color: #fff; }\n .decline { background: #f3f4f6; color: #374151; }\n </style>\n <div class=\"banner\">\n <div class=\"title\">🎯 Earn rewards</div>\n <div>Help improve this app and earn points, badges, and perks for your contributions.</div>\n <div class=\"actions\">\n <button class=\"accept\" id=\"accept\">Enable</button>\n <button class=\"decline\" id=\"decline\">No thanks</button>\n </div>\n </div>\n `;\n\n shadow.getElementById('accept')?.addEventListener('click', () => {\n setConsentGranted(projectId, true);\n consentHost?.remove();\n consentHost = null;\n if (config.showInWidget && currentUserId) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, config);\n });\n }\n });\n\n shadow.getElementById('decline')?.addEventListener('click', () => {\n setConsentGranted(projectId, false);\n consentHost?.remove();\n consentHost = null;\n });\n\n document.body.appendChild(consentHost);\n}\n","/* eslint-disable no-console */\nimport type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import {\n MUSHI_INTERNAL_HEADER,\n MUSHI_INTERNAL_INIT_MARKER,\n type MushiInternalRequestKind,\n type MushiUrlMatcher,\n} from '@mushi-mushi/core';\n\nexport interface InternalRequestOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport const DEFAULT_INTERNAL_URL_MATCHERS: MushiUrlMatcher[] = [\n /\\/v1\\/sdk(?:\\/|$)/,\n /\\/v1\\/reports(?:\\/|$)/,\n /\\/v1\\/notifications(?:\\/|$)/,\n /\\/v1\\/reputation(?:\\/|$)/,\n];\n\nexport function getRequestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n return input.url;\n}\n\nexport function getInternalRequestKind(\n input: RequestInfo | URL,\n init?: RequestInit,\n): MushiInternalRequestKind | null {\n const marker = (init as (RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: MushiInternalRequestKind }) | undefined)\n ?.[MUSHI_INTERNAL_INIT_MARKER];\n if (marker) return marker;\n\n const initHeader = readHeader(init?.headers, MUSHI_INTERNAL_HEADER);\n if (initHeader) return initHeader as MushiInternalRequestKind;\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n const requestHeader = input.headers.get(MUSHI_INTERNAL_HEADER);\n if (requestHeader) return requestHeader as MushiInternalRequestKind;\n }\n\n return null;\n}\n\nexport function shouldIgnoreMushiUrl(url: string, options: InternalRequestOptions = {}): boolean {\n const matchers = [...DEFAULT_INTERNAL_URL_MATCHERS, ...(options.ignoreUrls ?? [])];\n if (matchers.some((matcher) => matchesUrl(url, matcher))) return true;\n\n const endpoint = normalizeUrlPrefix(options.apiEndpoint);\n return endpoint ? normalizeComparableUrl(url).startsWith(endpoint) : false;\n}\n\nexport function matchesUrl(url: string, matcher: MushiUrlMatcher): boolean {\n if (typeof matcher === 'string') {\n return normalizeComparableUrl(url).includes(matcher);\n }\n matcher.lastIndex = 0;\n return matcher.test(url);\n}\n\nexport function normalizeUrlPrefix(url?: string): string | null {\n if (!url) return null;\n return normalizeComparableUrl(url).replace(/\\/+$/, '');\n}\n\nexport function isLocalhostEndpoint(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost'\n || parsed.hostname === '127.0.0.1'\n || parsed.hostname === '::1'\n || parsed.hostname.endsWith('.localhost');\n } catch {\n return /\\blocalhost\\b|127\\.0\\.0\\.1/.test(url);\n }\n}\n\nfunction normalizeComparableUrl(url: string): string {\n try {\n return new URL(url, typeof location !== 'undefined' ? location.href : 'http://localhost').href;\n } catch {\n return url;\n }\n}\n\nfunction readHeader(headers: HeadersInit | undefined, name: string): string | null {\n if (!headers) return null;\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return headers.get(name);\n }\n if (Array.isArray(headers)) {\n const found = headers.find(([key]) => key.toLowerCase() === name.toLowerCase());\n return found?.[1] ?? null;\n }\n const record = headers as Record<string, string>;\n return record[name] ?? record[name.toLowerCase()] ?? null;\n}\n","import type { MushiNetworkEntry, MushiUrlMatcher } from '@mushi-mushi/core';\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from '../internal-requests';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n updateOptions(options: NetworkCaptureOptions): void;\n destroy(): void;\n}\n\nexport interface NetworkCaptureOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport function createNetworkCapture(options: NetworkCaptureOptions = {}): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n let activeOptions = options;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = getRequestUrl(input);\n const internalKind = getInternalRequestKind(input, init);\n const shouldRecord = !internalKind && !shouldIgnoreMushiUrl(url, activeOptions);\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n\n return response;\n } catch (error) {\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n }\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","import type { MushiPrivacyConfig } from '@mushi-mushi/core';\n\nexport interface ScreenshotCapture {\n take(): Promise<string | null>;\n updateOptions(options: ScreenshotCaptureOptions): void;\n}\n\nexport interface ScreenshotCaptureOptions {\n privacy?: MushiPrivacyConfig;\n}\n\nexport function createScreenshotCapture(options: ScreenshotCaptureOptions = {}): ScreenshotCapture {\n let activeOptions = options;\n\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const safeDocument = buildPrivacySafeDocument(activeOptions.privacy);\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(safeDocument)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return {\n take,\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n };\n}\n\nconst DEFAULT_REDACT_SELECTORS: readonly string[] = [\n 'input[type=\"password\"]',\n '[data-mushi-redact]',\n];\n\nfunction buildPrivacySafeDocument(privacy?: MushiPrivacyConfig): Element {\n const clone = document.documentElement.cloneNode(true) as Element;\n\n // Redact: black-out matching elements. Applied before mask/block so that\n // password fields are always blacked out even if not explicitly listed\n // in maskSelectors. Pass an empty array to `redactSelectors` to opt out.\n const redactSelectors: readonly string[] = privacy?.redactSelectors !== undefined\n ? privacy.redactSelectors\n : DEFAULT_REDACT_SELECTORS;\n\n for (const selector of redactSelectors) {\n for (const el of safeQueryAll(clone, selector)) {\n redactElement(el as HTMLElement);\n }\n }\n\n for (const selector of privacy?.blockSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n el.remove();\n }\n }\n\n for (const selector of privacy?.maskSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n maskElement(el as HTMLElement);\n }\n }\n\n return clone;\n}\n\nfunction safeQueryAll(root: Element, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction redactElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n }\n el.textContent = '';\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#000!important;color:#000!important;text-shadow:none!important;border-color:#000!important;`,\n );\n el.setAttribute('data-mushi-redacted', 'true');\n // Remove child nodes so no text nodes leak through the SVG serialiser\n while (el.firstChild) el.removeChild(el.firstChild);\n}\n\nfunction maskElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n el.setAttribute('placeholder', '••••');\n }\n el.textContent = el.children.length === 0 ? '••••' : el.textContent;\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#8f8f8f!important;color:transparent!important;text-shadow:none!important;`,\n );\n el.setAttribute('data-mushi-masked', 'true');\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\n/**\n * INP `durationThreshold` recommended by the spec — interactions shorter\n * than this are below human perception and inflate noise. 40 ms is the\n * official web-vitals default.\n */\nconst INP_DURATION_THRESHOLD_MS = 40;\n\n/**\n * Build a stable, short selector for an element so the triage UI can\n * surface \"the slow click was on <button.checkout>\" rather than just\n * \"1200 ms INP\". Mirrors the web-vitals attribution-build heuristic\n * (tag + #id + .firstClass). Does not read `value`, `aria-label`, or\n * text content; however `el.id` and `el.classList` can contain\n * application-defined identifiers (e.g. `user-123`, `order-456`).\n * Keep this in mind when reviewing collected reports for PII exposure.\n */\nfunction describeElement(target: EventTarget | null | undefined): string | undefined {\n if (!target || !(target as Element).tagName) return undefined;\n const el = target as Element;\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n const cls = el.classList && el.classList.length > 0 ? `.${el.classList[0]}` : '';\n return `${tag}${id}${cls}`;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n\n // ---------------------------------------------------------------\n // Interaction to Next Paint (INP) — a Google Core Web Vital since\n // March 2024 (replaced First Input Delay). We track the worst\n // observed interaction since SDK init and attach lightweight\n // attribution (event type, target selector, sub-phase timings) so\n // the report reads \"1200ms click on <button.checkout>\" rather than\n // a bare number. Implementation follows the official `web-vitals`\n // library's onINP algorithm:\n // 1. Group `event` entries by `interactionId`.\n // 2. Take the max-duration entry per interaction.\n // 3. Track the longest interaction overall.\n // For sites with very few interactions (typical bug-report\n // sessions: 1–10 clicks) the longest interaction IS the INP per\n // the spec's 75th-percentile rule. Extending to a full P75 buffer\n // would add ~2KB for negligible accuracy on this workload.\n // SOURCE: https://web.dev/articles/inp\n // ---------------------------------------------------------------\n try {\n const seenInteractions = new Map<number, number>();\n const inpObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceEventTiming[]) {\n const interactionId = entry.interactionId;\n if (!interactionId) continue;\n const prev = seenInteractions.get(interactionId) ?? 0;\n if (entry.duration > prev) {\n seenInteractions.set(interactionId, entry.duration);\n }\n if (entry.duration > (metrics.inp ?? 0)) {\n metrics.inp = entry.duration;\n // Sub-phase timings let consumers pinpoint whether INP was\n // dominated by input delay (e.g. a long task on the main\n // thread blocking the input), processing (slow handler), or\n // presentation (heavy paint). The web-vitals attribution\n // build computes these the same way.\n const inputDelay = entry.processingStart - entry.startTime;\n const processingDuration = entry.processingEnd - entry.processingStart;\n const presentationDelay =\n entry.startTime + entry.duration - entry.processingEnd;\n metrics.inpAttribution = {\n eventType: entry.name,\n targetSelector: describeElement(entry.target),\n inputDelay: Math.max(0, inputDelay),\n processingDuration: Math.max(0, processingDuration),\n presentationDelay: Math.max(0, presentationDelay),\n };\n }\n }\n });\n inpObserver.observe({\n type: 'event',\n // `durationThreshold` filters out fast (< 40 ms) interactions\n // that sit below human perception. Spec-recommended floor.\n durationThreshold: INP_DURATION_THRESHOLD_MS,\n buffered: true,\n } as PerformanceObserverInit);\n observers.push(inpObserver);\n } catch {\n // event-timing not supported (Safari < 16.4 falls into this branch).\n // Consumers fall back to FID via a separate first-input observer.\n }\n\n try {\n const fidObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries() as PerformanceEventTiming[]) {\n // first-input fires once. Use it as a fallback on browsers\n // that don't support event-timing INP observation (Safari\n // < 16.4). Always recorded — INP supersedes when present.\n if (metrics.fid === undefined) {\n metrics.fid = entry.processingStart - entry.startTime;\n }\n }\n });\n fidObserver.observe({ type: 'first-input', buffered: true });\n observers.push(fidObserver);\n } catch {\n // first-input not supported either — caller will see no FID/INP.\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n /**\n * Walk up the DOM until we find an ancestor with `data-testid`.\n *\n * Why ascending and not descending: testids in modern apps are placed\n * on the OUTER interactive container (\"BuyProButton\") rather than on\n * the deepest leaf the click event hit (the SVG inside the icon).\n * Walking up matches authoring intent.\n *\n * Bounded at 20 hops so a misbehaving page can't pin the SDK in a\n * pathological tree.\n */\n function findNearestTestid(el: Element | null): string | null {\n let cur: Element | null = el;\n let hops = 0;\n while (cur && hops < 20) {\n const tid = cur.getAttribute?.('data-testid');\n if (tid) return tid;\n cur = cur.parentElement;\n hops++;\n }\n return null;\n }\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n // v2 (whitepaper §4.7): the closest ancestor's `data-testid` lets the\n // server map this report → an Action node in the inventory graph\n // without a fuzzy NLP guess. We walk to the body so a deeply nested\n // span inside a button-with-testid still resolves correctly.\n nearestTestid: findNearestTestid(el) || undefined,\n route: typeof window !== 'undefined' ? window.location.pathname : undefined,\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n // Guard: ignore clicks that originated inside the Mushi widget host so\n // the user can't accidentally capture the widget panel itself.\n const path = e.composedPath ? e.composedPath() : [];\n const hitsMushiHost = path.some(\n (node) => node instanceof Element && (node as Element).id === 'mushi-mushi-widget',\n );\n if (hitsMushiHost) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiConsoleEntry, MushiNetworkEntry, MushiTimelineEntry } from '@mushi-mushi/core';\n\nconst MAX_TIMELINE_ENTRIES = 120;\n\nexport interface TimelineCapture {\n setScreen(screen: { name: string; route?: string; feature?: string }): void;\n getEntries(input?: {\n consoleLogs?: MushiConsoleEntry[] | null;\n networkLogs?: MushiNetworkEntry[] | null;\n }): MushiTimelineEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createTimelineCapture(): TimelineCapture {\n const entries: MushiTimelineEntry[] = [];\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n const handlePopState = () => recordRoute('popstate');\n const handleHashChange = () => recordRoute('hashchange');\n\n recordRoute('initial');\n\n function record(entry: MushiTimelineEntry): void {\n entries.push(entry);\n if (entries.length > MAX_TIMELINE_ENTRIES) entries.shift();\n }\n\n function recordRoute(source: string): void {\n if (typeof location === 'undefined') return;\n record({\n ts: Date.now(),\n kind: 'route',\n payload: {\n source,\n route: `${location.pathname}${location.search}${location.hash}`,\n href: location.href,\n },\n });\n }\n\n function handleClick(event: MouseEvent): void {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n const el = target.closest('button,a,[role=\"button\"],input,textarea,select,[data-mushi-track]') ?? target;\n record({\n ts: Date.now(),\n kind: 'click',\n payload: {\n tag: el.tagName.toLowerCase(),\n id: (el as HTMLElement).id || undefined,\n text: textSnippet(el),\n },\n });\n }\n\n history.pushState = function mushiPushState(this: History, ...args) {\n const result = originalPushState.apply(this, args);\n recordRoute('pushState');\n return result;\n } as typeof history.pushState;\n\n history.replaceState = function mushiReplaceState(this: History, ...args) {\n const result = originalReplaceState.apply(this, args);\n recordRoute('replaceState');\n return result;\n } as typeof history.replaceState;\n\n window.addEventListener('popstate', handlePopState);\n window.addEventListener('hashchange', handleHashChange);\n document.addEventListener('click', handleClick, true);\n\n return {\n setScreen(screen) {\n record({\n ts: Date.now(),\n kind: 'screen',\n payload: screen,\n });\n },\n getEntries(input = {}) {\n const merged = [\n ...entries,\n ...(input.consoleLogs ?? []).map((log): MushiTimelineEntry => ({\n ts: log.timestamp,\n kind: 'log',\n payload: {\n level: log.level,\n message: log.message,\n },\n })),\n ...(input.networkLogs ?? []).map((network): MushiTimelineEntry => ({\n ts: network.timestamp,\n kind: 'request',\n payload: {\n method: network.method,\n url: network.url,\n status: network.status,\n duration: network.duration,\n error: network.error,\n },\n })),\n ].sort((a, b) => a.ts - b.ts);\n return merged.slice(-MAX_TIMELINE_ENTRIES);\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', handlePopState);\n window.removeEventListener('hashchange', handleHashChange);\n document.removeEventListener('click', handleClick, true);\n },\n };\n}\n\nfunction textSnippet(el: Element): string | undefined {\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 80) : undefined;\n}\n","/**\n * Mushi Mushi v2.1 — passive inventory discovery (whitepaper §6 hybrid mode).\n *\n * What this captures\n * ──────────────────\n * - location.pathname, normalized to a route TEMPLATE (e.g.\n * /practice/abc-123 → /practice/[id]) using either an explicit list\n * of templates from the host framework's route config OR a small\n * heuristic that collapses uuid / numeric / 24-char-hex segments.\n * - document.title\n * - all `[data-testid]` values currently in the DOM\n * - the most recent N fetch/XHR paths captured by the existing\n * network capturer (we do NOT instrument fetch ourselves — we\n * borrow its observations to keep responsibility in one place)\n * - a ≤200-char DOM summary built from <h1> / <title> / <main>\n * - sanitized query-param keys (keys only, never values)\n * - a SHA-256 of (userId || sessionId) so the server can count\n * distinct users without storing identity\n *\n * What this does NOT capture\n * ──────────────────────────\n * - any other DOM content\n * - query-param VALUES, fragments, or hashes (only key names)\n * - cookies, localStorage, sessionStorage\n * - input values, focused elements, or scroll positions\n * - the user's IP or any device fingerprint (the server already\n * redacts what it gets, but we never send any)\n *\n * Throttling\n * ──────────\n * At most one emission per (route, throttleMs) window. Default 60s.\n * This keeps the ingest volume on a high-traffic SPA bounded — even\n * a customer with a million PVs/day generates at most ~1.4M rows.\n */\n\nimport type { MushiDiscoverInventoryConfig } from '@mushi-mushi/core';\n\nexport interface DiscoveryEvent {\n route: string;\n page_title: string | null;\n dom_summary: string | null;\n testids: string[];\n network_paths: string[];\n query_param_keys: string[];\n user_id_hash: string | null;\n observed_at: string;\n}\n\nexport interface DiscoveryCaptureOptions {\n config: MushiDiscoverInventoryConfig;\n /** Returns the recent fetch/XHR paths from the network capturer. */\n getRecentNetworkPaths: () => string[];\n /** Returns the current user identifier (or null) for hash input. */\n getUserId: () => string | null;\n /** Stable session id for dedup when no userId is set. */\n getSessionId: () => string;\n /** Called when a new discovery event is ready to ship. */\n onEvent: (e: DiscoveryEvent) => void;\n}\n\nexport interface DiscoveryCapture {\n destroy: () => void;\n /** Emit immediately for the current pathname. Used on init. */\n flushNow: () => void;\n}\n\nconst DEFAULT_THROTTLE_MS = 60_000;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst HEX24_RE = /^[0-9a-f]{20,}$/i;\nconst NUMERIC_RE = /^\\d+$/;\nconst SLUG_HASHY_RE = /^[a-z0-9]{16,}$/i;\n\n/**\n * Collapse a single path segment to a template placeholder when it\n * looks like an opaque identifier. We are deliberately conservative\n * — if a heuristic isn't confident, we leave the segment alone, since\n * over-collapsing is worse than under-collapsing for the proposer.\n */\nexport function normalizeSegment(seg: string): string {\n if (seg.length === 0) return seg;\n if (UUID_RE.test(seg)) return '[id]';\n if (HEX24_RE.test(seg)) return '[id]';\n if (NUMERIC_RE.test(seg)) return '[id]';\n // Heuristic: a single segment of 16+ alphanumeric chars with at least\n // one digit is almost certainly an id, not a slug. (`thai-language` →\n // keep; `sku_abc12345xyz` → collapse.)\n if (SLUG_HASHY_RE.test(seg) && /\\d/.test(seg)) return '[id]';\n return seg;\n}\n\n/**\n * Normalize a pathname to a route template, preferring an exact-match\n * against `routeTemplates` if the host has provided them.\n *\n * /practice/abc-123 + ['/practice/[id]'] → '/practice/[id]'\n * /practice/01H8H8… without templates → '/practice/[id]'\n * /tags/thai-language without templates → '/tags/thai-language'\n */\nexport function normalizeRoute(\n pathname: string,\n templates: string[] | undefined,\n): string {\n // Strip trailing slash so /a and /a/ look the same to the proposer.\n const clean = pathname.length > 1 && pathname.endsWith('/')\n ? pathname.slice(0, -1)\n : pathname;\n if (templates?.length) {\n const matched = matchTemplate(clean, templates);\n if (matched) return matched;\n }\n return '/' + clean\n .split('/')\n .filter((s) => s.length > 0)\n .map(normalizeSegment)\n .join('/');\n}\n\n/**\n * Walk the host's static route templates and pick the one whose shape\n * matches the live pathname. `[id]`-style placeholders match any\n * single segment.\n */\nfunction matchTemplate(pathname: string, templates: string[]): string | null {\n const segs = pathname.split('/').filter((s) => s.length > 0);\n // Sort longer-first so /a/b/[c] beats /a/b on a 3-segment URL.\n const sorted = [...templates].sort(\n (a, b) => b.split('/').length - a.split('/').length,\n );\n for (const tpl of sorted) {\n const tplSegs = tpl.split('/').filter((s) => s.length > 0);\n if (tplSegs.length !== segs.length) continue;\n let ok = true;\n for (let i = 0; i < tplSegs.length; i++) {\n const t = tplSegs[i]!;\n const s = segs[i]!;\n if (t.startsWith('[') && t.endsWith(']')) continue;\n if (t.startsWith(':')) continue;\n if (t === s) continue;\n ok = false;\n break;\n }\n if (ok) return '/' + tplSegs.join('/');\n }\n return null;\n}\n\nfunction readTestids(): string[] {\n if (typeof document === 'undefined') return [];\n const out = new Set<string>();\n const els = document.querySelectorAll('[data-testid]');\n for (const el of Array.from(els)) {\n const v = el.getAttribute('data-testid');\n if (v && v.length > 0 && v.length < 120) out.add(v);\n }\n return Array.from(out).sort();\n}\n\nfunction readQueryParamKeys(): string[] {\n if (typeof window === 'undefined') return [];\n try {\n const params = new URLSearchParams(window.location.search);\n const out = new Set<string>();\n params.forEach((_, key) => out.add(key));\n return Array.from(out).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Build a ≤200-char summary from the document's most prominent text.\n * We try `<h1>` first (most apps put the page heading there), fall\n * back to `<title>`, then `<main>`'s first paragraph, then null.\n */\nfunction readDomSummary(): string | null {\n if (typeof document === 'undefined') return null;\n const trim = (s: string | null | undefined) =>\n (s ?? '').replace(/\\s+/g, ' ').trim().slice(0, 200);\n const h1 = trim(document.querySelector('h1')?.textContent);\n if (h1) return h1;\n const title = trim(document.title);\n if (title) return title;\n const main = trim(document.querySelector('main')?.textContent);\n return main || null;\n}\n\n/**\n * SHA-256 (lowercase hex) of `userId || sessionId`, using the platform\n * SubtleCrypto. Falls back to `null` if crypto.subtle isn't available\n * (rare; means we won't dedupe distinct users on this client). Never\n * throws.\n */\nasync function hashUserId(input: string | null): Promise<string | null> {\n if (!input || typeof crypto === 'undefined' || !crypto.subtle) return null;\n try {\n const data = new TextEncoder().encode(input);\n const buf = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(buf);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, '0');\n }\n return hex;\n } catch {\n return null;\n }\n}\n\n/**\n * Stand up the discovery capturer. Returns a disposer.\n *\n * Implementation notes\n * ────────────────────\n * - We hook `pushState` / `replaceState` because `popstate` alone misses\n * SPA navigations triggered by frameworks calling `history.pushState`\n * directly (Next.js / React Router both do this).\n * - The first emission fires after a 100ms delay so the host app has\n * a chance to settle the new DOM before we read testids.\n * - Hash-only changes (`#section`) are intentionally ignored; they're\n * not real navigations as far as the inventory is concerned.\n */\nexport function createDiscoveryCapture(opts: DiscoveryCaptureOptions): DiscoveryCapture {\n const {\n config,\n getRecentNetworkPaths,\n getUserId,\n getSessionId,\n onEvent,\n } = opts;\n\n const throttleMs = config.throttleMs ?? DEFAULT_THROTTLE_MS;\n const captureSummary = config.captureDomSummary !== false;\n const userIdSource = config.userIdSource ?? 'auto';\n\n const lastEmittedAt = new Map<string, number>();\n let lastPath: string | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n async function emitForCurrent() {\n if (typeof window === 'undefined') return;\n const route = normalizeRoute(window.location.pathname, config.routeTemplates);\n const now = Date.now();\n const last = lastEmittedAt.get(route) ?? 0;\n if (now - last < throttleMs) return;\n lastEmittedAt.set(route, now);\n\n let userIdInput: string | null = null;\n if (userIdSource === 'auto') {\n userIdInput = getUserId() ?? getSessionId();\n } else if (userIdSource === 'session-only') {\n userIdInput = getSessionId();\n }\n\n const event: DiscoveryEvent = {\n route,\n page_title: typeof document !== 'undefined'\n ? (document.title || '').slice(0, 300) || null\n : null,\n dom_summary: captureSummary ? readDomSummary() : null,\n testids: readTestids(),\n network_paths: getRecentNetworkPaths().slice(-50),\n query_param_keys: readQueryParamKeys(),\n user_id_hash: await hashUserId(userIdInput),\n observed_at: new Date().toISOString(),\n };\n onEvent(event);\n }\n\n function scheduleEmit() {\n if (pendingTimer) return;\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void emitForCurrent();\n }, 100);\n }\n\n function onMaybeNavigation() {\n if (typeof window === 'undefined') return;\n const path = window.location.pathname + window.location.search;\n if (path === lastPath) return;\n lastPath = path;\n scheduleEmit();\n }\n\n if (typeof window === 'undefined') {\n return {\n destroy: () => undefined,\n flushNow: () => undefined,\n };\n }\n\n // Patch history.pushState / replaceState.\n const originalPush = window.history.pushState.bind(window.history);\n const originalReplace = window.history.replaceState.bind(window.history);\n const patchedPush: typeof window.history.pushState = function patched(\n ...args\n ) {\n const out = originalPush(...args);\n onMaybeNavigation();\n return out;\n };\n const patchedReplace: typeof window.history.replaceState = function patched(\n ...args\n ) {\n const out = originalReplace(...args);\n onMaybeNavigation();\n return out;\n };\n window.history.pushState = patchedPush;\n window.history.replaceState = patchedReplace;\n\n const onPop = () => onMaybeNavigation();\n window.addEventListener('popstate', onPop);\n\n // Initial emission for the landing page.\n scheduleEmit();\n\n return {\n destroy() {\n window.removeEventListener('popstate', onPop);\n // Best-effort restoration; if another piece of code patched it\n // after us, leave it alone.\n if (window.history.pushState === patchedPush) {\n window.history.pushState = originalPush;\n }\n if (window.history.replaceState === patchedReplace) {\n window.history.replaceState = originalReplace;\n }\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n lastEmittedAt.clear();\n },\n flushNow() {\n // Bypass throttle on explicit flush.\n lastEmittedAt.clear();\n void emitForCurrent();\n },\n };\n}\n\n// Pure exports for the unit tests.\nexport const __test = { matchTemplate };\n","import type { MushiSentryConfig, MushiSentryContext } from '@mushi-mushi/core';\n\n/**\n * Sentry integration — boosted 2026-05-07.\n *\n * Goal: when a host has Sentry installed (v7, v8, or v9), every Mushi\n * report carries enough trace data for the admin to pivot directly into\n * Sentry's MCP / web UI without the user manually pasting links.\n *\n * Detection strategy:\n * 1. v8/v9 expose `Sentry.lastEventId()`, `Sentry.getCurrentScope()`,\n * `Sentry.getReplay()`, `Sentry.getActiveSpan()`. The global lives\n * under `window.Sentry`; the SDK wraps internals in\n * `__SENTRY__.version === '8'` or `'9'`.\n * 2. v7 exposes `Sentry.getCurrentHub()` and writes hub state under\n * `window.__SENTRY__.hub`.\n * 3. Replay can also be on `window.__SENTRY_REPLAY__` for sites that\n * attach the replay integration manually.\n *\n * Every probe is wrapped in a `try/catch` because Sentry's APIs change\n * between point releases — a v8.13.0 method can throw \"not a function\"\n * on v8.0.0. We accept partial captures by design; the goal is \"as much\n * context as we can get\" rather than \"all or nothing\".\n */\nexport type { MushiSentryContext as SentryContext };\n\n// ---- Detection layer --------------------------------------------------------\n\ninterface SentryV8Like {\n lastEventId?: () => string | undefined;\n getCurrentScope?: () => SentryScopeLike | undefined;\n getActiveSpan?: () => SentrySpanLike | undefined;\n getRootSpan?: (span: SentrySpanLike) => SentrySpanLike | undefined;\n getReplay?: () => SentryReplayLike | undefined;\n getClient?: () => SentryClientLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryV7Like {\n getCurrentHub?: () => SentryHubLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryHubLike {\n getClient?: () => SentryClientLike | undefined;\n getScope?: () => SentryScopeLike | undefined;\n configureScope?: (cb: (scope: SentryScopeLike) => void) => void;\n}\n\ninterface SentryScopeLike {\n getLastEventId?: () => string | undefined;\n getUser?: () => Record<string, unknown> | undefined;\n getTags?: () => Record<string, string | number | boolean> | undefined;\n getTransactionName?: () => string | undefined;\n getTransaction?: () => { name?: string } | undefined;\n getSpan?: () => SentrySpanLike | undefined;\n getSession?: () => { sid?: string } | undefined;\n getBreadcrumbs?: () => Record<string, unknown>[] | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n // Internal API: most Sentry SDK versions expose breadcrumbs at\n // `_breadcrumbs` even when there's no public getter for it. We use\n // it as a last-resort fallback inside a try/catch.\n _breadcrumbs?: Record<string, unknown>[];\n}\n\ninterface SentrySpanLike {\n spanContext?: () => { traceId?: string; spanId?: string };\n // v7 stored these directly on the span object.\n traceId?: string;\n spanId?: string;\n}\n\ninterface SentryReplayLike {\n getReplayId?: () => string | undefined;\n}\n\ninterface SentryClientLike {\n getOptions?: () => { release?: string; environment?: string; dsn?: string } | undefined;\n getDsn?: () => { projectId?: string; host?: string; publicKey?: string } | undefined;\n}\n\nfunction getSentryGlobal(): SentryV8Like | SentryV7Like | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n if (w.Sentry) return w.Sentry as SentryV8Like | SentryV7Like;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getSentryReplayGlobal(): SentryReplayLike | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n return w.__SENTRY_REPLAY__ as SentryReplayLike | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectSentrySdkFamily(): MushiSentryContext['sdk'] {\n try {\n const w = globalThis as Record<string, unknown>;\n const meta = w.__SENTRY__ as { version?: string } | undefined;\n const sentry = w.Sentry as Record<string, unknown> | undefined;\n if (meta?.version === '9' || (sentry && typeof sentry.lastEventId === 'function')) {\n // v9 dropped `getCurrentHub` entirely; presence of `lastEventId`\n // as a top-level fn distinguishes v8/v9 from v7.\n return meta?.version === '9' ? 'v9' : 'v8';\n }\n if (meta?.version === '8') return 'v8';\n if (sentry && typeof (sentry as SentryV7Like).getCurrentHub === 'function') return 'v7';\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\n// ---- Public surface ---------------------------------------------------------\n\n/**\n * Snapshot the current Sentry scope. `_config` is reserved for future\n * `useReplay`/`enrichWithSeer` toggles — for now every host that has\n * Sentry available gets the full snapshot.\n *\n * `breadcrumbsLimit` defaults to 30 (Sentry's own default `maxBreadcrumbs`).\n * Callers can pass a smaller value when ingest payload size matters\n * (mobile clients on lossy networks, etc.).\n */\nexport function captureSentryContext(\n _config: MushiSentryConfig,\n options: { breadcrumbsLimit?: number } = {},\n): MushiSentryContext {\n const limit = Math.max(0, options.breadcrumbsLimit ?? 30);\n const out: MushiSentryContext = {};\n const sentry = getSentryGlobal();\n if (!sentry) return out;\n out.sdk = detectSentrySdkFamily();\n\n // 1) eventId — Sentry v8/v9 exposes a top-level `lastEventId()`. v7\n // pulls it off the active scope.\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.lastEventId === 'function') {\n out.eventId = v8.lastEventId() ?? undefined;\n } else {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n out.eventId = scope?.getLastEventId?.() ?? undefined;\n }\n } catch {\n // Swallow — different Sentry versions throw \"not a function\" on\n // arbitrary internals between point releases.\n }\n\n // 2) Scope — user / tags / transaction / breadcrumbs / session.\n let scope: SentryScopeLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getCurrentScope === 'function') {\n scope = v8.getCurrentScope();\n } else {\n const v7 = sentry as SentryV7Like;\n scope = v7.getCurrentHub?.()?.getScope?.();\n }\n } catch {\n // Sentry not available\n }\n if (scope) {\n try {\n const user = scope.getUser?.();\n if (user) {\n out.user = {\n id: typeof user.id === 'string' ? user.id : undefined,\n email: typeof user.email === 'string' ? user.email : undefined,\n username: typeof user.username === 'string' ? user.username : undefined,\n ip_address: typeof user.ip_address === 'string' ? user.ip_address : undefined,\n };\n }\n } catch {\n // Swallow — Sentry's scope methods change shape across releases.\n }\n try {\n const tags = scope.getTags?.();\n if (tags && typeof tags === 'object') {\n // Filter to scalar values — `setTag` accepts arrays in some\n // Sentry versions but our schema is scalar-only and the LLM\n // grounding relies on `key=string` shapes anyway.\n const pruned: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n pruned[k] = v;\n }\n }\n if (Object.keys(pruned).length > 0) out.tags = pruned;\n }\n } catch {\n // Swallow.\n }\n try {\n // v8 uses `getTransactionName`; v7 used `getTransaction()?.name`.\n out.transactionName =\n scope.getTransactionName?.() ?? scope.getTransaction?.()?.name ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n out.sessionId = scope.getSession?.()?.sid ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n // Public getter when present, fall back to the internal `_breadcrumbs`\n // array which has lived at the same path since Sentry 5.\n const raw = scope.getBreadcrumbs?.() ?? scope._breadcrumbs ?? [];\n if (Array.isArray(raw) && raw.length > 0) {\n const sliced = raw.slice(-limit);\n out.breadcrumbs = sliced.map((b) => {\n const r = b as Record<string, unknown>;\n return {\n timestamp:\n typeof r.timestamp === 'number'\n ? // Sentry stores breadcrumb timestamps in seconds; convert\n // to ms so the field is comparable to Mushi's own.\n r.timestamp < 1e12\n ? Math.round(r.timestamp * 1000)\n : r.timestamp\n : undefined,\n category: typeof r.category === 'string' ? r.category : undefined,\n level: typeof r.level === 'string' ? r.level : undefined,\n message: typeof r.message === 'string' ? r.message : undefined,\n type: typeof r.type === 'string' ? r.type : undefined,\n data:\n r.data && typeof r.data === 'object'\n ? (r.data as Record<string, unknown>)\n : undefined,\n };\n });\n }\n } catch {\n // Swallow.\n }\n }\n\n // 3) Trace — ask Sentry for the active span and read its trace/span ids.\n try {\n const v8 = sentry as SentryV8Like;\n let span: SentrySpanLike | undefined;\n if (typeof v8.getActiveSpan === 'function') {\n span = v8.getActiveSpan();\n } else if (scope?.getSpan) {\n span = scope.getSpan();\n }\n if (span) {\n const ctx = span.spanContext?.();\n out.traceId = ctx?.traceId ?? span.traceId ?? undefined;\n out.spanId = ctx?.spanId ?? span.spanId ?? undefined;\n }\n } catch {\n // Swallow — `getActiveSpan` errored on v8.0.0 - v8.5.0 when no\n // tracing integration was configured. Reading is best-effort.\n }\n\n // 4) Client options — release + environment + DSN-derived issue url.\n let client: SentryClientLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getClient === 'function') {\n client = v8.getClient();\n } else {\n const v7 = sentry as SentryV7Like;\n client = v7.getCurrentHub?.()?.getClient?.();\n }\n } catch {\n // Swallow.\n }\n if (client) {\n try {\n const opts = client.getOptions?.();\n if (opts?.release) out.release = opts.release;\n if (opts?.environment) out.environment = opts.environment;\n } catch {\n // Swallow.\n }\n try {\n // DSN parts — used to synthesize a deeplink to the issue.\n const dsn = client.getDsn?.();\n if (dsn?.host && dsn?.projectId && out.eventId) {\n // The org slug is not directly exposed by Sentry's DSN object;\n // we synthesize the canonical events URL which Sentry redirects\n // to the right issue. Falls back to undefined when we can't\n // construct a valid URL.\n const orgHost = dsn.host.replace(/^o\\d+\\./, '');\n out.issueUrl = `https://${orgHost}/issues/?query=${encodeURIComponent(out.eventId)}`;\n }\n } catch {\n // Swallow.\n }\n }\n\n // 5) Replay — try the modern `getReplay()` first, fall back to the\n // legacy `__SENTRY_REPLAY__` global some integrations attach manually.\n try {\n const v8 = sentry as SentryV8Like;\n const replay = v8.getReplay?.() ?? getSentryReplayGlobal();\n out.replayId = replay?.getReplayId?.() ?? undefined;\n } catch {\n // Swallow.\n }\n\n return out;\n}\n\n/**\n * Bidirectional linkage. Call this *after* a successful Mushi report\n * submission with the server-assigned report id. We drop a tag on\n * Sentry's current scope so any subsequent Sentry events from the\n * same session reference the Mushi report. We also write a\n * `mushi_report` context block that the Sentry MCP `search_events`\n * tool surfaces on the issue page.\n *\n * Best-effort and silent on failure — a Sentry that's mid-bootstrap\n * or an SDK version with a different scope API must never break a\n * report that's already been accepted by Mushi.\n */\nexport function tagSentryScope(reportId: string, options: { reportUrl?: string } = {}): void {\n const sentry = getSentryGlobal();\n if (!sentry) return;\n try {\n // v8/v9: top-level `setTag` + `setContext` write to the active scope.\n const v8 = sentry as SentryV8Like;\n if (typeof v8.setTag === 'function') {\n v8.setTag('mushi.report_id', reportId);\n if (options.reportUrl) v8.setTag('mushi.report_url', options.reportUrl);\n }\n if (typeof v8.setContext === 'function') {\n v8.setContext('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n captured_at: new Date().toISOString(),\n });\n }\n // Also drop a Sentry breadcrumb so the link is visible in the\n // breadcrumb timeline of the next Sentry event the user\n // produces, not just on the scope.\n if (typeof v8.addBreadcrumb === 'function') {\n v8.addBreadcrumb({\n category: 'mushi',\n type: 'info',\n level: 'info',\n message: `Mushi report submitted (${reportId})`,\n data: { report_id: reportId, ...(options.reportUrl ? { url: options.reportUrl } : {}) },\n });\n }\n } catch {\n // Sentry not available\n }\n\n // v7 fallback: configure the scope on the active hub.\n try {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n if (scope) {\n scope.setTag?.('mushi.report_id', reportId);\n if (options.reportUrl) scope.setTag?.('mushi.report_url', options.reportUrl);\n scope.setContext?.('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n });\n }\n } catch {\n // Swallow.\n }\n}\n\n// ---- Feedback interceptor (kept from prior revision) -----------------------\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: (formData.get('message') as string) ?? '',\n email: (formData.get('email') as string) ?? undefined,\n name: (formData.get('name') as string) ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","import type { MushiApiCascadeConfig, MushiUrlMatcher } from '@mushi-mushi/core'\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from './internal-requests'\n\nexport interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean | MushiApiCascadeConfig\n apiEndpoint?: string\n errorBoundary?: boolean\n /**\n * Beta-mode nudges. Fire when the user has been on the same route for\n * `pageDwellMs` continuous milliseconds without filing any report. Default\n * disabled because production apps usually don't want unsolicited prompts;\n * recommended only when `betaMode.enabled` is true on the widget.\n *\n * Pass `true` to use the default 5-minute threshold, or a config object\n * to override. Set to `false` (default) to disable entirely.\n */\n pageDwell?: boolean | { thresholdMs?: number; excludeRoutes?: string[] }\n /**\n * First-session welcome. Fires exactly once per user (tracked via\n * `localStorage`) `delayMs` milliseconds after `Mushi.init`. Use to\n * gently surface the bug button to new beta users so they know feedback\n * is welcome. Default disabled.\n */\n firstSession?: boolean | { delayMs?: number; storageKey?: string }\n /**\n * The project ID, used to namespace the `firstSession` localStorage key so\n * multi-tenant single-page apps don't share first-session state across\n * projects. Sourced from `MushiConfig.projectId` by the SDK.\n */\n projectId?: string\n}\n\nconst DEFAULT_EXCLUDE_ROUTES: readonly string[] = [\n '/login',\n '/logout',\n '/signup',\n '/sso/*',\n '/auth/*',\n]\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n const apiCascade = normalizeApiCascadeConfig(config.apiCascade)\n if (apiCascade.enabled) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n const [input, init] = args\n const url = getRequestUrl(input)\n const ignoreFailure = Boolean(getInternalRequestKind(input, init))\n || shouldIgnoreMushiUrl(url, {\n apiEndpoint: config.apiEndpoint,\n ignoreUrls: apiCascade.ignoreUrls,\n })\n\n try {\n const res = await origFetch.apply(this, args)\n if (!ignoreFailure && !res.ok && res.status >= 400) {\n recordApiFailure(failedRequests, callbacks)\n }\n return res\n } catch (err) {\n if (!ignoreFailure) recordApiFailure(failedRequests, callbacks)\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Page Dwell (beta-feedback nudge) ---\n // Tracks continuous time on the same `location.pathname`. Resets on every\n // navigation (pushState/replaceState/popstate). Auth routes are excluded by\n // default so users are never prompted during login/signup flows.\n const pageDwellEnabled = config.pageDwell === true\n || (typeof config.pageDwell === 'object' && config.pageDwell !== null)\n if (pageDwellEnabled && typeof window !== 'undefined') {\n const dwellCfg = typeof config.pageDwell === 'object' ? config.pageDwell ?? {} : {}\n const thresholdMs = dwellCfg.thresholdMs || 5 * 60 * 1000\n const excludeRoutes: readonly string[] =\n dwellCfg.excludeRoutes !== undefined ? dwellCfg.excludeRoutes : DEFAULT_EXCLUDE_ROUTES\n let timer: ReturnType<typeof setTimeout> | null = null\n let lastPath = window.location?.pathname ?? ''\n\n function isExcluded(path: string): boolean {\n return excludeRoutes.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return path.startsWith(pattern.slice(0, -2))\n }\n return path === pattern || path.startsWith(pattern + '/')\n })\n }\n\n function fire(): void {\n const path = window.location?.pathname ?? ''\n if (isExcluded(path)) return\n callbacks.onTrigger('page_dwell', { thresholdMs, path })\n }\n function arm(): void {\n if (timer) clearTimeout(timer)\n const path = window.location?.pathname ?? ''\n if (!isExcluded(path)) {\n timer = setTimeout(fire, thresholdMs)\n }\n }\n function reset(): void {\n const path = window.location?.pathname ?? ''\n if (path !== lastPath) {\n lastPath = path\n arm()\n }\n }\n arm()\n\n // Patch History API to detect SPA navigations. Most SPAs use\n // pushState/replaceState; popstate covers back/forward.\n const history = window.history\n const origPush = history?.pushState\n const origReplace = history?.replaceState\n if (history && origPush && origReplace) {\n history.pushState = function (...args) {\n const result = origPush.apply(this, args)\n reset()\n return result\n }\n history.replaceState = function (...args) {\n const result = origReplace.apply(this, args)\n reset()\n return result\n }\n }\n const onPop = (): void => reset()\n window.addEventListener('popstate', onPop)\n cleanups.push(() => {\n if (timer) clearTimeout(timer)\n window.removeEventListener('popstate', onPop)\n if (history && origPush) history.pushState = origPush\n if (history && origReplace) history.replaceState = origReplace\n })\n }\n\n // --- First Session Welcome ---\n // Beta apps benefit from a single, well-timed \"feedback is welcome\"\n // nudge for new visitors. We persist a flag in localStorage so we only\n // fire it once per user, not once per tab/session. Cooldown + suppression\n // are still enforced by the ProactiveManager downstream.\n //\n // The storage key is project-scoped by default so multi-tenant SPAs\n // (e.g. different projects in the same domain) don't share the \"already\n // shown\" flag. Pass an explicit `storageKey` to override.\n const firstSessionEnabled = config.firstSession === true\n || (typeof config.firstSession === 'object' && config.firstSession !== null)\n if (firstSessionEnabled && typeof window !== 'undefined') {\n const opts = typeof config.firstSession === 'object' ? config.firstSession ?? {} : {}\n const delayMs = opts.delayMs ?? 45 * 1000\n const storageKey = opts.storageKey\n ?? (config.projectId ? `mushi:${config.projectId}:firstSessionShown` : 'mushi:firstSessionShown')\n\n let alreadyShown = false\n try { alreadyShown = window.localStorage?.getItem(storageKey) === '1' }\n catch { /* localStorage unavailable */ }\n\n if (!alreadyShown) {\n const timer = setTimeout(() => {\n try { window.localStorage?.setItem(storageKey, '1') } catch { /* noop */ }\n callbacks.onTrigger('first_session', { delayMs })\n }, delayMs)\n cleanups.push(() => clearTimeout(timer))\n }\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n\nfunction normalizeApiCascadeConfig(\n config: boolean | MushiApiCascadeConfig | undefined,\n): Required<Pick<MushiApiCascadeConfig, 'enabled'>> & { ignoreUrls: MushiUrlMatcher[] } {\n if (config === false) return { enabled: false, ignoreUrls: [] }\n if (config && typeof config === 'object') {\n return {\n enabled: config.enabled !== false,\n ignoreUrls: config.ignoreUrls ?? [],\n }\n }\n return { enabled: true, ignoreUrls: [] }\n}\n\nfunction recordApiFailure(failedRequests: number[], callbacks: ProactiveTriggerCallbacks): void {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","declare const __MUSHI_SDK_VERSION__: string | undefined;\n\nexport const MUSHI_SDK_PACKAGE = '@mushi-mushi/web';\nexport const MUSHI_SDK_VERSION =\n typeof __MUSHI_SDK_VERSION__ === 'string' && __MUSHI_SDK_VERSION__\n ? __MUSHI_SDK_VERSION__\n : '0.7.0';\n","import {\n type MushiConfig,\n type MushiWidgetConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiRuntimeSdkConfig,\n type MushiSdkVersionInfo,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n type MushiDiagnosticsResult,\n DEFAULT_API_ENDPOINT,\n MUSHI_INTERNAL_INIT_MARKER,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n createBreadcrumbBuffer,\n type BreadcrumbBuffer,\n normaliseThrown,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport { exposeMarketingRecorder } from './marketing-recorder';\nimport {\n initRewards,\n updateRewardsUser,\n enqueue as enqueueActivity,\n getTier as getRewardsTier,\n type RewardsContext,\n} from './rewards';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n createTimelineCapture,\n createDiscoveryCapture,\n type DiscoveryCapture,\n} from './capture';\nimport { captureSentryContext, tagSentryScope } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\nimport { isLocalhostEndpoint } from './internal-requests';\nimport { MUSHI_SDK_PACKAGE, MUSHI_SDK_VERSION } from './version';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n\n static diagnose(): Promise<MushiDiagnosticsResult> {\n return instance?.diagnose() ?? diagnoseWithoutInstance();\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const bootstrapConfig = applyPresetConfig(config);\n let activeConfig: MushiConfig = bootstrapConfig;\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: bootstrapConfig.projectId,\n apiKey: bootstrapConfig.apiKey,\n ...(bootstrapConfig.apiEndpoint ? { apiEndpoint: bootstrapConfig.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(bootstrapConfig.preFilter);\n const offlineQueue = createOfflineQueue(bootstrapConfig.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n\n // Apply the same scrubber that runs over `description` to the\n // observability surfaces (breadcrumbs, tags, sentry context) right\n // before they leave the SDK. The buffer/sentry layers are kept\n // pristine so `getBreadcrumbs()` returns the host's own values; this\n // pass only mutates the snapshot that goes on the wire.\n function scrubBreadcrumbsForWire<T extends { message?: string; data?: Record<string, unknown> }>(\n crumbs: T[],\n ): T[] {\n return crumbs.map((c) => {\n const next: T = { ...c };\n if (typeof c.message === 'string') {\n next.message = piiScrubber.scrub(c.message);\n }\n if (c.data && typeof c.data === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(c.data)) {\n cleaned[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n next.data = cleaned;\n }\n return next;\n });\n }\n function scrubTagsForWire(\n tags: Record<string, string | number | boolean> | undefined,\n ): Record<string, string | number | boolean> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n out[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n return out;\n }\n\n let consoleCap: ReturnType<typeof createConsoleCapture> | null = null;\n let networkCap: ReturnType<typeof createNetworkCapture> | null = null;\n let perfCap: ReturnType<typeof createPerformanceCapture> | null = null;\n let screenshotCap: ReturnType<typeof createScreenshotCapture> | null = null;\n let elementSelector: ReturnType<typeof createElementSelector> | null = null;\n let discoveryCap: DiscoveryCapture | null = null;\n const timelineCap = createTimelineCapture();\n let widget!: MushiWidget;\n\n function syncCaptureModules() {\n if (activeConfig.capture?.console !== false) {\n consoleCap ??= createConsoleCapture();\n } else {\n consoleCap?.destroy();\n consoleCap = null;\n }\n\n if (activeConfig.capture?.network !== false) {\n const networkOptions = {\n apiEndpoint: resolveApiEndpoint(activeConfig),\n ignoreUrls: activeConfig.capture?.ignoreUrls,\n };\n if (networkCap) {\n networkCap.updateOptions(networkOptions);\n } else {\n networkCap = createNetworkCapture(networkOptions);\n }\n } else {\n networkCap?.destroy();\n networkCap = null;\n }\n\n if (activeConfig.capture?.performance !== false) {\n perfCap ??= createPerformanceCapture();\n } else {\n perfCap?.destroy();\n perfCap = null;\n }\n\n if (activeConfig.capture?.screenshot !== 'off') {\n const screenshotOptions = { privacy: activeConfig.privacy };\n if (screenshotCap) {\n screenshotCap.updateOptions(screenshotOptions);\n } else {\n screenshotCap = createScreenshotCapture(screenshotOptions);\n }\n } else {\n screenshotCap = null;\n }\n if (!screenshotCap) pendingScreenshot = null;\n widget.setAllowScreenshotRemove(activeConfig.privacy?.allowUserRemoveScreenshot !== false);\n\n if (activeConfig.capture?.elementSelector !== false) {\n elementSelector ??= createElementSelector();\n } else {\n elementSelector?.deactivate();\n elementSelector = null;\n pendingElement = null;\n }\n\n // Mushi v2.1: passive inventory discovery. Default OFF — only stand\n // up when the host explicitly opts in. We deliberately re-create the\n // capturer when the config changes (rather than mutating it) so the\n // route-template list and throttle window are picked up cleanly.\n const discoveryRaw = activeConfig.capture?.discoverInventory;\n const discoveryConfig =\n discoveryRaw === true\n ? {}\n : discoveryRaw && typeof discoveryRaw === 'object'\n ? discoveryRaw\n : null;\n const discoveryEnabled =\n discoveryConfig != null && discoveryConfig.enabled !== false;\n if (discoveryEnabled) {\n discoveryCap?.destroy();\n discoveryCap = createDiscoveryCapture({\n config: discoveryConfig!,\n getRecentNetworkPaths: () => {\n if (!networkCap) return [];\n return networkCap\n .getEntries()\n .map((e) => {\n try {\n const u = new URL(e.url, typeof window !== 'undefined' ? window.location.href : 'http://localhost');\n // Only same-origin or otherwise meaningful paths — skip\n // tracking pixels and the Mushi ingest endpoint itself.\n if (u.host && typeof window !== 'undefined' && u.host !== window.location.host) return null;\n return u.pathname;\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p != null && p.length > 0 && p.length < 200);\n },\n getUserId: () => userInfo?.id ?? null,\n getSessionId,\n onEvent: (event) => {\n // Best-effort; never throw, never block.\n void apiClient\n .postDiscoveryEvent({\n ...event,\n sdk_version: MUSHI_SDK_VERSION,\n })\n .catch((err) => {\n log.debug('discovery emit failed', { err: String(err) });\n });\n },\n });\n } else {\n discoveryCap?.destroy();\n discoveryCap = null;\n }\n }\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n let runtimeConfigLoaded = false;\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n // Sticky tags applied to every subsequent report. Cleared by\n // `clearTag()` (single key) or `clearTag()` with no args (all keys).\n // We coerce to scalar values at insert time so the wire format is\n // already canonical when the report serialises.\n const stickyTags: Record<string, string | number | boolean> = {};\n // Breadcrumb ring buffer — Sentry-grade observability surface that\n // works whether or not the host has Sentry installed. Auto-populated\n // by SDK lifecycle events (`init` / `report:opened` / `report:sent`),\n // route changes, console errors, and `[data-testid]` clicks. Hosts\n // can also call `Mushi.addBreadcrumb()` directly.\n const breadcrumbs: BreadcrumbBuffer = createBreadcrumbBuffer({ max: 50 });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: 'Mushi SDK init',\n data: { projectId: bootstrapConfig.projectId, sdkVersion: MUSHI_SDK_VERSION },\n });\n // Auto-breadcrumb teardown handles. Stored at module scope so\n // `destroy()` can detach them cleanly — leaks here would tail every\n // re-init in HMR'd dev sessions.\n let detachAutoBreadcrumbs: (() => void) | null = null;\n detachAutoBreadcrumbs = installAutoBreadcrumbs(breadcrumbs);\n widget = new MushiWidget(bootstrapConfig.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n const outcome = await submitReport(category, description, intent);\n // Surface the server-confirmed id back to the widget so the\n // success step renders a real receipt rather than a fake stamp.\n // `undefined` happens when the pre-filter/rate-limiter blocked\n // the report — degrade to the \"queued offline\" copy so the user\n // still sees acknowledgement instead of a silent close.\n return outcome ?? { reportId: null, queuedOffline: true };\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap || activeConfig.capture?.screenshot === 'off') return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onScreenshotRemove: () => {\n log.debug('Screenshot attachment removed');\n pendingScreenshot = null;\n widget.setScreenshotAttached(false);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector || activeConfig.capture?.elementSelector === false) return;\n log.debug('Element selector activated');\n widget.setElementCapturing(true);\n widget.hidePanel();\n try {\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n } else {\n widget.setElementCapturing(false);\n }\n } finally {\n widget.showPanel();\n }\n },\n async onReporterReportsRequest() {\n const result = await apiClient.listReporterReports(getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load reports');\n return result.data?.reports ?? [];\n },\n async onReporterCommentsRequest(reportId) {\n const result = await apiClient.listReporterComments(reportId, getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load thread');\n return result.data?.comments ?? [];\n },\n async onReporterReply(reportId, body) {\n const result = await apiClient.replyToReporterReport(reportId, getReporterToken(), body);\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not send reply');\n },\n }, MUSHI_SDK_VERSION);\n syncCaptureModules();\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = activeConfig.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true\n || Boolean(proactiveCfg.pageDwell)\n || Boolean(proactiveCfg.firstSession));\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n // First-session welcome bypasses the category step and just\n // pulses the bug button — the user hasn't expressed intent yet,\n // so opening the full reporter would be aggressive.\n if (type === 'first_session') {\n widget.pulseTrigger?.();\n } else {\n widget.open();\n }\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n apiEndpoint: resolveApiEndpoint(activeConfig),\n errorBoundary: proactiveCfg?.errorBoundary,\n pageDwell: proactiveCfg?.pageDwell,\n firstSession: proactiveCfg?.firstSession,\n projectId: bootstrapConfig.projectId,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n pageDwell: Boolean(proactiveCfg?.pageDwell),\n firstSession: Boolean(proactiveCfg?.firstSession),\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n function applyRuntimeConfig(runtime: MushiRuntimeSdkConfig) {\n runtimeConfigLoaded = true;\n if (runtime.enabled === false) {\n activeConfig = bootstrapConfig;\n clearCachedRuntimeConfig(config.projectId);\n syncCaptureModules();\n widget.updateConfig(activeConfig.widget);\n log.debug('Runtime SDK config disabled; using bootstrap config', { version: runtime.version });\n return;\n }\n activeConfig = mergeRuntimeConfig(activeConfig, runtime);\n syncCaptureModules();\n if (runtime.widget) widget.updateConfig(activeConfig.widget);\n log.debug('Applied runtime SDK config', { version: runtime.version });\n }\n\n if (shouldUseRuntimeConfig(config)) {\n const cached = readCachedRuntimeConfig(config.projectId);\n if (cached) applyRuntimeConfig(cached);\n apiClient.getSdkConfig().then((result) => {\n if (result.ok && result.data) {\n cacheRuntimeConfig(config.projectId, result.data);\n applyRuntimeConfig(result.data);\n } else if (result.error) {\n log.debug('Runtime SDK config unavailable', result.error);\n }\n }).catch((err) => {\n log.debug('Runtime SDK config fetch failed', { error: err instanceof Error ? err.message : String(err) });\n });\n } else if (config.runtimeConfig !== false && isLocalhostEndpoint(resolveApiEndpoint(config))) {\n log.debug('Runtime SDK config skipped for localhost apiEndpoint; set runtimeConfig: true to force it');\n }\n\n void checkSdkFreshness();\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function checkSdkFreshness(): Promise<void> {\n if (activeConfig.widget?.outdatedBanner === 'off') return;\n const cached = readCachedSdkVersion(MUSHI_SDK_PACKAGE);\n if (cached) applySdkFreshness(cached);\n const result = await apiClient.getLatestSdkVersion(MUSHI_SDK_PACKAGE);\n if (!result.ok || !result.data) return;\n cacheSdkVersion(MUSHI_SDK_PACKAGE, result.data);\n applySdkFreshness(result.data);\n }\n\n function applySdkFreshness(info: MushiSdkVersionInfo): void {\n const latest = info.latest;\n const outdated = Boolean(latest && isVersionOlder(MUSHI_SDK_VERSION, latest));\n if (!outdated && !info.deprecated) return;\n const message = info.deprecationMessage ?? (outdated ? `Update ${MUSHI_SDK_PACKAGE} to ${latest}.` : null);\n log.warn('Mushi SDK is outdated', {\n package: MUSHI_SDK_PACKAGE,\n current: MUSHI_SDK_VERSION,\n latest,\n deprecated: info.deprecated,\n message,\n });\n if (activeConfig.widget?.outdatedBanner !== 'console-only') {\n widget.setSdkFreshness({\n latest,\n current: MUSHI_SDK_VERSION,\n deprecated: info.deprecated,\n message,\n });\n }\n }\n\n async function submitReport(\n category: MushiReportCategory,\n description: string,\n intent?: string,\n ): Promise<{ reportId: string | null; queuedOffline?: boolean } | undefined> {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return undefined;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return undefined;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return undefined;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n const consoleLogs = activeConfig.capture?.console === false ? undefined : consoleCap?.getEntries();\n const networkLogs = activeConfig.capture?.network === false ? undefined : networkCap?.getEntries();\n\n // Snapshot breadcrumbs *before* we add the lifecycle \"submitting\"\n // beat — we want the report's timeline to end with the user-action\n // event, not with our own bookkeeping. We then add the submit\n // breadcrumb so it shows up on the *next* report (typical pattern\n // in production: a user files two reports in close succession,\n // and the second carries a \"previous report submitted\" hint).\n const reportBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n const stickyTagSnapshot = scrubTagsForWire(\n Object.keys(stickyTags).length > 0 ? { ...stickyTags } : undefined,\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs,\n networkLogs,\n performanceMetrics: activeConfig.capture?.performance === false ? undefined : perfCap?.getMetrics(),\n timeline: timelineCap.getEntries({ consoleLogs, networkLogs }),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n // Top-level Sentry-grade observability fields. Breadcrumbs are\n // surfaced separately from `consoleLogs` because they're the\n // higher-signal \"what just happened\" trail (vs. the high-volume\n // raw console mirror), and the admin /reports drawer shows them\n // in different panes.\n ...(reportBreadcrumbs.length > 0 ? { breadcrumbs: reportBreadcrumbs } : {}),\n ...(stickyTagSnapshot ? { tags: stickyTagSnapshot } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report submitting (${category})`,\n data: { reportId: report.id, category },\n });\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n // Sentry-spec-1.0 `beforeSendFeedback` hook (introduced in v1.4):\n // last chance for the host app to mutate or drop the report.\n // Errors and timeouts ship the *unmodified* report so a buggy hook\n // never silently swallows user feedback. Returning `null` drops\n // the report — emits no `report:sent` and no `report:failed`.\n let finalReport: MushiReport = report;\n if (config.beforeSendFeedback) {\n try {\n const hookResult = await Promise.race([\n Promise.resolve(config.beforeSendFeedback(report)),\n // 2s timeout — async hooks must not block the user's \"submit\"\n // for longer than the network would. Falls back to original.\n new Promise<MushiReport>((resolve) =>\n setTimeout(() => resolve(report), 2000),\n ),\n ]);\n if (hookResult === null) {\n log.info('Report dropped by beforeSendFeedback hook', { reportId: report.id });\n return;\n }\n finalReport = hookResult;\n } catch (err) {\n log.warn('beforeSendFeedback hook threw — sending unmodified report', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n emit('report:submitted', { reportId: finalReport.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(finalReport);\n log.info('Offline — report queued', { reportId: finalReport.id });\n emit('report:queued', { reportId: finalReport.id });\n return;\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n // Outcome propagates back to the widget so the success step can\n // render the \"Queued offline\" receipt rather than implying the\n // report already landed.\n return { reportId: null, queuedOffline: true };\n }\n\n const result = await apiClient.submitReport(finalReport);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n // If the server response includes a Cursor agent dispatch (classify-report\n // triggered a cursor_cloud fix via the autofix_agent setting), emit\n // `report:dispatched` so the host page can show a toast notification.\n if ((result.data as Record<string, unknown> | undefined)?.cursorAgentId) {\n const d = result.data as { reportId?: string; cursorAgentId?: string; fixId?: string };\n emit('report:dispatched', { reportId: d.reportId, agentId: d.cursorAgentId, fixId: d.fixId });\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report sent (${result.data?.reportId ?? report.id})`,\n });\n // Award points for the report submission. This is client-side so\n // the activity batch is flushed on the next tick with the correct\n // user_id already set via identify(). The server awards 50 pts by\n // default (configurable via the rewards rules dashboard).\n enqueueActivity({\n action: 'report_submit',\n metadata: { category, reportId: result.data?.reportId ?? report.id },\n });\n // Bidirectional Sentry linkage. After a successful submit we tag\n // Sentry's current scope so any subsequent Sentry events show\n // the Mushi correlation (`mushi.report_id` tag) and the issue\n // page picks up a `mushi_report` context block. Wrapped in\n // `try/catch` because Sentry's globals can be in a half-bootstrap\n // state immediately after page load.\n try {\n if (config.sentry && result.data?.reportId) {\n tagSentryScope(result.data.reportId);\n }\n } catch {\n // Swallow — never break a successful submit because Sentry's\n // scope API moved between point releases.\n }\n } else {\n log.warn('Report failed, queuing for retry', { reportId: finalReport.id, error: result.error });\n await offlineQueue.enqueue(finalReport);\n emit('report:failed', { reportId: finalReport.id, error: result.error });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'warning',\n message: `Mushi report queued for retry (${finalReport.id})`,\n });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n // Returning the server-confirmed id lets the widget render the\n // two-way receipt (Receipt #abc12345 + Track on Mushi link).\n // When the submit failed and was queued for retry, return the\n // queued-offline outcome so the widget can degrade gracefully.\n if (result?.ok) {\n const serverId = (result.data?.reportId as string | undefined) ?? report.id;\n return { reportId: serverId, queuedOffline: false };\n }\n return { reportId: null, queuedOffline: true };\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n setScreen(screen) {\n timelineCap.setScreen(screen);\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n openWith(category) {\n widget.open({ category });\n },\n\n show() {\n widget.showTrigger();\n },\n\n hide() {\n widget.hideTrigger();\n },\n\n attachTo(selectorOrElement, options) {\n return widget.attachTo(selectorOrElement, options);\n },\n\n setTrigger(trigger) {\n widget.setTrigger(trigger);\n },\n\n close() {\n widget.close();\n },\n\n updateConfig(runtimeConfig) {\n applyRuntimeConfig(runtimeConfig);\n },\n\n diagnose() {\n return runDiagnostics({\n apiEndpoint: resolveApiEndpoint(activeConfig),\n widgetMounted: widget.getIsMounted(),\n runtimeConfigLoaded,\n captureScreenshotAvailable: screenshotCap !== null,\n captureNetworkIntercepting: networkCap !== null,\n });\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n timelineCap.destroy();\n discoveryCap?.destroy();\n discoveryCap = null;\n offlineQueue.stopAutoSync();\n detachAutoBreadcrumbs?.();\n detachAutoBreadcrumbs = null;\n breadcrumbs.clear();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const captureBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n // Sticky tags merge with per-call `input.tags` — call-site wins\n // when both supply the same key. Keeps adapters that already\n // pass per-event tags compatible while letting hosts set\n // app-wide defaults via `setTag()`. We then run the same\n // PII scrubber over string values so secrets a host accidentally\n // shoved into a tag (e.g. `Mushi.setTag('email', user.email)`)\n // never hit the wire.\n const mergedTags = scrubTagsForWire(\n Object.keys(stickyTags).length === 0 && !input.tags\n ? undefined\n : { ...stickyTags, ...(input.tags ?? {}) },\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n timeline: timelineCap.getEntries(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n ...(captureBreadcrumbs.length > 0 ? { breadcrumbs: captureBreadcrumbs } : {}),\n ...(mergedTags && Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n try {\n if (config.sentry && res.data?.reportId) tagSentryScope(res.data.reportId);\n } catch {\n // Swallow.\n }\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n async captureException(error, options) {\n const normalised = normaliseThrown(error);\n // Drop a breadcrumb at the call site so this exception shows up\n // in Mushi's own timeline even if the report itself is rate-limited\n // or rejected by the pre-filter — losing the report shouldn't lose\n // the trace.\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'error',\n message: `Mushi.captureException(${normalised.name}): ${normalised.message}`,\n ...(normalised.stack ? { data: { stack: normalised.stack.slice(0, 500) } } : {}),\n });\n const description =\n options?.description?.trim() ||\n `${normalised.name}: ${normalised.message}` ||\n 'Uncaught exception';\n return sdk.captureEvent({\n description,\n category: options?.category ?? 'bug',\n severity: options?.severity ?? 'high',\n ...(options?.component ? { component: options.component } : {}),\n ...(options?.tags ? { tags: options.tags } : {}),\n source: options?.source ?? 'captureException',\n error: {\n name: normalised.name,\n message: normalised.message,\n ...(normalised.stack ? { stack: normalised.stack } : {}),\n },\n metadata: {\n ...(options?.metadata ?? {}),\n ...(normalised.cause ? { cause: normalised.cause } : {}),\n },\n });\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi.identify(${userId})`,\n });\n\n // Wire rewards program when enabled\n if (activeConfig.rewards?.enabled) {\n const rewardsCtx: RewardsContext = {\n client: apiClient,\n config: activeConfig.rewards,\n projectId: bootstrapConfig.projectId,\n userId,\n traits: traits\n ? { email: traits.email as string | undefined, name: traits.name as string | undefined, provider: traits.provider as string | undefined }\n : undefined,\n };\n if (userInfo.id === userId) {\n // First identify → full init\n initRewards(rewardsCtx);\n } else {\n // Already initialized; just update user context\n updateRewardsUser(userId, rewardsCtx.traits);\n }\n\n // Fetch reputation to hydrate the in-widget rewards nudge and success\n // points display. Fire-and-forget: never blocks the identify call.\n if (activeConfig.rewards.showInWidget !== false) {\n void apiClient.getMyPoints(userId).then((res) => {\n if (!res.ok) return;\n const d = res.data as {\n total_points?: number;\n tier?: { slug?: string; display_name?: string; points_threshold?: number } | null;\n next_tier?: { display_name?: string; points_threshold?: number } | null;\n report_submit_pts?: number;\n };\n widget.setRewardsState({\n tier: d.tier\n ? { slug: d.tier.slug ?? 'free', displayName: d.tier.display_name ?? 'Free', pointsThreshold: d.tier.points_threshold ?? 0 }\n : null,\n nextTier: d.next_tier\n ? { displayName: d.next_tier.display_name ?? '', pointsThreshold: d.next_tier.points_threshold ?? 0 }\n : null,\n totalPoints: d.total_points ?? 0,\n pointsForReport: d.report_submit_pts ?? 50,\n });\n }).catch(() => { /* non-fatal */ });\n }\n }\n },\n\n addBreadcrumb(crumb) {\n breadcrumbs.add(crumb);\n },\n\n getBreadcrumbs() {\n return breadcrumbs.getAll();\n },\n\n setTag(key, value) {\n if (typeof key !== 'string' || key.length === 0) return;\n stickyTags[key] = value;\n },\n\n setTags(tags) {\n if (!tags || typeof tags !== 'object') return;\n for (const [k, v] of Object.entries(tags)) {\n if (typeof k === 'string' && k.length > 0) {\n stickyTags[k] = v;\n }\n }\n },\n\n clearTag(key) {\n if (typeof key === 'string' && key.length > 0) {\n delete stickyTags[key];\n return;\n }\n // No-arg variant: clear every sticky tag (used in test teardown\n // and on app-level \"logout\" handlers).\n for (const k of Object.keys(stickyTags)) delete stickyTags[k];\n },\n\n // ─── Rewards program (P1) ──────────────────────────────────\n\n async getReputation() {\n if (!userInfo?.id) return null;\n const res = await apiClient.getMyPoints(userInfo.id);\n if (!res.ok) return null;\n return {\n totalPoints: (res.data as { total_points: number }).total_points ?? 0,\n points30d: (res.data as { points_30d: number }).points_30d ?? 0,\n reputation: 1.0,\n confirmedBugs: 0,\n totalReports: 0,\n };\n },\n\n async getTier() {\n if (!userInfo?.id) return null;\n return getRewardsTier(userInfo.id);\n },\n\n recordActivity(action, metadata) {\n if (!activeConfig.rewards?.enabled) return;\n enqueueActivity({ action, metadata });\n },\n\n pulseTrigger() {\n widget.pulseTrigger?.();\n },\n };\n\n if (typeof globalThis !== 'undefined' && (bootstrapConfig.debug ?? false)) {\n exposeMarketingRecorder(widget);\n }\n\n // Sentry-spec-1.0 `onCrashedLastRun` (introduced in v1.4):\n // detect whether the *previous* tab session ended cleanly. We mark a\n // sentinel in localStorage on init and clear it on `pagehide`. If we\n // see a stale sentinel on the next init, the previous session ended\n // without a clean unload → host app may want to surface \"Tell us\n // what went wrong?\". We never auto-open the widget; copy + timing\n // are the host's call.\n // Wrapped in try/catch because privacy-mode browsers throw on every\n // localStorage access and we must not break SDK init.\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const SENTINEL_KEY = 'mushi:last-run';\n let crashed: boolean | null = null;\n try {\n const previous = localStorage.getItem(SENTINEL_KEY);\n // First-ever load (or cleared storage): null. Otherwise, an\n // `unfinished` value means the prior tab didn't reach pagehide.\n crashed = previous === null ? null : previous === 'unfinished';\n localStorage.setItem(SENTINEL_KEY, 'unfinished');\n } catch {\n // localStorage unavailable (Safari private mode, file://). Hook\n // gets `null` so the host knows we couldn't determine state.\n crashed = null;\n }\n try {\n // pagehide fires on tab close, navigation, and bfcache freeze.\n // It's the only reliably-fired end-of-session event in 2026 —\n // browsers stopped guaranteeing `beforeunload`/`unload` years\n // ago. Listener is `{ once: false }` because bfcache may resume\n // the same page later and we want a fresh sentinel each time.\n window.addEventListener('pagehide', () => {\n try { localStorage.setItem(SENTINEL_KEY, 'clean'); } catch { /* noop */ }\n });\n } catch { /* noop — addEventListener never actually throws on Window */ }\n if (typeof bootstrapConfig.onCrashedLastRun === 'function') {\n try {\n bootstrapConfig.onCrashedLastRun(crashed as boolean);\n } catch (err) {\n log.warn('onCrashedLastRun hook threw', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n return sdk;\n}\n\nfunction mergeRuntimeConfig(config: MushiConfig, runtime: MushiRuntimeSdkConfig): MushiConfig {\n const nativeTrigger = runtime.native?.triggerMode;\n // The server returns `launcher` for the new field (backwards-compat with\n // the old `trigger` field that only tracked `auto`). Prefer `launcher`.\n const runtimeLauncher = (runtime.widget as Record<string, unknown>)?.launcher as string | undefined;\n const widgetTrigger =\n runtimeLauncher ??\n runtime.widget?.trigger ??\n (nativeTrigger === 'none' || nativeTrigger === 'shake' ? 'manual' : undefined);\n // Build bannerConfig from flat runtime fields when present.\n const runtimeBannerVariant = (runtime.widget as Record<string, unknown>)?.bannerVariant as string | undefined;\n const runtimeBannerPosition = (runtime.widget as Record<string, unknown>)?.bannerPosition as string | undefined;\n const runtimeBannerBugCta = (runtime.widget as Record<string, unknown>)?.bannerBugCta as string | null | undefined;\n const runtimeBannerFeatureCta = (runtime.widget as Record<string, unknown>)?.bannerFeatureCta as boolean | undefined;\n const derivedBannerConfig =\n runtimeBannerVariant || runtimeBannerPosition || runtimeBannerBugCta != null || runtimeBannerFeatureCta != null\n ? {\n ...(config.widget?.bannerConfig ?? {}),\n ...(runtimeBannerVariant ? { variant: runtimeBannerVariant as 'neon' | 'brand' | 'subtle' } : {}),\n ...(runtimeBannerPosition ? { position: runtimeBannerPosition as 'top' | 'bottom' } : {}),\n ...(runtimeBannerBugCta != null ? { bugCta: runtimeBannerBugCta ?? undefined } : {}),\n ...(runtimeBannerFeatureCta != null ? { featureCta: runtimeBannerFeatureCta } : {}),\n }\n : undefined;\n return {\n ...config,\n widget: {\n ...config.widget,\n ...runtime.widget,\n ...(widgetTrigger ? { trigger: widgetTrigger as MushiWidgetConfig['trigger'] } : {}),\n ...(derivedBannerConfig ? { bannerConfig: derivedBannerConfig } : {}),\n // betaMode is local-only: set by the host app, not the dashboard.\n // Restore it after the runtime spread so it is never silently cleared.\n ...(config.widget?.betaMode ? { betaMode: config.widget.betaMode } : {}),\n },\n capture: {\n ...config.capture,\n ...runtime.capture,\n },\n privacy: {\n ...config.privacy,\n },\n };\n}\n\nfunction applyPresetConfig(config: MushiConfig): MushiConfig {\n if (!config.preset) return config;\n const preset = presetDefaults(config.preset);\n return {\n ...config,\n widget: {\n ...preset.widget,\n ...config.widget,\n },\n capture: {\n ...preset.capture,\n ...config.capture,\n },\n proactive: {\n ...preset.proactive,\n ...config.proactive,\n cooldown: {\n ...preset.proactive?.cooldown,\n ...config.proactive?.cooldown,\n },\n },\n };\n}\n\nfunction presetDefaults(preset: NonNullable<MushiConfig['preset']>): Pick<MushiConfig, 'widget' | 'capture' | 'proactive'> {\n switch (preset) {\n case 'manual-only':\n return {\n widget: { trigger: 'manual', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n case 'beta-loud':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner' },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: { rageClick: true, longTask: true, apiCascade: true, errorBoundary: true },\n };\n case 'internal-debug':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner', brandFooter: true },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: {\n rageClick: true,\n longTask: true,\n apiCascade: true,\n errorBoundary: true,\n cooldown: { maxProactivePerSession: 10, dismissCooldownHours: 0, suppressAfterDismissals: 99 },\n },\n };\n case 'production-calm':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n }\n}\n\nfunction resolveApiEndpoint(config: Pick<MushiConfig, 'apiEndpoint'>): string {\n return config.apiEndpoint ?? DEFAULT_API_ENDPOINT;\n}\n\nfunction shouldUseRuntimeConfig(config: MushiConfig): boolean {\n if (config.runtimeConfig === false) return false;\n if (config.runtimeConfig === true) return true;\n return !isLocalhostEndpoint(resolveApiEndpoint(config));\n}\n\nasync function runDiagnostics(options: {\n apiEndpoint: string;\n widgetMounted: boolean;\n runtimeConfigLoaded: boolean;\n captureScreenshotAvailable: boolean;\n captureNetworkIntercepting: boolean;\n}): Promise<MushiDiagnosticsResult> {\n const endpoint = await probeApiEndpoint(options.apiEndpoint);\n return {\n apiEndpointReachable: endpoint.reachable,\n cspAllowsEndpoint: endpoint.cspAllowed,\n widgetMounted: options.widgetMounted,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: options.runtimeConfigLoaded,\n captureScreenshotAvailable: options.captureScreenshotAvailable,\n captureNetworkIntercepting: options.captureNetworkIntercepting,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function diagnoseWithoutInstance(): Promise<MushiDiagnosticsResult> {\n return {\n apiEndpointReachable: false,\n cspAllowsEndpoint: false,\n widgetMounted: false,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: false,\n captureScreenshotAvailable: false,\n captureNetworkIntercepting: false,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function probeApiEndpoint(apiEndpoint: string): Promise<{ reachable: boolean; cspAllowed: boolean }> {\n if (typeof fetch === 'undefined') return { reachable: false, cspAllowed: false };\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller ? setTimeout(() => controller.abort(), 3_000) : null;\n try {\n const response = await fetch(`${apiEndpoint.replace(/\\/$/, '')}/health`, {\n method: 'GET',\n cache: 'no-store',\n ...(controller ? { signal: controller.signal } : {}),\n [MUSHI_INTERNAL_INIT_MARKER]: 'diagnose',\n } as RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: 'diagnose' });\n return { reachable: response.ok, cspAllowed: true };\n } catch {\n return { reachable: false, cspAllowed: false };\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction runtimeConfigCacheKey(projectId: string): string {\n return `mushi:sdk-config:${projectId}`;\n}\n\nfunction sdkVersionCacheKey(packageName: string): string {\n return `mushi:sdk-version:${packageName}`;\n}\n\nfunction readCachedRuntimeConfig(projectId: string): MushiRuntimeSdkConfig | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(runtimeConfigCacheKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { config?: MushiRuntimeSdkConfig };\n return parsed.config ?? null;\n } catch {\n return null;\n }\n}\n\nfunction cacheRuntimeConfig(projectId: string, config: MushiRuntimeSdkConfig): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(runtimeConfigCacheKey(projectId), JSON.stringify({\n cachedAt: Date.now(),\n config,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction clearCachedRuntimeConfig(projectId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(runtimeConfigCacheKey(projectId));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction readCachedSdkVersion(packageName: string): MushiSdkVersionInfo | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(sdkVersionCacheKey(packageName));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { cachedAt?: number; data?: MushiSdkVersionInfo };\n if (!parsed.data || !parsed.cachedAt || Date.now() - parsed.cachedAt > 86_400_000) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction cacheSdkVersion(packageName: string, data: MushiSdkVersionInfo): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(sdkVersionCacheKey(packageName), JSON.stringify({\n cachedAt: Date.now(),\n data,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction isVersionOlder(current: string, latest: string): boolean {\n const currentParts = parseVersion(current);\n const latestParts = parseVersion(latest);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const cur = currentParts[i] ?? 0;\n const next = latestParts[i] ?? 0;\n if (cur < next) return true;\n if (cur > next) return false;\n }\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n setScreen: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n updateConfig: () => {},\n diagnose: diagnoseWithoutInstance,\n openWith: () => {},\n show: () => {},\n hide: () => {},\n attachTo: () => () => {},\n setTrigger: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n captureException: async () => null,\n identify: () => {},\n addBreadcrumb: () => {},\n getBreadcrumbs: () => [],\n setTag: () => {},\n setTags: () => {},\n clearTag: () => {},\n getReputation: async () => null,\n getTier: async () => null,\n recordActivity: () => {},\n pulseTrigger: () => {},\n };\n}\n\n/**\n * Auto-breadcrumb installer — attaches passive listeners that turn\n * common host-app signals into Mushi breadcrumbs without the host\n * lifting a finger.\n *\n * - Route changes via `popstate` and the `history.pushState` /\n * `replaceState` patches that single-page apps already trigger.\n * - `console.error` and `console.warn` callsites — distinct from\n * the existing `console-capture` (which mirrors the *content* of\n * console for the report's `consoleLogs` array; breadcrumbs\n * capture only that an error happened, what file/line, and one\n * short message).\n * - `[data-testid]` clicks anywhere on the page — testids are the\n * same identifiers the v2 inventory + Triage LLM grounds against,\n * so a breadcrumb of `clicked checkout-submit` is dramatically\n * more useful for triage than `clicked button.btn-primary`.\n *\n * Returns a teardown closure that detaches every listener. We keep\n * the closure in scope of `createInstance` so `Mushi.destroy()` can\n * call it before re-init — without this, dev-mode HMR would tail a\n * fresh listener stack on every reload.\n */\nfunction installAutoBreadcrumbs(buffer: BreadcrumbBuffer): () => void {\n if (typeof window === 'undefined') return () => {};\n const cleanups: Array<() => void> = [];\n\n // 1) Route changes — covers SSR-hydrated SPAs (Next, Remix, SvelteKit)\n // and old-school history-pushed apps. We patch the prototype methods\n // because most SPA frameworks call them directly instead of dispatching\n // an event the host could subscribe to.\n try {\n const dispatchRouteChange = (kind: 'pushState' | 'replaceState' | 'popstate') => {\n buffer.add({\n category: 'navigation',\n level: 'info',\n message: `${kind}: ${window.location.pathname}`,\n data: { url: window.location.href, kind },\n });\n };\n const onPop = () => dispatchRouteChange('popstate');\n window.addEventListener('popstate', onPop, { passive: true });\n cleanups.push(() => window.removeEventListener('popstate', onPop));\n\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n window.history.pushState = function patched(...args: Parameters<History['pushState']>) {\n const ret = origPush.apply(this, args);\n try {\n dispatchRouteChange('pushState');\n } catch {\n // Swallow — never break navigation because the breadcrumb buffer\n // mis-stringified an URL.\n }\n return ret;\n };\n window.history.replaceState = function patched(...args: Parameters<History['replaceState']>) {\n const ret = origReplace.apply(this, args);\n try {\n dispatchRouteChange('replaceState');\n } catch {\n // Swallow.\n }\n return ret;\n };\n cleanups.push(() => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n });\n } catch {\n // History API unavailable (some sandboxed iframes) — skip silently.\n }\n\n // 2) `console.error` and `console.warn` — wrap *only* these two so\n // we don't add overhead to `console.log` on the hot path. The\n // `console-capture` module already mirrors content; this layer\n // adds a \"something went wrong\" beat to the breadcrumb timeline.\n try {\n const origError = console.error;\n const origWarn = console.warn;\n console.error = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'error',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origError.apply(this, args as Parameters<typeof origError>);\n };\n console.warn = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'warning',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origWarn.apply(this, args as Parameters<typeof origWarn>);\n };\n cleanups.push(() => {\n console.error = origError;\n console.warn = origWarn;\n });\n } catch {\n // Console patching can fail in locked-down environments — non-fatal.\n }\n\n // 3) `[data-testid]` clicks — capture the testid, the tag name, and\n // the visible text (capped) so a breadcrumb of \"clicked submit-cta\n // — Buy now\" tells the triage path what the user just touched\n // without leaking arbitrary innerHTML.\n try {\n const onClick = (ev: MouseEvent) => {\n try {\n const target = ev.target;\n if (!(target instanceof Element)) return;\n let cur: Element | null = target;\n let hops = 0;\n while (cur && hops < 10) {\n const tid = cur.getAttribute('data-testid');\n if (tid) {\n const text = (cur.textContent ?? '').trim().slice(0, 80);\n buffer.add({\n category: 'ui.click',\n level: 'info',\n message: `clicked ${tid}${text ? ` — ${text}` : ''}`,\n data: { testid: tid, tag: cur.tagName.toLowerCase() },\n });\n return;\n }\n cur = cur.parentElement;\n hops++;\n }\n } catch {\n // Swallow — listener errors must never propagate.\n }\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n cleanups.push(() => document.removeEventListener('click', onClick, true));\n } catch {\n // Swallow.\n }\n\n return () => {\n for (const c of cleanups) {\n try {\n c();\n } catch {\n // Swallow.\n }\n }\n };\n}\n\n/**\n * Coerce arbitrary console arguments to a short string for breadcrumb\n * messages. Errors get their `name + message`; objects get JSON-encoded\n * with a 200-char cap; everything else is `String(...)` truncated to\n * 200 chars. We never invoke a `toString` that throws — failures fall\n * back to the type label.\n */\nfunction stringifyConsoleArg(arg: unknown): string {\n try {\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n const json = JSON.stringify(arg);\n return json.length > 200 ? `${json.slice(0, 200)}…` : json;\n }\n const s = String(arg);\n return s.length > 200 ? `${s.slice(0, 200)}…` : s;\n } catch {\n return `[${typeof arg}]`;\n }\n}\n"]}
|