@iota-uz/sdk 0.4.20 → 0.4.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +20 -0
  2. package/dist/applet/core.cjs +8 -4
  3. package/dist/applet/core.cjs.map +1 -1
  4. package/dist/applet/core.mjs +8 -4
  5. package/dist/applet/core.mjs.map +1 -1
  6. package/dist/applet/devtools.cjs +24 -8
  7. package/dist/applet/devtools.cjs.map +1 -1
  8. package/dist/applet/devtools.mjs +24 -8
  9. package/dist/applet/devtools.mjs.map +1 -1
  10. package/dist/applet/host.cjs +47 -16
  11. package/dist/applet/host.cjs.map +1 -1
  12. package/dist/applet/host.mjs +47 -16
  13. package/dist/applet/host.mjs.map +1 -1
  14. package/dist/applet/vite.cjs +12 -4
  15. package/dist/applet/vite.cjs.map +1 -1
  16. package/dist/applet/vite.mjs +12 -4
  17. package/dist/applet/vite.mjs.map +1 -1
  18. package/dist/applet-runtime/index.cjs.map +1 -1
  19. package/dist/applet-runtime/index.mjs.map +1 -1
  20. package/dist/bichat/index.cjs +6971 -2646
  21. package/dist/bichat/index.cjs.map +1 -1
  22. package/dist/bichat/index.css +11 -1
  23. package/dist/bichat/index.css.map +1 -1
  24. package/dist/bichat/index.d.cts +453 -157
  25. package/dist/bichat/index.d.ts +453 -157
  26. package/dist/bichat/index.mjs +6969 -2652
  27. package/dist/bichat/index.mjs.map +1 -1
  28. package/dist/bichat/styles.css +17 -4
  29. package/dist/bichat/tailwind.cjs.map +1 -1
  30. package/dist/bichat/tailwind.mjs.map +1 -1
  31. package/dist/index.cjs +73 -26
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.mjs +73 -26
  34. package/dist/index.mjs.map +1 -1
  35. package/package.json +10 -3
  36. package/tailwind/compiled.css +1 -1
  37. package/tailwind/create-config.cjs +50 -2
  38. package/tailwind/iota.css +6 -6
  39. package/tailwind/sdk-content.cjs +177 -0
  40. package/tailwind/sdk-theme.cjs +12 -0
@@ -7,7 +7,8 @@
7
7
  CSS Variables - Design Tokens
8
8
  ============================================================================= */
9
9
 
