sunpeak 0.16.17 → 0.16.21

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 (145) hide show
  1. package/README.md +2 -2
  2. package/bin/commands/build.mjs +1 -1
  3. package/bin/commands/dev.mjs +137 -19
  4. package/bin/commands/new.mjs +21 -2
  5. package/bin/commands/start.mjs +1 -1
  6. package/dist/chatgpt/chatgpt-conversation.d.ts +3 -1
  7. package/dist/chatgpt/globals.css +37 -8
  8. package/dist/chatgpt/index.cjs +3 -5
  9. package/dist/chatgpt/index.cjs.map +1 -1
  10. package/dist/chatgpt/index.d.ts +0 -1
  11. package/dist/chatgpt/index.js +3 -5
  12. package/dist/chatgpt/index.js.map +1 -1
  13. package/dist/claude/claude-conversation.d.ts +3 -1
  14. package/dist/claude/index.cjs +2 -2
  15. package/dist/claude/index.d.ts +1 -1
  16. package/dist/claude/index.js +2 -2
  17. package/dist/{discovery-DvIQWTez.js → discovery-BVqD-JsT.js} +4 -2
  18. package/dist/{discovery-DvIQWTez.js.map → discovery-BVqD-JsT.js.map} +1 -1
  19. package/dist/{discovery-SviNiBkF.cjs → discovery-D1gpaVz4.cjs} +4 -2
  20. package/dist/{discovery-SviNiBkF.cjs.map → discovery-D1gpaVz4.cjs.map} +1 -1
  21. package/dist/hooks/index.d.ts +10 -1
  22. package/dist/hooks/safe-area.d.ts +6 -2
  23. package/dist/hooks/use-device-capabilities.d.ts +3 -0
  24. package/dist/hooks/use-platform.d.ts +3 -0
  25. package/dist/hooks/use-styles.d.ts +2 -0
  26. package/dist/hooks/use-time-zone.d.ts +1 -0
  27. package/dist/hooks/use-tool-info.d.ts +3 -0
  28. package/dist/hooks/use-user-agent.d.ts +1 -0
  29. package/dist/hooks/use-viewport.d.ts +3 -0
  30. package/dist/{platform → host}/chatgpt/index.cjs +1 -1
  31. package/dist/host/chatgpt/index.cjs.map +1 -0
  32. package/dist/{platform → host}/chatgpt/index.d.ts +2 -2
  33. package/dist/{platform → host}/chatgpt/index.js +1 -1
  34. package/dist/host/chatgpt/index.js.map +1 -0
  35. package/dist/{platform → host}/chatgpt/use-create-file.d.ts +2 -2
  36. package/dist/{platform → host}/chatgpt/use-file-download.d.ts +2 -2
  37. package/dist/{platform → host}/chatgpt/use-open-modal.d.ts +2 -2
  38. package/dist/{platform → host}/chatgpt/use-request-checkout.d.ts +2 -2
  39. package/dist/{platform → host}/index.cjs +5 -3
  40. package/dist/host/index.cjs.map +1 -0
  41. package/dist/{platform → host}/index.d.ts +15 -11
  42. package/dist/{platform → host}/index.js +5 -3
  43. package/dist/host/index.js.map +1 -0
  44. package/dist/{index-CsYoMHyn.js → index-B4aC3vjH.js} +4 -4
  45. package/dist/index-B4aC3vjH.js.map +1 -0
  46. package/dist/{index-DHcaJ5PU.cjs → index-CKabCJyV.cjs} +4 -4
  47. package/dist/index-CKabCJyV.cjs.map +1 -0
  48. package/dist/index-CX6Z4bED.js +29 -0
  49. package/dist/index-CX6Z4bED.js.map +1 -0
  50. package/dist/index-bKBBCBK6.cjs +28 -0
  51. package/dist/index-bKBBCBK6.cjs.map +1 -0
  52. package/dist/index.cjs +233 -6297
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.ts +4 -2
  55. package/dist/index.js +228 -6292
  56. package/dist/index.js.map +1 -1
  57. package/dist/lib/discovery-cli.cjs +1 -1
  58. package/dist/lib/discovery-cli.js +1 -1
  59. package/dist/mcp/index.cjs +680 -6766
  60. package/dist/mcp/index.cjs.map +1 -1
  61. package/dist/mcp/index.js +682 -6768
  62. package/dist/mcp/index.js.map +1 -1
  63. package/dist/{protocol-CfvM5B6z.cjs → protocol-DkDHRwOW.cjs} +50 -5
  64. package/dist/{protocol-CfvM5B6z.cjs.map → protocol-DkDHRwOW.cjs.map} +1 -1
  65. package/dist/{protocol-CF-P_kw5.js → protocol-uge7qFev.js} +102 -57
  66. package/dist/{protocol-CF-P_kw5.js.map → protocol-uge7qFev.js.map} +1 -1
  67. package/dist/simulator/hosts.d.ts +2 -0
  68. package/dist/simulator/index.cjs +3 -3
  69. package/dist/simulator/index.js +3 -3
  70. package/dist/simulator/simple-sidebar.d.ts +18 -4
  71. package/dist/simulator/simulator-url.d.ts +8 -0
  72. package/dist/simulator/simulator.d.ts +13 -1
  73. package/dist/simulator/use-simulator-state.d.ts +10 -6
  74. package/dist/simulator-D8t-r7HH.js +3222 -0
  75. package/dist/simulator-D8t-r7HH.js.map +1 -0
  76. package/dist/simulator-FFNttkqL.cjs +3237 -0
  77. package/dist/simulator-FFNttkqL.cjs.map +1 -0
  78. package/dist/{simulator-url-rgg_KYOg.cjs → simulator-url-DcSYRl-P.cjs} +7 -1
  79. package/dist/simulator-url-DcSYRl-P.cjs.map +1 -0
  80. package/dist/{simulator-url-CuLqtnSS.js → simulator-url-j_XV3EoP.js} +7 -1
  81. package/dist/simulator-url-j_XV3EoP.js.map +1 -0
  82. package/dist/style.css +37 -8
  83. package/dist/use-app-C9gpzIQO.js +349 -0
  84. package/dist/use-app-C9gpzIQO.js.map +1 -0
  85. package/dist/use-app-D09O2swh.cjs +348 -0
  86. package/dist/use-app-D09O2swh.cjs.map +1 -0
  87. package/package.json +26 -14
  88. package/template/.sunpeak/dev.tsx +28 -2
  89. package/template/node_modules/.bin/vite +2 -2
  90. package/template/node_modules/.bin/vitest +2 -2
  91. package/template/package.json +5 -5
  92. package/template/playwright.config.ts +6 -3
  93. package/template/src/resources/albums/albums.test.tsx +1 -0
  94. package/template/src/resources/albums/albums.tsx +5 -2
  95. package/template/src/resources/albums/components/albums.test.tsx +22 -18
  96. package/template/src/resources/albums/components/albums.tsx +63 -7
  97. package/template/src/resources/albums/components/fullscreen-viewer.test.tsx +3 -25
  98. package/template/src/resources/albums/components/fullscreen-viewer.tsx +2 -3
  99. package/template/src/resources/carousel/carousel.test.tsx +12 -16
  100. package/template/src/resources/carousel/carousel.tsx +47 -5
  101. package/template/src/resources/map/components/map.tsx +65 -9
  102. package/template/src/resources/map/map.test.tsx +0 -1
  103. package/template/src/resources/review/review.test.tsx +25 -27
  104. package/template/src/resources/review/review.tsx +85 -63
  105. package/template/src/tools/review-diff.test.ts +73 -0
  106. package/template/src/tools/review-diff.ts +29 -2
  107. package/template/src/tools/review-post.test.ts +100 -0
  108. package/template/src/tools/review-post.ts +30 -2
  109. package/template/src/tools/review-purchase.test.ts +111 -0
  110. package/template/src/tools/review-purchase.ts +35 -2
  111. package/template/src/tools/review.test.ts +40 -0
  112. package/template/src/tools/review.ts +4 -1
  113. package/template/src/tools/show-albums.test.ts +42 -0
  114. package/template/src/tools/show-albums.ts +22 -2
  115. package/template/src/tools/show-carousel.test.ts +45 -0
  116. package/template/src/tools/show-carousel.ts +19 -2
  117. package/template/src/tools/show-map.test.ts +74 -0
  118. package/template/src/tools/show-map.ts +21 -2
  119. package/template/tests/e2e/albums.spec.ts +75 -0
  120. package/template/tests/e2e/carousel.spec.ts +65 -0
  121. package/template/tests/e2e/global-setup.ts +25 -0
  122. package/template/tests/e2e/map.spec.ts +60 -0
  123. package/template/tests/e2e/review.spec.ts +72 -11
  124. package/dist/chatgpt/chatgpt-simulator.d.ts +0 -10
  125. package/dist/index-BFD3bAHd.cjs +0 -547
  126. package/dist/index-BFD3bAHd.cjs.map +0 -1
  127. package/dist/index-CsYoMHyn.js.map +0 -1
  128. package/dist/index-DHcaJ5PU.cjs.map +0 -1
  129. package/dist/index-wUvmyoCx.js +0 -532
  130. package/dist/index-wUvmyoCx.js.map +0 -1
  131. package/dist/platform/chatgpt/index.cjs.map +0 -1
  132. package/dist/platform/chatgpt/index.js.map +0 -1
  133. package/dist/platform/index.cjs.map +0 -1
  134. package/dist/platform/index.js.map +0 -1
  135. package/dist/simulator-BEFsuj9Z.cjs +0 -8872
  136. package/dist/simulator-BEFsuj9Z.cjs.map +0 -1
  137. package/dist/simulator-Da9iAupa.js +0 -8857
  138. package/dist/simulator-Da9iAupa.js.map +0 -1
  139. package/dist/simulator-url-CuLqtnSS.js.map +0 -1
  140. package/dist/simulator-url-rgg_KYOg.cjs.map +0 -1
  141. package/dist/use-app-CaTJmpgj.cjs +0 -6449
  142. package/dist/use-app-CaTJmpgj.cjs.map +0 -1
  143. package/dist/use-app-DTTzqi-0.js +0 -6450
  144. package/dist/use-app-DTTzqi-0.js.map +0 -1
  145. /package/dist/{platform → host}/chatgpt/openai-types.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulator-FFNttkqL.cjs","sources":["../src/lib/default-style-variables.ts","../src/simulator/hosts.ts","../src/simulator/simulator-types.ts","../src/chatgpt/chatgpt-conversation.tsx","../src/chatgpt/chatgpt-host.ts","../src/claude/claude-conversation.tsx","../src/claude/claude-host.ts","../../../node_modules/.pnpm/@modelcontextprotocol+ext-apps@1.2.2_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__react-_e9bf7657371391a829fe8b4e289b253c/node_modules/@modelcontextprotocol/ext-apps/dist/src/app-bridge.js","../src/simulator/mcp-app-host.ts","../src/simulator/mock-openai-runtime.ts","../src/simulator/iframe-resource.tsx","../src/simulator/use-simulator-state.ts","../src/simulator/theme-provider.tsx","../src/simulator/simple-sidebar.tsx","../src/types/simulation.ts","../src/simulator/simulator.tsx"],"sourcesContent":["/**\n * Default MCP App style variables.\n *\n * Uses CSS light-dark() so a single set of values adapts to the document's\n * color-scheme automatically. These are applied as fallbacks when the host\n * doesn't provide style variables, and host shells use them as a base to\n * override specific entries for their brand palette.\n *\n * @see https://github.com/modelcontextprotocol/ext-apps/blob/main/specification/2026-01-26/apps.mdx#theming\n */\nimport type { McpUiStyles } from '@modelcontextprotocol/ext-apps';\n\nexport const DEFAULT_STYLE_VARIABLES: McpUiStyles = {\n // Background colors\n '--color-background-primary': 'light-dark(#ffffff, #1a1a1a)',\n '--color-background-secondary': 'light-dark(#f5f5f5, #2d2d2d)',\n '--color-background-tertiary': 'light-dark(#e5e5e5, #404040)',\n '--color-background-inverse': 'light-dark(#1a1a1a, #ffffff)',\n '--color-background-ghost': 'light-dark(rgba(255,255,255,0), rgba(26,26,26,0))',\n '--color-background-info': 'light-dark(#eff6ff, #1e3a5f)',\n '--color-background-danger': 'light-dark(#fef2f2, #7f1d1d)',\n '--color-background-success': 'light-dark(#f0fdf4, #14532d)',\n '--color-background-warning': 'light-dark(#fefce8, #713f12)',\n '--color-background-disabled': 'light-dark(rgba(255,255,255,0.5), rgba(26,26,26,0.5))',\n\n // Text colors\n '--color-text-primary': 'light-dark(#1f2937, #f3f4f6)',\n '--color-text-secondary': 'light-dark(#6b7280, #9ca3af)',\n '--color-text-tertiary': 'light-dark(#9ca3af, #6b7280)',\n '--color-text-inverse': 'light-dark(#f3f4f6, #1f2937)',\n '--color-text-ghost': 'light-dark(rgba(107,114,128,0.5), rgba(156,163,175,0.5))',\n '--color-text-info': 'light-dark(#1d4ed8, #60a5fa)',\n '--color-text-danger': 'light-dark(#b91c1c, #f87171)',\n '--color-text-success': 'light-dark(#15803d, #4ade80)',\n '--color-text-warning': 'light-dark(#a16207, #fbbf24)',\n '--color-text-disabled': 'light-dark(rgba(31,41,55,0.5), rgba(243,244,246,0.5))',\n\n // Border colors\n '--color-border-primary': 'light-dark(#e5e7eb, #404040)',\n '--color-border-secondary': 'light-dark(#d1d5db, #525252)',\n '--color-border-tertiary': 'light-dark(#f3f4f6, #374151)',\n '--color-border-inverse': 'light-dark(rgba(255,255,255,0.3), rgba(0,0,0,0.3))',\n '--color-border-ghost': 'light-dark(rgba(229,231,235,0), rgba(64,64,64,0))',\n '--color-border-info': 'light-dark(#93c5fd, #1e40af)',\n '--color-border-danger': 'light-dark(#fca5a5, #991b1b)',\n '--color-border-success': 'light-dark(#86efac, #166534)',\n '--color-border-warning': 'light-dark(#fde047, #854d0e)',\n '--color-border-disabled': 'light-dark(rgba(229,231,235,0.5), rgba(64,64,64,0.5))',\n\n // Ring colors (focus)\n '--color-ring-primary': 'light-dark(#3b82f6, #60a5fa)',\n '--color-ring-secondary': 'light-dark(#6b7280, #9ca3af)',\n '--color-ring-inverse': 'light-dark(#ffffff, #1f2937)',\n '--color-ring-info': 'light-dark(#2563eb, #3b82f6)',\n '--color-ring-danger': 'light-dark(#dc2626, #ef4444)',\n '--color-ring-success': 'light-dark(#16a34a, #22c55e)',\n '--color-ring-warning': 'light-dark(#ca8a04, #eab308)',\n\n // Typography — Family\n '--font-sans': \"system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n '--font-mono': \"ui-monospace, 'SF Mono', Monaco, 'Cascadia Code', monospace\",\n\n // Typography — Weight\n '--font-weight-normal': '400',\n '--font-weight-medium': '500',\n '--font-weight-semibold': '600',\n '--font-weight-bold': '700',\n\n // Typography — Text Size\n '--font-text-xs-size': '0.75rem',\n '--font-text-sm-size': '0.875rem',\n '--font-text-md-size': '1rem',\n '--font-text-lg-size': '1.125rem',\n\n // Typography — Heading Size\n '--font-heading-xs-size': '0.75rem',\n '--font-heading-sm-size': '0.875rem',\n '--font-heading-md-size': '1rem',\n '--font-heading-lg-size': '1.25rem',\n '--font-heading-xl-size': '1.5rem',\n '--font-heading-2xl-size': '1.875rem',\n '--font-heading-3xl-size': '2.25rem',\n\n // Typography — Text Line Height\n '--font-text-xs-line-height': '1.4',\n '--font-text-sm-line-height': '1.4',\n '--font-text-md-line-height': '1.5',\n '--font-text-lg-line-height': '1.5',\n\n // Typography — Heading Line Height\n '--font-heading-xs-line-height': '1.4',\n '--font-heading-sm-line-height': '1.4',\n '--font-heading-md-line-height': '1.4',\n '--font-heading-lg-line-height': '1.3',\n '--font-heading-xl-line-height': '1.25',\n '--font-heading-2xl-line-height': '1.2',\n '--font-heading-3xl-line-height': '1.1',\n\n // Border radius\n '--border-radius-xs': '2px',\n '--border-radius-sm': '4px',\n '--border-radius-md': '6px',\n '--border-radius-lg': '8px',\n '--border-radius-xl': '12px',\n '--border-radius-full': '9999px',\n\n // Border width\n '--border-width-regular': '1px',\n\n // Shadows\n '--shadow-hairline': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n '--shadow-sm': '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)',\n '--shadow-md': '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)',\n '--shadow-lg': '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)',\n};\n","import type {\n McpUiDisplayMode,\n McpUiHostContext,\n McpUiHostCapabilities,\n McpUiStyles,\n} from '@modelcontextprotocol/ext-apps';\nimport type { ScreenWidth } from './simulator-types';\n\ntype Platform = NonNullable<McpUiHostContext['platform']>;\n\n/**\n * Props passed to a host shell (conversation chrome) component.\n * Each host implements a React component matching this interface.\n */\nexport interface HostConversationProps {\n /** The resource content (iframe or children) to render inside the conversation */\n children: React.ReactNode;\n /** Current simulated screen width */\n screenWidth: ScreenWidth;\n /** Current MCP display mode */\n displayMode: McpUiDisplayMode;\n /** Current platform (desktop/mobile/web) */\n platform: Platform;\n /** Callback when the shell requests a display mode change (e.g., close button) */\n onRequestDisplayMode?: (mode: McpUiDisplayMode) => void;\n /** App name for display in conversation chrome */\n appName?: string;\n /** App icon (emoji or URL) for display in conversation chrome */\n appIcon?: string;\n /** User message to show in the conversation (decorative) */\n userMessage?: string;\n /** Whether content is transitioning between display modes */\n isTransitioning?: boolean;\n /** Optional action element rendered in the conversation header (e.g., Run button in Prod Tools mode) */\n headerAction?: React.ReactNode;\n}\n\n/** Unique identifier for a host */\nexport type HostId = 'chatgpt' | 'claude' | (string & {});\n\n/**\n * A registered host shell provides the conversation chrome and\n * functional configuration for a specific MCP App host.\n */\nexport interface HostShell {\n /** Unique host identifier */\n id: HostId;\n /** Human-readable name for the sidebar dropdown */\n label: string;\n /** The conversation shell React component */\n Conversation: React.ComponentType<HostConversationProps>;\n /** Apply the host's theme to the document (CSS variables, data attributes, etc.) */\n applyTheme: (theme: 'light' | 'dark') => void;\n /** Host info reported to the app via MCP protocol */\n hostInfo: { name: string; version: string };\n /** Host capabilities reported to the app via MCP protocol */\n hostCapabilities: McpUiHostCapabilities;\n /**\n * MCP App style variables sent to the app via hostContext.styles.variables.\n * Uses CSS light-dark() values so a single set adapts to theme automatically.\n * The SDK's applyDocumentTheme() sets color-scheme which light-dark() reads.\n * @see McpUiStyleVariableKey from @modelcontextprotocol/ext-apps\n */\n styleVariables?: McpUiStyles;\n /**\n * CSS custom properties for the simulator page chrome (sidebar, conversation area).\n * These are applied to the document root and can override the defaults:\n * --sim-bg-sidebar (fallback: var(--color-background-secondary))\n * --sim-bg-conversation (fallback: var(--color-background-primary))\n *\n * Values should use CSS light-dark() for automatic theme adaptation.\n */\n pageStyles?: Record<string, string>;\n}\n\n// ── Host Shell Registry ──────────────────────────────────────────\n\nconst registry = new Map<HostId, HostShell>();\n\n/** Register a host shell. Idempotent — re-registering with the same id replaces. */\nexport function registerHostShell(shell: HostShell): void {\n registry.set(shell.id, shell);\n}\n\n/** Get a registered host shell by id. */\nexport function getHostShell(id: HostId): HostShell | undefined {\n return registry.get(id);\n}\n\n/** Get all registered host shells, in insertion order. */\nexport function getRegisteredHosts(): HostShell[] {\n return Array.from(registry.values());\n}\n","import { DisplayMode, Theme } from '../types/runtime';\n\nexport type ScreenWidth = 'mobile-s' | 'mobile-l' | 'tablet' | 'full';\n\nexport type SimulatorConfig = {\n theme: Theme;\n displayMode: DisplayMode;\n screenWidth: ScreenWidth;\n};\n\nexport const SCREEN_WIDTHS: Record<ScreenWidth, number> = {\n 'mobile-s': 375,\n 'mobile-l': 425,\n tablet: 768,\n full: 1024,\n};\n","import * as React from 'react';\nimport { SCREEN_WIDTHS, type ScreenWidth } from '../simulator/simulator-types';\nimport type { McpUiDisplayMode, McpUiHostContext } from '@modelcontextprotocol/ext-apps';\n\ntype Platform = NonNullable<McpUiHostContext['platform']>;\n\nfunction CloseIcon({ className }: { className?: string }) {\n return (\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\" className={className}>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.83071 5.83077C6.33839 5.32309 7.16151 5.32309 7.66919 5.83077L12 10.1615L16.3307 5.83077C16.8384 5.32309 17.6615 5.32309 18.1692 5.83077C18.6769 6.33845 18.6769 7.16157 18.1692 7.66925L13.8384 12L18.1692 16.3308C18.6769 16.8385 18.6769 17.6616 18.1692 18.1693C17.6615 18.6769 16.8384 18.6769 16.3307 18.1693L12 13.8385L7.66919 18.1693C7.16151 18.6769 6.33839 18.6769 5.83071 18.1693C5.32303 17.6616 5.32303 16.8385 5.83071 16.3308L10.1615 12L5.83071 7.66925C5.32303 7.16157 5.32303 6.33845 5.83071 5.83077Z\"\n />\n </svg>\n );\n}\n\ninterface ConversationProps {\n children?: React.ReactNode;\n screenWidth: ScreenWidth;\n displayMode: McpUiDisplayMode;\n platform: Platform;\n onRequestDisplayMode?: (mode: McpUiDisplayMode) => void;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n /**\n * Whether the content is transitioning between display modes.\n * When true, the content area is hidden (opacity 0) to prevent the pip\n * border from flashing at a stale height before the iframe resizes.\n */\n isTransitioning?: boolean;\n /** Optional action element rendered in the conversation header (e.g., Run button) */\n headerAction?: React.ReactNode;\n}\n\n/**\n * Conversation layout that renders children (iframe) at a stable tree position.\n *\n * All three display modes (inline, pip, fullscreen) share the same React tree\n * shape so that the iframe never unmounts when switching modes, avoiding a\n * white-flash reload.\n *\n * Visual differences are achieved purely with CSS:\n * - **inline**: content in normal document flow\n * - **pip**: content wrapper becomes `position: fixed` floating overlay\n * - **fullscreen**: content wrapper becomes `position: fixed` covering the viewport;\n * fullscreen chrome (header/footer) rendered as a separate fixed overlay\n */\nexport function Conversation({\n children,\n screenWidth,\n displayMode,\n platform,\n onRequestDisplayMode,\n appName = 'Sunpeak',\n appIcon,\n userMessage = 'What have you got for me today?',\n isTransitioning = false,\n headerAction,\n}: ConversationProps) {\n const isDesktop = platform === 'desktop';\n const containerWidth = screenWidth === 'full' ? '100%' : `${SCREEN_WIDTHS[screenWidth]}px`;\n const isFullscreen = displayMode === 'fullscreen';\n const isPip = displayMode === 'pip';\n\n const handleClose = () => onRequestDisplayMode?.('inline');\n\n return (\n <div\n className=\"flex flex-col w-full h-full flex-1 items-center relative\"\n style={{\n transform: 'translate(0)',\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n color: 'var(--color-text-primary)',\n }}\n >\n {/* ─── Fullscreen chrome overlay ─── */}\n {isFullscreen && (\n <div\n className=\"fixed start-0 end-0 top-0 bottom-0 z-[51] mx-auto flex flex-col pointer-events-none\"\n style={{ maxWidth: containerWidth }}\n >\n <div\n className=\"z-10 grid h-[3.25rem] grid-cols-[1fr_auto_1fr] border-b px-2 pointer-events-auto\"\n style={{\n borderColor: 'var(--color-border-primary)',\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <div className=\"flex items-center justify-start gap-3\">\n <button\n onClick={handleClose}\n aria-label=\"Close\"\n className=\"h-7 w-7 flex items-center justify-center rounded-md transition-colors hover:opacity-70\"\n type=\"button\"\n >\n <CloseIcon />\n </button>\n </div>\n {isDesktop && (\n <div className=\"flex items-center justify-center text-base\">{appName}</div>\n )}\n {isDesktop && <div />}\n </div>\n {/* Spacer - pointer events pass through to content below */}\n <div className=\"flex-1\" />\n <footer className=\"relative\">\n {/* Backdrop blur gradient — matches inline input treatment */}\n <div\n className=\"absolute inset-x-0 bottom-0 h-full -z-10\"\n style={{\n maskImage: 'linear-gradient(to bottom, transparent 0%, black 50%)',\n WebkitMaskImage: 'linear-gradient(to bottom, transparent 0%, black 50%)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n }}\n />\n <div className=\"max-w-[48rem] mx-auto px-4 pt-4 pb-4 pointer-events-auto\">\n <div className=\"relative\">\n <input\n type=\"text\"\n name=\"userInput\"\n disabled\n placeholder=\"Message sunpeak.ai\"\n className=\"w-full rounded-3xl px-5 py-3 pr-12 shadow-sm\"\n style={{\n backgroundColor: 'var(--sim-bg-reply-input, var(--color-background-secondary))',\n color: 'var(--color-text-primary)',\n border: '1px solid var(--color-border-tertiary)',\n }}\n />\n </div>\n </div>\n </footer>\n </div>\n )}\n\n {/* ─── Conversation header ─── */}\n {!isFullscreen && (\n <header\n className=\"h-12 flex items-center gap-3 px-4 text-lg sticky top-0 z-40 w-full\"\n style={{\n maxWidth: containerWidth,\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <span>sunpeak.ai</span>\n {headerAction}\n </header>\n )}\n\n {/* ─── Conversation container ─── */}\n <div\n className=\"flex flex-col flex-1 w-full transition-all duration-200 overflow-hidden\"\n style={{ maxWidth: containerWidth }}\n >\n <main className=\"flex-1 overflow-y-auto overflow-x-hidden flex flex-col\">\n {/* User turn - hidden in fullscreen */}\n {!isFullscreen && (\n <article className=\"w-full focus:outline-none\" dir=\"auto\" data-turn=\"user\">\n <h5 className=\"sr-only\">You said:</h5>\n <div className=\"text-base my-auto mx-auto md:pt-8 px-4\">\n <div className=\"max-w-[48rem] mx-auto flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n <div\n data-message-author-role=\"user\"\n className=\"min-h-8 relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal\"\n >\n <div className=\"flex w-full flex-col gap-1 empty:hidden items-end\">\n <div\n className=\"relative rounded-[18px] px-4 py-3 max-w-[70%]\"\n style={{\n backgroundColor:\n 'var(--sim-bg-user-bubble, var(--color-background-tertiary))',\n }}\n >\n <div className=\"whitespace-pre-wrap\">{userMessage}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </article>\n )}\n\n {/* Assistant turn — flex-1 so short content still pushes the input to the bottom */}\n <article className=\"w-full focus:outline-none flex-1\" dir=\"auto\" data-turn=\"assistant\">\n <h6 className=\"sr-only\">{appName} said:</h6>\n <div className=\"text-base my-auto mx-auto pb-10 px-4\">\n <div className=\"max-w-[48rem] mx-auto flex-1 relative flex w-full min-w-0 flex-col\">\n <div className=\"flex max-w-full flex-col grow\">\n {/* Assistant avatar and name - hidden in fullscreen */}\n {!isFullscreen && (\n <div className=\"flex items-center gap-2 my-3\">\n {appIcon ? (\n <div className=\"size-6 flex items-center justify-center text-base\">\n {appIcon}\n </div>\n ) : (\n <div\n className=\"size-6 rounded-full flex items-center justify-center font-medium text-xs text-white\"\n style={{ backgroundColor: '#10a37f' }}\n >\n AI\n </div>\n )}\n <span className=\"font-semibold text-sm\">{appName}</span>\n </div>\n )}\n\n {/* Assistant message content */}\n <div\n data-message-author-role=\"assistant\"\n className=\"min-h-8 relative flex w-full flex-col items-start gap-2 text-start break-words whitespace-normal\"\n >\n <div className=\"flex w-full flex-col gap-1 empty:hidden\">\n {/*\n * ─── CONTENT AREA ───\n * Children (iframe) are always at this tree position.\n * CSS handles visual positioning for each display mode:\n * inline: normal flow (position: relative)\n * pip: floating overlay (position: fixed)\n * fullscreen: viewport takeover (position: fixed)\n */}\n <div\n className={\n isPip\n ? 'no-scrollbar @w-xl/main:top-4 fixed start-4 end-4 top-12 z-50 mx-auto max-w-[40rem] lg:max-w-[48rem] sm:start-0 sm:end-0 sm:top-[3.25rem] sm:w-full overflow-visible'\n : isFullscreen\n ? 'no-scrollbar fixed inset-x-0 top-[3.25rem] bottom-0 z-50 mx-auto'\n : 'no-scrollbar relative mb-2 @w-sm/main:w-full mx-0 max-sm:-mx-[1rem] max-sm:w-[100cqw] max-sm:overflow-hidden overflow-visible'\n }\n style={{\n ...(isPip ? { maxHeight: '480px' } : {}),\n ...(isFullscreen ? { maxWidth: containerWidth } : {}),\n }}\n >\n {/* PiP close button - keyed so it doesn't shift content's position */}\n {isPip && (\n <button\n key=\"pip-close\"\n onClick={handleClose}\n className=\"absolute -start-2 -top-1.5 z-10 rounded-full bg-[#3a3a3a] p-1.5 text-white shadow-[0px_0px_0px_1px_#fff3,0px_4px_12px_rgba(0,0,0,0.12)] hover:bg-[#6a6a6a]\"\n aria-label=\"Close picture-in-picture\"\n type=\"button\"\n >\n <CloseIcon className=\"h-4 w-4\" />\n </button>\n )}\n <div\n key=\"content\"\n className={\n isPip\n ? 'relative overflow-hidden h-full rounded-2xl sm:rounded-3xl shadow-[0px_0px_0px_1px_#fff3,0px_6px_20px_rgba(0,0,0,0.1)] md:-mx-4'\n : 'relative overflow-hidden h-full'\n }\n >\n <div\n className=\"h-full w-full max-w-full\"\n style={{\n ...(isPip\n ? {\n overflow: 'auto',\n backgroundColor: 'var(--color-background-primary)',\n }\n : isFullscreen\n ? {\n overflow: 'auto',\n backgroundColor: 'var(--color-background-primary)',\n }\n : { backgroundColor: 'transparent' }),\n opacity: isTransitioning ? 0 : 1,\n transition: isTransitioning ? 'none' : 'opacity 100ms',\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </article>\n\n {/* Input area - sticky at bottom, content scrolls underneath with blur.\n Hidden in fullscreen since fullscreen chrome has its own footer. */}\n {!isFullscreen && (\n <div className=\"sticky bottom-0 z-10 pointer-events-none\">\n {/* Backdrop blur gradient — fades from transparent to blurred */}\n <div\n className=\"absolute inset-x-0 bottom-0 h-full -z-10\"\n style={{\n maskImage: 'linear-gradient(to bottom, transparent 0%, black 50%)',\n WebkitMaskImage: 'linear-gradient(to bottom, transparent 0%, black 50%)',\n backdropFilter: 'blur(16px)',\n WebkitBackdropFilter: 'blur(16px)',\n }}\n />\n <div className=\"max-w-[48rem] mx-auto px-4 pt-4 pb-4 pointer-events-auto\">\n <div className=\"relative\">\n <input\n type=\"text\"\n name=\"userInput\"\n disabled\n placeholder=\"Message sunpeak.ai\"\n className=\"w-full rounded-3xl px-5 py-3 pr-12 shadow-sm\"\n style={{\n backgroundColor:\n 'var(--sim-bg-reply-input, var(--color-background-secondary))',\n color: 'var(--color-text-primary)',\n border: '1px solid var(--color-border-tertiary)',\n }}\n />\n </div>\n </div>\n </div>\n )}\n </main>\n </div>\n </div>\n );\n}\n","import type { McpUiHostCapabilities } from '@modelcontextprotocol/ext-apps';\nimport { registerHostShell } from '../simulator/hosts';\nimport { DEFAULT_STYLE_VARIABLES } from '../simulator/host-styles';\nimport { Conversation } from './chatgpt-conversation';\n\nconst CHATGPT_HOST_INFO = {\n name: 'ChatGPT',\n version: '1.0.0',\n};\n\nconst CHATGPT_HOST_CAPABILITIES: McpUiHostCapabilities = {\n openLinks: {},\n serverTools: {},\n serverResources: {},\n downloadFile: {},\n logging: {},\n updateModelContext: { text: {} },\n message: { text: {} },\n sandbox: {},\n};\n\n/**\n * Apply ChatGPT-style theming to the document.\n * Sets data-theme attribute and color-scheme for light-dark() CSS support.\n */\nfunction applyChatGPTTheme(theme: 'light' | 'dark'): void {\n document.documentElement.setAttribute('data-theme', theme);\n document.documentElement.style.colorScheme = theme;\n}\n\n/**\n * ChatGPT-specific style variable overrides.\n * Inherits defaults, overriding colors to match ChatGPT's palette.\n */\nconst CHATGPT_STYLE_VARIABLES = {\n ...DEFAULT_STYLE_VARIABLES,\n // Background colors — ChatGPT's standard palette\n '--color-background-primary': 'light-dark(#ffffff, #212121)',\n '--color-background-secondary': 'light-dark(#f7f7f8, #2f2f2f)',\n '--color-background-tertiary': 'light-dark(#ececf1, #444654)',\n '--color-background-inverse': 'light-dark(#212121, #ffffff)',\n // Text colors\n '--color-text-primary': 'light-dark(#0d0d0d, #ececec)',\n '--color-text-secondary': 'light-dark(#6e6e80, #acacbe)',\n '--color-text-tertiary': 'light-dark(#acacbe, #6e6e80)',\n '--color-text-inverse': 'light-dark(#ececec, #0d0d0d)',\n // Border colors\n '--color-border-primary': 'light-dark(#e5e5e5, #4e4e4e)',\n '--color-border-secondary': 'light-dark(#d9d9e3, #565869)',\n '--color-border-tertiary': 'light-dark(#f0f0f0, #3a3a3a)',\n};\n\nregisterHostShell({\n id: 'chatgpt',\n label: 'ChatGPT',\n Conversation,\n applyTheme: applyChatGPTTheme,\n hostInfo: CHATGPT_HOST_INFO,\n hostCapabilities: CHATGPT_HOST_CAPABILITIES,\n styleVariables: CHATGPT_STYLE_VARIABLES,\n pageStyles: {\n '--sim-bg-sidebar': 'light-dark(#f9f9f9, #181818)',\n '--sim-bg-conversation': 'light-dark(#ffffff, #212121)',\n '--sim-bg-user-bubble': 'light-dark(#f4f4f4, #303030)',\n '--sim-bg-reply-input': 'light-dark(#ffffff, #303030)',\n },\n});\n","import * as React from 'react';\nimport { SCREEN_WIDTHS, type ScreenWidth } from '../simulator/simulator-types';\nimport type { McpUiDisplayMode, McpUiHostContext } from '@modelcontextprotocol/ext-apps';\n\ntype Platform = NonNullable<McpUiHostContext['platform']>;\n\ninterface ClaudeConversationProps {\n children?: React.ReactNode;\n screenWidth: ScreenWidth;\n displayMode: McpUiDisplayMode;\n platform: Platform;\n onRequestDisplayMode?: (mode: McpUiDisplayMode) => void;\n appName?: string;\n appIcon?: string;\n userMessage?: string;\n isTransitioning?: boolean;\n /** Optional action element rendered in the conversation header (e.g., Run button) */\n headerAction?: React.ReactNode;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nfunction BackIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M10 3L5 8L10 13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/**\n * Claude conversation shell — mimics Claude's chat UI chrome.\n *\n * All three display modes (inline, pip, fullscreen) share the same React tree\n * shape so that the iframe never unmounts when switching modes.\n */\nexport function ClaudeConversation({\n children,\n screenWidth,\n displayMode,\n platform,\n onRequestDisplayMode,\n appName = 'Sunpeak',\n appIcon,\n userMessage = 'What have you got for me today?',\n isTransitioning = false,\n headerAction,\n}: ClaudeConversationProps) {\n const isDesktop = platform === 'desktop';\n const containerWidth = screenWidth === 'full' ? '100%' : `${SCREEN_WIDTHS[screenWidth]}px`;\n const isFullscreen = displayMode === 'fullscreen';\n const isPip = displayMode === 'pip';\n\n const handleClose = () => onRequestDisplayMode?.('inline');\n\n return (\n <div\n className=\"flex flex-col w-full h-full flex-1 items-center relative\"\n style={{\n transform: 'translate(0)',\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n color: 'var(--color-text-primary)',\n }}\n >\n {/* ─── Fullscreen chrome overlay ─── */}\n {isFullscreen && (\n <div\n className=\"fixed start-0 end-0 top-0 bottom-0 z-[51] mx-auto flex flex-col pointer-events-none\"\n style={{ maxWidth: containerWidth }}\n >\n <div\n className=\"z-10 flex items-center h-12 border-b px-3 pointer-events-auto\"\n style={{\n borderColor: 'var(--color-border-primary)',\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <button\n onClick={handleClose}\n aria-label=\"Back\"\n className=\"h-8 w-8 flex items-center justify-center rounded-lg transition-colors hover:opacity-70\"\n type=\"button\"\n >\n <BackIcon />\n </button>\n <div className=\"flex-1 text-center text-sm font-medium\">{appName}</div>\n {isDesktop && <div className=\"w-8\" />}\n </div>\n <div className=\"flex-1\" />\n <footer\n className=\"pointer-events-auto p-3\"\n style={{\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <div className=\"max-w-[48rem] mx-auto\">\n <input\n type=\"text\"\n name=\"userInput\"\n disabled\n placeholder=\"Reply to sunpeak...\"\n className=\"w-full rounded-xl px-4 py-2.5 text-sm\"\n style={{\n backgroundColor: 'var(--sim-bg-reply-input, var(--color-background-secondary))',\n border: '1px solid var(--color-border-primary)',\n color: 'var(--color-text-primary)',\n }}\n />\n </div>\n </footer>\n </div>\n )}\n\n {/* ─── Conversation header ─── */}\n {!isFullscreen && (\n <header\n className=\"h-12 flex items-center gap-3 px-4 text-sm font-medium sticky top-0 z-40 w-full\"\n style={{\n maxWidth: containerWidth,\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <span>sunpeak.ai</span>\n {headerAction}\n </header>\n )}\n\n {/* ─── Conversation container ─── */}\n <div\n className=\"flex flex-col flex-1 w-full transition-all duration-200 overflow-hidden\"\n style={{ maxWidth: containerWidth }}\n >\n <main className=\"flex-1 overflow-y-auto overflow-x-hidden\">\n {/* User turn */}\n {!isFullscreen && (\n <article className=\"w-full\" dir=\"auto\" data-turn=\"user\">\n <div className=\"px-4 py-4\">\n <div className=\"max-w-[48rem] mx-auto flex justify-end\">\n <div\n className=\"inline-block rounded-2xl px-4 py-2.5 text-sm max-w-[85%]\"\n style={{\n backgroundColor:\n 'var(--sim-bg-user-bubble, var(--color-background-tertiary))',\n }}\n >\n {userMessage}\n </div>\n </div>\n </div>\n </article>\n )}\n\n {/* Assistant turn */}\n <article className=\"w-full\" dir=\"auto\" data-turn=\"assistant\">\n <h6 className=\"sr-only\">{appName} said:</h6>\n <div className=\"px-4 py-2\">\n <div className=\"max-w-[48rem] mx-auto\">\n {/* Claude avatar + name */}\n {!isFullscreen && (\n <div className=\"flex items-center gap-2 mb-3\">\n {appIcon ? (\n <div className=\"size-6 flex items-center justify-center text-base\">\n {appIcon}\n </div>\n ) : (\n <div\n className=\"size-6 rounded-full flex items-center justify-center text-xs font-medium text-white\"\n style={{ backgroundColor: '#c55a30' }}\n >\n C\n </div>\n )}\n <span className=\"text-sm font-medium\">{appName}</span>\n </div>\n )}\n\n {/* ─── CONTENT AREA ─── */}\n <div\n className={\n isPip\n ? 'fixed start-4 end-4 top-12 z-50 mx-auto max-w-[40rem] lg:max-w-[48rem] sm:start-0 sm:end-0 sm:top-[3rem] sm:w-full overflow-visible'\n : isFullscreen\n ? 'fixed inset-x-0 top-[3rem] bottom-0 z-50 mx-auto'\n : 'relative mb-2 w-full overflow-visible'\n }\n style={{\n ...(isPip ? { maxHeight: '480px' } : {}),\n ...(isFullscreen ? { maxWidth: containerWidth } : {}),\n }}\n >\n {/* PiP close button */}\n {isPip && (\n <button\n key=\"pip-close\"\n onClick={handleClose}\n className=\"absolute -start-2 -top-1.5 z-10 rounded-full p-1.5 text-white shadow-md\"\n style={{ backgroundColor: '#4a4a4a' }}\n aria-label=\"Close picture-in-picture\"\n type=\"button\"\n >\n <CloseIcon />\n </button>\n )}\n <div\n key=\"content\"\n className={\n isPip\n ? 'relative overflow-hidden h-full rounded-2xl shadow-lg'\n : 'relative overflow-hidden h-full'\n }\n >\n <div\n className=\"h-full w-full max-w-full\"\n style={{\n ...(isPip\n ? {\n overflow: 'auto',\n backgroundColor: 'var(--color-background-secondary)',\n }\n : isFullscreen\n ? {\n overflow: 'auto',\n backgroundColor: 'var(--color-background-primary)',\n }\n : { backgroundColor: 'transparent' }),\n opacity: isTransitioning ? 0 : 1,\n transition: isTransitioning ? 'none' : 'opacity 100ms',\n }}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n </div>\n </article>\n </main>\n\n {/* Input area */}\n {!isFullscreen && (\n <footer\n style={{\n backgroundColor: 'var(--sim-bg-conversation, var(--color-background-primary))',\n }}\n >\n <div className=\"max-w-[48rem] mx-auto px-4 py-4\">\n <div className=\"relative\">\n <input\n type=\"text\"\n name=\"userInput\"\n disabled\n placeholder=\"Reply to sunpeak...\"\n className=\"w-full rounded-xl px-4 py-2.5 text-sm\"\n style={{\n backgroundColor: 'var(--sim-bg-reply-input, var(--color-background-secondary))',\n border: '1px solid var(--color-border-primary)',\n }}\n />\n </div>\n </div>\n </footer>\n )}\n </div>\n </div>\n );\n}\n","import type { McpUiHostCapabilities } from '@modelcontextprotocol/ext-apps';\nimport { registerHostShell } from '../simulator/hosts';\nimport { DEFAULT_STYLE_VARIABLES } from '../simulator/host-styles';\nimport { ClaudeConversation } from './claude-conversation';\n\nconst CLAUDE_HOST_INFO = {\n name: 'Claude',\n version: '1.0.0',\n};\n\nconst CLAUDE_HOST_CAPABILITIES: McpUiHostCapabilities = {\n openLinks: {},\n serverTools: {},\n serverResources: {},\n downloadFile: {},\n logging: {},\n updateModelContext: { text: {} },\n message: { text: {} },\n sandbox: {},\n};\n\n/**\n * Apply Claude-style theming to the document.\n * Sets data-theme attribute and color-scheme so CSS light-dark() resolves correctly.\n */\nfunction applyClaudeTheme(theme: 'light' | 'dark'): void {\n document.documentElement.setAttribute('data-theme', theme);\n document.documentElement.style.colorScheme = theme;\n}\n\n/**\n * Claude-specific style variable overrides (warm beige/cream palette).\n * Inherits defaults from DEFAULT_STYLE_VARIABLES, overriding only colors.\n */\nconst CLAUDE_STYLE_VARIABLES = {\n ...DEFAULT_STYLE_VARIABLES,\n // Background colors — warm beige/cream palette\n '--color-background-primary': 'light-dark(#faf9f5, #262624)',\n '--color-background-secondary': 'light-dark(#ffffff, #3a3935)',\n '--color-background-tertiary': 'light-dark(#e8e4dc, #4a4843)',\n '--color-background-inverse': 'light-dark(#2b2a27, #f3f0e8)',\n // Text colors\n '--color-text-primary': 'light-dark(#2d2b27, #e8e4dc)',\n '--color-text-secondary': 'light-dark(#6b6560, #9b9690)',\n '--color-text-tertiary': 'light-dark(#9b9690, #6b6560)',\n '--color-text-inverse': 'light-dark(#e8e4dc, #2d2b27)',\n // Border colors\n '--color-border-primary': 'light-dark(#e0ddd5, #4a4843)',\n '--color-border-secondary': 'light-dark(#d5d1c8, #5a5753)',\n '--color-border-tertiary': 'light-dark(#f0ede5, #3a3935)',\n};\n\nregisterHostShell({\n id: 'claude',\n label: 'Claude',\n Conversation: ClaudeConversation,\n applyTheme: applyClaudeTheme,\n hostInfo: CLAUDE_HOST_INFO,\n hostCapabilities: CLAUDE_HOST_CAPABILITIES,\n styleVariables: CLAUDE_STYLE_VARIABLES,\n pageStyles: {\n '--sim-bg-sidebar': 'light-dark(#f9f8f3, #252523)',\n '--sim-bg-conversation': 'light-dark(#faf9f5, #262624)',\n '--sim-bg-user-bubble': 'light-dark(#f1eee6, #141413)',\n '--sim-bg-reply-input': 'light-dark(#ffffff, #30302e)',\n },\n});\n","import{CallToolRequestSchema as gQ,CallToolResultSchema as qQ,ListPromptsRequestSchema as kQ,ListPromptsResultSchema as yQ,ListResourcesRequestSchema as fQ,ListResourcesResultSchema as dQ,ListResourceTemplatesRequestSchema as bQ,ListResourceTemplatesResultSchema as xQ,LoggingMessageNotificationSchema as uQ,PingRequestSchema as hQ,PromptListChangedNotificationSchema as mQ,ReadResourceRequestSchema as pQ,ReadResourceResultSchema as cQ,ResourceListChangedNotificationSchema as nQ,ToolListChangedNotificationSchema as iQ}from\"@modelcontextprotocol/sdk/types.js\";import{Protocol as lQ}from\"@modelcontextprotocol/sdk/shared/protocol.js\";var G=\"2026-01-26\",t=\"ui/open-link\",s=\"ui/download-file\",e=\"ui/message\",QQ=\"ui/notifications/sandbox-proxy-ready\",XQ=\"ui/notifications/sandbox-resource-ready\",YQ=\"ui/notifications/size-changed\",ZQ=\"ui/notifications/tool-input\",_=\"ui/notifications/tool-input-partial\",$Q=\"ui/notifications/tool-result\",JQ=\"ui/notifications/tool-cancelled\",KQ=\"ui/notifications/host-context-changed\",GQ=\"ui/resource-teardown\",DQ=\"ui/initialize\",NQ=\"ui/notifications/initialized\",jQ=\"ui/request-display-mode\";import{z as Q}from\"zod/v4\";import{ContentBlockSchema as u,CallToolResultSchema as EQ,EmbeddedResourceSchema as WQ,ImplementationSchema as h,RequestIdSchema as zQ,ResourceLinkSchema as BQ,ToolSchema as _Q}from\"@modelcontextprotocol/sdk/types.js\";var m=Q.union([Q.literal(\"light\"),Q.literal(\"dark\")]).describe(\"Color theme preference for the host environment.\"),D=Q.union([Q.literal(\"inline\"),Q.literal(\"fullscreen\"),Q.literal(\"pip\")]).describe(\"Display mode for UI presentation.\"),OQ=Q.union([Q.literal(\"--color-background-primary\"),Q.literal(\"--color-background-secondary\"),Q.literal(\"--color-background-tertiary\"),Q.literal(\"--color-background-inverse\"),Q.literal(\"--color-background-ghost\"),Q.literal(\"--color-background-info\"),Q.literal(\"--color-background-danger\"),Q.literal(\"--color-background-success\"),Q.literal(\"--color-background-warning\"),Q.literal(\"--color-background-disabled\"),Q.literal(\"--color-text-primary\"),Q.literal(\"--color-text-secondary\"),Q.literal(\"--color-text-tertiary\"),Q.literal(\"--color-text-inverse\"),Q.literal(\"--color-text-ghost\"),Q.literal(\"--color-text-info\"),Q.literal(\"--color-text-danger\"),Q.literal(\"--color-text-success\"),Q.literal(\"--color-text-warning\"),Q.literal(\"--color-text-disabled\"),Q.literal(\"--color-border-primary\"),Q.literal(\"--color-border-secondary\"),Q.literal(\"--color-border-tertiary\"),Q.literal(\"--color-border-inverse\"),Q.literal(\"--color-border-ghost\"),Q.literal(\"--color-border-info\"),Q.literal(\"--color-border-danger\"),Q.literal(\"--color-border-success\"),Q.literal(\"--color-border-warning\"),Q.literal(\"--color-border-disabled\"),Q.literal(\"--color-ring-primary\"),Q.literal(\"--color-ring-secondary\"),Q.literal(\"--color-ring-inverse\"),Q.literal(\"--color-ring-info\"),Q.literal(\"--color-ring-danger\"),Q.literal(\"--color-ring-success\"),Q.literal(\"--color-ring-warning\"),Q.literal(\"--font-sans\"),Q.literal(\"--font-mono\"),Q.literal(\"--font-weight-normal\"),Q.literal(\"--font-weight-medium\"),Q.literal(\"--font-weight-semibold\"),Q.literal(\"--font-weight-bold\"),Q.literal(\"--font-text-xs-size\"),Q.literal(\"--font-text-sm-size\"),Q.literal(\"--font-text-md-size\"),Q.literal(\"--font-text-lg-size\"),Q.literal(\"--font-heading-xs-size\"),Q.literal(\"--font-heading-sm-size\"),Q.literal(\"--font-heading-md-size\"),Q.literal(\"--font-heading-lg-size\"),Q.literal(\"--font-heading-xl-size\"),Q.literal(\"--font-heading-2xl-size\"),Q.literal(\"--font-heading-3xl-size\"),Q.literal(\"--font-text-xs-line-height\"),Q.literal(\"--font-text-sm-line-height\"),Q.literal(\"--font-text-md-line-height\"),Q.literal(\"--font-text-lg-line-height\"),Q.literal(\"--font-heading-xs-line-height\"),Q.literal(\"--font-heading-sm-line-height\"),Q.literal(\"--font-heading-md-line-height\"),Q.literal(\"--font-heading-lg-line-height\"),Q.literal(\"--font-heading-xl-line-height\"),Q.literal(\"--font-heading-2xl-line-height\"),Q.literal(\"--font-heading-3xl-line-height\"),Q.literal(\"--border-radius-xs\"),Q.literal(\"--border-radius-sm\"),Q.literal(\"--border-radius-md\"),Q.literal(\"--border-radius-lg\"),Q.literal(\"--border-radius-xl\"),Q.literal(\"--border-radius-full\"),Q.literal(\"--border-width-regular\"),Q.literal(\"--shadow-hairline\"),Q.literal(\"--shadow-sm\"),Q.literal(\"--shadow-md\"),Q.literal(\"--shadow-lg\")]).describe(\"CSS variable keys available to MCP apps for theming.\"),VQ=Q.record(OQ.describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`),Q.union([Q.string(),Q.undefined()]).describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`)).describe(`Style variables for theming MCP apps.\n\nIndividual style keys are optional - hosts may provide any subset of these values.\nValues are strings containing CSS values (colors, sizes, font stacks, etc.).\n\nNote: This type uses \\`Record<K, string | undefined>\\` rather than \\`Partial<Record<K, string>>\\`\nfor compatibility with Zod schema generation. Both are functionally equivalent for validation.`),V=Q.object({method:Q.literal(\"ui/open-link\"),params:Q.object({url:Q.string().describe(\"URL to open in the host's browser\")})}),I=Q.object({isError:Q.boolean().optional().describe(\"True if the host failed to open the URL (e.g., due to security policy).\")}).passthrough(),A=Q.object({isError:Q.boolean().optional().describe(\"True if the download failed (e.g., user cancelled or host denied).\")}).passthrough(),L=Q.object({isError:Q.boolean().optional().describe(\"True if the host rejected or failed to deliver the message.\")}).passthrough(),F=Q.object({method:Q.literal(\"ui/notifications/sandbox-proxy-ready\"),params:Q.object({})}),j=Q.object({connectDomains:Q.array(Q.string()).optional().describe(`Origins for network requests (fetch/XHR/WebSocket).\n\n- Maps to CSP \\`connect-src\\` directive\n- Empty or omitted → no network connections (secure default)`),resourceDomains:Q.array(Q.string()).optional().describe(\"Origins for static resources (images, scripts, stylesheets, fonts, media).\\n\\n- Maps to CSP `img-src`, `script-src`, `style-src`, `font-src`, `media-src` directives\\n- Wildcard subdomains supported: `https://*.example.com`\\n- Empty or omitted → no network resources (secure default)\"),frameDomains:Q.array(Q.string()).optional().describe(\"Origins for nested iframes.\\n\\n- Maps to CSP `frame-src` directive\\n- Empty or omitted → no nested iframes allowed (`frame-src 'none'`)\"),baseUriDomains:Q.array(Q.string()).optional().describe(\"Allowed base URIs for the document.\\n\\n- Maps to CSP `base-uri` directive\\n- Empty or omitted → only same origin allowed (`base-uri 'self'`)\")}),E=Q.object({camera:Q.object({}).optional().describe(\"Request camera access.\\n\\nMaps to Permission Policy `camera` feature.\"),microphone:Q.object({}).optional().describe(\"Request microphone access.\\n\\nMaps to Permission Policy `microphone` feature.\"),geolocation:Q.object({}).optional().describe(\"Request geolocation access.\\n\\nMaps to Permission Policy `geolocation` feature.\"),clipboardWrite:Q.object({}).optional().describe(\"Request clipboard write access.\\n\\nMaps to Permission Policy `clipboard-write` feature.\")}),P=Q.object({method:Q.literal(\"ui/notifications/size-changed\"),params:Q.object({width:Q.number().optional().describe(\"New width in pixels.\"),height:Q.number().optional().describe(\"New height in pixels.\")})}),T=Q.object({method:Q.literal(\"ui/notifications/tool-input\"),params:Q.object({arguments:Q.record(Q.string(),Q.unknown().describe(\"Complete tool call arguments as key-value pairs.\")).optional().describe(\"Complete tool call arguments as key-value pairs.\")})}),w=Q.object({method:Q.literal(\"ui/notifications/tool-input-partial\"),params:Q.object({arguments:Q.record(Q.string(),Q.unknown().describe(\"Partial tool call arguments (incomplete, may change).\")).optional().describe(\"Partial tool call arguments (incomplete, may change).\")})}),U=Q.object({method:Q.literal(\"ui/notifications/tool-cancelled\"),params:Q.object({reason:Q.string().optional().describe('Optional reason for the cancellation (e.g., \"user action\", \"timeout\").')})}),p=Q.object({fonts:Q.string().optional()}),c=Q.object({variables:VQ.optional().describe(\"CSS variables for theming the app.\"),css:p.optional().describe(\"CSS blocks that apps can inject.\")}),H=Q.object({method:Q.literal(\"ui/resource-teardown\"),params:Q.object({})}),R=Q.record(Q.string(),Q.unknown()),O=Q.object({text:Q.object({}).optional().describe(\"Host supports text content blocks.\"),image:Q.object({}).optional().describe(\"Host supports image content blocks.\"),audio:Q.object({}).optional().describe(\"Host supports audio content blocks.\"),resource:Q.object({}).optional().describe(\"Host supports resource content blocks.\"),resourceLink:Q.object({}).optional().describe(\"Host supports resource link content blocks.\"),structuredContent:Q.object({}).optional().describe(\"Host supports structured content.\")}),n=Q.object({experimental:Q.object({}).optional().describe(\"Experimental features (structure TBD).\"),openLinks:Q.object({}).optional().describe(\"Host supports opening external URLs.\"),downloadFile:Q.object({}).optional().describe(\"Host supports file downloads via ui/download-file.\"),serverTools:Q.object({listChanged:Q.boolean().optional().describe(\"Host supports tools/list_changed notifications.\")}).optional().describe(\"Host can proxy tool calls to the MCP server.\"),serverResources:Q.object({listChanged:Q.boolean().optional().describe(\"Host supports resources/list_changed notifications.\")}).optional().describe(\"Host can proxy resource reads to the MCP server.\"),logging:Q.object({}).optional().describe(\"Host accepts log messages.\"),sandbox:Q.object({permissions:E.optional().describe(\"Permissions granted by the host (camera, microphone, geolocation).\"),csp:j.optional().describe(\"CSP domains approved by the host.\")}).optional().describe(\"Sandbox configuration applied by the host.\"),updateModelContext:O.optional().describe(\"Host accepts context updates (ui/update-model-context) to be included in the model's context for future turns.\"),message:O.optional().describe(\"Host supports receiving content messages (ui/message) from the view.\")}),i=Q.object({experimental:Q.object({}).optional().describe(\"Experimental features (structure TBD).\"),tools:Q.object({listChanged:Q.boolean().optional().describe(\"App supports tools/list_changed notifications.\")}).optional().describe(\"App exposes MCP-style tools that the host can call.\"),availableDisplayModes:Q.array(D).optional().describe(\"Display modes the app supports.\")}),M=Q.object({method:Q.literal(\"ui/notifications/initialized\"),params:Q.object({}).optional()}),IQ=Q.object({csp:j.optional().describe(\"Content Security Policy configuration for UI resources.\"),permissions:E.optional().describe(\"Sandbox permissions requested by the UI resource.\"),domain:Q.string().optional().describe(`Dedicated origin for view sandbox.\n\nUseful when views need stable, dedicated origins for OAuth callbacks, CORS policies, or API key allowlists.\n\n**Host-dependent:** The format and validation rules for this field are determined by each host. Servers MUST consult host-specific documentation for the expected domain format. Common patterns include:\n- Hash-based subdomains (e.g., \\`{hash}.claudemcpcontent.com\\`)\n- URL-derived subdomains (e.g., \\`www-example-com.oaiusercontent.com\\`)\n\nIf omitted, host uses default sandbox origin (typically per-conversation).`),prefersBorder:Q.boolean().optional().describe(`Visual boundary preference - true if view prefers a visible border.\n\nBoolean requesting whether a visible border and background is provided by the host. Specifying an explicit value for this is recommended because hosts' defaults may vary.\n\n- \\`true\\`: request visible border + background\n- \\`false\\`: request no visible border + background\n- omitted: host decides border`)}),W=Q.object({method:Q.literal(\"ui/request-display-mode\"),params:Q.object({mode:D.describe(\"The display mode being requested.\")})}),v=Q.object({mode:D.describe(\"The display mode that was actually set. May differ from requested if not supported.\")}).passthrough(),l=Q.union([Q.literal(\"model\"),Q.literal(\"app\")]).describe(\"Tool visibility scope - who can access the tool.\"),AQ=Q.object({resourceUri:Q.string().optional(),visibility:Q.array(l).optional().describe(`Who can access this tool. Default: [\"model\", \"app\"]\n- \"model\": Tool visible to and callable by the agent\n- \"app\": Tool callable by the app from this server only`)}),QX=Q.object({mimeTypes:Q.array(Q.string()).optional().describe('Array of supported MIME types for UI resources.\\nMust include `\"text/html;profile=mcp-app\"` for MCP Apps support.')}),S=Q.object({method:Q.literal(\"ui/download-file\"),params:Q.object({contents:Q.array(Q.union([WQ,BQ])).describe(\"Resource contents to download — embedded (inline data) or linked (host fetches). Uses standard MCP resource types.\")})}),C=Q.object({method:Q.literal(\"ui/message\"),params:Q.object({role:Q.literal(\"user\").describe('Message role, currently only \"user\" is supported.'),content:Q.array(u).describe(\"Message content blocks (text, image, etc.).\")})}),LQ=Q.object({method:Q.literal(\"ui/notifications/sandbox-resource-ready\"),params:Q.object({html:Q.string().describe(\"HTML content to load into the inner iframe.\"),sandbox:Q.string().optional().describe(\"Optional override for the inner iframe's sandbox attribute.\"),csp:j.optional().describe(\"CSP configuration from resource metadata.\"),permissions:E.optional().describe(\"Sandbox permissions from resource metadata.\")})}),g=Q.object({method:Q.literal(\"ui/notifications/tool-result\"),params:EQ.describe(\"Standard MCP tool execution result.\")}),q=Q.object({toolInfo:Q.object({id:zQ.optional().describe(\"JSON-RPC id of the tools/call request.\"),tool:_Q.describe(\"Tool definition including name, inputSchema, etc.\")}).optional().describe(\"Metadata of the tool call that instantiated this App.\"),theme:m.optional().describe(\"Current color theme preference.\"),styles:c.optional().describe(\"Style configuration for theming the app.\"),displayMode:D.optional().describe(\"How the UI is currently displayed.\"),availableDisplayModes:Q.array(D).optional().describe(\"Display modes the host supports.\"),containerDimensions:Q.union([Q.object({height:Q.number().describe(\"Fixed container height in pixels.\")}),Q.object({maxHeight:Q.union([Q.number(),Q.undefined()]).optional().describe(\"Maximum container height in pixels.\")})]).and(Q.union([Q.object({width:Q.number().describe(\"Fixed container width in pixels.\")}),Q.object({maxWidth:Q.union([Q.number(),Q.undefined()]).optional().describe(\"Maximum container width in pixels.\")})])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other\ncontainer holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:Q.string().optional().describe(\"User's language and region preference in BCP 47 format.\"),timeZone:Q.string().optional().describe(\"User's timezone in IANA format.\"),userAgent:Q.string().optional().describe(\"Host application identifier.\"),platform:Q.union([Q.literal(\"web\"),Q.literal(\"desktop\"),Q.literal(\"mobile\")]).optional().describe(\"Platform type for responsive design decisions.\"),deviceCapabilities:Q.object({touch:Q.boolean().optional().describe(\"Whether the device supports touch input.\"),hover:Q.boolean().optional().describe(\"Whether the device supports hover interactions.\")}).optional().describe(\"Device input capabilities.\"),safeAreaInsets:Q.object({top:Q.number().describe(\"Top safe area inset in pixels.\"),right:Q.number().describe(\"Right safe area inset in pixels.\"),bottom:Q.number().describe(\"Bottom safe area inset in pixels.\"),left:Q.number().describe(\"Left safe area inset in pixels.\")}).optional().describe(\"Mobile safe area boundaries in pixels.\")}).passthrough(),k=Q.object({method:Q.literal(\"ui/notifications/host-context-changed\"),params:q.describe(\"Partial context update containing only changed fields.\")}),y=Q.object({method:Q.literal(\"ui/update-model-context\"),params:Q.object({content:Q.array(u).optional().describe(\"Context content blocks (text, image, etc.).\"),structuredContent:Q.record(Q.string(),Q.unknown().describe(\"Structured content for machine-readable context data.\")).optional().describe(\"Structured content for machine-readable context data.\")})}),f=Q.object({method:Q.literal(\"ui/initialize\"),params:Q.object({appInfo:h.describe(\"App identification (name and version).\"),appCapabilities:i.describe(\"Features and capabilities this app provides.\"),protocolVersion:Q.string().describe(\"Protocol version this app supports.\")})}),d=Q.object({protocolVersion:Q.string().describe('Negotiated protocol version string (e.g., \"2025-11-21\").'),hostInfo:h.describe(\"Host application identification and version.\"),hostCapabilities:n.describe(\"Features and capabilities provided by the host.\"),hostContext:q.describe(\"Rich context about the host environment.\")}).passthrough();import{Protocol as PQ}from\"@modelcontextprotocol/sdk/shared/protocol.js\";import{CallToolRequestSchema as TQ,CallToolResultSchema as wQ,EmptyResultSchema as UQ,ListResourcesResultSchema as HQ,ListToolsRequestSchema as RQ,PingRequestSchema as MQ,ReadResourceResultSchema as vQ}from\"@modelcontextprotocol/sdk/types.js\";import{JSONRPCMessageSchema as FQ}from\"@modelcontextprotocol/sdk/types.js\";class N{eventTarget;eventSource;messageListener;constructor(X=window.parent,Y){this.eventTarget=X;this.eventSource=Y;this.messageListener=(Z)=>{if(Y&&Z.source!==this.eventSource){console.debug(\"Ignoring message from unknown source\",Z);return}let $=FQ.safeParse(Z.data);if($.success)console.debug(\"Parsed message\",$.data),this.onmessage?.($.data);else if(Z.data?.jsonrpc!==\"2.0\")console.debug(\"Ignoring non-JSON-RPC message\",$.error.message,Z);else console.error(\"Failed to parse message\",$.error.message,Z),this.onerror?.(Error(\"Invalid JSON-RPC message received: \"+$.error.message))}}async start(){window.addEventListener(\"message\",this.messageListener)}async send(X,Y){if(X.method!==_)console.debug(\"Sending message\",X);this.eventTarget.postMessage(X,\"*\")}async close(){window.removeEventListener(\"message\",this.messageListener),this.onclose?.()}onclose;onerror;onmessage;sessionId;setProtocolVersion}var b=\"ui/resourceUri\",SQ=\"text/html;profile=mcp-app\";class CQ extends PQ{_appInfo;_capabilities;options;_hostCapabilities;_hostInfo;_hostContext;constructor(X,Y={},Z={autoResize:!0}){super(Z);this._appInfo=X;this._capabilities=Y;this.options=Z;this.setRequestHandler(MQ,($)=>{return console.log(\"Received ping:\",$.params),{}}),this.onhostcontextchanged=()=>{}}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}set ontoolinput(X){this.setNotificationHandler(T,(Y)=>X(Y.params))}set ontoolinputpartial(X){this.setNotificationHandler(w,(Y)=>X(Y.params))}set ontoolresult(X){this.setNotificationHandler(g,(Y)=>X(Y.params))}set ontoolcancelled(X){this.setNotificationHandler(U,(Y)=>X(Y.params))}set onhostcontextchanged(X){this.setNotificationHandler(k,(Y)=>{this._hostContext={...this._hostContext,...Y.params},X(Y.params)})}set onteardown(X){this.setRequestHandler(H,(Y,Z)=>X(Y.params,Z))}set oncalltool(X){this.setRequestHandler(TQ,(Y,Z)=>X(Y.params,Z))}set onlisttools(X){this.setRequestHandler(RQ,(Y,Z)=>X(Y.params,Z))}assertCapabilityForMethod(X){}assertRequestHandlerCapability(X){switch(X){case\"tools/call\":case\"tools/list\":if(!this._capabilities.tools)throw Error(`Client does not support tool capability (required for ${X})`);return;case\"ping\":case\"ui/resource-teardown\":return;default:throw Error(`No handler for method ${X} registered`)}}assertNotificationCapability(X){}assertTaskCapability(X){throw Error(\"Tasks are not supported in MCP Apps\")}assertTaskHandlerCapability(X){throw Error(\"Task handlers are not supported in MCP Apps\")}async callServerTool(X,Y){if(typeof X===\"string\")throw Error(`callServerTool() expects an object as its first argument, but received a string (\"${X}\"). Did you mean: callServerTool({ name: \"${X}\", arguments: { ... } })?`);return await this.request({method:\"tools/call\",params:X},wQ,Y)}async readServerResource(X,Y){return await this.request({method:\"resources/read\",params:X},vQ,Y)}async listServerResources(X,Y){return await this.request({method:\"resources/list\",params:X},HQ,Y)}sendMessage(X,Y){return this.request({method:\"ui/message\",params:X},L,Y)}sendLog(X){return this.notification({method:\"notifications/message\",params:X})}updateModelContext(X,Y){return this.request({method:\"ui/update-model-context\",params:X},UQ,Y)}openLink(X,Y){return this.request({method:\"ui/open-link\",params:X},I,Y)}sendOpenLink=this.openLink;downloadFile(X,Y){return this.request({method:\"ui/download-file\",params:X},A,Y)}requestDisplayMode(X,Y){return this.request({method:\"ui/request-display-mode\",params:X},v,Y)}sendSizeChanged(X){return this.notification({method:\"ui/notifications/size-changed\",params:X})}setupSizeChangedNotifications(){let X=!1,Y=0,Z=0,$=()=>{if(X)return;X=!0,requestAnimationFrame(()=>{X=!1;let J=document.documentElement,r=J.style.width,o=J.style.height;J.style.width=\"fit-content\",J.style.height=\"max-content\";let x=J.getBoundingClientRect();J.style.width=r,J.style.height=o;let a=window.innerWidth-J.clientWidth,z=Math.ceil(x.width+a),B=Math.ceil(x.height);if(z!==Y||B!==Z)Y=z,Z=B,this.sendSizeChanged({width:z,height:B})})};$();let K=new ResizeObserver($);return K.observe(document.documentElement),K.observe(document.body),()=>K.disconnect()}async connect(X=new N(window.parent,window.parent),Y){if(this.transport)throw Error(\"App is already connected. Call close() before connecting again.\");await super.connect(X);try{let Z=await this.request({method:\"ui/initialize\",params:{appCapabilities:this._capabilities,appInfo:this._appInfo,protocolVersion:G}},d,Y);if(Z===void 0)throw Error(`Server sent invalid initialize result: ${Z}`);if(this._hostCapabilities=Z.hostCapabilities,this._hostInfo=Z.hostInfo,this._hostContext=Z.hostContext,await this.notification({method:\"ui/notifications/initialized\"}),this.options?.autoResize)this.setupSizeChangedNotifications()}catch(Z){throw this.close(),Z}}}function hY(X){let Z=X._meta?.ui?.resourceUri;if(Z===void 0)Z=X._meta?.[b];if(typeof Z===\"string\"&&Z.startsWith(\"ui://\"))return Z;else if(Z!==void 0)throw Error(`Invalid UI resource URI: ${JSON.stringify(Z)}`);return}function mY(X){let Z=X._meta?.ui?.visibility;if(!Z)return!1;if(Z.length===1&&Z[0]===\"model\")return!0;return!1}function pY(X){let Z=X._meta?.ui?.visibility;if(!Z)return!1;if(Z.length===1&&Z[0]===\"app\")return!0;return!1}function cY(X){if(!X)return\"\";let Y=[];if(X.camera)Y.push(\"camera\");if(X.microphone)Y.push(\"microphone\");if(X.geolocation)Y.push(\"geolocation\");if(X.clipboardWrite)Y.push(\"clipboard-write\");return Y.join(\"; \")}var rQ=[G];class oQ extends lQ{_client;_hostInfo;_capabilities;_appCapabilities;_hostContext={};_appInfo;constructor(X,Y,Z,$){super($);this._client=X;this._hostInfo=Y;this._capabilities=Z;this._hostContext=$?.hostContext||{},this.setRequestHandler(f,(K)=>this._oninitialize(K)),this.setRequestHandler(hQ,(K,J)=>{return this.onping?.(K.params,J),{}}),this.setRequestHandler(W,(K)=>{return{mode:this._hostContext.displayMode??\"inline\"}})}getAppCapabilities(){return this._appCapabilities}getAppVersion(){return this._appInfo}onping;set onsizechange(X){this.setNotificationHandler(P,(Y)=>X(Y.params))}set onsandboxready(X){this.setNotificationHandler(F,(Y)=>X(Y.params))}set oninitialized(X){this.setNotificationHandler(M,(Y)=>X(Y.params))}set onmessage(X){this.setRequestHandler(C,async(Y,Z)=>{return X(Y.params,Z)})}set onopenlink(X){this.setRequestHandler(V,async(Y,Z)=>{return X(Y.params,Z)})}set ondownloadfile(X){this.setRequestHandler(S,async(Y,Z)=>{return X(Y.params,Z)})}set onrequestdisplaymode(X){this.setRequestHandler(W,async(Y,Z)=>{return X(Y.params,Z)})}set onloggingmessage(X){this.setNotificationHandler(uQ,async(Y)=>{X(Y.params)})}set onupdatemodelcontext(X){this.setRequestHandler(y,async(Y,Z)=>{return X(Y.params,Z)})}set oncalltool(X){this.setRequestHandler(gQ,async(Y,Z)=>{return X(Y.params,Z)})}sendToolListChanged(X={}){return this.notification({method:\"notifications/tools/list_changed\",params:X})}set onlistresources(X){this.setRequestHandler(fQ,async(Y,Z)=>{return X(Y.params,Z)})}set onlistresourcetemplates(X){this.setRequestHandler(bQ,async(Y,Z)=>{return X(Y.params,Z)})}set onreadresource(X){this.setRequestHandler(pQ,async(Y,Z)=>{return X(Y.params,Z)})}sendResourceListChanged(X={}){return this.notification({method:\"notifications/resources/list_changed\",params:X})}set onlistprompts(X){this.setRequestHandler(kQ,async(Y,Z)=>{return X(Y.params,Z)})}sendPromptListChanged(X={}){return this.notification({method:\"notifications/prompts/list_changed\",params:X})}assertCapabilityForMethod(X){}assertRequestHandlerCapability(X){}assertNotificationCapability(X){}assertTaskCapability(X){throw Error(\"Tasks are not supported in MCP Apps\")}assertTaskHandlerCapability(X){throw Error(\"Task handlers are not supported in MCP Apps\")}getCapabilities(){return this._capabilities}async _oninitialize(X){let Y=X.params.protocolVersion;return this._appCapabilities=X.params.appCapabilities,this._appInfo=X.params.appInfo,{protocolVersion:rQ.includes(Y)?Y:G,hostCapabilities:this.getCapabilities(),hostInfo:this._hostInfo,hostContext:this._hostContext}}setHostContext(X){let Y={},Z=!1;for(let $ of Object.keys(X)){let K=this._hostContext[$],J=X[$];if(aQ(K,J))continue;Y[$]=J,Z=!0}if(Z)this._hostContext=X,this.sendHostContextChange(Y)}sendHostContextChange(X){return this.notification({method:\"ui/notifications/host-context-changed\",params:X})}sendToolInput(X){return this.notification({method:\"ui/notifications/tool-input\",params:X})}sendToolInputPartial(X){return this.notification({method:\"ui/notifications/tool-input-partial\",params:X})}sendToolResult(X){return this.notification({method:\"ui/notifications/tool-result\",params:X})}sendToolCancelled(X){return this.notification({method:\"ui/notifications/tool-cancelled\",params:X})}sendSandboxResourceReady(X){return this.notification({method:\"ui/notifications/sandbox-resource-ready\",params:X})}teardownResource(X,Y){return this.request({method:\"ui/resource-teardown\",params:X},R,Y)}sendResourceTeardown=this.teardownResource;async connect(X){if(this.transport)throw Error(\"AppBridge is already connected. Call close() before connecting again.\");if(this._client){let Y=this._client.getServerCapabilities();if(!Y)throw Error(\"Client server capabilities not available\");if(Y.tools){if(this.oncalltool=async(Z,$)=>{return this._client.request({method:\"tools/call\",params:Z},qQ,{signal:$.signal})},Y.tools.listChanged)this._client.setNotificationHandler(iQ,(Z)=>this.sendToolListChanged(Z.params))}if(Y.resources){if(this.onlistresources=async(Z,$)=>{return this._client.request({method:\"resources/list\",params:Z},dQ,{signal:$.signal})},this.onlistresourcetemplates=async(Z,$)=>{return this._client.request({method:\"resources/templates/list\",params:Z},xQ,{signal:$.signal})},this.onreadresource=async(Z,$)=>{return this._client.request({method:\"resources/read\",params:Z},cQ,{signal:$.signal})},Y.resources.listChanged)this._client.setNotificationHandler(nQ,(Z)=>this.sendResourceListChanged(Z.params))}if(Y.prompts){if(this.onlistprompts=async(Z,$)=>{return this._client.request({method:\"prompts/list\",params:Z},yQ,{signal:$.signal})},Y.prompts.listChanged)this._client.setNotificationHandler(mQ,(Z)=>this.sendPromptListChanged(Z.params))}}return super.connect(X)}}function aQ(X,Y){return JSON.stringify(X)===JSON.stringify(Y)}export{mY as isToolVisibilityModelOnly,pY as isToolVisibilityAppOnly,hY as getToolUiResourceUri,cY as buildAllowAttribute,$Q as TOOL_RESULT_METHOD,_ as TOOL_INPUT_PARTIAL_METHOD,ZQ as TOOL_INPUT_METHOD,JQ as TOOL_CANCELLED_METHOD,rQ as SUPPORTED_PROTOCOL_VERSIONS,YQ as SIZE_CHANGED_METHOD,XQ as SANDBOX_RESOURCE_READY_METHOD,QQ as SANDBOX_PROXY_READY_METHOD,b as RESOURCE_URI_META_KEY,GQ as RESOURCE_TEARDOWN_METHOD,SQ as RESOURCE_MIME_TYPE,jQ as REQUEST_DISPLAY_MODE_METHOD,N as PostMessageTransport,t as OPEN_LINK_METHOD,y as McpUiUpdateModelContextRequestSchema,l as McpUiToolVisibilitySchema,g as McpUiToolResultNotificationSchema,AQ as McpUiToolMetaSchema,w as McpUiToolInputPartialNotificationSchema,T as McpUiToolInputNotificationSchema,U as McpUiToolCancelledNotificationSchema,m as McpUiThemeSchema,O as McpUiSupportedContentBlockModalitiesSchema,P as McpUiSizeChangedNotificationSchema,LQ as McpUiSandboxResourceReadyNotificationSchema,F as McpUiSandboxProxyReadyNotificationSchema,R as McpUiResourceTeardownResultSchema,H as McpUiResourceTeardownRequestSchema,E as McpUiResourcePermissionsSchema,IQ as McpUiResourceMetaSchema,j as McpUiResourceCspSchema,v as McpUiRequestDisplayModeResultSchema,W as McpUiRequestDisplayModeRequestSchema,I as McpUiOpenLinkResultSchema,V as McpUiOpenLinkRequestSchema,L as McpUiMessageResultSchema,C as McpUiMessageRequestSchema,M as McpUiInitializedNotificationSchema,d as McpUiInitializeResultSchema,f as McpUiInitializeRequestSchema,c as McpUiHostStylesSchema,p as McpUiHostCssSchema,q as McpUiHostContextSchema,k as McpUiHostContextChangedNotificationSchema,n as McpUiHostCapabilitiesSchema,A as McpUiDownloadFileResultSchema,S as McpUiDownloadFileRequestSchema,D as McpUiDisplayModeSchema,i as McpUiAppCapabilitiesSchema,e as MESSAGE_METHOD,G as LATEST_PROTOCOL_VERSION,DQ as INITIALIZE_METHOD,NQ as INITIALIZED_METHOD,KQ as HOST_CONTEXT_CHANGED_METHOD,s as DOWNLOAD_FILE_METHOD,oQ as AppBridge};\n","import {\n AppBridge,\n PostMessageTransport,\n type McpUiHostContext,\n type McpUiDisplayMode,\n type McpUiHostCapabilities,\n type McpUiToolInputNotification,\n type McpUiToolInputPartialNotification,\n type McpUiToolResultNotification,\n type McpUiToolCancelledNotification,\n} from '@modelcontextprotocol/ext-apps/app-bridge';\nimport type {\n CallToolRequest,\n CallToolResult,\n LoggingMessageNotification,\n} from '@modelcontextprotocol/sdk/types.js';\n\nconst DEFAULT_HOST_INFO = { name: 'SunpeakSimulator', version: '1.0.0' };\n\nconst DEFAULT_HOST_CAPABILITIES: McpUiHostCapabilities = {\n openLinks: {},\n serverTools: {},\n serverResources: {},\n downloadFile: {},\n logging: {},\n updateModelContext: { text: {} },\n message: { text: {} },\n sandbox: {},\n};\n\nexport interface McpAppHostOptions {\n hostContext?: McpUiHostContext;\n /** Host info reported to the app via MCP protocol. Defaults to SunpeakSimulator. */\n hostInfo?: { name: string; version: string };\n /** Host capabilities reported to the app. Defaults to baseline MCP capabilities. */\n hostCapabilities?: McpUiHostCapabilities;\n onDisplayModeChange?: (mode: McpUiDisplayMode) => void;\n onMessage?: (role: string, content: unknown[]) => void;\n onOpenLink?: (url: string) => void;\n onUpdateModelContext?: (content: unknown[], structuredContent?: unknown) => void;\n onSizeChanged?: (params: { width?: number; height?: number }) => void;\n onLog?: (params: LoggingMessageNotification['params']) => void;\n onCallTool?: (params: CallToolRequest['params']) => CallToolResult | Promise<CallToolResult>;\n onDownloadFile?: (contents: unknown[]) => void;\n /** Called after the iframe confirms rendering in a new display mode (paint fence resolved). */\n onDisplayModeReady?: (mode: string) => void;\n}\n\n/**\n * MCP Apps host for the Sunpeak simulator.\n * Wraps AppBridge to provide a simpler API for the simulator.\n * Connects to an iframe via PostMessageTransport.\n */\nexport class McpAppHost {\n private bridge: AppBridge;\n private options: McpAppHostOptions;\n private _initialized = false;\n private _contentWindow: Window | null = null;\n private _fenceId = 0;\n private _fenceCleanup: (() => void) | null = null;\n private _prevDisplayMode: string | undefined;\n private _pendingToolInput: McpUiToolInputNotification['params'] | null = null;\n private _pendingToolResult: McpUiToolResultNotification['params'] | null = null;\n\n constructor(options: McpAppHostOptions = {}) {\n this.options = options;\n this._prevDisplayMode = options.hostContext?.displayMode;\n\n const hostInfo = options.hostInfo ?? DEFAULT_HOST_INFO;\n const hostCapabilities = options.hostCapabilities ?? DEFAULT_HOST_CAPABILITIES;\n this.bridge = new AppBridge(null, hostInfo, hostCapabilities, {\n hostContext: options.hostContext,\n });\n\n this.bridge.oninitialized = () => {\n this._initialized = true;\n\n // Flush any data that was sent before initialization completed\n if (this._pendingToolInput) {\n this.bridge.sendToolInput(this._pendingToolInput);\n this._pendingToolInput = null;\n }\n if (this._pendingToolResult) {\n this.bridge.sendToolResult(this._pendingToolResult);\n this._pendingToolResult = null;\n }\n };\n\n this.bridge.onopenlink = async ({ url }) => {\n console.log('[MCP App] openLink:', url);\n if (this.options.onOpenLink) {\n this.options.onOpenLink(url);\n } else {\n // Validate URL scheme to prevent javascript: and data: URLs\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n console.warn('[MCP App] openLink blocked non-http(s) URL:', url);\n return {};\n }\n } catch {\n console.warn('[MCP App] openLink blocked invalid URL:', url);\n return {};\n }\n window.open(url, '_blank');\n }\n return {};\n };\n\n this.bridge.onmessage = async ({ role, content }) => {\n if (this.options.onMessage) {\n this.options.onMessage(role, content);\n } else {\n // Default: log to console\n console.log('[MCP App] sendMessage:', { role, content });\n }\n return {};\n };\n\n this.bridge.onrequestdisplaymode = async ({ mode }) => {\n this.options.onDisplayModeChange?.(mode);\n return { mode };\n };\n\n this.bridge.onupdatemodelcontext = async ({ content, structuredContent }) => {\n this.options.onUpdateModelContext?.(content ?? [], structuredContent);\n return {};\n };\n\n this.bridge.onsizechange = (params) => {\n this.options.onSizeChanged?.(params);\n };\n\n this.bridge.onloggingmessage = (params) => {\n if (this.options.onLog) {\n this.options.onLog(params);\n } else {\n // Default: log to console with appropriate level\n const level = params.level ?? 'info';\n const prefix = `[MCP App${params.logger ? ` ${params.logger}` : ''}]`;\n if (\n level === 'error' ||\n level === 'critical' ||\n level === 'alert' ||\n level === 'emergency'\n ) {\n console.error(prefix, params.data);\n } else if (level === 'warning') {\n console.warn(prefix, params.data);\n } else if (level === 'debug') {\n console.debug(prefix, params.data);\n } else {\n console.log(prefix, params.data);\n }\n }\n };\n\n this.bridge.oncalltool = async (params) => {\n if (this.options.onCallTool) {\n return this.options.onCallTool(params);\n }\n // Default: log to console and return empty result\n console.log('[MCP App] callServerTool:', params.name, params.arguments);\n return {\n content: [\n {\n type: 'text',\n text: `[Simulator] Tool \"${params.name}\" called (no handler configured)`,\n },\n ],\n };\n };\n\n this.bridge.ondownloadfile = async ({ contents }) => {\n if (this.options.onDownloadFile) {\n this.options.onDownloadFile(contents);\n } else {\n console.log('[MCP App] downloadFile:', contents.length, 'item(s)');\n }\n return {};\n };\n }\n\n /**\n * Connect to an iframe's contentWindow.\n */\n async connectToIframe(contentWindow: Window): Promise<void> {\n this._contentWindow = contentWindow;\n const transport = new PostMessageTransport(contentWindow, contentWindow);\n await this.bridge.connect(transport);\n }\n\n /**\n * Wait for the iframe to process all pending messages and commit its DOM.\n *\n * Uses a postMessage fence: since messages to the same target are delivered\n * in FIFO order, a fence message sent after setHostContext is guaranteed to\n * be processed after the host context change. The iframe's fence responder\n * waits for requestAnimationFrame before acking, ensuring the DOM has been\n * committed for the re-render triggered by the context change.\n *\n * Returns immediately if the iframe is not connected.\n */\n waitForPaint(): Promise<void> {\n const win = this._contentWindow;\n if (!win) return Promise.resolve();\n\n // Cancel any previous pending fence\n this._fenceCleanup?.();\n\n const id = ++this._fenceId;\n\n return new Promise<void>((resolve) => {\n const handler = (event: MessageEvent) => {\n if (event.source !== win) return;\n if (event.data?.method === 'sunpeak/fence-ack' && event.data.params?.fenceId === id) {\n cleanup();\n resolve();\n }\n };\n\n const cleanup = () => {\n window.removeEventListener('message', handler);\n if (this._fenceCleanup === cleanup) {\n this._fenceCleanup = null;\n }\n };\n\n this._fenceCleanup = cleanup;\n window.addEventListener('message', handler);\n\n try {\n // Format as a valid JSON-RPC 2.0 notification so the SDK's\n // PostMessageTransport parses it without error. Unknown notification\n // methods are silently ignored by the bridge.\n win.postMessage({ jsonrpc: '2.0', method: 'sunpeak/fence', params: { fenceId: id } }, '*');\n } catch {\n // Detached or cross-origin window\n cleanup();\n resolve();\n }\n });\n }\n\n /**\n * Update the host context and notify the connected app.\n * Automatically detects display mode changes and waits for the iframe\n * to commit its DOM before firing onDisplayModeReady.\n */\n setHostContext(context: McpUiHostContext): void {\n this.bridge.setHostContext(context);\n\n const currentMode = context.displayMode;\n if (currentMode && currentMode !== this._prevDisplayMode) {\n this._prevDisplayMode = currentMode;\n const mode = currentMode;\n this.waitForPaint().then(() => {\n this.options.onDisplayModeReady?.(mode);\n });\n }\n }\n\n /**\n * Send tool input to the app.\n * If the app hasn't initialized yet, the input is queued.\n */\n sendToolInput(args: Record<string, unknown>): void {\n const params: McpUiToolInputNotification['params'] = { arguments: args };\n if (this._initialized) {\n this.bridge.sendToolInput(params);\n } else {\n this._pendingToolInput = params;\n }\n }\n\n /**\n * Send tool result to the app.\n * If the app hasn't initialized yet, the result is queued.\n */\n sendToolResult(result: CallToolResult): void {\n if (this._initialized) {\n this.bridge.sendToolResult(result);\n } else {\n this._pendingToolResult = result;\n }\n }\n\n /**\n * Send partial/streaming tool input to the app.\n * Useful for simulating streaming tool arguments.\n */\n sendToolInputPartial(args: Record<string, unknown>): void {\n const params: McpUiToolInputPartialNotification['params'] = { arguments: args };\n if (this._initialized) {\n this.bridge.sendToolInputPartial(params);\n }\n // Don't queue partials - they're only meaningful during streaming\n }\n\n /**\n * Send tool cancellation notification to the app.\n * Simulates user or host cancelling a tool execution.\n */\n sendToolCancelled(reason?: string): void {\n const params: McpUiToolCancelledNotification['params'] = reason ? { reason } : {};\n if (this._initialized) {\n this.bridge.sendToolCancelled(params);\n }\n }\n\n /**\n * Close the connection.\n */\n async close(): Promise<void> {\n this._fenceCleanup?.();\n this._fenceCleanup = null;\n try {\n if (this._initialized) {\n await this.bridge.teardownResource({});\n }\n } catch {\n // Ignore teardown errors\n }\n await this.bridge.close();\n this._initialized = false;\n // Note: _contentWindow is intentionally NOT cleared here.\n // In React strict mode, close() runs asynchronously during the cleanup\n // phase of double-mount, completing after effects have re-run. Clearing\n // _contentWindow would break injectState() and waitForPaint() which\n // use it directly (unlike sendToolResult which goes through the bridge).\n // The reference becomes harmless on real unmount since no code calls\n // methods on a host whose component has been removed from the tree.\n }\n\n /**\n * Debug: Inject state directly into the app's useAppState hook.\n * This bypasses the normal MCP Apps protocol and is intended for\n * simulator testing/debugging only.\n */\n injectState(state: Record<string, unknown>): void {\n const win = this._contentWindow;\n if (!win) return;\n\n try {\n win.postMessage({ jsonrpc: '2.0', method: 'sunpeak/injectState', params: { state } }, '*');\n } catch {\n // Detached or cross-origin window - ignore\n }\n }\n\n /**\n * Update mutable options (callbacks) after construction.\n * Allows the simulator to swap handlers (e.g. onCallTool) without\n * recreating the host and tearing down the iframe connection.\n */\n updateOptions(partial: Partial<McpAppHostOptions>): void {\n Object.assign(this.options, partial);\n }\n\n get initialized(): boolean {\n return this._initialized;\n }\n}\n","/**\n * Mock OpenAI runtime for the simulator.\n *\n * ChatGPT-specific hooks (useUploadFile, useRequestModal, etc.) call\n * `window.openai` directly — they don't use the MCP protocol. When the\n * ChatGPT host is selected in the simulator, we inject this mock into\n * the iframe's window so those hooks work during local development.\n */\n\n/**\n * Inline script that sets up a mock `window.openai` for srcdoc iframes.\n * Embedded in the generated HTML *before* the app's script so that\n * `isChatGPT()` and hooks work from the very first render.\n */\nexport const MOCK_OPENAI_RUNTIME_SCRIPT = [\n 'window.openai={',\n 'uploadFile:function(f){console.log(\"[Simulator] uploadFile:\",f.name);',\n 'return Promise.resolve({fileId:\"sim_file_\"+Date.now()})},',\n 'getFileDownloadUrl:function(p){console.log(\"[Simulator] getFileDownloadUrl:\",p.fileId);',\n 'return Promise.resolve({downloadUrl:\"https://simulator.local/files/\"+p.fileId})},',\n 'requestModal:function(p){console.log(\"[Simulator] requestModal:\",JSON.stringify(p));',\n 'return Promise.resolve()},',\n 'requestCheckout:function(s){console.log(\"[Simulator] requestCheckout:\",JSON.stringify(s));',\n 'return Promise.resolve({id:\"sim_order_\"+Date.now(),checkout_session_id:s.id||\"sim_session\",status:\"completed\"})},',\n 'requestClose:function(){console.log(\"[Simulator] requestClose\")},',\n 'requestDisplayMode:function(p){console.log(\"[Simulator] requestDisplayMode:\",p.mode);',\n 'return Promise.resolve()},',\n 'sendFollowUpMessage:function(p){console.log(\"[Simulator] sendFollowUpMessage:\",p.prompt)},',\n 'openExternal:function(p){console.log(\"[Simulator] openExternal:\",p.href);window.open(p.href,\"_blank\")}',\n '};',\n].join('');\n\n/**\n * Create a mock OpenAI runtime object for direct injection into an\n * iframe's `contentWindow`. Used for src-mode iframes (dev with Vite)\n * where we can't embed inline scripts in the page.\n */\nexport function createMockOpenAIRuntime(): Record<string, (...args: never[]) => unknown> {\n return {\n uploadFile: async (file: File) => {\n console.log('[Simulator] uploadFile:', file.name);\n return { fileId: `sim_file_${Date.now()}` };\n },\n getFileDownloadUrl: async (params: { fileId: string }) => {\n console.log('[Simulator] getFileDownloadUrl:', params.fileId);\n return { downloadUrl: `https://simulator.local/files/${params.fileId}` };\n },\n requestModal: async (params: unknown) => {\n console.log('[Simulator] requestModal:', params);\n },\n requestCheckout: async (session: { id?: string }) => {\n console.log('[Simulator] requestCheckout:', session);\n return {\n id: `sim_order_${Date.now()}`,\n checkout_session_id: session.id || 'sim_session',\n status: 'completed',\n };\n },\n requestClose: () => {\n console.log('[Simulator] requestClose');\n },\n requestDisplayMode: async (params: { mode: string }) => {\n console.log('[Simulator] requestDisplayMode:', params.mode);\n },\n sendFollowUpMessage: (params: { prompt: string }) => {\n console.log('[Simulator] sendFollowUpMessage:', params.prompt);\n },\n openExternal: (params: { href: string }) => {\n console.log('[Simulator] openExternal:', params.href);\n window.open(params.href, '_blank');\n },\n };\n}\n","import * as React from 'react';\nimport { useEffect, useRef, useMemo, useCallback } from 'react';\nimport { McpAppHost, type McpAppHostOptions } from './mcp-app-host';\nimport { createMockOpenAIRuntime, MOCK_OPENAI_RUNTIME_SCRIPT } from './mock-openai-runtime';\nimport type { McpUiHostContext, McpUiResourcePermissions } from '@modelcontextprotocol/ext-apps';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Allowed origins for cross-origin script loading.\n * - Local development: localhost, 127.0.0.1, file://\n * - Production: sunpeak-prod-app-storage.s3.us-east-2.amazonaws.com (serves user scripts)\n */\nconst ALLOWED_SCRIPT_ORIGINS = [\n 'https://sunpeak-prod-app-storage.s3.us-east-2.amazonaws.com',\n 'http://localhost',\n 'https://localhost',\n 'http://127.0.0.1',\n 'https://127.0.0.1',\n];\n\n/**\n * Escapes HTML special characters to prevent XSS via attribute injection.\n */\nfunction escapeHtml(str: string): string {\n return str.replace(/[&<>\"']/g, (c) => {\n const entities: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#39;',\n };\n return entities[c] ?? c;\n });\n}\n\n/**\n * Validates that a URL is from an allowed origin.\n * Allows same-origin URLs and URLs from whitelisted domains.\n */\nfunction isAllowedUrl(src: string): boolean {\n if (!src) return false;\n\n // Allow relative paths (same-origin) - must start with / but not //\n if (src.startsWith('/') && !src.startsWith('//')) return true;\n\n // Reject strings that don't look like URLs (no protocol)\n if (!src.includes('://')) return false;\n\n try {\n const url = new URL(src);\n\n // Allow same-origin\n if (url.origin === window.location.origin) return true;\n\n // Allow localhost with any port for development\n if (url.hostname === 'localhost' || url.hostname === '127.0.0.1') return true;\n\n // Check against allowed origins (strict origin comparison only)\n return ALLOWED_SCRIPT_ORIGINS.some((allowed) => {\n try {\n return url.origin === new URL(allowed).origin;\n } catch {\n return false;\n }\n });\n } catch {\n return false;\n }\n}\n\n/**\n * Content Security Policy configuration for iframe resources.\n * Matches McpUiResourceCsp from the MCP Apps spec.\n */\nexport interface ResourceCSP {\n /** Domains allowed for fetch/XHR/WebSocket connections */\n connectDomains?: string[];\n /** Domains allowed for scripts, images, styles, fonts */\n resourceDomains?: string[];\n /** Domains allowed for nested iframes */\n frameDomains?: string[];\n /** Domains allowed for the base-uri directive */\n baseUriDomains?: string[];\n}\n\n/**\n * Extract CSP configuration from a resource's _meta.ui.csp field.\n */\nexport function extractResourceCSP(resource: { _meta?: unknown }): ResourceCSP | undefined {\n const meta = resource._meta as Record<string, unknown> | undefined;\n const ui = meta?.ui as { csp?: ResourceCSP } | undefined;\n return ui?.csp;\n}\n\n/**\n * Validates a CSP source entry is a safe origin URL (scheme + host + optional port).\n * Rejects wildcards, CSP keywords, and whitespace that could inject extra directives.\n */\nfunction isValidCspSource(source: string): boolean {\n // Block CSP keywords like 'unsafe-inline', wildcards like *, and whitespace injection\n if (!source || /[\\s;,']/.test(source) || source === '*') return false;\n try {\n const url = new URL(source);\n return (\n url.protocol === 'http:' ||\n url.protocol === 'https:' ||\n url.protocol === 'ws:' ||\n url.protocol === 'wss:'\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Generates a Content Security Policy string.\n */\nfunction generateCSP(csp: ResourceCSP | undefined, scriptSrc: string): string {\n let scriptOrigin = '';\n try {\n scriptOrigin = new URL(scriptSrc, window.location.origin).origin;\n } catch {\n // Invalid URL, skip\n }\n\n // frame-src: default to 'none', but allow declared frame domains\n const frameSources = new Set<string>();\n if (csp?.frameDomains) {\n for (const domain of csp.frameDomains) {\n if (isValidCspSource(domain)) {\n frameSources.add(domain);\n } else {\n console.warn('[IframeResource] Ignoring invalid CSP frame domain:', domain);\n }\n }\n }\n const frameSrc =\n frameSources.size > 0 ? `frame-src ${Array.from(frameSources).join(' ')}` : \"frame-src 'none'\";\n\n // base-uri: default to 'self', but allow declared base-uri domains\n const baseSources = new Set<string>([\"'self'\"]);\n if (csp?.baseUriDomains) {\n for (const domain of csp.baseUriDomains) {\n if (isValidCspSource(domain)) {\n baseSources.add(domain);\n } else {\n console.warn('[IframeResource] Ignoring invalid CSP base-uri domain:', domain);\n }\n }\n }\n\n const directives: string[] = [\n \"default-src 'none'\",\n `script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: ${scriptOrigin}`.trim(),\n `style-src 'self' 'unsafe-inline' ${scriptOrigin}`.trim(),\n frameSrc,\n \"object-src 'none'\",\n \"form-action 'none'\",\n `base-uri ${Array.from(baseSources).join(' ')}`,\n ];\n\n const connectSources = new Set<string>([\"'self'\"]);\n if (scriptOrigin) connectSources.add(scriptOrigin);\n if (csp?.connectDomains) {\n for (const domain of csp.connectDomains) {\n if (isValidCspSource(domain)) {\n connectSources.add(domain);\n } else {\n console.warn('[IframeResource] Ignoring invalid CSP connect domain:', domain);\n }\n }\n }\n directives.push(`connect-src ${Array.from(connectSources).join(' ')}`);\n\n const resourceSources = new Set<string>([\"'self'\", 'data:', 'blob:']);\n if (scriptOrigin) resourceSources.add(scriptOrigin);\n if (csp?.resourceDomains) {\n for (const domain of csp.resourceDomains) {\n if (isValidCspSource(domain)) {\n resourceSources.add(domain);\n } else {\n console.warn('[IframeResource] Ignoring invalid CSP resource domain:', domain);\n }\n }\n }\n const resourceList = Array.from(resourceSources).join(' ');\n directives.push(`img-src ${resourceList}`);\n directives.push(`font-src ${resourceList}`);\n directives.push(`media-src ${resourceList}`);\n\n return directives.join('; ');\n}\n\n/**\n * Paint fence responder script body.\n * Allows the host to wait for this iframe to process pending messages and\n * commit DOM updates before revealing content during display mode transitions.\n *\n * Used in two places:\n * - Embedded in the generated HTML for scriptSrc mode\n * - Injected into src-mode iframes after load via contentDocument\n */\nconst PAINT_FENCE_SCRIPT = `window.addEventListener(\"message\",function(e){\nif(e.data&&e.data.method===\"sunpeak/fence\"){\nvar fid=e.data.params&&e.data.params.fenceId;\nrequestAnimationFrame(function(){\ne.source.postMessage({jsonrpc:\"2.0\",method:\"sunpeak/fence-ack\",params:{fenceId:fid}},\"*\");\n});}});`;\n\n/**\n * Inject the paint fence responder into an iframe's document.\n * For src-mode iframes the host doesn't control the HTML, so we inject the\n * script after load. This requires same-origin access (sandbox must include\n * allow-same-origin). Silently skipped for cross-origin iframes.\n */\nfunction injectPaintFence(iframe: HTMLIFrameElement): void {\n try {\n const doc = iframe.contentDocument;\n if (!doc || doc.querySelector('script[data-sunpeak-fence]')) return;\n const script = doc.createElement('script');\n script.setAttribute('data-sunpeak-fence', '');\n script.textContent = PAINT_FENCE_SCRIPT;\n doc.head.appendChild(script);\n } catch {\n // Cross-origin iframe — contentDocument access blocked\n }\n}\n\n/**\n * Inject a background-color rule into an iframe's document.\n * For src-mode iframes (Vite dev) the simulator doesn't control the HTML,\n * so we inject the rule after load. The scriptSrc-mode generated HTML\n * already includes this rule in its <style> tag.\n *\n * Sets color-scheme on the document so the CSS system color `Canvas`\n * resolves to the correct dark/light default, preventing white flash.\n */\nfunction injectBackgroundRule(\n iframe: HTMLIFrameElement,\n theme?: string,\n styleVars?: Record<string, string>\n): void {\n try {\n const doc = iframe.contentDocument;\n if (!doc || doc.querySelector('style[data-sunpeak-bg]')) return;\n // Set color-scheme so Canvas resolves to the correct system color\n doc.documentElement.style.colorScheme = theme || 'dark';\n // Inject host style variables so --color-background-primary resolves\n // immediately, before the MCP handshake delivers them via the SDK.\n if (styleVars) {\n for (const [key, value] of Object.entries(styleVars)) {\n if (value) doc.documentElement.style.setProperty(key, value);\n }\n }\n const style = doc.createElement('style');\n style.setAttribute('data-sunpeak-bg', '');\n style.textContent = 'html { background-color: var(--color-background-primary, Canvas); }';\n doc.head.appendChild(style);\n } catch {\n // Cross-origin iframe — contentDocument access blocked\n }\n}\n\n/**\n * Generates HTML wrapper for a script URL.\n * The MCP Apps SDK in the loaded script handles communication via PostMessageTransport.\n */\nfunction generateScriptHtml(\n scriptSrc: string,\n theme: string,\n cspPolicy: string,\n platformScript?: string\n): string {\n const safeScriptSrc = escapeHtml(scriptSrc);\n const safeCsp = escapeHtml(cspPolicy);\n const safeTheme = escapeHtml(theme);\n // Platform runtime script (e.g. mock window.openai) runs before the app\n // script so that isChatGPT() and platform hooks work from first render.\n const platformTag = platformScript ? `\\n <script>${platformScript}</script>` : '';\n return `<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"${safeTheme}\" style=\"color-scheme:${safeTheme};background:Canvas\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"color-scheme\" content=\"${safeTheme}\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${safeCsp}\" />\n <title>Resource</title>\n <style>\n html {\n /* Use the MCP App background variable once JS sets it, otherwise\n Canvas (the system color that auto-adapts to color-scheme). */\n background-color: var(--color-background-primary, Canvas);\n }\n body, #root {\n margin: 0;\n padding: 0;\n width: 100%;\n background: transparent;\n }\n </style>\n <script>${PAINT_FENCE_SCRIPT}</script>${platformTag}\n</head>\n<body>\n <div id=\"root\"></div>\n <script src=\"${safeScriptSrc}\"></script>\n</body>\n</html>`;\n}\n\n/**\n * Build the iframe `allow` attribute from resource-declared permissions.\n * Maps McpUiResourcePermissions to Permission Policy directives and\n * combines them with simulator baseline permissions.\n */\nfunction buildIframeAllow(permissions: McpUiResourcePermissions | undefined): string {\n const parts: string[] = [\n 'local-network-access *', // Always needed for local dev server access\n ];\n\n // Map spec permissions to their Permission Policy names\n const permMap: [keyof McpUiResourcePermissions, string][] = [\n ['camera', 'camera'],\n ['microphone', 'microphone'],\n ['geolocation', 'geolocation'],\n ['clipboardWrite', 'clipboard-write'],\n ];\n\n for (const [key, directive] of permMap) {\n if (permissions?.[key]) {\n parts.push(directive);\n }\n }\n\n return parts.join('; ');\n}\n\ninterface IframeResourceProps {\n /**\n * URL to an HTML page to load directly in the iframe.\n * Used for dev mode where Vite serves the resource page.\n * Mutually exclusive with scriptSrc.\n */\n src?: string;\n /**\n * URL to a built resource to load in the iframe via srcdoc.\n * Used for production builds where we generate the HTML wrapper.\n * Mutually exclusive with src.\n */\n scriptSrc?: string;\n /** Initial host context for the MCP Apps bridge */\n hostContext?: McpUiHostContext;\n /** Tool input arguments to send after connection */\n toolInput?: Record<string, unknown>;\n /** Partial/streaming tool input to send as a tool-input-partial notification */\n toolInputPartial?: Record<string, unknown>;\n /** Tool result to send after connection */\n toolResult?: CallToolResult;\n /** Optional callbacks for the MCP Apps host */\n hostOptions?: McpAppHostOptions;\n /** Optional CSP configuration (only used with scriptSrc) */\n csp?: ResourceCSP;\n /** Resource-declared sandbox permissions (camera, microphone, etc.) */\n permissions?: McpUiResourcePermissions;\n /** Whether the host should render a border around the resource */\n prefersBorder?: boolean;\n /** Optional className for the iframe container */\n className?: string;\n /** Optional style for the iframe */\n style?: React.CSSProperties;\n /**\n * Called after the iframe has rendered following a display mode change.\n * The callback receives the display mode that was confirmed.\n * Used by the simulator to hide content during transitions and only\n * reveal it once the app has committed its DOM for the new mode.\n */\n onDisplayModeReady?: (mode: string) => void;\n /**\n * Debug: State to inject directly into the app's useAppState hook.\n * This bypasses the normal MCP Apps protocol and is for simulator testing.\n */\n debugInjectState?: Record<string, unknown> | null;\n /**\n * Whether to inject a mock ChatGPT runtime (window.openai) into the iframe.\n * When true, ChatGPT-specific hooks (useUploadFile, useRequestModal, etc.)\n * and isChatGPT() will work inside the iframe.\n */\n injectOpenAIRuntime?: boolean;\n}\n\n/**\n * IframeResource renders MCP Apps in an iframe, communicating via the\n * MCP Apps protocol (PostMessageTransport + AppBridge).\n *\n * Supports two modes:\n * - `src`: Load an HTML page directly (dev mode with Vite HMR)\n * - `scriptSrc`: Generate HTML wrapper for a JS file (production builds)\n *\n * The loaded app uses the MCP Apps SDK's useApp() hook which automatically\n * connects via PostMessageTransport to window.parent. The parent side uses\n * McpAppHost (wrapping AppBridge) to communicate.\n */\nexport function IframeResource({\n src,\n scriptSrc,\n hostContext,\n toolInput,\n toolInputPartial,\n toolResult,\n hostOptions,\n csp,\n permissions,\n prefersBorder,\n className,\n style,\n onDisplayModeReady,\n debugInjectState,\n injectOpenAIRuntime,\n}: IframeResourceProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const hostRef = useRef<McpAppHost | null>(null);\n\n // Determine which URL to validate\n const resourceUrl = src ?? scriptSrc;\n\n // Track whether we've received an initial size report\n const hasReceivedSizeRef = useRef(false);\n\n // Track current display mode so the stable onSizeChanged callback can\n // skip auto-resizing in fullscreen (where the host container is fixed).\n const displayModeRef = useRef(hostContext?.displayMode);\n displayModeRef.current = hostContext?.displayMode;\n\n // Remember the last content-driven height so we can restore it when\n // leaving fullscreen (the app won't re-report until content changes).\n const lastContentHeightRef = useRef<number | null>(null);\n\n // Create the MCP Apps host\n const host = useMemo(\n () =>\n new McpAppHost({\n hostContext,\n ...hostOptions,\n onSizeChanged: (params) => {\n hostOptions?.onSizeChanged?.(params);\n if (params.height != null) {\n lastContentHeightRef.current = params.height;\n }\n // Skip auto-resizing in fullscreen mode where the host provides a\n // fixed container — auto-sizing would create a feedback loop with\n // viewport-relative units like dvh. PIP and inline use content-driven sizing.\n if (displayModeRef.current === 'fullscreen') return;\n if (iframeRef.current && params.height != null) {\n hasReceivedSizeRef.current = true;\n iframeRef.current.style.height = `${params.height}px`;\n }\n },\n onDisplayModeReady: (mode) => onDisplayModeReady?.(mode),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [] // Stable - create once\n );\n hostRef.current = host;\n\n // Connect bridge transport as soon as the iframe element exists in the DOM,\n // before the browser loads the iframe content. For built HTML files with\n // inline scripts (same-origin), React effects inside the iframe can fire\n // before the parent's onLoad event, causing the app's `initialize` request\n // to be lost if the bridge transport isn't listening yet.\n const setIframeRef = useCallback(\n (node: HTMLIFrameElement | null) => {\n iframeRef.current = node;\n if (node?.contentWindow) {\n host.connectToIframe(node.contentWindow);\n }\n },\n [host]\n );\n\n // After iframe content loads, inject the paint fence responder for src-mode\n // iframes (scriptSrc mode already embeds it in the generated HTML).\n // Tool data is NOT sent here — McpAppHost queues pending data and flushes\n // it automatically when the app initializes.\n const handleLoad = useCallback(() => {\n if (src && iframeRef.current) {\n injectPaintFence(iframeRef.current);\n injectBackgroundRule(\n iframeRef.current,\n hostContext?.theme,\n hostContext?.styles?.variables as Record<string, string> | undefined\n );\n }\n // Inject mock ChatGPT runtime for src-mode iframes after page load.\n // For srcdoc mode this is handled by an inline script in the generated HTML.\n if (injectOpenAIRuntime && iframeRef.current?.contentWindow) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (iframeRef.current.contentWindow as any).openai = createMockOpenAIRuntime();\n } catch {\n // Cross-origin iframe — contentWindow access blocked\n }\n }\n // Fade in via direct DOM update — avoids a React state update from an\n // async iframe load event (which triggers act() warnings in tests).\n if (iframeRef.current) {\n iframeRef.current.style.opacity = '1';\n iframeRef.current.style.transition = 'opacity 100ms';\n }\n }, [src, injectOpenAIRuntime, hostContext?.theme, hostContext?.styles]);\n\n // Sync mutable host options (e.g. onCallTool) into the existing host\n // instance when they change, without recreating the connection.\n useEffect(() => {\n if (hostOptions) {\n host.updateOptions(hostOptions);\n }\n }, [host, hostOptions]);\n\n // Update host context when props change.\n // McpAppHost.setHostContext() internally detects display mode changes\n // and waits for the iframe to commit its DOM before firing onDisplayModeReady.\n useEffect(() => {\n if (hostContext) {\n host.setHostContext(hostContext);\n }\n // In fullscreen the host provides a fixed container, so the iframe\n // should fill it. When leaving fullscreen, restore the last content-driven\n // height so the iframe isn't stuck at 100% or collapsed.\n if (iframeRef.current) {\n if (hostContext?.displayMode === 'fullscreen') {\n iframeRef.current.style.height = '100%';\n } else if (lastContentHeightRef.current != null) {\n iframeRef.current.style.height = `${lastContentHeightRef.current}px`;\n }\n }\n }, [host, hostContext]);\n\n // Send tool input updates\n // Note: Don't check host.initialized here - McpAppHost handles queueing internally\n useEffect(() => {\n if (toolInput) {\n host.sendToolInput(toolInput);\n }\n }, [host, toolInput]);\n\n // Send partial/streaming tool input\n useEffect(() => {\n if (toolInputPartial) {\n host.sendToolInputPartial(toolInputPartial);\n }\n }, [host, toolInputPartial]);\n\n // Send tool result updates\n // Note: Don't check host.initialized here - McpAppHost handles queueing internally\n useEffect(() => {\n if (toolResult) {\n host.sendToolResult(toolResult);\n }\n }, [host, toolResult]);\n\n // Debug: Inject state directly into app's useAppState hook\n useEffect(() => {\n if (debugInjectState != null) {\n host.injectState(debugInjectState);\n }\n }, [host, debugInjectState]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n hostRef.current?.close();\n };\n }, []);\n\n // Validate URL\n const isValidUrl = useMemo(() => resourceUrl && isAllowedUrl(resourceUrl), [resourceUrl]);\n\n // Build iframe allow attribute from resource permissions\n const allowAttribute = useMemo(() => buildIframeAllow(permissions), [permissions]);\n\n // Border style when resource declares prefersBorder\n const borderStyle: React.CSSProperties = prefersBorder\n ? { border: '1px solid var(--color-border-primary, #e5e7eb)' }\n : { border: 'none' };\n\n // For scriptSrc mode, generate HTML with srcdoc (must be above early return to satisfy rules-of-hooks)\n const htmlContent = useMemo(() => {\n if (!scriptSrc || !isValidUrl) {\n if (scriptSrc) {\n console.error('[IframeResource] Script source not allowed:', scriptSrc);\n }\n return `<!DOCTYPE html><html><body><h1>Error</h1><p>Script source not allowed.</p></body></html>`;\n }\n\n // Convert relative paths to absolute (srcdoc iframes can't resolve relative paths)\n const absoluteScriptSrc = scriptSrc.startsWith('/')\n ? `${window.location.origin}${scriptSrc}`\n : scriptSrc;\n\n const cspPolicy = generateCSP(csp, absoluteScriptSrc);\n const theme = hostContext?.theme ?? 'dark';\n const platformScript = injectOpenAIRuntime ? MOCK_OPENAI_RUNTIME_SCRIPT : undefined;\n return generateScriptHtml(absoluteScriptSrc, theme, cspPolicy, platformScript);\n }, [scriptSrc, isValidUrl, csp, hostContext?.theme, injectOpenAIRuntime]);\n\n const iframeStyle: React.CSSProperties = {\n ...borderStyle,\n background: 'transparent',\n colorScheme: hostContext?.theme === 'light' ? 'light dark' : 'dark light',\n // Start hidden; handleLoad fades in via direct DOM update\n opacity: 0,\n width: '100%',\n // Start with minHeight to prevent collapse, but allow auto-resize to set actual height.\n // Don't use height: 100% as it requires explicit height in parent chain.\n minHeight: '200px',\n ...style,\n };\n\n // For src mode, use iframe src directly\n if (src) {\n if (!isValidUrl) {\n console.error('[IframeResource] URL not allowed:', src);\n return <div style={{ color: 'red', padding: 20 }}>Error: URL not allowed: {src}</div>;\n }\n\n return (\n <iframe\n ref={setIframeRef}\n src={src}\n onLoad={handleLoad}\n className={className}\n style={iframeStyle}\n title=\"Resource Preview\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\"\n allow={allowAttribute}\n />\n );\n }\n\n return (\n <iframe\n ref={setIframeRef}\n srcDoc={htmlContent}\n onLoad={handleLoad}\n className={className}\n style={iframeStyle}\n title=\"Resource Preview\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\"\n allow={allowAttribute}\n />\n );\n}\n\n// Export security helpers for testing\nexport const _testExports = {\n escapeHtml,\n isAllowedUrl,\n isValidCspSource,\n generateCSP,\n generateScriptHtml,\n buildIframeAllow,\n ALLOWED_SCRIPT_ORIGINS,\n};\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport type {\n McpUiHostContext,\n McpUiDisplayMode,\n McpUiTheme,\n McpUiResourcePermissions,\n} from '@modelcontextprotocol/ext-apps';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { Simulation } from '../types/simulation';\nimport type { ScreenWidth } from './simulator-types';\nimport type { HostId } from './hosts';\nimport { extractResourceCSP, type ResourceCSP } from './iframe-resource';\n\ntype Platform = NonNullable<McpUiHostContext['platform']>;\n\nconst DEFAULT_THEME: McpUiTheme = 'dark';\nconst DEFAULT_DISPLAY_MODE: McpUiDisplayMode = 'inline';\nconst DEFAULT_PLATFORM: Platform = 'desktop';\n\nexport interface UseSimulatorStateOptions {\n simulations: Record<string, Simulation>;\n defaultHost?: HostId;\n}\n\nexport interface SimulatorState {\n // ── Simulation selection ──\n simulationNames: string[];\n selectedSimulationName: string;\n setSelectedSimulationName: (name: string) => void;\n selectedSim: Simulation | undefined;\n\n // ── Host selection ──\n activeHost: HostId;\n setActiveHost: (host: HostId) => void;\n\n // ── Screen width ──\n screenWidth: ScreenWidth;\n setScreenWidth: (width: ScreenWidth) => void;\n\n // ── Host context ──\n theme: McpUiTheme;\n setTheme: (theme: McpUiTheme) => void;\n displayMode: McpUiDisplayMode;\n setDisplayMode: (mode: McpUiDisplayMode) => void;\n locale: string;\n setLocale: (locale: string) => void;\n containerHeight: number | undefined;\n setContainerHeight: (height: number | undefined) => void;\n containerWidth: number | undefined;\n setContainerWidth: (width: number | undefined) => void;\n containerMaxHeight: number | undefined;\n setContainerMaxHeight: (height: number | undefined) => void;\n containerMaxWidth: number | undefined;\n setContainerMaxWidth: (width: number | undefined) => void;\n platform: Platform;\n setPlatform: (platform: Platform) => void;\n hover: boolean;\n setHover: (hover: boolean) => void;\n touch: boolean;\n setTouch: (touch: boolean) => void;\n safeAreaInsets: { top: number; bottom: number; left: number; right: number };\n setSafeAreaInsets: React.Dispatch<\n React.SetStateAction<{ top: number; bottom: number; left: number; right: number }>\n >;\n timeZone: string;\n setTimeZone: (tz: string) => void;\n // ── Computed host context ──\n hostContext: McpUiHostContext;\n\n // ── Display mode transition ──\n readyDisplayMode: McpUiDisplayMode;\n handleDisplayModeReady: (mode: string) => void;\n isTransitioning: boolean;\n\n // ── Tool data ──\n toolInput: Record<string, unknown>;\n setToolInput: (input: Record<string, unknown>) => void;\n toolResult: CallToolResult | undefined;\n setToolResult: (result: CallToolResult | undefined) => void;\n effectiveToolResult: CallToolResult | undefined;\n\n // ── Model context ──\n modelContext: Record<string, unknown> | null;\n setModelContext: (ctx: Record<string, unknown> | null) => void;\n\n // ── JSON editing state (for sidebar) ──\n toolInputJson: string;\n setToolInputJson: (json: string) => void;\n toolInputError: string;\n setToolInputError: (error: string) => void;\n toolResultJson: string;\n setToolResultJson: (json: string) => void;\n toolResultError: string;\n setToolResultError: (error: string) => void;\n modelContextJson: string;\n setModelContextJson: (json: string) => void;\n modelContextError: string;\n setModelContextError: (error: string) => void;\n editingField: string | null;\n setEditingField: (field: string | null) => void;\n\n // ── JSON helpers ──\n validateJSON: (\n json: string,\n setJson: (value: string) => void,\n setError: (error: string) => void\n ) => void;\n commitJSON: (\n json: string,\n setError: (error: string) => void,\n updateFn: (value: Record<string, unknown> | null) => void\n ) => void;\n\n // ── Host callbacks ──\n handleDisplayModeChange: (mode: McpUiDisplayMode) => void;\n handleUpdateModelContext: (content: unknown[], structuredContent?: unknown) => void;\n\n // ── Content props (for IframeResource) ──\n resourceUrl: string | undefined;\n resourceScript: string | undefined;\n csp: ResourceCSP | undefined;\n permissions: McpUiResourcePermissions | undefined;\n prefersBorder: boolean;\n domain: string | undefined;\n hasIframeContent: boolean;\n\n // ── URL param overrides ──\n urlProdTools: boolean | undefined;\n urlProdResources: boolean | undefined;\n}\n\n/**\n * Parse URL params for initial simulator values.\n * Supported params:\n * - simulation: simulation name (e.g., 'show-albums')\n * - theme: 'light' | 'dark'\n * - displayMode: 'inline' | 'pip' | 'fullscreen'\n * - locale: e.g., 'en-US'\n * - maxHeight: number (containerDimensions.maxHeight)\n * - maxWidth: number (containerDimensions.maxWidth)\n * - deviceType: 'mobile' | 'tablet' | 'desktop' → maps to platform\n * - hover: 'true' | 'false'\n * - touch: 'true' | 'false'\n * - safeAreaTop, safeAreaBottom, safeAreaLeft, safeAreaRight: number\n * - host: 'chatgpt' | 'claude'\n * - prodTools: 'true' | 'false'\n * - prodResources: 'true' | 'false'\n */\nfunction parseUrlParams(): {\n simulation?: string;\n theme?: McpUiTheme;\n displayMode?: McpUiDisplayMode;\n locale?: string;\n containerMaxHeight?: number;\n containerMaxWidth?: number;\n platform?: Platform;\n deviceCapabilities?: { hover?: boolean; touch?: boolean };\n safeAreaInsets?: { top: number; bottom: number; left: number; right: number };\n host?: HostId;\n prodTools?: boolean;\n prodResources?: boolean;\n} {\n if (typeof window === 'undefined') return {};\n\n const params = new URLSearchParams(window.location.search);\n\n const simulation = params.get('simulation') ?? undefined;\n const theme = params.get('theme') as McpUiTheme | null;\n const displayMode = params.get('displayMode') as McpUiDisplayMode | null;\n const locale = params.get('locale');\n const maxHeightParam = params.get('maxHeight');\n const containerMaxHeight = maxHeightParam ? Number(maxHeightParam) : undefined;\n const maxWidthParam = params.get('maxWidth');\n const containerMaxWidth = maxWidthParam ? Number(maxWidthParam) : undefined;\n const host = (params.get('host') as HostId) ?? undefined;\n\n // Prod modes\n const prodToolsParam = params.get('prodTools');\n const prodTools =\n prodToolsParam === 'true' ? true : prodToolsParam === 'false' ? false : undefined;\n const prodResourcesParam = params.get('prodResources');\n const prodResources =\n prodResourcesParam === 'true' ? true : prodResourcesParam === 'false' ? false : undefined;\n\n // Map deviceType param to MCP Apps platform\n const deviceType = params.get('deviceType');\n let platform: Platform | undefined;\n if (deviceType === 'mobile' || deviceType === 'tablet') {\n platform = 'mobile';\n } else if (deviceType === 'desktop') {\n platform = 'desktop';\n }\n\n // Device capabilities\n const hoverParam = params.get('hover');\n const touchParam = params.get('touch');\n const hasCapParams = hoverParam || touchParam;\n const deviceCapabilities = hasCapParams\n ? {\n hover: hoverParam === 'false' ? false : true,\n touch: touchParam === 'true' ? true : false,\n }\n : undefined;\n\n // Safe area insets\n const safeAreaTop = params.get('safeAreaTop');\n const safeAreaBottom = params.get('safeAreaBottom');\n const safeAreaLeft = params.get('safeAreaLeft');\n const safeAreaRight = params.get('safeAreaRight');\n const hasSafeAreaParams = safeAreaTop || safeAreaBottom || safeAreaLeft || safeAreaRight;\n const safeAreaInsets = hasSafeAreaParams\n ? {\n top: safeAreaTop ? Number(safeAreaTop) : 0,\n bottom: safeAreaBottom ? Number(safeAreaBottom) : 0,\n left: safeAreaLeft ? Number(safeAreaLeft) : 0,\n right: safeAreaRight ? Number(safeAreaRight) : 0,\n }\n : undefined;\n\n return {\n simulation,\n theme: theme ?? undefined,\n displayMode: displayMode ?? undefined,\n locale: locale ?? undefined,\n containerMaxHeight,\n containerMaxWidth,\n platform,\n deviceCapabilities,\n safeAreaInsets,\n host: host ?? undefined,\n prodTools,\n prodResources,\n };\n}\n\nexport function useSimulatorState({\n simulations,\n defaultHost = 'chatgpt',\n}: UseSimulatorStateOptions): SimulatorState {\n // Only list simulations with a UI resource — backend-only tools have nothing to render.\n const simulationNames = Object.keys(simulations)\n .filter((name) => simulations[name].resource)\n .sort((a, b) => {\n const simA = simulations[a];\n const simB = simulations[b];\n const resourceLabelA = (simA.resource!.title as string) || simA.resource!.name;\n const resourceLabelB = (simB.resource!.title as string) || simB.resource!.name;\n const labelA = `${resourceLabelA}: ${(simA.tool.title as string) || simA.tool.name}`;\n const labelB = `${resourceLabelB}: ${(simB.tool.title as string) || simB.tool.name}`;\n return labelA.localeCompare(labelB);\n });\n const urlParams = useMemo(() => parseUrlParams(), []);\n const [screenWidth, setScreenWidth] = useState<ScreenWidth>('full');\n\n const isMobileWidth = (width: ScreenWidth) => width === 'mobile-s' || width === 'mobile-l';\n\n // ── Host selection ──\n const [activeHost, setActiveHost] = useState<HostId>(urlParams.host ?? defaultHost);\n\n // ── Simulation selection ──\n const initialSimulationName = useMemo(() => {\n const defaultName = simulationNames[0] ?? '';\n if (!urlParams.simulation) return defaultName;\n return urlParams.simulation in simulations ? urlParams.simulation : defaultName;\n }, [urlParams.simulation, simulations, simulationNames]);\n\n const [selectedSimulationName, setSelectedSimulationName] =\n useState<string>(initialSimulationName);\n\n const selectedSim = simulations[selectedSimulationName];\n\n // ── Host context state ──\n\n const [theme, setTheme] = useState<McpUiTheme>(urlParams.theme ?? DEFAULT_THEME);\n const [displayMode, _setDisplayMode] = useState<McpUiDisplayMode>(\n urlParams.displayMode ?? DEFAULT_DISPLAY_MODE\n );\n const [locale, setLocale] = useState(urlParams.locale ?? 'en-US');\n const [containerHeight, setContainerHeight] = useState<number | undefined>(undefined);\n const [containerWidth, setContainerWidth] = useState<number | undefined>(undefined);\n const [containerMaxHeight, setContainerMaxHeight] = useState<number | undefined>(\n urlParams.containerMaxHeight\n );\n const [containerMaxWidth, setContainerMaxWidth] = useState<number | undefined>(\n urlParams.containerMaxWidth\n );\n const [platform, setPlatform] = useState<Platform>(urlParams.platform ?? DEFAULT_PLATFORM);\n const [hover, setHover] = useState(urlParams.deviceCapabilities?.hover ?? true);\n const [touch, setTouch] = useState(urlParams.deviceCapabilities?.touch ?? false);\n const [safeAreaInsets, setSafeAreaInsets] = useState(\n urlParams.safeAreaInsets ?? { top: 0, bottom: 0, left: 0, right: 0 }\n );\n const [timeZone, setTimeZone] = useState(() => Intl.DateTimeFormat().resolvedOptions().timeZone);\n\n // Display mode setter that respects mobile width constraints\n const setDisplayMode = (mode: McpUiDisplayMode) => {\n if (isMobileWidth(screenWidth) && mode === 'pip') {\n _setDisplayMode('fullscreen');\n } else {\n _setDisplayMode(mode);\n }\n };\n\n // Track which display mode the iframe has confirmed rendering.\n const [readyDisplayMode, setReadyDisplayMode] = useState<McpUiDisplayMode>(\n urlParams.displayMode ?? DEFAULT_DISPLAY_MODE\n );\n\n const handleDisplayModeReady = useCallback((mode: string) => {\n setReadyDisplayMode(mode as McpUiDisplayMode);\n }, []);\n\n // Build host context from state\n const containerDimensions = useMemo(() => {\n if (\n containerHeight == null &&\n containerWidth == null &&\n containerMaxHeight == null &&\n containerMaxWidth == null\n )\n return undefined;\n return {\n ...(containerHeight != null ? { height: containerHeight } : {}),\n ...(containerWidth != null ? { width: containerWidth } : {}),\n ...(containerMaxHeight != null ? { maxHeight: containerMaxHeight } : {}),\n ...(containerMaxWidth != null ? { maxWidth: containerMaxWidth } : {}),\n };\n }, [containerHeight, containerWidth, containerMaxHeight, containerMaxWidth]);\n\n const hostContext = useMemo<McpUiHostContext>(\n () => ({\n theme,\n displayMode,\n availableDisplayModes: ['inline', 'pip', 'fullscreen'],\n locale,\n timeZone,\n platform,\n deviceCapabilities: { hover, touch },\n safeAreaInsets,\n ...(containerDimensions ? { containerDimensions } : {}),\n }),\n [\n theme,\n displayMode,\n locale,\n timeZone,\n platform,\n hover,\n touch,\n safeAreaInsets,\n containerDimensions,\n ]\n );\n\n // ── Tool data state ──\n\n const [toolInput, setToolInput] = useState<Record<string, unknown>>(\n () => selectedSim?.toolInput ?? {}\n );\n const [toolResult, setToolResult] = useState<CallToolResult | undefined>(\n () => selectedSim?.toolResult as CallToolResult | undefined\n );\n\n // Editable JSON strings for sidebar\n const [toolInputJson, setToolInputJson] = useState(() => JSON.stringify(toolInput, null, 2));\n const [toolResultJson, setToolResultJson] = useState(() =>\n JSON.stringify(toolResult ?? null, null, 2)\n );\n\n // Model context\n const [modelContextJson, setModelContextJson] = useState<string>('null');\n const [modelContext, setModelContext] = useState<Record<string, unknown> | null>(null);\n\n // Track which field is being edited\n const [editingField, setEditingField] = useState<string | null>(null);\n\n // JSON validation errors\n const [toolInputError, setToolInputError] = useState('');\n const [toolResultError, setToolResultError] = useState('');\n const [modelContextError, setModelContextError] = useState('');\n\n // Reset tool data when simulation changes\n useEffect(() => {\n const newInput = selectedSim?.toolInput ?? {};\n const newResult = (selectedSim?.toolResult as CallToolResult | undefined) ?? undefined;\n setToolInput(newInput);\n setToolResult(newResult);\n if (editingField !== 'toolInput') {\n setToolInputJson(JSON.stringify(newInput, null, 2));\n setToolInputError('');\n }\n if (editingField !== 'toolResult') {\n setToolResultJson(JSON.stringify(newResult ?? null, null, 2));\n setToolResultError('');\n }\n if (editingField !== 'modelContext') {\n setModelContextJson('null');\n setModelContext(null);\n setModelContextError('');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedSimulationName, selectedSim]);\n\n // Disallow PiP on mobile widths\n useEffect(() => {\n if (isMobileWidth(screenWidth) && displayMode === 'pip') {\n _setDisplayMode('fullscreen');\n }\n }, [screenWidth, displayMode]);\n\n // ── Host callbacks ──\n\n const handleDisplayModeChange = (mode: McpUiDisplayMode) => {\n setDisplayMode(mode);\n };\n\n const handleUpdateModelContext = (content: unknown[], structuredContent?: unknown) => {\n setModelContextJson(JSON.stringify(structuredContent ?? content, null, 2));\n };\n\n // ── JSON helpers ──\n\n const validateJSON = (\n json: string,\n setJson: (value: string) => void,\n setError: (error: string) => void\n ) => {\n setJson(json);\n try {\n if (json.trim() !== '') JSON.parse(json);\n setError('');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Invalid JSON');\n }\n };\n\n const commitJSON = (\n json: string,\n setError: (error: string) => void,\n updateFn: (value: Record<string, unknown> | null) => void\n ) => {\n try {\n const parsed = json.trim() === '' ? null : JSON.parse(json);\n setError('');\n updateFn(parsed);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Invalid JSON');\n } finally {\n setEditingField(null);\n }\n };\n\n // ── Content props ──\n\n const effectiveToolResult = useMemo((): CallToolResult | undefined => {\n if (!toolResult && !modelContext) return undefined;\n if (!modelContext) return toolResult;\n\n const baseResult = toolResult ?? { content: [] };\n const baseStructured = (baseResult.structuredContent as Record<string, unknown>) ?? {};\n return {\n ...baseResult,\n structuredContent: { ...baseStructured, ...modelContext },\n };\n }, [toolResult, modelContext]);\n\n const resourceUrl = selectedSim?.resourceUrl;\n const resourceScript = selectedSim?.resourceScript;\n const csp = selectedSim?.resource ? extractResourceCSP(selectedSim.resource) : undefined;\n const resourceMeta = (selectedSim?.resource?._meta as Record<string, unknown> | undefined)?.ui as\n | { permissions?: McpUiResourcePermissions; prefersBorder?: boolean; domain?: string }\n | undefined;\n const permissions = resourceMeta?.permissions;\n const prefersBorder = resourceMeta?.prefersBorder ?? false;\n const domain = resourceMeta?.domain;\n const hasIframeContent = !!(resourceUrl || resourceScript);\n const isTransitioning = hasIframeContent && displayMode !== readyDisplayMode;\n\n return {\n simulationNames,\n selectedSimulationName,\n setSelectedSimulationName,\n selectedSim,\n\n activeHost,\n setActiveHost,\n\n screenWidth,\n setScreenWidth,\n\n theme,\n setTheme,\n displayMode,\n setDisplayMode,\n locale,\n setLocale,\n containerHeight,\n setContainerHeight,\n containerWidth,\n setContainerWidth,\n containerMaxHeight,\n setContainerMaxHeight,\n containerMaxWidth,\n setContainerMaxWidth,\n platform,\n setPlatform,\n hover,\n setHover,\n touch,\n setTouch,\n safeAreaInsets,\n setSafeAreaInsets,\n timeZone,\n setTimeZone,\n\n hostContext,\n\n readyDisplayMode,\n handleDisplayModeReady,\n isTransitioning,\n\n toolInput,\n setToolInput,\n toolResult,\n setToolResult,\n effectiveToolResult,\n\n modelContext,\n setModelContext,\n\n toolInputJson,\n setToolInputJson,\n toolInputError,\n setToolInputError,\n toolResultJson,\n setToolResultJson,\n toolResultError,\n setToolResultError,\n modelContextJson,\n setModelContextJson,\n modelContextError,\n setModelContextError,\n editingField,\n setEditingField,\n\n validateJSON,\n commitJSON,\n\n handleDisplayModeChange,\n handleUpdateModelContext,\n\n resourceUrl,\n resourceScript,\n csp,\n permissions,\n prefersBorder,\n domain,\n hasIframeContent,\n\n urlProdTools: urlParams.prodTools,\n urlProdResources: urlParams.prodResources,\n };\n}\n","import * as React from 'react';\n\ntype Theme = 'light' | 'dark';\n\ntype ThemeProviderProps = {\n children: React.ReactNode;\n defaultTheme?: Theme;\n theme?: Theme;\n /** Custom theme applier. If not provided, falls back to setting data-theme attribute. */\n applyTheme?: (theme: Theme) => void;\n};\n\ntype ThemeProviderState = {\n theme: Theme;\n};\n\nconst ThemeProviderContext = React.createContext<ThemeProviderState | undefined>(undefined);\n\n/** Default theme applier: sets data-theme attribute on document.documentElement */\nfunction defaultApplyTheme(theme: Theme): void {\n if (typeof document !== 'undefined') {\n document.documentElement.setAttribute('data-theme', theme);\n }\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'light',\n theme: controlledTheme,\n applyTheme,\n ...props\n}: ThemeProviderProps) {\n const [internalTheme] = React.useState<Theme>(defaultTheme);\n\n const theme = controlledTheme ?? internalTheme;\n const applier = applyTheme ?? defaultApplyTheme;\n\n // Apply theme synchronously before paint to avoid FOUC\n React.useLayoutEffect(() => {\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n try {\n applier(theme);\n } catch (error) {\n console.warn('Failed to apply document theme:', error);\n }\n }\n }, [theme, applier]);\n\n const value = {\n theme,\n };\n\n return (\n <ThemeProviderContext.Provider {...props} value={value}>\n {children}\n </ThemeProviderContext.Provider>\n );\n}\n\nexport const useThemeContext = () => {\n const context = React.useContext(ThemeProviderContext);\n\n if (context === undefined) throw new Error('useThemeContext must be used within a ThemeProvider');\n\n return context;\n};\n","import * as React from 'react';\n\ninterface SimpleSidebarProps {\n children: React.ReactNode;\n controls: React.ReactNode;\n /** Optional element rendered right-aligned in the Controls header row */\n headerRight?: React.ReactNode;\n}\n\nconst DEFAULT_SIDEBAR_WIDTH = 224; // w-56 = 14rem = 224px\n\nfunction ChevronRightIcon() {\n return (\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n fillRule=\"evenodd\"\n d=\"M8.293 4.293a1 1 0 0 1 1.414 0l7 7a1 1 0 0 1 0 1.414l-7 7a1 1 0 0 1-1.414-1.414L14.586 12 8.293 5.707a1 1 0 0 1 0-1.414Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nexport function SimpleSidebar({ children, controls, headerRight }: SimpleSidebarProps) {\n const [isDrawerOpen, setIsDrawerOpen] = React.useState(false);\n const [sidebarWidth, setSidebarWidth] = React.useState(DEFAULT_SIDEBAR_WIDTH);\n const [isResizing, setIsResizing] = React.useState(false);\n\n const handleMouseDown = React.useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n }, []);\n\n React.useEffect(() => {\n if (!isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const maxWidth = Math.floor(window.innerWidth / 3);\n const newWidth = Math.min(maxWidth, Math.max(DEFAULT_SIDEBAR_WIDTH, e.clientX));\n setSidebarWidth(newWidth);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isResizing]);\n\n return (\n <div className=\"sunpeak-simulator-root flex h-screen w-full overflow-hidden relative\">\n {/* Resize overlay to capture mouse events during drag */}\n {isResizing && <div className=\"fixed inset-0 z-50 cursor-col-resize\" />}\n\n {/* Mobile drawer overlay */}\n {isDrawerOpen && (\n <div\n className=\"md:hidden fixed inset-0 bg-black/50 z-40 pointer-events-auto\"\n onClick={(e) => {\n if (e.target === e.currentTarget) {\n setIsDrawerOpen(false);\n }\n }}\n />\n )}\n\n {/* Sidebar */}\n <aside\n className={`\n relative flex flex-col bg-sidebar\n md:z-auto\n max-md:fixed max-md:inset-y-0 max-md:left-0 max-md:z-[100]\n max-md:transition-transform max-md:duration-300 max-md:!w-2/3\n ${isDrawerOpen ? 'max-md:translate-x-0' : 'max-md:-translate-x-full'}\n `}\n style={{\n width: sidebarWidth,\n borderRight: '1px solid var(--color-border-primary)',\n }}\n >\n <div className=\"flex-1 overflow-y-auto min-h-0 px-3 pb-3 pt-0\">\n <div className=\"space-y-3\">\n <div>\n <div className=\"flex items-center justify-between sticky top-0 bg-sidebar z-10 py-2\">\n <h2\n className=\"text-xs font-semibold\"\n style={{ color: 'var(--color-text-primary)' }}\n >\n Controls\n </h2>\n <div className=\"flex items-center gap-2\">\n {headerRight}\n {/* Close button for mobile */}\n <button\n onClick={() => setIsDrawerOpen(false)}\n className=\"md:hidden p-1 transition-colors\"\n style={{ color: 'var(--color-text-secondary)' }}\n type=\"button\"\n aria-label=\"Close sidebar\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 4L4 12M4 4L12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n </div>\n {controls}\n </div>\n </div>\n </div>\n\n {/* Resize handle */}\n <div\n onMouseDown={handleMouseDown}\n className=\"hidden md:block absolute top-0 right-0 w-1 h-full cursor-col-resize hover:bg-black/10 dark:hover:bg-white/10 active:bg-black/20 dark:active:bg-white/20 transition-colors\"\n />\n </aside>\n\n {/* Main content */}\n <main className=\"flex-1 overflow-auto relative\">\n {/* Mobile drawer toggle button */}\n <button\n onClick={() => setIsDrawerOpen(true)}\n className=\"md:hidden fixed top-18 left-0 z-30 bg-sidebar rounded-r-md p-2 shadow-lg hover:bg-black/5 dark:hover:bg-white/10 transition-colors\"\n style={{\n borderRight: '1px solid var(--color-border-primary)',\n borderTop: '1px solid var(--color-border-primary)',\n borderBottom: '1px solid var(--color-border-primary)',\n }}\n type=\"button\"\n aria-label=\"Open sidebar\"\n >\n <ChevronRightIcon />\n </button>\n {children}\n </main>\n </div>\n );\n}\n\n/* ── Help icon with tooltip ── */\n\nconst DOCS_BASE_URL = 'https://sunpeak.ai/docs';\n\ninterface HelpIconProps {\n tooltip: string;\n docsPath: string;\n}\n\nfunction HelpIcon({ tooltip, docsPath }: HelpIconProps) {\n const [pos, setPos] = React.useState<{ top: number; left: number } | null>(null);\n const ref = React.useRef<HTMLAnchorElement>(null);\n\n const showTooltip = () => {\n const rect = ref.current?.getBoundingClientRect();\n if (rect) {\n setPos({ top: rect.top + rect.height / 2, left: rect.right + 6 });\n }\n };\n\n return (\n <a\n ref={ref}\n href={`${DOCS_BASE_URL}/${docsPath}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center justify-center no-underline flex-shrink-0 transition-colors\"\n style={{\n color: 'var(--color-text-tertiary, var(--color-text-secondary))',\n }}\n onClick={(e) => e.stopPropagation()}\n onMouseEnter={showTooltip}\n onMouseLeave={() => setPos(null)}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle cx=\"6\" cy=\"6\" r=\"5.25\" stroke=\"currentColor\" strokeWidth=\"1\" />\n <text\n x=\"6.25\"\n y=\"8.5\"\n textAnchor=\"middle\"\n fill=\"currentColor\"\n fontSize=\"7.5\"\n fontWeight=\"600\"\n fontFamily=\"system-ui, sans-serif\"\n >\n ?\n </text>\n </svg>\n {pos && (\n <span\n className=\"pointer-events-none fixed whitespace-nowrap rounded px-2 py-1 text-[11px] font-normal leading-tight z-[200]\"\n style={{\n top: pos.top,\n left: pos.left,\n transform: 'translateY(-50%)',\n backgroundColor: 'var(--color-text-primary)',\n color: 'var(--color-background-primary)',\n }}\n >\n {tooltip}\n </span>\n )}\n </a>\n );\n}\n\ninterface SidebarControlProps {\n label: string;\n children: React.ReactNode;\n /** Short tooltip shown on hover of the help icon */\n tooltip?: string;\n /** Docs path appended to https://sunpeak.ai/docs/ */\n docsPath?: string;\n}\n\nexport function SidebarControl({ label, children, tooltip, docsPath }: SidebarControlProps) {\n return (\n <div className=\"space-y-1\">\n <span\n className=\"text-[10px] font-medium leading-tight inline-flex items-center gap-1\"\n style={{ color: 'var(--color-text-secondary)' }}\n >\n {label}\n {tooltip && docsPath && <HelpIcon tooltip={tooltip} docsPath={docsPath} />}\n </span>\n {children}\n </div>\n );\n}\n\ninterface SidebarCollapsibleControlProps {\n label: string;\n children: React.ReactNode;\n defaultCollapsed?: boolean;\n /** Short tooltip shown on hover of the help icon */\n tooltip?: string;\n /** Docs path appended to https://sunpeak.ai/docs/ */\n docsPath?: string;\n}\n\nexport function SidebarCollapsibleControl({\n label,\n children,\n defaultCollapsed = true,\n tooltip,\n docsPath,\n}: SidebarCollapsibleControlProps) {\n const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed);\n\n return (\n <div className=\"space-y-1\">\n <button\n onClick={() => setIsCollapsed(!isCollapsed)}\n className=\"w-full flex items-center justify-between text-[10px] font-medium leading-tight transition-colors py-1 cursor-pointer\"\n style={{ color: 'var(--color-text-secondary)' }}\n type=\"button\"\n >\n <span className=\"inline-flex items-center gap-1\">\n {label}\n {tooltip && docsPath && <HelpIcon tooltip={tooltip} docsPath={docsPath} />}\n </span>\n <span className=\"text-[8px]\">{isCollapsed ? '▶' : '▼'}</span>\n </button>\n {!isCollapsed && children}\n </div>\n );\n}\n\n/* ── Shared form element styles ── */\n\nconst formElementStyle: React.CSSProperties = {\n color: 'var(--color-text-primary)',\n backgroundColor: 'var(--color-background-primary)',\n cursor: 'pointer',\n};\n\ninterface SidebarSelectProps {\n value: string;\n onChange: (value: string) => void;\n options: Array<{ value: string; label: string }>;\n placeholder?: string;\n}\n\nexport function SidebarSelect({ value, onChange, options, placeholder }: SidebarSelectProps) {\n return (\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full h-7 text-xs rounded-full px-2 outline-none appearance-none bg-no-repeat bg-[length:12px] bg-[right_6px_center]\"\n style={{\n ...formElementStyle,\n backgroundImage: `url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236b7280'%3e%3cpath d='M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z'/%3e%3c/svg%3e\")`,\n paddingRight: '1.5rem',\n }}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n\ninterface SidebarInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n type?: 'text' | 'number';\n disabled?: boolean;\n}\n\nexport function SidebarInput({\n value,\n onChange,\n placeholder,\n type = 'text',\n disabled = false,\n}: SidebarInputProps) {\n return (\n <input\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full h-7 text-xs rounded-md px-2 outline-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{ ...formElementStyle, cursor: disabled ? undefined : 'text' }}\n />\n );\n}\n\ninterface SidebarCheckboxProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label: string;\n /** Short tooltip shown on hover of the help icon */\n tooltip?: string;\n /** Docs path appended to https://sunpeak.ai/docs/ */\n docsPath?: string;\n}\n\nexport function SidebarCheckbox({\n checked,\n onChange,\n label,\n tooltip,\n docsPath,\n}: SidebarCheckboxProps) {\n const id = React.useId();\n return (\n <div className=\"flex items-center gap-1.5\">\n <input\n id={id}\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"outline-none cursor-pointer\"\n />\n <label\n htmlFor={id}\n className=\"text-[11px] select-none cursor-pointer leading-tight inline-flex items-center gap-1\"\n style={{ color: 'var(--color-text-primary)' }}\n >\n {label}\n {tooltip && docsPath && <HelpIcon tooltip={tooltip} docsPath={docsPath} />}\n </label>\n </div>\n );\n}\n\ninterface SidebarTextareaProps {\n value: string;\n onChange: (value: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n placeholder?: string;\n maxRows?: number;\n error?: string;\n}\n\nexport function SidebarTextarea({\n value,\n onChange,\n onFocus,\n onBlur,\n placeholder,\n maxRows = 8,\n error,\n}: SidebarTextareaProps) {\n const contentRows = value?.split('\\n').length ?? 1;\n const rows = Math.min(contentRows, maxRows);\n\n return (\n <div className=\"space-y-0.5\">\n <textarea\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={placeholder}\n rows={rows}\n className=\"w-full text-[10px] font-mono rounded-md px-2 py-1.5 outline-none resize-y\"\n style={{\n ...formElementStyle,\n cursor: 'text',\n whiteSpace: 'pre',\n overflowX: 'auto',\n overflowWrap: 'normal',\n ...(error ? { boxShadow: 'inset 0 0 0 1px var(--color-text-danger, #dc2626)' } : {}),\n }}\n aria-invalid={!!error}\n />\n {error && (\n <div className=\"text-[9px]\" style={{ color: 'var(--color-text-danger, #dc2626)' }}>\n {error}\n </div>\n )}\n </div>\n );\n}\n\ninterface SidebarToggleProps {\n value: string;\n onChange: (value: string) => void;\n options: Array<{ value: string; label: string }>;\n}\n\nexport function SidebarToggle({ value, onChange, options }: SidebarToggleProps) {\n return (\n <div\n className=\"inline-flex w-full rounded-full p-[3px] gap-0.5\"\n style={{ backgroundColor: 'var(--color-background-tertiary)' }}\n role=\"group\"\n aria-label=\"Toggle options\"\n >\n {options.map((option) => {\n const isSelected = value === option.value;\n return (\n <button\n key={option.value}\n onClick={() => onChange(option.value)}\n aria-pressed={isSelected}\n className=\"flex-1 text-[10px] font-medium h-[22px] px-2 rounded-full outline-none transition-all duration-150 cursor-pointer\"\n style={{\n backgroundColor: isSelected ? 'var(--color-background-primary)' : 'transparent',\n color: isSelected ? 'var(--color-text-primary)' : 'var(--color-text-secondary)',\n boxShadow: isSelected ? '0 1px 2px 0 rgba(0,0,0,0.06)' : 'none',\n }}\n type=\"button\"\n >\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Core simulation types for development and testing.\n * These types define how simulations are configured and used in both\n * the dev simulator and MCP server contexts.\n */\n\nimport type { Tool, Resource, CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport type { McpUiHostContext } from '@modelcontextprotocol/ext-apps';\n\n/**\n * Mock response for a server tool call within a simulation.\n *\n * Simple form: a single `CallToolResult` always returned.\n * Conditional form: an array of `{ when, result }` entries — the first\n * entry whose `when` keys shallow-match the call arguments wins.\n */\nexport type ServerToolMock =\n | CallToolResult\n | Array<{ when: Record<string, unknown>; result: CallToolResult }>;\n\n/**\n * A simulation packages a component with its example data and metadata.\n * Each simulation represents a complete tool experience in the simulator.\n *\n * Resource rendering options (mutually exclusive):\n * - `resourceUrl`: URL to an HTML page (dev mode with Vite HMR)\n * - `resourceScript`: URL to a built resource file (production builds)\n */\nexport interface Simulation {\n // Unique identifier derived from the simulation filename (e.g., 'show-albums')\n name: string;\n\n // URL to an HTML page to load in an iframe (dev mode).\n // The page mounts the resource component and uses SDK's useApp().\n resourceUrl?: string;\n\n // URL to a built resource for iframe rendering (production builds).\n resourceScript?: string;\n\n userMessage?: string; // Decoration for the simulator, no functional purpose.\n\n // Official Tool type from the MCP SDK, used in ListTools response.\n tool: Tool;\n\n // Official Resource type from the MCP SDK, used in ListResources response.\n // Undefined for tools without a UI.\n resource?: Resource;\n\n // Tool input arguments (the arguments object sent to CallTool).\n toolInput?: Record<string, unknown>;\n\n // Tool result data (the response from CallTool).\n toolResult?: {\n content?: Array<{ type: string; text: string }>;\n structuredContent?: unknown;\n isError?: boolean;\n };\n\n // Initial host context overrides for the simulation.\n hostContext?: Partial<McpUiHostContext>;\n\n /**\n * Mock responses for `callServerTool` calls made by the resource.\n * Keys are tool names; values are either a single result or an array\n * of conditional `{ when, result }` entries for argument-based matching.\n */\n serverTools?: Record<string, ServerToolMock>;\n}\n\n/**\n * Resolve a `ServerToolMock` to a concrete `CallToolResult` given the call arguments.\n *\n * - Simple form (single result): returns it directly.\n * - Conditional form (array of `{ when, result }`): returns the first entry\n * whose `when` keys all shallow-equal the corresponding values in `args`.\n * Falls back to `undefined` if no condition matches.\n */\nexport function resolveServerToolResult(\n mock: ServerToolMock,\n args: Record<string, unknown> | undefined\n): CallToolResult | undefined {\n if (!Array.isArray(mock)) return mock;\n\n for (const entry of mock) {\n const matches = Object.entries(entry.when).every(\n ([key, value]) => args != null && args[key] === value\n );\n if (matches) return entry.result;\n }\n return undefined;\n}\n","import * as React from 'react';\nimport type {\n McpUiDisplayMode,\n McpUiTheme,\n McpUiHostContext,\n} from '@modelcontextprotocol/ext-apps';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { useSimulatorState } from './use-simulator-state';\nimport { IframeResource } from './iframe-resource';\nimport { ThemeProvider } from './theme-provider';\nimport {\n SimpleSidebar,\n SidebarControl,\n SidebarCollapsibleControl,\n SidebarSelect,\n SidebarInput,\n SidebarCheckbox,\n SidebarTextarea,\n SidebarToggle,\n} from './simple-sidebar';\nimport { getHostShell, getRegisteredHosts, type HostId } from './hosts';\nimport { resolveServerToolResult } from '../types/simulation';\nimport type { Simulation } from '../types/simulation';\nimport type { ScreenWidth } from './simulator-types';\n\n// Register built-in host shells. These imports live here (in the component file)\n// rather than in the barrel index.ts because Rollup code-splitting can separate\n// side-effect imports from barrel exports, letting consumer bundlers tree-shake\n// them. Importing here makes registration part of the Simulator component's\n// dependency graph, which can't be tree-shaken since the component is used.\nimport '../chatgpt/chatgpt-host';\nimport '../claude/claude-host';\n\nexport interface SimulatorProps {\n children?: React.ReactNode;\n simulations?: Record<string, Simulation>;\n appName?: string;\n appIcon?: string;\n /** Which host shell to use initially. Defaults to 'chatgpt'. */\n defaultHost?: HostId;\n /** Override callServerTool resolution. When provided, bypasses simulation serverTools mocks (e.g., for --prod-tools mode). */\n onCallTool?: (params: {\n name: string;\n arguments?: Record<string, unknown>;\n }) => Promise<CallToolResult> | CallToolResult;\n /** Initial prod-tools mode state. Defaults to false. */\n defaultProdTools?: boolean;\n /** Initial prod-resources mode state. When true, resources load from dist/ instead of HMR. Defaults to false. */\n defaultProdResources?: boolean;\n /** Hide Prod Tools and Prod Resources toggles in the sidebar (e.g., for marketing/embedded use). */\n hideSimulatorModes?: boolean;\n}\n\ntype Platform = 'mobile' | 'desktop' | 'web';\n\nexport function Simulator({\n children,\n simulations = {},\n appName = 'Sunpeak',\n appIcon,\n defaultHost = 'chatgpt',\n onCallTool,\n defaultProdTools = false,\n defaultProdResources = false,\n hideSimulatorModes = false,\n}: SimulatorProps) {\n const state = useSimulatorState({ simulations, defaultHost });\n const [prodTools, setProdTools] = React.useState(state.urlProdTools ?? defaultProdTools);\n const [prodResources, setProdResources] = React.useState(\n state.urlProdResources ?? defaultProdResources\n );\n const [isRunning, setIsRunning] = React.useState(false);\n const [hasRun, setHasRun] = React.useState(false);\n const [showCheck, setShowCheck] = React.useState(false);\n const checkTimerRef = React.useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Reset hasRun when tool selection changes in prod-tools mode.\n // When switching back to simulation mode, restore the simulation's tool result.\n React.useEffect(() => {\n if (prodTools) {\n setHasRun(false);\n } else {\n const simResult = (state.selectedSim?.toolResult as CallToolResult | undefined) ?? undefined;\n state.setToolResult(simResult);\n }\n }, [prodTools, state.selectedSimulationName]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Cleanup check timer\n React.useEffect(() => () => clearTimeout(checkTimerRef.current), []);\n\n // In prod-tools mode, deduplicate simulations by tool name for the Tool dropdown\n const toolOptions = React.useMemo(() => {\n if (!prodTools) return [];\n const seen = new Map<string, string>(); // toolName → first simulationName\n for (const simName of state.simulationNames) {\n const sim = simulations[simName];\n const toolName = sim.tool.name;\n if (!seen.has(toolName)) {\n seen.set(toolName, simName);\n }\n }\n return Array.from(seen.entries()).map(([toolName, simName]) => ({\n value: simName,\n label: (simulations[simName].tool.title as string | undefined) || toolName,\n }));\n }, [prodTools, state.simulationNames, simulations]);\n\n // Run button handler: call the real tool handler with current toolInput\n const handleRun = React.useCallback(async () => {\n if (!onCallTool || !state.selectedSim) return;\n const toolName = state.selectedSim.tool.name;\n setIsRunning(true);\n try {\n const result = await onCallTool({ name: toolName, arguments: state.toolInput });\n state.setToolResult(result);\n state.setToolResultJson(JSON.stringify(result, null, 2));\n state.setToolResultError('');\n setHasRun(true);\n setShowCheck(true);\n clearTimeout(checkTimerRef.current);\n checkTimerRef.current = setTimeout(() => setShowCheck(false), 2000);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n state.setToolResult({\n content: [{ type: 'text', text: `Error: ${message}` }],\n isError: true,\n });\n state.setToolResultJson(\n JSON.stringify(\n { content: [{ type: 'text', text: `Error: ${message}` }], isError: true },\n null,\n 2\n )\n );\n } finally {\n setIsRunning(false);\n }\n }, [onCallTool, state]);\n\n // Resolve the active host shell\n const activeShell = getHostShell(state.activeHost);\n const registeredHosts = getRegisteredHosts();\n const ShellConversation = activeShell?.Conversation;\n\n // Merge host style variables into the hostContext (standard MCP App theming).\n // Style variables use CSS light-dark() so they don't depend on theme —\n // the app handles theme via color-scheme set by applyDocumentTheme().\n const hostContext = React.useMemo(() => {\n const styleVars = activeShell?.styleVariables;\n if (!styleVars) return state.hostContext;\n return {\n ...state.hostContext,\n styles: { variables: styleVars },\n } as McpUiHostContext;\n }, [state.hostContext, activeShell]);\n\n // Apply host style variables to the document root so the simulator chrome\n // (sidebar, conversation shells) can use them via var(--color-*).\n // These are the same MCP standard variables sent to the iframe.\n React.useEffect(() => {\n const vars = activeShell?.styleVariables;\n if (!vars) return;\n const root = document.documentElement;\n for (const [key, value] of Object.entries(vars)) {\n if (value) root.style.setProperty(key, value);\n }\n }, [activeShell]);\n\n // Apply host page styles (simulator chrome backgrounds, etc.) to the document root.\n // Cleans up old properties when switching hosts so stale values don't persist.\n const prevPageStyleKeysRef = React.useRef<string[]>([]);\n React.useEffect(() => {\n const root = document.documentElement;\n for (const key of prevPageStyleKeysRef.current) {\n root.style.removeProperty(key);\n }\n const pageStyles = activeShell?.pageStyles;\n if (pageStyles) {\n const keys: string[] = [];\n for (const [key, value] of Object.entries(pageStyles)) {\n root.style.setProperty(key, value);\n keys.push(key);\n }\n prevPageStyleKeysRef.current = keys;\n } else {\n prevPageStyleKeysRef.current = [];\n }\n }, [activeShell]);\n\n // Handle callServerTool from the iframe. When onCallTool is provided (prod-tools mode),\n // forward to real tool handlers. Otherwise resolve from simulation serverTools mocks.\n const handleCallTool = React.useCallback(\n (params: {\n name: string;\n arguments?: Record<string, unknown>;\n }): CallToolResult | Promise<CallToolResult> => {\n if (onCallTool) {\n return onCallTool(params);\n }\n const mock = state.selectedSim?.serverTools?.[params.name];\n if (mock) {\n const result = resolveServerToolResult(mock, params.arguments);\n if (result) return result;\n }\n return {\n content: [\n {\n type: 'text',\n text: `[Simulator] Tool \"${params.name}\" called — no serverTools mock found in simulation \"${state.selectedSimulationName}\".`,\n },\n ],\n };\n },\n [onCallTool, state.selectedSim, state.selectedSimulationName]\n );\n\n // In prod-tools mode, derive user message from the selected tool\n const prodToolsUserMessage =\n prodTools && state.selectedSim\n ? `Call my ${(state.selectedSim.tool.title as string | undefined) || state.selectedSim.tool.name} tool`\n : undefined;\n\n // When prod-resources mode is on, override the resource URL to point at dist/ HTML.\n // The resource name comes from the simulation's resource metadata.\n // We verify the dist file exists via a HEAD request to avoid loading the\n // dev server's SPA fallback (which would render a nested simulator).\n const prodResourcesPath = React.useMemo(() => {\n if (!prodResources || !state.selectedSim?.resource) return undefined;\n const name = state.selectedSim.resource.name as string;\n return `/dist/${name}/${name}.html`;\n }, [prodResources, state.selectedSim?.resource]);\n\n // Continuously poll the dist file while prod-resources mode is active.\n // Detects file disappearing (rebuild started → \"Building…\") and\n // reappearing (rebuild finished → load iframe). A generation counter\n // increments on each ready transition to force an iframe remount.\n const [prodResourcesReady, setProdResourcesReady] = React.useState(false);\n const [prodResourcesGeneration, setProdResourcesGeneration] = React.useState(0);\n const prodResourcesWasReady = React.useRef(false);\n React.useEffect(() => {\n if (!prodResourcesPath) {\n setProdResourcesReady(false);\n prodResourcesWasReady.current = false;\n return;\n }\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout>;\n\n const check = async () => {\n let ok = false;\n try {\n const res = await fetch(prodResourcesPath, { method: 'HEAD' });\n ok = res.ok;\n } catch {\n // network error → not ready\n }\n if (cancelled) return;\n if (ok) {\n if (!prodResourcesWasReady.current) {\n // Transition: not ready → ready. Bump generation to remount iframe.\n setProdResourcesGeneration((g) => g + 1);\n }\n prodResourcesWasReady.current = true;\n setProdResourcesReady(true);\n } else {\n prodResourcesWasReady.current = false;\n setProdResourcesReady(false);\n }\n timer = setTimeout(check, 1000);\n };\n\n check();\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [prodResourcesPath]);\n\n const effectiveResourceUrl =\n (prodResourcesPath && prodResourcesReady ? prodResourcesPath : undefined) ?? state.resourceUrl;\n const prodResourcesLoading = !!prodResourcesPath && !prodResourcesReady;\n\n // Build content.\n // The wrapper div stays mounted across key changes, providing a themed\n // background while the iframe (opacity: 0) loads new content.\n // In prod-tools mode, show empty state until the tool has been run.\n const showEmptyState = prodTools && !hasRun;\n let content: React.ReactNode;\n const iframeBg = 'var(--sim-bg-conversation, var(--color-background-primary, transparent))';\n if (showEmptyState) {\n content = (\n <div\n className=\"h-full w-full flex items-center justify-center\"\n style={{ background: iframeBg }}\n >\n <span className=\"text-sm\" style={{ color: 'var(--color-text-secondary)' }}>\n Press <strong>Run</strong> to call the tool\n </span>\n </div>\n );\n } else if (prodResourcesLoading) {\n content = (\n <div\n className=\"h-full w-full flex items-center justify-center\"\n style={{ background: iframeBg }}\n >\n <span className=\"text-sm\" style={{ color: 'var(--color-text-secondary)' }}>\n Building&hellip;\n </span>\n </div>\n );\n } else if (effectiveResourceUrl) {\n content = (\n <div className=\"h-full w-full\" style={{ background: iframeBg }}>\n <IframeResource\n key={`${state.activeHost}-${state.selectedSimulationName}-${prodResources}-${prodResourcesGeneration}`}\n src={effectiveResourceUrl}\n hostContext={hostContext}\n toolInput={state.toolInput}\n toolResult={state.effectiveToolResult}\n hostOptions={{\n hostInfo: activeShell?.hostInfo,\n hostCapabilities: activeShell?.hostCapabilities,\n onDisplayModeChange: state.handleDisplayModeChange,\n onUpdateModelContext: state.handleUpdateModelContext,\n onCallTool: handleCallTool,\n }}\n permissions={state.permissions}\n prefersBorder={state.prefersBorder}\n onDisplayModeReady={state.handleDisplayModeReady}\n debugInjectState={state.modelContext}\n injectOpenAIRuntime={state.activeHost === 'chatgpt'}\n className=\"h-full w-full\"\n />\n </div>\n );\n } else if (!prodResources && state.resourceScript) {\n content = (\n <div className=\"h-full w-full\" style={{ background: iframeBg }}>\n <IframeResource\n key={`${state.activeHost}-${state.selectedSimulationName}`}\n scriptSrc={state.resourceScript}\n hostContext={hostContext}\n toolInput={state.toolInput}\n toolResult={state.effectiveToolResult}\n csp={state.csp}\n hostOptions={{\n hostInfo: activeShell?.hostInfo,\n hostCapabilities: activeShell?.hostCapabilities,\n onDisplayModeChange: state.handleDisplayModeChange,\n onUpdateModelContext: state.handleUpdateModelContext,\n onCallTool: handleCallTool,\n }}\n permissions={state.permissions}\n prefersBorder={state.prefersBorder}\n onDisplayModeReady={state.handleDisplayModeReady}\n debugInjectState={state.modelContext}\n injectOpenAIRuntime={state.activeHost === 'chatgpt'}\n className=\"h-full w-full\"\n />\n </div>\n );\n } else {\n content = children;\n }\n\n // Use the active host's theme applier\n const applyTheme = activeShell?.applyTheme;\n\n return (\n <ThemeProvider theme={state.theme} applyTheme={applyTheme}>\n <SimpleSidebar\n controls={\n <div className=\"space-y-1\">\n {/* ── Dev mode toggles ── */}\n {!hideSimulatorModes && onCallTool && (\n <SidebarCheckbox\n checked={prodTools}\n onChange={setProdTools}\n label=\"Prod Tools\"\n tooltip=\"Use real tool handlers instead of simulations\"\n docsPath=\"api-reference/cli/dev#prod-tools-and-prod-resources-flags\"\n />\n )}\n {!hideSimulatorModes && (\n <SidebarCheckbox\n checked={prodResources}\n onChange={setProdResources}\n label=\"Prod Resources\"\n tooltip=\"Load resources from dist/ builds instead of HMR\"\n docsPath=\"api-reference/cli/dev#prod-tools-and-prod-resources-flags\"\n />\n )}\n\n {/* ── Host + Width row ── */}\n <div className=\"grid grid-cols-2 gap-2\">\n {registeredHosts.length > 1 && (\n <SidebarControl\n label=\"Host\"\n tooltip=\"Host runtime to simulate\"\n docsPath=\"api-reference/functions/host-detection\"\n >\n <SidebarSelect\n value={state.activeHost}\n onChange={(value) => state.setActiveHost(value as HostId)}\n options={registeredHosts.map((h) => ({\n value: h.id,\n label: h.label,\n }))}\n />\n </SidebarControl>\n )}\n <SidebarControl\n label=\"Width\"\n tooltip=\"Chat width\"\n docsPath=\"api-reference/simulations/simulator\"\n >\n <SidebarSelect\n value={state.screenWidth}\n onChange={(value) => state.setScreenWidth(value as ScreenWidth)}\n options={[\n { value: 'mobile-s', label: 'Mobile S (375px)' },\n { value: 'mobile-l', label: 'Mobile L (425px)' },\n { value: 'tablet', label: 'Tablet (768px)' },\n { value: 'full', label: '100% (Full)' },\n ]}\n />\n </SidebarControl>\n </div>\n\n {/* ── Tool / Simulation selector ── */}\n {prodTools && toolOptions.length > 1 && (\n <SidebarControl\n label=\"Tool\"\n tooltip=\"Tool to call with prod handler\"\n docsPath=\"api-reference/cli/dev\"\n >\n <SidebarSelect\n value={state.selectedSimulationName}\n onChange={(value) => state.setSelectedSimulationName(value)}\n options={toolOptions}\n />\n </SidebarControl>\n )}\n {!prodTools && state.simulationNames.length > 1 && (\n <SidebarControl\n label=\"Simulation\"\n tooltip=\"Test fixture to render\"\n docsPath=\"api-reference/simulations/simulation\"\n >\n <SidebarSelect\n value={state.selectedSimulationName}\n onChange={(value) => state.setSelectedSimulationName(value)}\n options={state.simulationNames.map((name) => {\n const sim = simulations[name];\n const resourceTitle = sim.resource\n ? (sim.resource.title as string | undefined) || sim.resource.name\n : undefined;\n const toolTitle = (sim.tool.title as string | undefined) || sim.tool.name;\n return {\n value: name,\n label: resourceTitle ? `${resourceTitle}: ${toolTitle}` : toolTitle,\n };\n })}\n />\n </SidebarControl>\n )}\n\n <SidebarCollapsibleControl\n label=\"Host Context\"\n defaultCollapsed={false}\n tooltip=\"Host-provided environment\"\n docsPath=\"api-reference/hooks/use-host-context\"\n >\n <div className=\"space-y-1\">\n <div className=\"grid grid-cols-[2fr_1fr] gap-2\">\n <SidebarControl\n label=\"Theme\"\n tooltip=\"Host color theme\"\n docsPath=\"api-reference/hooks/use-theme\"\n >\n <SidebarToggle\n value={state.theme}\n onChange={(value) => state.setTheme(value as McpUiTheme)}\n options={[\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n ]}\n />\n </SidebarControl>\n\n <SidebarControl\n label=\"Locale\"\n tooltip=\"BCP 47 language tag\"\n docsPath=\"api-reference/hooks/use-locale\"\n >\n <SidebarInput\n value={state.locale}\n onChange={(value) => state.setLocale(value)}\n placeholder=\"en-US\"\n />\n </SidebarControl>\n </div>\n\n <SidebarControl\n label=\"Display Mode\"\n tooltip=\"Host resource rendering paradigm\"\n docsPath=\"api-reference/hooks/use-display-mode\"\n >\n <SidebarToggle\n value={state.displayMode}\n onChange={(value) => state.setDisplayMode(value as McpUiDisplayMode)}\n options={[\n { value: 'inline', label: 'Inline' },\n { value: 'pip', label: 'PiP' },\n { value: 'fullscreen', label: 'Full' },\n ]}\n />\n </SidebarControl>\n\n <div className=\"grid grid-cols-7 gap-2\">\n <div className=\"col-span-3\">\n <SidebarControl\n label=\"Platform\"\n tooltip=\"End user device platform\"\n docsPath=\"api-reference/hooks/use-platform\"\n >\n <SidebarSelect\n value={state.platform}\n onChange={(value) => {\n const p = value as Platform;\n state.setPlatform(p);\n if (p === 'mobile') {\n state.setHover(false);\n state.setTouch(true);\n } else if (p === 'desktop') {\n state.setHover(true);\n state.setTouch(false);\n } else {\n state.setHover(true);\n state.setTouch(false);\n }\n }}\n options={[\n { value: 'mobile', label: 'Mobile' },\n { value: 'desktop', label: 'Desktop' },\n { value: 'web', label: 'Web' },\n ]}\n />\n </SidebarControl>\n </div>\n\n <div className=\"col-span-4\">\n <SidebarControl\n label=\"Capabilities\"\n tooltip=\"End user device capabilities\"\n docsPath=\"api-reference/hooks/use-device-capabilities\"\n >\n <div className=\"flex gap-2\">\n <SidebarCheckbox\n checked={state.hover}\n onChange={state.setHover}\n label=\"Hover\"\n />\n <SidebarCheckbox\n checked={state.touch}\n onChange={state.setTouch}\n label=\"Touch\"\n />\n </div>\n </SidebarControl>\n </div>\n </div>\n\n <SidebarControl\n label=\"Time Zone\"\n tooltip=\"End user IANA time zone\"\n docsPath=\"api-reference/hooks/use-time-zone\"\n >\n <SidebarInput\n value={state.timeZone}\n onChange={(value) => state.setTimeZone(value)}\n placeholder=\"e.g. America/New_York\"\n />\n </SidebarControl>\n\n <SidebarControl\n label=\"Container Dimensions\"\n tooltip=\"Host-enforced size constraints (px)\"\n docsPath=\"api-reference/hooks/use-viewport\"\n >\n <div className=\"grid grid-cols-4 gap-1\">\n <SidebarControl label=\"Height\">\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={state.containerHeight != null ? String(state.containerHeight) : ''}\n onChange={(value) =>\n state.setContainerHeight(value ? Number(value) : undefined)\n }\n />\n </SidebarControl>\n <SidebarControl label=\"Width\">\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={state.containerWidth != null ? String(state.containerWidth) : ''}\n onChange={(value) =>\n state.setContainerWidth(value ? Number(value) : undefined)\n }\n />\n </SidebarControl>\n <SidebarControl label=\"Max H\">\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={\n state.containerMaxHeight != null ? String(state.containerMaxHeight) : ''\n }\n onChange={(value) =>\n state.setContainerMaxHeight(value ? Number(value) : undefined)\n }\n />\n </SidebarControl>\n <SidebarControl label=\"Max W\">\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={\n state.containerMaxWidth != null ? String(state.containerMaxWidth) : ''\n }\n onChange={(value) =>\n state.setContainerMaxWidth(value ? Number(value) : undefined)\n }\n />\n </SidebarControl>\n </div>\n </SidebarControl>\n\n <SidebarControl\n label=\"Safe Area Insets\"\n tooltip=\"Device safe area padding (px)\"\n docsPath=\"api-reference/hooks/use-safe-area\"\n >\n <div className=\"grid grid-cols-4 gap-1\">\n <div className=\"flex items-center gap-0.5\">\n <span\n className=\"text-[10px]\"\n style={{ color: 'var(--color-text-secondary)' }}\n >\n &uarr;\n </span>\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={state.safeAreaInsets.top ? String(state.safeAreaInsets.top) : ''}\n onChange={(value) =>\n state.setSafeAreaInsets((prev) => ({ ...prev, top: Number(value) || 0 }))\n }\n />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <span\n className=\"text-[10px]\"\n style={{ color: 'var(--color-text-secondary)' }}\n >\n &darr;\n </span>\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={\n state.safeAreaInsets.bottom ? String(state.safeAreaInsets.bottom) : ''\n }\n onChange={(value) =>\n state.setSafeAreaInsets((prev) => ({\n ...prev,\n bottom: Number(value) || 0,\n }))\n }\n />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <span\n className=\"text-[10px]\"\n style={{ color: 'var(--color-text-secondary)' }}\n >\n &larr;\n </span>\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={state.safeAreaInsets.left ? String(state.safeAreaInsets.left) : ''}\n onChange={(value) =>\n state.setSafeAreaInsets((prev) => ({ ...prev, left: Number(value) || 0 }))\n }\n />\n </div>\n <div className=\"flex items-center gap-0.5\">\n <span\n className=\"text-[10px]\"\n style={{ color: 'var(--color-text-secondary)' }}\n >\n &rarr;\n </span>\n <SidebarInput\n type=\"number\"\n placeholder=\"-\"\n value={state.safeAreaInsets.right ? String(state.safeAreaInsets.right) : ''}\n onChange={(value) =>\n state.setSafeAreaInsets((prev) => ({\n ...prev,\n right: Number(value) || 0,\n }))\n }\n />\n </div>\n </div>\n </SidebarControl>\n </div>\n </SidebarCollapsibleControl>\n\n <SidebarCollapsibleControl\n label=\"App Context\"\n defaultCollapsed\n tooltip=\"App-provided context shared with the model\"\n docsPath=\"api-reference/hooks/use-app-state\"\n >\n <SidebarTextarea\n value={state.modelContextJson}\n onChange={(json) =>\n state.validateJSON(json, state.setModelContextJson, state.setModelContextError)\n }\n onFocus={() => state.setEditingField('modelContext')}\n onBlur={() =>\n state.commitJSON(state.modelContextJson, state.setModelContextError, (parsed) => {\n state.setModelContext(parsed as Record<string, unknown> | null);\n })\n }\n error={state.modelContextError}\n maxRows={8}\n />\n </SidebarCollapsibleControl>\n\n <SidebarCollapsibleControl\n key={`tool-input-${prodTools}`}\n label=\"Tool Input (JSON)\"\n defaultCollapsed={!prodTools}\n tooltip=\"Arguments passed to the tool\"\n docsPath=\"api-reference/hooks/use-tool-data\"\n >\n <SidebarTextarea\n value={state.toolInputJson}\n onChange={(json) =>\n state.validateJSON(json, state.setToolInputJson, state.setToolInputError)\n }\n onFocus={() => state.setEditingField('toolInput')}\n onBlur={() =>\n state.commitJSON(state.toolInputJson, state.setToolInputError, (parsed) =>\n state.setToolInput((parsed as Record<string, unknown>) ?? {})\n )\n }\n error={state.toolInputError}\n maxRows={8}\n />\n </SidebarCollapsibleControl>\n\n {!prodTools && (\n <SidebarCollapsibleControl\n label=\"Tool Result (JSON)\"\n defaultCollapsed={false}\n tooltip=\"Structured content returned by the tool\"\n docsPath=\"api-reference/hooks/use-tool-data\"\n >\n <SidebarTextarea\n value={state.toolResultJson}\n onChange={(json) =>\n state.validateJSON(json, state.setToolResultJson, state.setToolResultError)\n }\n onFocus={() => state.setEditingField('toolResult')}\n onBlur={() =>\n state.commitJSON(state.toolResultJson, state.setToolResultError, (parsed) => {\n if (parsed === null) {\n state.setToolResult(undefined);\n } else {\n const result = parsed as Record<string, unknown>;\n if ('content' in result || 'structuredContent' in result) {\n state.setToolResult(\n result as import('@modelcontextprotocol/sdk/types.js').CallToolResult\n );\n } else {\n state.setToolResult({ content: [], structuredContent: result });\n }\n }\n })\n }\n error={state.toolResultError}\n maxRows={8}\n />\n </SidebarCollapsibleControl>\n )}\n </div>\n }\n >\n {ShellConversation ? (\n <ShellConversation\n screenWidth={state.screenWidth}\n displayMode={state.displayMode}\n platform={state.platform}\n onRequestDisplayMode={state.handleDisplayModeChange}\n appName={appName}\n appIcon={appIcon}\n userMessage={prodToolsUserMessage ?? state.selectedSim?.userMessage}\n isTransitioning={state.isTransitioning}\n headerAction={\n prodTools && onCallTool ? (\n <button\n type=\"button\"\n onClick={handleRun}\n disabled={isRunning}\n className=\"rounded-full px-3 py-1 text-sm font-medium transition-opacity disabled:opacity-40 flex items-center gap-1.5 cursor-pointer\"\n style={{\n backgroundColor: 'var(--color-text-primary)',\n color: 'var(--color-background-primary)',\n }}\n >\n {showCheck ? (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M2 6L5 9L10 3\" />\n </svg>\n ) : (\n <svg width=\"10\" height=\"12\" viewBox=\"0 0 10 12\" fill=\"currentColor\">\n <path d=\"M0 0L10 6L0 12V0Z\" />\n </svg>\n )}\n Run\n </button>\n ) : undefined\n }\n >\n {content}\n </ShellConversation>\n ) : (\n content\n )}\n </SimpleSidebar>\n </ThemeProvider>\n );\n}\n"],"names":["CloseIcon","jsx","jsxs","Q.union","Q.literal","Q.record","Q.string","Q.undefined","Q.object","Q.boolean","Q.array","Q.number","Q.unknown","WQ","BQ","u","EQ","zQ","_Q","h","FQ","lQ","hQ","uQ","gQ","fQ","bQ","pQ","kQ","qQ","iQ","dQ","xQ","cQ","nQ","yQ","mQ","AppBridge","PostMessageTransport","c","useRef","useMemo","useCallback","useEffect","useState","React","p"],"mappings":"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","x_google_ignoreList":[7]}