10
- :root {
10
+ :root,
11
+ :host {
11
12
  /* -------------------------------------------------------------------------
12
13
  Spacing Scale
13
14
  ------------------------------------------------------------------------- */
@@ -141,9 +142,9 @@
141
142
  /* -------------------------------------------------------------------------
142
143
  Typography
143
144
  ------------------------------------------------------------------------- */
144
- --bichat-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto',
145
- 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
146
- sans-serif;
145
+ --bichat-font-family: 'Gilroy', -apple-system, BlinkMacSystemFont, 'Segoe UI',
146
+ 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans',
147
+ 'Helvetica Neue', sans-serif;
147
148
  --bichat-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo,
148
149
  Consolas, 'Liberation Mono', monospace;
149
150
 
@@ -248,6 +249,8 @@
248
249
  --bichat-input-min-height: 2.5rem;
249
250
  --bichat-input-max-height: 12rem;
250
251
 
252
+ --bichat-color-chart-grid: rgba(148, 163, 184, 0.15);
253
+
251
254
  /* Legacy compatibility (keep for backward compat) */
252
255
  --bichat-primary: var(--bichat-color-primary-500);
253
256
  --bichat-bg: var(--bichat-color-bg);
@@ -301,6 +304,8 @@
301
304
  --bichat-border: var(--bichat-color-border);
302
305
  --bichat-bubble-assistant: var(--bichat-color-assistant-bubble-bg);
303
306
 
307
+ --bichat-color-chart-grid: rgba(148, 163, 184, 0.1);
308
+
304
309
  /* Adjust shadows for dark mode */
305
310
  --bichat-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.3), 0 1px 2px -1px rgba(0, 0, 0, 0.3);
306
311
  --bichat-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
@@ -724,6 +729,14 @@ bi-chat-root [tabindex]:not([tabindex="-1"]):focus-visible {
724
729
  background-color: var(--bichat-color-bg-subtle);
725
730
  }
726
731
 
732
+ /* Keep rendered formulas readable within chat bubbles. */
733
+ .markdown-content math[display='block'] {
734
+ display: block;
735
+ overflow-x: auto;
736
+ overflow-y: hidden;
737
+ padding: 0.25rem 0;
738
+ }
739
+
727
740
  /* =============================================================================
728
741
  Focus Styles
729
742
  ============================================================================= */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/bichat/tailwind.ts"],"names":["require","createRequire","path"],"mappings":"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","file":"tailwind.cjs","sourcesContent":["/**\n * BiChat Tailwind preset and content helper for downstream applets.\n * Use these so Tailwind generates utilities for SDK BiChat components and so\n * theme tokens stay consistent. Always import @iota-uz/sdk/bichat/styles.css\n * in your applet CSS for design tokens.\n */\nimport path from 'node:path'\nimport { createRequire } from 'node:module'\n\n/** Tailwind v3 config preset type (minimal shape we extend). */\nexport type TailwindPreset = {\n darkMode?: 'class' | 'selector' | 'media'\n theme?: { extend?: Record<string, unknown> }\n plugins?: unknown[]\n}\n\n/**\n * Preset for BiChat UI: theme extensions and dark mode.\n * Stable and minimal; apps can override via their own theme or CSS variables.\n */\nexport const bichatTailwindPreset: TailwindPreset = {\n darkMode: 'selector',\n theme: {\n extend: {\n colors: {\n red: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#0d1117',\n },\n primary: {\n 50: 'var(--primary-50, var(--bichat-color-primary-50, #eff6ff))',\n 100: 'var(--primary-100, var(--bichat-color-primary-100, #dbeafe))',\n 200: 'var(--primary-200, var(--bichat-color-primary-200, #bfdbfe))',\n 300: 'var(--primary-300, var(--bichat-color-primary-300, #93c5fd))',\n 400: 'var(--primary-400, var(--bichat-color-primary-400, #60a5fa))',\n 500: 'var(--primary-500, var(--bichat-color-primary-500, #3b82f6))',\n 600: 'var(--primary-600, var(--bichat-color-primary-600, #2563eb))',\n 700: 'var(--primary-700, var(--bichat-color-primary-700, #1d4ed8))',\n 800: 'var(--primary-800, var(--bichat-color-primary-800, #1e40af))',\n 900: 'var(--primary-900, var(--bichat-color-primary-900, #1e3a8a))',\n },\n },\n fontFamily: {\n sans: ['\"Gilroy\"', 'system-ui', '-apple-system', 'sans-serif'],\n },\n boxShadow: {\n xs: 'var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.05))',\n sm: 'var(--shadow-sm, 0 1px 3px 0 rgb(0 0 0 / 0.1))',\n md: 'var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1))',\n lg: 'var(--shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1))',\n xl: 'var(--shadow-xl, 0 20px 25px -5px rgb(0 0 0 / 0.1))',\n },\n borderRadius: {\n '2xl': '1rem',\n '3xl': '1.5rem',\n },\n },\n },\n plugins: [],\n}\n\n/**\n * Returns absolute paths to SDK BiChat bundle files so Tailwind can scan them\n * for class names. Include the result in your Tailwind config content array.\n * Resolves via @iota-uz/sdk/package.json when available so the package root is unambiguous.\n */\nexport function bichatTailwindContent(): string[] {\n const require = createRequire(import.meta.url)\n let pkgDir: string\n try {\n const pkgJsonPath = require.resolve('@iota-uz/sdk/package.json')\n pkgDir = path.dirname(pkgJsonPath)\n } catch {\n const entryPath = require.resolve('@iota-uz/sdk')\n pkgDir = path.dirname(entryPath) // when \".\" resolves to dist/index.mjs, dirname is dist\n }\n const distBichat = pkgDir.endsWith(path.sep + 'dist') || pkgDir.endsWith('/dist')\n ? path.join(pkgDir, 'bichat')\n : path.join(pkgDir, 'dist', 'bichat')\n return [\n path.join(distBichat, 'index.mjs'),\n path.join(distBichat, 'index.cjs'),\n ]\n}\n"]}
1
+ {"version":3,"sources":["../../ui/src/bichat/tailwind.ts"],"names":["require","createRequire","path"],"mappings":"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","file":"tailwind.cjs","sourcesContent":["/**\n * BiChat Tailwind preset and content helper for downstream applets.\n * Use these so Tailwind generates utilities for SDK BiChat components and so\n * theme tokens stay consistent. Always import @iota-uz/sdk/bichat/styles.css\n * in your applet CSS for design tokens.\n */\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\n/** Tailwind v3 config preset type (minimal shape we extend). */\nexport type TailwindPreset = {\n darkMode?: 'class' | 'selector' | 'media'\n theme?: { extend?: Record<string, unknown> }\n plugins?: unknown[]\n}\n\n/**\n * Preset for BiChat UI: theme extensions and dark mode.\n * Stable and minimal; apps can override via their own theme or CSS variables.\n */\nexport const bichatTailwindPreset: TailwindPreset = {\n darkMode: 'selector',\n theme: {\n extend: {\n colors: {\n red: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#0d1117',\n },\n primary: {\n 50: 'var(--primary-50, var(--bichat-color-primary-50, #eff6ff))',\n 100: 'var(--primary-100, var(--bichat-color-primary-100, #dbeafe))',\n 200: 'var(--primary-200, var(--bichat-color-primary-200, #bfdbfe))',\n 300: 'var(--primary-300, var(--bichat-color-primary-300, #93c5fd))',\n 400: 'var(--primary-400, var(--bichat-color-primary-400, #60a5fa))',\n 500: 'var(--primary-500, var(--bichat-color-primary-500, #3b82f6))',\n 600: 'var(--primary-600, var(--bichat-color-primary-600, #2563eb))',\n 700: 'var(--primary-700, var(--bichat-color-primary-700, #1d4ed8))',\n 800: 'var(--primary-800, var(--bichat-color-primary-800, #1e40af))',\n 900: 'var(--primary-900, var(--bichat-color-primary-900, #1e3a8a))',\n },\n },\n fontFamily: {\n sans: ['\"Gilroy\"', 'system-ui', '-apple-system', 'sans-serif'],\n },\n boxShadow: {\n xs: 'var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.05))',\n sm: 'var(--shadow-sm, 0 1px 3px 0 rgb(0 0 0 / 0.1))',\n md: 'var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1))',\n lg: 'var(--shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1))',\n xl: 'var(--shadow-xl, 0 20px 25px -5px rgb(0 0 0 / 0.1))',\n },\n borderRadius: {\n '2xl': '1rem',\n '3xl': '1.5rem',\n },\n },\n },\n plugins: [],\n};\n\n/**\n * Returns absolute paths to SDK BiChat bundle files so Tailwind can scan them\n * for class names. Include the result in your Tailwind config content array.\n * Resolves via @iota-uz/sdk/package.json when available so the package root is unambiguous.\n */\nexport function bichatTailwindContent(): string[] {\n const require = createRequire(import.meta.url);\n let pkgDir: string;\n try {\n const pkgJsonPath = require.resolve('@iota-uz/sdk/package.json');\n pkgDir = path.dirname(pkgJsonPath);\n } catch {\n const entryPath = require.resolve('@iota-uz/sdk');\n pkgDir = path.dirname(entryPath); // when \".\" resolves to dist/index.mjs, dirname is dist\n }\n const distBichat = pkgDir.endsWith(path.sep + 'dist') || pkgDir.endsWith('/dist')\n ? path.join(pkgDir, 'bichat')\n : path.join(pkgDir, 'dist', 'bichat');\n return [\n path.join(distBichat, 'index.mjs'),\n path.join(distBichat, 'index.cjs'),\n ];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../ui/src/bichat/tailwind.ts"],"names":["require"],"mappings":";;;;AAoBO,IAAM,oBAAA,GAAuC;AAAA,EAClD,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,GAAA,EAAK;AAAA,UACH,EAAA,EAAI,SAAA;AAAA,UACJ,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK;AAAA,SACP;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK;AAAA,SACP;AAAA,QACA,OAAA,EAAS;AAAA,UACP,EAAA,EAAI,4DAAA;AAAA,UACJ,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK;AAAA;AACP,OACF;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,CAAC,UAAA,EAAY,WAAA,EAAa,iBAAiB,YAAY;AAAA,OAC/D;AAAA,MACA,SAAA,EAAW;AAAA,QACT,EAAA,EAAI,iDAAA;AAAA,QACJ,EAAA,EAAI,gDAAA;AAAA,QACJ,EAAA,EAAI,mDAAA;AAAA,QACJ,EAAA,EAAI,qDAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA,EACA,SAAS;AACX;AAOO,SAAS,qBAAA,GAAkC;AAChD,EAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAcA,QAAAA,CAAQ,OAAA,CAAQ,2BAA2B,CAAA;AAC/D,IAAA,MAAA,GAAS,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,SAAA,GAAYA,QAAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAChD,IAAA,MAAA,GAAS,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,MAAM,CAAA,IAAK,OAAO,QAAA,CAAS,OAAO,IAC5E,IAAA,CAAK,IAAA,CAAK,QAAQ,QAAQ,CAAA,GAC1B,KAAK,IAAA,CAAK,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA;AAAA,IACjC,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW;AAAA,GACnC;AACF","file":"tailwind.mjs","sourcesContent":["/**\n * BiChat Tailwind preset and content helper for downstream applets.\n * Use these so Tailwind generates utilities for SDK BiChat components and so\n * theme tokens stay consistent. Always import @iota-uz/sdk/bichat/styles.css\n * in your applet CSS for design tokens.\n */\nimport path from 'node:path'\nimport { createRequire } from 'node:module'\n\n/** Tailwind v3 config preset type (minimal shape we extend). */\nexport type TailwindPreset = {\n darkMode?: 'class' | 'selector' | 'media'\n theme?: { extend?: Record<string, unknown> }\n plugins?: unknown[]\n}\n\n/**\n * Preset for BiChat UI: theme extensions and dark mode.\n * Stable and minimal; apps can override via their own theme or CSS variables.\n */\nexport const bichatTailwindPreset: TailwindPreset = {\n darkMode: 'selector',\n theme: {\n extend: {\n colors: {\n red: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#0d1117',\n },\n primary: {\n 50: 'var(--primary-50, var(--bichat-color-primary-50, #eff6ff))',\n 100: 'var(--primary-100, var(--bichat-color-primary-100, #dbeafe))',\n 200: 'var(--primary-200, var(--bichat-color-primary-200, #bfdbfe))',\n 300: 'var(--primary-300, var(--bichat-color-primary-300, #93c5fd))',\n 400: 'var(--primary-400, var(--bichat-color-primary-400, #60a5fa))',\n 500: 'var(--primary-500, var(--bichat-color-primary-500, #3b82f6))',\n 600: 'var(--primary-600, var(--bichat-color-primary-600, #2563eb))',\n 700: 'var(--primary-700, var(--bichat-color-primary-700, #1d4ed8))',\n 800: 'var(--primary-800, var(--bichat-color-primary-800, #1e40af))',\n 900: 'var(--primary-900, var(--bichat-color-primary-900, #1e3a8a))',\n },\n },\n fontFamily: {\n sans: ['\"Gilroy\"', 'system-ui', '-apple-system', 'sans-serif'],\n },\n boxShadow: {\n xs: 'var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.05))',\n sm: 'var(--shadow-sm, 0 1px 3px 0 rgb(0 0 0 / 0.1))',\n md: 'var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1))',\n lg: 'var(--shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1))',\n xl: 'var(--shadow-xl, 0 20px 25px -5px rgb(0 0 0 / 0.1))',\n },\n borderRadius: {\n '2xl': '1rem',\n '3xl': '1.5rem',\n },\n },\n },\n plugins: [],\n}\n\n/**\n * Returns absolute paths to SDK BiChat bundle files so Tailwind can scan them\n * for class names. Include the result in your Tailwind config content array.\n * Resolves via @iota-uz/sdk/package.json when available so the package root is unambiguous.\n */\nexport function bichatTailwindContent(): string[] {\n const require = createRequire(import.meta.url)\n let pkgDir: string\n try {\n const pkgJsonPath = require.resolve('@iota-uz/sdk/package.json')\n pkgDir = path.dirname(pkgJsonPath)\n } catch {\n const entryPath = require.resolve('@iota-uz/sdk')\n pkgDir = path.dirname(entryPath) // when \".\" resolves to dist/index.mjs, dirname is dist\n }\n const distBichat = pkgDir.endsWith(path.sep + 'dist') || pkgDir.endsWith('/dist')\n ? path.join(pkgDir, 'bichat')\n : path.join(pkgDir, 'dist', 'bichat')\n return [\n path.join(distBichat, 'index.mjs'),\n path.join(distBichat, 'index.cjs'),\n ]\n}\n"]}
1
+ {"version":3,"sources":["../../ui/src/bichat/tailwind.ts"],"names":["require"],"mappings":";;;;AAoBO,IAAM,oBAAA,GAAuC;AAAA,EAClD,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,QACN,GAAA,EAAK;AAAA,UACH,EAAA,EAAI,SAAA;AAAA,UACJ,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK;AAAA,SACP;AAAA,QACA,IAAA,EAAM;AAAA,UACJ,EAAA,EAAI,SAAA;AAAA,UACJ,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK,SAAA;AAAA,UACL,GAAA,EAAK;AAAA,SACP;AAAA,QACA,OAAA,EAAS;AAAA,UACP,EAAA,EAAI,4DAAA;AAAA,UACJ,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK,8DAAA;AAAA,UACL,GAAA,EAAK;AAAA;AACP,OACF;AAAA,MACA,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,CAAC,UAAA,EAAY,WAAA,EAAa,iBAAiB,YAAY;AAAA,OAC/D;AAAA,MACA,SAAA,EAAW;AAAA,QACT,EAAA,EAAI,iDAAA;AAAA,QACJ,EAAA,EAAI,gDAAA;AAAA,QACJ,EAAA,EAAI,mDAAA;AAAA,QACJ,EAAA,EAAI,qDAAA;AAAA,QACJ,EAAA,EAAI;AAAA,OACN;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO;AAAA;AACT;AACF,GACF;AAAA,EACA,SAAS;AACX;AAOO,SAAS,qBAAA,GAAkC;AAChD,EAAA,MAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAC7C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAcA,QAAAA,CAAQ,OAAA,CAAQ,2BAA2B,CAAA;AAC/D,IAAA,MAAA,GAAS,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,SAAA,GAAYA,QAAAA,CAAQ,OAAA,CAAQ,cAAc,CAAA;AAChD,IAAA,MAAA,GAAS,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,MAAM,CAAA,IAAK,OAAO,QAAA,CAAS,OAAO,IAC5E,IAAA,CAAK,IAAA,CAAK,QAAQ,QAAQ,CAAA,GAC1B,KAAK,IAAA,CAAK,MAAA,EAAQ,QAAQ,QAAQ,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW,CAAA;AAAA,IACjC,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,WAAW;AAAA,GACnC;AACF","file":"tailwind.mjs","sourcesContent":["/**\n * BiChat Tailwind preset and content helper for downstream applets.\n * Use these so Tailwind generates utilities for SDK BiChat components and so\n * theme tokens stay consistent. Always import @iota-uz/sdk/bichat/styles.css\n * in your applet CSS for design tokens.\n */\nimport path from 'node:path';\nimport { createRequire } from 'node:module';\n\n/** Tailwind v3 config preset type (minimal shape we extend). */\nexport type TailwindPreset = {\n darkMode?: 'class' | 'selector' | 'media'\n theme?: { extend?: Record<string, unknown> }\n plugins?: unknown[]\n}\n\n/**\n * Preset for BiChat UI: theme extensions and dark mode.\n * Stable and minimal; apps can override via their own theme or CSS variables.\n */\nexport const bichatTailwindPreset: TailwindPreset = {\n darkMode: 'selector',\n theme: {\n extend: {\n colors: {\n red: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n },\n gray: {\n 50: '#f9fafb',\n 100: '#f3f4f6',\n 200: '#e5e7eb',\n 300: '#d1d5db',\n 400: '#9ca3af',\n 500: '#6b7280',\n 600: '#4b5563',\n 700: '#374151',\n 800: '#1f2937',\n 900: '#111827',\n 950: '#0d1117',\n },\n primary: {\n 50: 'var(--primary-50, var(--bichat-color-primary-50, #eff6ff))',\n 100: 'var(--primary-100, var(--bichat-color-primary-100, #dbeafe))',\n 200: 'var(--primary-200, var(--bichat-color-primary-200, #bfdbfe))',\n 300: 'var(--primary-300, var(--bichat-color-primary-300, #93c5fd))',\n 400: 'var(--primary-400, var(--bichat-color-primary-400, #60a5fa))',\n 500: 'var(--primary-500, var(--bichat-color-primary-500, #3b82f6))',\n 600: 'var(--primary-600, var(--bichat-color-primary-600, #2563eb))',\n 700: 'var(--primary-700, var(--bichat-color-primary-700, #1d4ed8))',\n 800: 'var(--primary-800, var(--bichat-color-primary-800, #1e40af))',\n 900: 'var(--primary-900, var(--bichat-color-primary-900, #1e3a8a))',\n },\n },\n fontFamily: {\n sans: ['\"Gilroy\"', 'system-ui', '-apple-system', 'sans-serif'],\n },\n boxShadow: {\n xs: 'var(--shadow-xs, 0 1px 2px 0 rgb(0 0 0 / 0.05))',\n sm: 'var(--shadow-sm, 0 1px 3px 0 rgb(0 0 0 / 0.1))',\n md: 'var(--shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1))',\n lg: 'var(--shadow-lg, 0 10px 15px -3px rgb(0 0 0 / 0.1))',\n xl: 'var(--shadow-xl, 0 20px 25px -5px rgb(0 0 0 / 0.1))',\n },\n borderRadius: {\n '2xl': '1rem',\n '3xl': '1.5rem',\n },\n },\n },\n plugins: [],\n};\n\n/**\n * Returns absolute paths to SDK BiChat bundle files so Tailwind can scan them\n * for class names. Include the result in your Tailwind config content array.\n * Resolves via @iota-uz/sdk/package.json when available so the package root is unambiguous.\n */\nexport function bichatTailwindContent(): string[] {\n const require = createRequire(import.meta.url);\n let pkgDir: string;\n try {\n const pkgJsonPath = require.resolve('@iota-uz/sdk/package.json');\n pkgDir = path.dirname(pkgJsonPath);\n } catch {\n const entryPath = require.resolve('@iota-uz/sdk');\n pkgDir = path.dirname(entryPath); // when \".\" resolves to dist/index.mjs, dirname is dist\n }\n const distBichat = pkgDir.endsWith(path.sep + 'dist') || pkgDir.endsWith('/dist')\n ? path.join(pkgDir, 'bichat')\n : path.join(pkgDir, 'dist', 'bichat');\n return [\n path.join(distBichat, 'index.mjs'),\n path.join(distBichat, 'index.cjs'),\n ];\n}\n"]}
package/dist/index.cjs CHANGED
@@ -182,10 +182,11 @@ function useStreaming() {
182
182
  setIsStreaming(true);
183
183
  const controller = new AbortController();
184
184
  abortControllerRef.current = controller;
185
- if (signal) {
186
- signal.addEventListener("abort", () => {
187
- controller.abort();
188
- });
185
+ const onExternalAbort = signal ? () => {
186
+ controller.abort();
187
+ } : void 0;
188
+ if (signal && onExternalAbort) {
189
+ signal.addEventListener("abort", onExternalAbort);
189
190
  }
190
191
  try {
191
192
  for await (const chunk of generator) {
@@ -200,6 +201,9 @@ function useStreaming() {
200
201
  }
201
202
  throw error;
202
203
  } finally {
204
+ if (signal && onExternalAbort) {
205
+ signal.removeEventListener("abort", onExternalAbort);
206
+ }
203
207
  setIsStreaming(false);
204
208
  abortControllerRef.current = null;
205
209
  }
@@ -240,10 +244,14 @@ function defineReactAppletElement(options) {
240
244
  const existing = registry.get(tagName);
241
245
  if (existing) {
242
246
  existing.options = options;
243
- for (const a of options.observedAttributes ?? []) existing.observed.add(a);
247
+ for (const a of options.observedAttributes ?? []) {
248
+ existing.observed.add(a);
249
+ }
244
250
  } else {
245
251
  const observed = /* @__PURE__ */ new Set(["base-path", "shell-mode", "router-mode"]);
246
- for (const a of options.observedAttributes ?? []) observed.add(a);
252
+ for (const a of options.observedAttributes ?? []) {
253
+ observed.add(a);
254
+ }
247
255
  registry.set(tagName, { options, observed });
248
256
  }
249
257
  if (customElements.get(tagName)) {
@@ -254,7 +262,9 @@ function defineReactAppletElement(options) {
254
262
  }
255
263
  function getEntry() {
256
264
  const entry = getRegistry().get(tagName);
257
- if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`);
265
+ if (!entry) {
266
+ throw new Error(`[${tagName}] applet host registry entry missing`);
267
+ }
258
268
  return entry;
259
269
  }
260
270
  class ReactAppletElement extends HTMLElement {
@@ -283,16 +293,22 @@ function defineReactAppletElement(options) {
283
293
  }
284
294
  const existingContainer = shadowRoot.querySelector("#react-root");
285
295
  if (!existingContainer) {
286
- if (this.styleEl) shadowRoot.appendChild(this.styleEl);
296
+ if (this.styleEl) {
297
+ shadowRoot.appendChild(this.styleEl);
298
+ }
287
299
  shadowRoot.appendChild(this.container);
288
300
  } else if (existingContainer !== this.container) {
289
301
  this.container = existingContainer;
290
302
  }
291
303
  this.syncFromRegistry();
292
304
  this.updateListener ?? (this.updateListener = (e) => {
293
- if (!(e instanceof CustomEvent)) return;
305
+ if (!(e instanceof CustomEvent)) {
306
+ return;
307
+ }
294
308
  const detail = e.detail;
295
- if (!detail || detail.tagName !== tagName) return;
309
+ if (!detail || detail.tagName !== tagName) {
310
+ return;
311
+ }
296
312
  this.syncFromRegistry();
297
313
  this.renderReact();
298
314
  });
@@ -309,8 +325,12 @@ function defineReactAppletElement(options) {
309
325
  this.reactRoot = null;
310
326
  }
311
327
  attributeChangedCallback(_name, oldValue, newValue) {
312
- if (oldValue === newValue) return;
313
- if (this.container) this.renderReact();
328
+ if (oldValue === newValue) {
329
+ return;
330
+ }
331
+ if (this.container) {
332
+ this.renderReact();
333
+ }
314
334
  }
315
335
  getHostConfig() {
316
336
  const attrs = {};
@@ -323,7 +343,9 @@ function defineReactAppletElement(options) {
323
343
  return { basePath, shellMode, routerMode, attrs };
324
344
  }
325
345
  renderReact() {
326
- if (!this.container) return;
346
+ if (!this.container) {
347
+ return;
348
+ }
327
349
  if (!this.reactRoot) {
328
350
  this.reactRoot = client.createRoot(this.container);
329
351
  }
@@ -355,10 +377,15 @@ function defineReactAppletElement(options) {
355
377
  }
356
378
  syncDarkMode() {
357
379
  const root = this.container;
358
- if (!root) throw new Error("react root container not found");
380
+ if (!root) {
381
+ throw new Error("react root container not found");
382
+ }
359
383
  const apply = () => {
360
- if (document.documentElement.classList.contains("dark")) root.classList.add("dark");
361
- else root.classList.remove("dark");
384
+ if (document.documentElement.classList.contains("dark")) {
385
+ root.classList.add("dark");
386
+ } else {
387
+ root.classList.remove("dark");
388
+ }
362
389
  };
363
390
  apply();
364
391
  const observer = new MutationObserver(apply);
@@ -376,9 +403,13 @@ function getRegistry() {
376
403
 
377
404
  // ui/src/applet-devtools/enabled.ts
378
405
  function shouldEnableAppletDevtools() {
379
- if (typeof window === "undefined") return false;
406
+ if (typeof window === "undefined") {
407
+ return false;
408
+ }
380
409
  const url = new URL(window.location.href);
381
- if (url.searchParams.get("appletDebug") === "1") return true;
410
+ if (url.searchParams.get("appletDebug") === "1") {
411
+ return true;
412
+ }
382
413
  try {
383
414
  return window.localStorage.getItem("iotaAppletDevtools") === "1";
384
415
  } catch {
@@ -480,8 +511,12 @@ function createAppletRPCClient(options) {
480
511
  return { call, callTyped };
481
512
  }
482
513
  function maybeDispatchRPCEvent(detail) {
483
- if (typeof window === "undefined") return;
484
- if (!shouldEnableAppletDevtools()) return;
514
+ if (typeof window === "undefined") {
515
+ return;
516
+ }
517
+ if (!shouldEnableAppletDevtools()) {
518
+ return;
519
+ }
485
520
  window.dispatchEvent(new CustomEvent("iota:applet-rpc", { detail }));
486
521
  }
487
522
  function elapsedMs(startedAt) {
@@ -506,9 +541,13 @@ function AppletDevtoolsOverlay() {
506
541
  const [rpcEvents, setRPCEvents] = react.useState([]);
507
542
  react.useEffect(() => {
508
543
  const onEvent = (e) => {
509
- if (!(e instanceof CustomEvent)) return;
544
+ if (!(e instanceof CustomEvent)) {
545
+ return;
546
+ }
510
547
  const detail = e.detail;
511
- if (!detail) return;
548
+ if (!detail) {
549
+ return;
550
+ }
512
551
  setRPCEvents((prev) => [detail, ...prev].slice(0, 50));
513
552
  };
514
553
  window.addEventListener("iota:applet-rpc", onEvent);
@@ -576,11 +615,19 @@ function serializeError(err) {
576
615
  name: err.name,
577
616
  message: err.message
578
617
  };
579
- if (err.stack) out.stack = err.stack;
618
+ if (err.stack) {
619
+ out.stack = err.stack;
620
+ }
580
621
  const errRecord = err;
581
- if ("code" in err && typeof errRecord.code === "string") out.code = errRecord.code;
582
- if ("details" in err) out.details = errRecord.details;
583
- if ("cause" in err) out.cause = errRecord.cause;
622
+ if ("code" in err && typeof errRecord.code === "string") {
623
+ out.code = errRecord.code;
624
+ }
625
+ if ("details" in err) {
626
+ out.details = errRecord.details;
627
+ }
628
+ if ("cause" in err) {
629
+ out.cause = errRecord.cause;
630
+ }
584
631
  return out;
585
632
  }
586
633
  return err;
@@ -1 +1 @@
1
- {"version":3,"sources":["../ui/src/applet-core/context/AppletContext.tsx","../ui/src/applet-core/context/ConfigProvider.tsx","../ui/src/applet-core/hooks/useAppletContext.ts","../ui/src/applet-core/hooks/useConfig.ts","../ui/src/applet-core/hooks/useUser.ts","../ui/src/applet-core/hooks/usePermissions.ts","../ui/src/applet-core/hooks/useTranslation.ts","../ui/src/applet-core/hooks/useSession.ts","../ui/src/applet-core/hooks/useRoute.ts","../ui/src/applet-core/hooks/useStreaming.ts","../ui/src/applet-core/hooks/useAppletRuntime.ts","../ui/src/applet-host/react-element.ts","../ui/src/applet-devtools/enabled.ts","../ui/src/applet-host/rpc.ts","../ui/src/applet-host/router.tsx","../ui/src/applet-devtools/overlay.tsx"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback","createRoot","useEffect","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react'\nimport type { InitialContext } from '../types'\n\n/**\n * AppletContext provides access to the global context injected by the backend.\n * The context is read from window.__*_CONTEXT__ (configured via windowKey).\n */\nconst AppletContext = createContext<InitialContext | null>(null)\n\nconst REQUIRED_KEYS: Array<keyof InitialContext> = ['user', 'tenant', 'locale', 'config', 'route', 'session']\n\nfunction validateInitialContext(value: unknown, windowKey: string): InitialContext {\n if (!value || typeof value !== 'object') {\n throw new Error(`${windowKey}: expected an object, got ${typeof value}`)\n }\n const obj = value as Record<string, unknown>\n const missing = REQUIRED_KEYS.filter((k) => !(k in obj))\n if (missing.length > 0) {\n throw new Error(`${windowKey}: missing required keys: ${missing.join(', ')}`)\n }\n\n // Deep validation for nested required fields\n const user = obj.user as Record<string, unknown> | undefined\n if (!user || typeof user !== 'object') {\n throw new Error(`${windowKey}.user: expected an object, got ${typeof user}`)\n }\n if (typeof user.id !== 'number') {\n throw new Error(`${windowKey}.user.id: expected number, got ${typeof user.id}`)\n }\n if (!Array.isArray(user.permissions)) {\n throw new Error(`${windowKey}.user.permissions: expected array, got ${typeof user.permissions}`)\n }\n\n const tenant = obj.tenant as Record<string, unknown> | undefined\n if (!tenant || typeof tenant !== 'object') {\n throw new Error(`${windowKey}.tenant: expected an object, got ${typeof tenant}`)\n }\n if (typeof tenant.id !== 'string') {\n throw new Error(`${windowKey}.tenant.id: expected string, got ${typeof tenant.id}`)\n }\n\n const session = obj.session as Record<string, unknown> | undefined\n if (!session || typeof session !== 'object') {\n throw new Error(`${windowKey}.session: expected an object, got ${typeof session}`)\n }\n if (typeof session.csrfToken !== 'string') {\n throw new Error(`${windowKey}.session.csrfToken: expected string, got ${typeof session.csrfToken}`)\n }\n if (typeof session.expiresAt !== 'number') {\n throw new Error(`${windowKey}.session.expiresAt: expected number, got ${typeof session.expiresAt}`)\n }\n if (typeof session.refreshURL !== 'string') {\n throw new Error(`${windowKey}.session.refreshURL: expected string, got ${typeof session.refreshURL}`)\n }\n\n const config = obj.config\n if (!config || typeof config !== 'object') {\n throw new Error(`${windowKey}.config: expected object, got ${typeof config}`)\n }\n\n return value as InitialContext\n}\n\nexport interface AppletProviderProps {\n children: ReactNode\n windowKey: string\n context?: InitialContext\n}\n\n/**\n * AppletProvider reads context from window global and provides it to hooks.\n *\n * Usage:\n * <AppletProvider windowKey=\"__APPLET_CONTEXT__\">\n * <App />\n * </AppletProvider>\n */\nexport function AppletProvider({ children, windowKey, context }: AppletProviderProps) {\n // Use provided context or read from window global\n const raw = context ?? (window as unknown as Record<string, unknown>)[windowKey]\n\n if (!raw) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`)\n }\n\n const initialContext = validateInitialContext(raw, windowKey)\n\n return (\n <AppletContext.Provider value={initialContext}>\n {children}\n </AppletContext.Provider>\n )\n}\n\n/**\n * useAppletContext provides access to the full applet context.\n * Use specialized hooks (useUser, useConfig, etc.) for specific context parts.\n */\nexport function useAppletContext<T = InitialContext>(): T {\n const context = useContext(AppletContext)\n if (!context) {\n throw new Error('useAppletContext must be used within AppletProvider')\n }\n return context as T\n}\n","import { createContext, useContext, ReactNode } from 'react'\nimport type { InitialContext } from '../types'\n\n/**\n * ConfigProvider is an alternative to AppletProvider that accepts context via props\n * instead of reading from window global. Useful for testing and server-side rendering.\n */\n\nconst ConfigContext = createContext<InitialContext | null>(null)\n\nexport interface ConfigProviderProps {\n children: ReactNode\n config: InitialContext\n}\n\n/**\n * ConfigProvider accepts context configuration via props.\n *\n * Usage:\n * <ConfigProvider config={initialContext}>\n * <App />\n * </ConfigProvider>\n */\nexport function ConfigProvider({ children, config }: ConfigProviderProps) {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n )\n}\n\n/**\n * useConfigContext provides access to the applet context when using ConfigProvider.\n */\nexport function useConfigContext<T = InitialContext>(): T {\n const context = useContext(ConfigContext)\n if (!context) {\n throw new Error('useConfigContext must be used within ConfigProvider')\n }\n return context as T\n}\n","import type { InitialContext } from '../types'\n\n/**\n * useAppletContext provides direct access to the window global context.\n * This is a standalone version that doesn't require AppletProvider.\n *\n * Usage:\n * const context = useAppletContext('__APPLET_CONTEXT__')\n *\n * Note: Prefer using AppletProvider + context hooks for better type safety\n * and testability. Use this hook only when provider setup is not possible.\n */\nexport function useAppletContext<T = InitialContext>(windowKey: string): T {\n const context = (window as unknown as Record<string, unknown>)[windowKey]\n\n if (!context) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`)\n }\n\n return context as T\n}\n","import { useAppletContext } from '../context/AppletContext'\nimport type { AppConfig } from '../types'\n\n/**\n * useConfig provides access to applet configuration (endpoints, etc.)\n *\n * Usage:\n * const { graphQLEndpoint, streamEndpoint } = useConfig()\n */\nexport function useConfig(): AppConfig {\n const { config } = useAppletContext()\n return config\n}\n","import { useAppletContext } from '../context/AppletContext'\nimport type { UserContext } from '../types'\n\n/**\n * useUser provides access to current user information.\n *\n * Usage:\n * const { id, email, firstName, lastName, permissions } = useUser()\n */\nexport function useUser(): UserContext {\n const { user } = useAppletContext()\n return user\n}\n","import { useAppletContext } from '../context/AppletContext'\nimport type { PermissionsHook } from '../types'\n\n/**\n * usePermissions provides permission checking utilities.\n * All user permissions are automatically passed from backend.\n *\n * Usage:\n * const { hasPermission, hasAnyPermission } = usePermissions()\n *\n * if (hasPermission('BiChat.Access')) {\n * // User has bichat access\n * }\n *\n * if (hasAnyPermission('finance.view', 'finance.edit')) {\n * // User has at least one of these permissions\n * }\n */\nexport function usePermissions(): PermissionsHook {\n const { user } = useAppletContext()\n\n const hasPermission = (permission: string): boolean => {\n return user.permissions.includes(permission)\n }\n\n const hasAnyPermission = (...permissions: string[]): boolean => {\n return permissions.some(p => user.permissions.includes(p))\n }\n\n return {\n hasPermission,\n hasAnyPermission,\n permissions: user.permissions\n }\n}\n","import { useAppletContext } from '../context/AppletContext'\nimport type { TranslationHook } from '../types'\n\n/**\n * useTranslation provides i18n translation utilities.\n * All translations are automatically passed from backend locale bundle.\n *\n * Usage:\n * const { t, language } = useTranslation()\n *\n * // Simple translation\n * t('BiChat.Title') // Returns translated text\n *\n * // Translation with interpolation\n * t('Common.WelcomeMessage', { name: 'John' })\n * // If translation is \"Welcome {name}!\" -> Returns \"Welcome John!\"\n *\n * React uses same keys as Go backend:\n * Go: pageCtx.T(\"BiChat.Title\")\n * React: t(\"BiChat.Title\")\n */\nexport function useTranslation(): TranslationHook {\n const { locale } = useAppletContext()\n\n const t = (key: string, params?: Record<string, unknown>): string => {\n let text = locale.translations[key] || key\n\n // Simple interpolation: \"Hello {name}\" with {name: \"World\"}\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v))\n })\n }\n\n return text\n }\n\n return {\n t,\n language: locale.language\n }\n}\n","import { useMemo } from 'react'\nimport { useAppletContext } from '../context/AppletContext'\nimport type { SessionHook } from '../types'\n\nexport interface UseSessionOptions {\n loginPath?: string\n}\n\n/**\n * useSession provides session and authentication handling utilities.\n *\n * Usage:\n * const { isExpiringSoon, refreshSession, csrfToken } = useSession()\n *\n * // Check if session is expiring soon (5 min buffer)\n * if (isExpiringSoon) {\n * await refreshSession()\n * }\n *\n * // Include CSRF token in requests\n * fetch('/api/endpoint', {\n * headers: { 'X-CSRF-Token': csrfToken }\n * })\n */\nexport function useSession(options?: UseSessionOptions): SessionHook {\n const { session } = useAppletContext()\n const loginPath = options?.loginPath ?? '/login'\n\n // Check if session is expiring soon (5 minute buffer)\n const isExpiringSoon = useMemo(() => {\n const bufferMs = 5 * 60 * 1000 // 5 minutes\n return session.expiresAt - Date.now() < bufferMs\n }, [session.expiresAt])\n\n const refreshSession = async (): Promise<void> => {\n const response = await fetch(session.refreshURL, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': session.csrfToken\n }\n })\n\n if (!response.ok) {\n // Session refresh failed - redirect to login with return URL\n const returnUrl = encodeURIComponent(window.location.pathname)\n window.location.href = `${loginPath}?redirect=${returnUrl}`\n return\n }\n\n // Dispatch event for CSRF token update\n const newToken = response.headers.get('X-CSRF-Token')\n if (newToken) {\n window.dispatchEvent(\n new CustomEvent('iota:csrf-refresh', {\n detail: { token: newToken }\n })\n )\n }\n }\n\n return {\n isExpiringSoon,\n refreshSession,\n csrfToken: session.csrfToken,\n expiresAt: session.expiresAt\n }\n}\n","import { useAppletContext } from '../context/AppletContext'\nimport type { RouteContext } from '../types'\n\n/**\n * useRoute provides access to the current route context.\n * Route context is initialized from the backend and includes path, params, and query.\n *\n * Usage:\n * const { path, params, query } = useRoute()\n *\n * // Example values:\n * // path: \"/sessions/123\"\n * // params: { id: \"123\" }\n * // query: { tab: \"history\" }\n */\nexport function useRoute(): RouteContext {\n const { route } = useAppletContext()\n return route\n}\n","import { useState, useRef, useCallback } from 'react'\nimport type { StreamingHook } from '../types'\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n * console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n const [isStreaming, setIsStreaming] = useState(false)\n const abortControllerRef = useRef<AbortController | null>(null)\n\n const processStream = useCallback(\n async <T,>(\n generator: AsyncGenerator<T>,\n onChunk: (chunk: T) => void,\n signal?: AbortSignal\n ): Promise<void> => {\n setIsStreaming(true)\n\n // Create abort controller if not provided\n const controller = new AbortController()\n abortControllerRef.current = controller\n\n // Listen to external signal if provided\n if (signal) {\n signal.addEventListener('abort', () => {\n controller.abort()\n })\n }\n\n try {\n for await (const chunk of generator) {\n // Check if stream was cancelled\n if (controller.signal.aborted) {\n break\n }\n\n onChunk(chunk)\n }\n } catch (error) {\n // Stream was cancelled or errored\n if (controller.signal.aborted) {\n // Cancellation is expected, don't throw\n return\n }\n throw error\n } finally {\n setIsStreaming(false)\n abortControllerRef.current = null\n }\n },\n []\n )\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n setIsStreaming(false)\n }, [])\n\n const reset = useCallback(() => {\n abortControllerRef.current = null\n setIsStreaming(false)\n }, [])\n\n return {\n isStreaming,\n processStream,\n cancel,\n reset\n }\n}\n","import { useConfig } from './useConfig'\n\nexport type ShellMode = 'embedded' | 'standalone'\n\nexport interface AppletRuntime {\n basePath: string\n assetsBasePath: string\n rpcEndpoint?: string\n shellMode?: ShellMode\n}\n\nexport function useAppletRuntime(): AppletRuntime {\n const config = useConfig()\n\n const basePath = config.basePath ?? ''\n const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath\n const assetsBasePath = config.assetsBasePath ?? `${normalizedBasePath || ''}/assets`\n const rpcEndpoint = config.rpcUIEndpoint\n const shellMode = config.shellMode\n\n return { basePath: normalizedBasePath, assetsBasePath, rpcEndpoint, shellMode }\n}\n","import type React from 'react'\nimport { createRoot, type Root } from 'react-dom/client'\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase()\n\n const registry = getRegistry()\n const existing = registry.get(tagName)\n if (existing) {\n existing.options = options\n for (const a of options.observedAttributes ?? []) existing.observed.add(a)\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode'])\n for (const a of options.observedAttributes ?? []) observed.add(a)\n registry.set(tagName, { options, observed })\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }))\n }\n return\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName)\n if (!entry) throw new Error(`[${tagName}] applet host registry entry missing`)\n return entry\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null\n private container: HTMLDivElement | null = null\n private darkModeObserver: MutationObserver | null = null\n private styleEl: HTMLStyleElement | null = null\n private updateListener: ((e: Event) => void) | null = null\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed)\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n\n if (!this.container) {\n this.container = document.createElement('div')\n this.container.id = 'react-root'\n this.container.style.display = 'flex'\n this.container.style.flexDirection = 'column'\n this.container.style.flex = '1'\n this.container.style.minHeight = '0'\n this.container.style.height = '100%'\n this.container.style.width = '100%'\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root')\n if (!existingContainer) {\n if (this.styleEl) shadowRoot.appendChild(this.styleEl)\n shadowRoot.appendChild(this.container)\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement\n }\n\n this.syncFromRegistry()\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<{ tagName?: string }>).detail\n if (!detail || detail.tagName !== tagName) return\n this.syncFromRegistry()\n this.renderReact()\n }\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener)\n\n this.renderReact()\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener)\n }\n\n this.darkModeObserver?.disconnect()\n this.darkModeObserver = null\n\n this.reactRoot?.unmount()\n this.reactRoot = null\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return\n if (this.container) this.renderReact()\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {}\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value\n }\n\n const basePath = this.getAttribute('base-path') ?? ''\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url'\n\n return { basePath, shellMode, routerMode, attrs }\n }\n\n private renderReact(): void {\n if (!this.container) return\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container)\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()))\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err)\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry()\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles\n if (styles) {\n this.styleEl ??= document.createElement('style')\n this.styleEl.textContent = styles\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild)\n }\n } else if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode()\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect()\n this.darkModeObserver = null\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container\n if (!root) throw new Error('react root container not found')\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) root.classList.add('dark')\n else root.classList.remove('dark')\n }\n\n apply()\n\n const observer = new MutationObserver(apply)\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })\n return observer\n }\n }\n\n customElements.define(tagName, ReactAppletElement)\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>()\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') return false\n\n const url = new URL(window.location.href)\n if (url.searchParams.get('appletDebug') === '1') return true\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1'\n } catch {\n return false\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled'\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string\n details?: unknown\n cause?: unknown\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message)\n this.name = 'AppletRPCException'\n this.code = args.code\n this.details = args.details\n this.cause = args.cause\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params }\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now()\n const abortController = timeoutMs > 0 ? new AbortController() : undefined\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined\n let timedOut = false\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n })\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true\n abortController.abort()\n }, timeoutMs)\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n })\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n })\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n })\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n })\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n })\n\n return json.result as TResult\n } catch (err) {\n let rpcErr: unknown = err\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n })\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n })\n throw rpcErr\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle)\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>\n }\n\n return { call, callTyped }\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') return\n\n if (!shouldEnableAppletDevtools()) return\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }))\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now()\n return Math.max(0, Math.round(now - startedAt))\n}\n","import type React from 'react'\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? ''\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter\n return <MemoryRouter>{children}</MemoryRouter>\n }\n\n const BrowserRouter = options.BrowserRouter\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>\n }\n\n return { Router }\n}\n\n","import { useEffect, useMemo, useState } from 'react'\nimport { useAppletContext } from '../applet-core/context/AppletContext'\nimport { useAppletRuntime } from '../applet-core/hooks/useAppletRuntime'\n\ntype RPCEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nexport function AppletDevtoolsOverlay() {\n const ctx = useAppletContext()\n const runtime = useAppletRuntime()\n const [rpcEvents, setRPCEvents] = useState<RPCEvent[]>([])\n\n useEffect(() => {\n const onEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) return\n const detail = (e as CustomEvent<RPCEvent>).detail\n if (!detail) return\n setRPCEvents((prev) => [detail, ...prev].slice(0, 50))\n }\n window.addEventListener('iota:applet-rpc', onEvent as EventListener)\n return () => window.removeEventListener('iota:applet-rpc', onEvent as EventListener)\n }, [])\n\n const summary = useMemo(() => {\n return {\n basePath: runtime.basePath,\n assetsBasePath: runtime.assetsBasePath,\n rpcEndpoint: runtime.rpcEndpoint,\n shellMode: runtime.shellMode,\n route: ctx.route,\n user: { id: ctx.user.id, email: ctx.user.email },\n tenant: ctx.tenant,\n }\n }, [ctx.route, ctx.tenant, ctx.user.email, ctx.user.id, runtime.assetsBasePath, runtime.basePath, runtime.rpcEndpoint, runtime.shellMode])\n\n return (\n <div\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 420,\n maxHeight: '60vh',\n overflow: 'auto',\n background: 'rgba(17, 24, 39, 0.92)',\n color: '#E5E7EB',\n border: '1px solid rgba(255,255,255,0.12)',\n borderRadius: 10,\n padding: 12,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n fontSize: 12,\n zIndex: 2147483647,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={{ fontWeight: 700 }}>Applet Devtools</div>\n <div style={{ opacity: 0.7 }}>{runtime.shellMode ?? 'unknown'}</div>\n </div>\n\n <div style={{ marginBottom: 10 }}>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>Context</div>\n <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{JSON.stringify(summary, null, 2)}</pre>\n </div>\n\n <div>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>RPC</div>\n {rpcEvents.length === 0 ? (\n <div style={{ opacity: 0.7 }}>No calls yet</div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {rpcEvents.map((ev) => (\n <div key={`${ev.id}:${ev.status}`} style={{ padding: 8, border: '1px solid rgba(255,255,255,0.08)', borderRadius: 8 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>{ev.method}</div>\n <div style={{ opacity: 0.8 }}>\n {ev.status}\n {typeof ev.durationMs === 'number' ? ` (${ev.durationMs}ms)` : ''}\n </div>\n </div>\n {ev.status === 'error' ? (\n <pre style={{ margin: '6px 0 0', opacity: 0.8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {JSON.stringify(serializeError(ev.error) ?? {}, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction serializeError(err: unknown): unknown {\n if (err instanceof Error) {\n const out: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n }\n if (err.stack) out.stack = err.stack\n const errRecord = err as unknown as Record<string, unknown>\n if ('code' in err && typeof errRecord.code === 'string') out.code = errRecord.code\n if ('details' in err) out.details = errRecord.details\n if ('cause' in err) out.cause = errRecord.cause\n return out\n }\n return err\n}\n"]}
1
+ {"version":3,"sources":["../ui/src/applet-core/context/AppletContext.tsx","../ui/src/applet-core/context/ConfigProvider.tsx","../ui/src/applet-core/hooks/useAppletContext.ts","../ui/src/applet-core/hooks/useConfig.ts","../ui/src/applet-core/hooks/useUser.ts","../ui/src/applet-core/hooks/usePermissions.ts","../ui/src/applet-core/hooks/useTranslation.ts","../ui/src/applet-core/hooks/useSession.ts","../ui/src/applet-core/hooks/useRoute.ts","../ui/src/applet-core/hooks/useStreaming.ts","../ui/src/applet-core/hooks/useAppletRuntime.ts","../ui/src/applet-host/react-element.ts","../ui/src/applet-devtools/enabled.ts","../ui/src/applet-host/rpc.ts","../ui/src/applet-host/router.tsx","../ui/src/applet-devtools/overlay.tsx"],"names":["createContext","useContext","jsx","useAppletContext","useMemo","useState","useRef","useCallback","createRoot","useEffect","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * AppletContext provides access to the global context injected by the backend.\n * The context is read from window.__*_CONTEXT__ (configured via windowKey).\n */\nconst AppletContext = createContext<InitialContext | null>(null);\n\nconst REQUIRED_KEYS: Array<keyof InitialContext> = ['user', 'tenant', 'locale', 'config', 'route', 'session'];\n\nfunction validateInitialContext(value: unknown, windowKey: string): InitialContext {\n if (!value || typeof value !== 'object') {\n throw new Error(`${windowKey}: expected an object, got ${typeof value}`);\n }\n const obj = value as Record<string, unknown>;\n const missing = REQUIRED_KEYS.filter((k) => !(k in obj));\n if (missing.length > 0) {\n throw new Error(`${windowKey}: missing required keys: ${missing.join(', ')}`);\n }\n\n // Deep validation for nested required fields\n const user = obj.user as Record<string, unknown> | undefined;\n if (!user || typeof user !== 'object') {\n throw new Error(`${windowKey}.user: expected an object, got ${typeof user}`);\n }\n if (typeof user.id !== 'number') {\n throw new Error(`${windowKey}.user.id: expected number, got ${typeof user.id}`);\n }\n if (!Array.isArray(user.permissions)) {\n throw new Error(`${windowKey}.user.permissions: expected array, got ${typeof user.permissions}`);\n }\n\n const tenant = obj.tenant as Record<string, unknown> | undefined;\n if (!tenant || typeof tenant !== 'object') {\n throw new Error(`${windowKey}.tenant: expected an object, got ${typeof tenant}`);\n }\n if (typeof tenant.id !== 'string') {\n throw new Error(`${windowKey}.tenant.id: expected string, got ${typeof tenant.id}`);\n }\n\n const session = obj.session as Record<string, unknown> | undefined;\n if (!session || typeof session !== 'object') {\n throw new Error(`${windowKey}.session: expected an object, got ${typeof session}`);\n }\n if (typeof session.csrfToken !== 'string') {\n throw new Error(`${windowKey}.session.csrfToken: expected string, got ${typeof session.csrfToken}`);\n }\n if (typeof session.expiresAt !== 'number') {\n throw new Error(`${windowKey}.session.expiresAt: expected number, got ${typeof session.expiresAt}`);\n }\n if (typeof session.refreshURL !== 'string') {\n throw new Error(`${windowKey}.session.refreshURL: expected string, got ${typeof session.refreshURL}`);\n }\n\n const config = obj.config;\n if (!config || typeof config !== 'object') {\n throw new Error(`${windowKey}.config: expected object, got ${typeof config}`);\n }\n\n return value as InitialContext;\n}\n\nexport interface AppletProviderProps {\n children: ReactNode\n windowKey: string\n context?: InitialContext\n}\n\n/**\n * AppletProvider reads context from window global and provides it to hooks.\n *\n * Usage:\n * <AppletProvider windowKey=\"__APPLET_CONTEXT__\">\n * <App />\n * </AppletProvider>\n */\nexport function AppletProvider({ children, windowKey, context }: AppletProviderProps) {\n // Use provided context or read from window global\n const raw = context ?? (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!raw) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n const initialContext = validateInitialContext(raw, windowKey);\n\n return (\n <AppletContext.Provider value={initialContext}>\n {children}\n </AppletContext.Provider>\n );\n}\n\n/**\n * useAppletContext provides access to the full applet context.\n * Use specialized hooks (useUser, useConfig, etc.) for specific context parts.\n */\nexport function useAppletContext<T = InitialContext>(): T {\n const context = useContext(AppletContext);\n if (!context) {\n throw new Error('useAppletContext must be used within AppletProvider');\n }\n return context as T;\n}\n","import { createContext, useContext, ReactNode } from 'react';\nimport type { InitialContext } from '../types';\n\n/**\n * ConfigProvider is an alternative to AppletProvider that accepts context via props\n * instead of reading from window global. Useful for testing and server-side rendering.\n */\n\nconst ConfigContext = createContext<InitialContext | null>(null);\n\nexport interface ConfigProviderProps {\n children: ReactNode\n config: InitialContext\n}\n\n/**\n * ConfigProvider accepts context configuration via props.\n *\n * Usage:\n * <ConfigProvider config={initialContext}>\n * <App />\n * </ConfigProvider>\n */\nexport function ConfigProvider({ children, config }: ConfigProviderProps) {\n return (\n <ConfigContext.Provider value={config}>\n {children}\n </ConfigContext.Provider>\n );\n}\n\n/**\n * useConfigContext provides access to the applet context when using ConfigProvider.\n */\nexport function useConfigContext<T = InitialContext>(): T {\n const context = useContext(ConfigContext);\n if (!context) {\n throw new Error('useConfigContext must be used within ConfigProvider');\n }\n return context as T;\n}\n","import type { InitialContext } from '../types';\n\n/**\n * useAppletContext provides direct access to the window global context.\n * This is a standalone version that doesn't require AppletProvider.\n *\n * Usage:\n * const context = useAppletContext('__APPLET_CONTEXT__')\n *\n * Note: Prefer using AppletProvider + context hooks for better type safety\n * and testability. Use this hook only when provider setup is not possible.\n */\nexport function useAppletContext<T = InitialContext>(windowKey: string): T {\n const context = (window as unknown as Record<string, unknown>)[windowKey];\n\n if (!context) {\n throw new Error(`${windowKey} not found on window. Ensure backend context injection is working.`);\n }\n\n return context as T;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { AppConfig } from '../types';\n\n/**\n * useConfig provides access to applet configuration (endpoints, etc.)\n *\n * Usage:\n * const { graphQLEndpoint, streamEndpoint } = useConfig()\n */\nexport function useConfig(): AppConfig {\n const { config } = useAppletContext();\n return config;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { UserContext } from '../types';\n\n/**\n * useUser provides access to current user information.\n *\n * Usage:\n * const { id, email, firstName, lastName, permissions } = useUser()\n */\nexport function useUser(): UserContext {\n const { user } = useAppletContext();\n return user;\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { PermissionsHook } from '../types';\n\n/**\n * usePermissions provides permission checking utilities.\n * All user permissions are automatically passed from backend.\n *\n * Usage:\n * const { hasPermission, hasAnyPermission } = usePermissions()\n *\n * if (hasPermission('BiChat.Access')) {\n * // User has bichat access\n * }\n *\n * if (hasAnyPermission('finance.view', 'finance.edit')) {\n * // User has at least one of these permissions\n * }\n */\nexport function usePermissions(): PermissionsHook {\n const { user } = useAppletContext();\n\n const hasPermission = (permission: string): boolean => {\n return user.permissions.includes(permission);\n };\n\n const hasAnyPermission = (...permissions: string[]): boolean => {\n return permissions.some(p => user.permissions.includes(p));\n };\n\n return {\n hasPermission,\n hasAnyPermission,\n permissions: user.permissions\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { TranslationHook } from '../types';\n\n/**\n * useTranslation provides i18n translation utilities.\n * All translations are automatically passed from backend locale bundle.\n *\n * Usage:\n * const { t, language } = useTranslation()\n *\n * // Simple translation\n * t('BiChat.Title') // Returns translated text\n *\n * // Translation with interpolation\n * t('Common.WelcomeMessage', { name: 'John' })\n * // If translation is \"Welcome {name}!\" -> Returns \"Welcome John!\"\n *\n * React uses same keys as Go backend:\n * Go: pageCtx.T(\"BiChat.Title\")\n * React: t(\"BiChat.Title\")\n */\nexport function useTranslation(): TranslationHook {\n const { locale } = useAppletContext();\n\n const t = (key: string, params?: Record<string, unknown>): string => {\n let text = locale.translations[key] || key;\n\n // Simple interpolation: \"Hello {name}\" with {name: \"World\"}\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(v));\n });\n }\n\n return text;\n };\n\n return {\n t,\n language: locale.language\n };\n}\n","import { useMemo } from 'react';\nimport { useAppletContext } from '../context/AppletContext';\nimport type { SessionHook } from '../types';\n\nexport interface UseSessionOptions {\n loginPath?: string\n}\n\n/**\n * useSession provides session and authentication handling utilities.\n *\n * Usage:\n * const { isExpiringSoon, refreshSession, csrfToken } = useSession()\n *\n * // Check if session is expiring soon (5 min buffer)\n * if (isExpiringSoon) {\n * await refreshSession()\n * }\n *\n * // Include CSRF token in requests\n * fetch('/api/endpoint', {\n * headers: { 'X-CSRF-Token': csrfToken }\n * })\n */\nexport function useSession(options?: UseSessionOptions): SessionHook {\n const { session } = useAppletContext();\n const loginPath = options?.loginPath ?? '/login';\n\n // Check if session is expiring soon (5 minute buffer)\n const isExpiringSoon = useMemo(() => {\n const bufferMs = 5 * 60 * 1000; // 5 minutes\n return session.expiresAt - Date.now() < bufferMs;\n }, [session.expiresAt]);\n\n const refreshSession = async (): Promise<void> => {\n const response = await fetch(session.refreshURL, {\n method: 'POST',\n headers: {\n 'X-CSRF-Token': session.csrfToken\n }\n });\n\n if (!response.ok) {\n // Session refresh failed - redirect to login with return URL\n const returnUrl = encodeURIComponent(window.location.pathname);\n window.location.href = `${loginPath}?redirect=${returnUrl}`;\n return;\n }\n\n // Dispatch event for CSRF token update\n const newToken = response.headers.get('X-CSRF-Token');\n if (newToken) {\n window.dispatchEvent(\n new CustomEvent('iota:csrf-refresh', {\n detail: { token: newToken }\n })\n );\n }\n };\n\n return {\n isExpiringSoon,\n refreshSession,\n csrfToken: session.csrfToken,\n expiresAt: session.expiresAt\n };\n}\n","import { useAppletContext } from '../context/AppletContext';\nimport type { RouteContext } from '../types';\n\n/**\n * useRoute provides access to the current route context.\n * Route context is initialized from the backend and includes path, params, and query.\n *\n * Usage:\n * const { path, params, query } = useRoute()\n *\n * // Example values:\n * // path: \"/sessions/123\"\n * // params: { id: \"123\" }\n * // query: { tab: \"history\" }\n */\nexport function useRoute(): RouteContext {\n const { route } = useAppletContext();\n return route;\n}\n","import { useState, useRef, useCallback } from 'react';\nimport type { StreamingHook } from '../types';\n\n/**\n * useStreaming provides SSE (Server-Sent Events) streaming utilities with cancellation support.\n *\n * Usage:\n * const { isStreaming, processStream, cancel, reset } = useStreaming()\n *\n * // Process async generator stream\n * await processStream(messageStream, (chunk) => {\n * console.log('Received:', chunk)\n * })\n *\n * // Cancel ongoing stream\n * cancel()\n *\n * // Reset state after stream completion\n * reset()\n */\nexport function useStreaming(): StreamingHook {\n const [isStreaming, setIsStreaming] = useState(false);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const processStream = useCallback(\n async <T,>(\n generator: AsyncGenerator<T>,\n onChunk: (chunk: T) => void,\n signal?: AbortSignal\n ): Promise<void> => {\n setIsStreaming(true);\n\n // Create abort controller if not provided\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Listen to external signal if provided\n const onExternalAbort = signal ? () => { controller.abort(); } : undefined;\n if (signal && onExternalAbort) {\n signal.addEventListener('abort', onExternalAbort);\n }\n\n try {\n for await (const chunk of generator) {\n // Check if stream was cancelled\n if (controller.signal.aborted) {\n break;\n }\n\n onChunk(chunk);\n }\n } catch (error) {\n // Stream was cancelled or errored\n if (controller.signal.aborted) {\n // Cancellation is expected, don't throw\n return;\n }\n throw error;\n } finally {\n if (signal && onExternalAbort) {\n signal.removeEventListener('abort', onExternalAbort);\n }\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n []\n );\n\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n const reset = useCallback(() => {\n abortControllerRef.current = null;\n setIsStreaming(false);\n }, []);\n\n return {\n isStreaming,\n processStream,\n cancel,\n reset\n };\n}\n","import { useConfig } from './useConfig';\n\nexport type ShellMode = 'embedded' | 'standalone'\n\nexport interface AppletRuntime {\n basePath: string\n assetsBasePath: string\n rpcEndpoint?: string\n shellMode?: ShellMode\n}\n\nexport function useAppletRuntime(): AppletRuntime {\n const config = useConfig();\n\n const basePath = config.basePath ?? '';\n const normalizedBasePath = basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n const assetsBasePath = config.assetsBasePath ?? `${normalizedBasePath || ''}/assets`;\n const rpcEndpoint = config.rpcUIEndpoint;\n const shellMode = config.shellMode;\n\n return { basePath: normalizedBasePath, assetsBasePath, rpcEndpoint, shellMode };\n}\n","import type React from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nexport type RouterMode = 'url' | 'memory'\nexport type ShellMode = 'embedded' | 'standalone'\n\ntype RegistryEntry = {\n options: DefineReactAppletElementOptions\n observed: Set<string>\n}\n\nexport interface AppletHostConfig {\n basePath: string\n shellMode?: ShellMode\n routerMode: RouterMode\n attrs: Record<string, string>\n}\n\nexport interface DefineReactAppletElementOptions {\n tagName: string\n styles?: string | (() => string)\n render: (host: AppletHostConfig) => React.ReactElement\n observedAttributes?: string[]\n observeDarkMode?: boolean\n}\n\nexport function defineReactAppletElement(options: DefineReactAppletElementOptions): void {\n const tagName = options.tagName.toLowerCase();\n\n const registry = getRegistry();\n const existing = registry.get(tagName);\n if (existing) {\n existing.options = options;\n for (const a of options.observedAttributes ?? []) {existing.observed.add(a);}\n } else {\n const observed = new Set<string>(['base-path', 'shell-mode', 'router-mode']);\n for (const a of options.observedAttributes ?? []) {observed.add(a);}\n registry.set(tagName, { options, observed });\n }\n\n if (customElements.get(tagName)) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('iota:applet-host-update', { detail: { tagName } }));\n }\n return;\n }\n\n function getEntry(): RegistryEntry {\n const entry = getRegistry().get(tagName);\n if (!entry) {throw new Error(`[${tagName}] applet host registry entry missing`);}\n return entry;\n }\n\n class ReactAppletElement extends HTMLElement {\n private reactRoot: Root | null = null;\n private container: HTMLDivElement | null = null;\n private darkModeObserver: MutationObserver | null = null;\n private styleEl: HTMLStyleElement | null = null;\n private updateListener: ((e: Event) => void) | null = null;\n\n static get observedAttributes(): string[] {\n return Array.from(getEntry().observed);\n }\n\n connectedCallback(): void {\n const shadowRoot = this.shadowRoot ?? this.attachShadow({ mode: 'open' });\n\n if (!this.container) {\n this.container = document.createElement('div');\n this.container.id = 'react-root';\n this.container.style.display = 'flex';\n this.container.style.flexDirection = 'column';\n this.container.style.flex = '1';\n this.container.style.minHeight = '0';\n this.container.style.height = '100%';\n this.container.style.width = '100%';\n }\n\n const existingContainer = shadowRoot.querySelector('#react-root');\n if (!existingContainer) {\n if (this.styleEl) {shadowRoot.appendChild(this.styleEl);}\n shadowRoot.appendChild(this.container);\n } else if (existingContainer !== this.container) {\n this.container = existingContainer as HTMLDivElement;\n }\n\n this.syncFromRegistry();\n\n this.updateListener ??= (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<{ tagName?: string }>).detail;\n if (!detail || detail.tagName !== tagName) {return;}\n this.syncFromRegistry();\n this.renderReact();\n };\n window.addEventListener('iota:applet-host-update', this.updateListener as EventListener);\n\n this.renderReact();\n }\n\n disconnectedCallback(): void {\n if (this.updateListener) {\n window.removeEventListener('iota:applet-host-update', this.updateListener as EventListener);\n }\n\n this.darkModeObserver?.disconnect();\n this.darkModeObserver = null;\n\n this.reactRoot?.unmount();\n this.reactRoot = null;\n }\n\n attributeChangedCallback(_name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) {return;}\n if (this.container) {this.renderReact();}\n }\n\n private getHostConfig(): AppletHostConfig {\n const attrs: Record<string, string> = {};\n for (const { name, value } of Array.from(this.attributes)) {\n attrs[name] = value;\n }\n\n const basePath = this.getAttribute('base-path') ?? '';\n const shellMode = (this.getAttribute('shell-mode') as ShellMode | null) ?? undefined;\n const routerMode = (this.getAttribute('router-mode') as RouterMode | null) ?? 'url';\n\n return { basePath, shellMode, routerMode, attrs };\n }\n\n private renderReact(): void {\n if (!this.container) {return;}\n\n if (!this.reactRoot) {\n this.reactRoot = createRoot(this.container);\n }\n\n try {\n this.reactRoot.render(getEntry().options.render(this.getHostConfig()));\n } catch (err) {\n console.error(`[${tagName}] failed to mount React app:`, err);\n }\n }\n\n private syncFromRegistry(): void {\n const entry = getEntry();\n\n const styles = typeof entry.options.styles === 'function' ? entry.options.styles() : entry.options.styles;\n if (styles) {\n this.styleEl ??= document.createElement('style');\n this.styleEl.textContent = styles;\n if (this.shadowRoot && !this.shadowRoot.contains(this.styleEl)) {\n this.shadowRoot.insertBefore(this.styleEl, this.shadowRoot.firstChild);\n }\n } else if (this.styleEl) {\n this.styleEl.remove();\n this.styleEl = null;\n }\n\n if (entry.options.observeDarkMode !== false) {\n this.darkModeObserver ??= this.syncDarkMode();\n } else if (this.darkModeObserver) {\n this.darkModeObserver.disconnect();\n this.darkModeObserver = null;\n }\n }\n\n private syncDarkMode(): MutationObserver {\n const root = this.container;\n if (!root) {throw new Error('react root container not found');}\n\n const apply = () => {\n if (document.documentElement.classList.contains('dark')) {root.classList.add('dark');}\n else {root.classList.remove('dark');}\n };\n\n apply();\n\n const observer = new MutationObserver(apply);\n observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });\n return observer;\n }\n }\n\n customElements.define(tagName, ReactAppletElement);\n}\n\nfunction getRegistry(): Map<string, RegistryEntry> {\n const g = globalThis as Record<string, unknown>;\n g.__IOTA_REACT_APPLET_HOST_REGISTRY__ ??= new Map<string, RegistryEntry>();\n return g.__IOTA_REACT_APPLET_HOST_REGISTRY__ as Map<string, RegistryEntry>;\n}\n","export function shouldEnableAppletDevtools(): boolean {\n if (typeof window === 'undefined') {return false;}\n\n const url = new URL(window.location.href);\n if (url.searchParams.get('appletDebug') === '1') {return true;}\n\n try {\n return window.localStorage.getItem('iotaAppletDevtools') === '1';\n } catch {\n return false;\n }\n}\n\n","import { shouldEnableAppletDevtools } from '../applet-devtools/enabled';\n\nexport interface AppletRPCError {\n code: string\n message: string\n details?: unknown\n}\n\nexport class AppletRPCException extends Error {\n code: string;\n details?: unknown;\n cause?: unknown;\n\n constructor(args: { code: string; message: string; details?: unknown; cause?: unknown }) {\n super(args.message);\n this.name = 'AppletRPCException';\n this.code = args.code;\n this.details = args.details;\n this.cause = args.cause;\n }\n}\n\nexport type AppletRPCSchema = Record<string, { params: unknown; result: unknown }>\n\ninterface RPCRequest {\n id: string\n method: string\n params: unknown\n}\n\ninterface RPCResponse<TResult> {\n id: string\n result?: TResult\n error?: AppletRPCError\n}\n\nexport interface CreateAppletRPCClientOptions {\n endpoint: string\n fetcher?: typeof fetch\n timeoutMs?: number\n}\n\nexport function createAppletRPCClient(options: CreateAppletRPCClientOptions) {\n const fetcher = options.fetcher ?? fetch;\n const timeoutMs = typeof options.timeoutMs === 'number' && options.timeoutMs > 0 ? options.timeoutMs : 0;\n\n async function call<TParams, TResult>(method: string, params: TParams): Promise<TResult> {\n const req: RPCRequest = { id: crypto.randomUUID(), method, params };\n const startedAt = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const abortController = timeoutMs > 0 ? new AbortController() : undefined;\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let timedOut = false;\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'start',\n });\n\n try {\n if (abortController) {\n timeoutHandle = setTimeout(() => {\n timedOut = true;\n abortController.abort();\n }, timeoutMs);\n }\n\n const resp = await fetcher(options.endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(req),\n signal: abortController?.signal,\n });\n\n if (!resp.ok) {\n throw new AppletRPCException({\n code: 'http_error',\n message: `HTTP ${resp.status}`,\n details: { status: resp.status },\n });\n }\n\n const json = (await resp.json()) as RPCResponse<TResult>;\n if (json.error) {\n throw new AppletRPCException({\n code: json.error.code,\n message: json.error.message,\n details: json.error.details,\n });\n }\n\n if (json.result === undefined) {\n throw new AppletRPCException({\n code: 'invalid_response',\n message: 'Missing result in successful response',\n });\n }\n\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'success',\n durationMs: elapsedMs(startedAt),\n });\n\n return json.result as TResult;\n } catch (err) {\n let rpcErr: unknown = err;\n if (err instanceof Error && err.name === 'AbortError') {\n rpcErr = new AppletRPCException({\n code: timedOut ? 'timeout' : 'aborted',\n message: timedOut ? `RPC request timed out after ${timeoutMs}ms` : 'RPC request was aborted',\n cause: err,\n });\n }\n maybeDispatchRPCEvent({\n id: req.id,\n method: req.method,\n status: 'error',\n durationMs: elapsedMs(startedAt),\n error: rpcErr,\n });\n throw rpcErr;\n } finally {\n if (timeoutHandle !== undefined) {\n clearTimeout(timeoutHandle);\n }\n }\n }\n\n async function callTyped<\n TRouter extends AppletRPCSchema,\n TMethod extends keyof TRouter & string,\n >(method: TMethod, params: TRouter[TMethod]['params']): Promise<TRouter[TMethod]['result']> {\n return call(method, params) as Promise<TRouter[TMethod]['result']>;\n }\n\n return { call, callTyped };\n}\n\ntype RPCDevEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nfunction maybeDispatchRPCEvent(detail: RPCDevEvent) {\n if (typeof window === 'undefined') {return;}\n\n if (!shouldEnableAppletDevtools()) {return;}\n\n window.dispatchEvent(new CustomEvent('iota:applet-rpc', { detail }));\n}\n\nfunction elapsedMs(startedAt: number): number {\n const now = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return Math.max(0, Math.round(now - startedAt));\n}\n","import type React from 'react';\n\nexport type RouterMode = 'url' | 'memory'\n\nexport interface CreateAppletRouterOptions {\n mode: RouterMode\n basePath?: string\n BrowserRouter: React.ComponentType<Record<string, unknown>>\n MemoryRouter: React.ComponentType<Record<string, unknown>>\n}\n\nexport function createAppletRouter(options: CreateAppletRouterOptions) {\n const basePath = options.basePath ?? '';\n\n const Router: React.FC<React.PropsWithChildren> = ({ children }) => {\n if (options.mode === 'memory') {\n const MemoryRouter = options.MemoryRouter;\n return <MemoryRouter>{children}</MemoryRouter>;\n }\n\n const BrowserRouter = options.BrowserRouter;\n return <BrowserRouter basename={basePath}>{children}</BrowserRouter>;\n };\n\n return { Router };\n}\n\n","import { useEffect, useMemo, useState } from 'react';\nimport { useAppletContext } from '../applet-core/context/AppletContext';\nimport { useAppletRuntime } from '../applet-core/hooks/useAppletRuntime';\n\ntype RPCEvent = {\n id: string\n method: string\n status: 'start' | 'success' | 'error'\n durationMs?: number\n error?: unknown\n}\n\nexport function AppletDevtoolsOverlay() {\n const ctx = useAppletContext();\n const runtime = useAppletRuntime();\n const [rpcEvents, setRPCEvents] = useState<RPCEvent[]>([]);\n\n useEffect(() => {\n const onEvent = (e: Event) => {\n if (!(e instanceof CustomEvent)) {return;}\n const detail = (e as CustomEvent<RPCEvent>).detail;\n if (!detail) {return;}\n setRPCEvents((prev) => [detail, ...prev].slice(0, 50));\n };\n window.addEventListener('iota:applet-rpc', onEvent as EventListener);\n return () => window.removeEventListener('iota:applet-rpc', onEvent as EventListener);\n }, []);\n\n const summary = useMemo(() => {\n return {\n basePath: runtime.basePath,\n assetsBasePath: runtime.assetsBasePath,\n rpcEndpoint: runtime.rpcEndpoint,\n shellMode: runtime.shellMode,\n route: ctx.route,\n user: { id: ctx.user.id, email: ctx.user.email },\n tenant: ctx.tenant,\n };\n }, [ctx.route, ctx.tenant, ctx.user.email, ctx.user.id, runtime.assetsBasePath, runtime.basePath, runtime.rpcEndpoint, runtime.shellMode]);\n\n return (\n <div\n style={{\n position: 'fixed',\n right: 12,\n bottom: 12,\n width: 420,\n maxHeight: '60vh',\n overflow: 'auto',\n background: 'rgba(17, 24, 39, 0.92)',\n color: '#E5E7EB',\n border: '1px solid rgba(255,255,255,0.12)',\n borderRadius: 10,\n padding: 12,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n fontSize: 12,\n zIndex: 2147483647,\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 8 }}>\n <div style={{ fontWeight: 700 }}>Applet Devtools</div>\n <div style={{ opacity: 0.7 }}>{runtime.shellMode ?? 'unknown'}</div>\n </div>\n\n <div style={{ marginBottom: 10 }}>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>Context</div>\n <pre style={{ margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{JSON.stringify(summary, null, 2)}</pre>\n </div>\n\n <div>\n <div style={{ opacity: 0.85, marginBottom: 4 }}>RPC</div>\n {rpcEvents.length === 0 ? (\n <div style={{ opacity: 0.7 }}>No calls yet</div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {rpcEvents.map((ev) => (\n <div key={`${ev.id}:${ev.status}`} style={{ padding: 8, border: '1px solid rgba(255,255,255,0.08)', borderRadius: 8 }}>\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <div>{ev.method}</div>\n <div style={{ opacity: 0.8 }}>\n {ev.status}\n {typeof ev.durationMs === 'number' ? ` (${ev.durationMs}ms)` : ''}\n </div>\n </div>\n {ev.status === 'error' ? (\n <pre style={{ margin: '6px 0 0', opacity: 0.8, whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {JSON.stringify(serializeError(ev.error) ?? {}, null, 2)}\n </pre>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction serializeError(err: unknown): unknown {\n if (err instanceof Error) {\n const out: Record<string, unknown> = {\n name: err.name,\n message: err.message,\n };\n if (err.stack) {out.stack = err.stack;}\n const errRecord = err as unknown as Record<string, unknown>;\n if ('code' in err && typeof errRecord.code === 'string') {out.code = errRecord.code;}\n if ('details' in err) {out.details = errRecord.details;}\n if ('cause' in err) {out.cause = errRecord.cause;}\n return out;\n }\n return err;\n}\n"]}