@frontmcp/ui 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (805) hide show
  1. package/README.md +140 -362
  2. package/bridge/adapters/base-adapter.d.ts +104 -0
  3. package/bridge/adapters/base-adapter.d.ts.map +1 -0
  4. package/bridge/adapters/claude.adapter.d.ts +67 -0
  5. package/bridge/adapters/claude.adapter.d.ts.map +1 -0
  6. package/bridge/adapters/ext-apps.adapter.d.ts +143 -0
  7. package/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
  8. package/bridge/adapters/gemini.adapter.d.ts +64 -0
  9. package/bridge/adapters/gemini.adapter.d.ts.map +1 -0
  10. package/bridge/adapters/generic.adapter.d.ts +56 -0
  11. package/bridge/adapters/generic.adapter.d.ts.map +1 -0
  12. package/bridge/adapters/index.d.ts +26 -0
  13. package/bridge/adapters/index.d.ts.map +1 -0
  14. package/bridge/adapters/openai.adapter.d.ts +65 -0
  15. package/bridge/adapters/openai.adapter.d.ts.map +1 -0
  16. package/bridge/core/adapter-registry.d.ts +122 -0
  17. package/bridge/core/adapter-registry.d.ts.map +1 -0
  18. package/bridge/core/bridge-factory.d.ts +199 -0
  19. package/bridge/core/bridge-factory.d.ts.map +1 -0
  20. package/bridge/core/index.d.ts +10 -0
  21. package/bridge/core/index.d.ts.map +1 -0
  22. package/bridge/index.d.ts +62 -0
  23. package/bridge/index.d.ts.map +1 -0
  24. package/bridge/index.js +2540 -0
  25. package/bridge/runtime/iife-generator.d.ts +62 -0
  26. package/bridge/runtime/iife-generator.d.ts.map +1 -0
  27. package/bridge/runtime/index.d.ts +10 -0
  28. package/bridge/runtime/index.d.ts.map +1 -0
  29. package/bridge/types.d.ts +386 -0
  30. package/bridge/types.d.ts.map +1 -0
  31. package/bundler/bundler.d.ts +208 -0
  32. package/bundler/bundler.d.ts.map +1 -0
  33. package/bundler/cache.d.ts +173 -0
  34. package/bundler/cache.d.ts.map +1 -0
  35. package/bundler/file-cache/component-builder.d.ts +167 -0
  36. package/bundler/file-cache/component-builder.d.ts.map +1 -0
  37. package/bundler/file-cache/hash-calculator.d.ts +155 -0
  38. package/bundler/file-cache/hash-calculator.d.ts.map +1 -0
  39. package/bundler/file-cache/index.d.ts +12 -0
  40. package/bundler/file-cache/index.d.ts.map +1 -0
  41. package/bundler/file-cache/storage/filesystem.d.ts +149 -0
  42. package/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
  43. package/bundler/file-cache/storage/index.d.ts +11 -0
  44. package/bundler/file-cache/storage/index.d.ts.map +1 -0
  45. package/bundler/file-cache/storage/interface.d.ts +152 -0
  46. package/bundler/file-cache/storage/interface.d.ts.map +1 -0
  47. package/bundler/file-cache/storage/redis.d.ts +139 -0
  48. package/bundler/file-cache/storage/redis.d.ts.map +1 -0
  49. package/bundler/index.d.ts +43 -0
  50. package/bundler/index.d.ts.map +1 -0
  51. package/bundler/index.js +3707 -0
  52. package/bundler/sandbox/enclave-adapter.d.ts +121 -0
  53. package/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
  54. package/bundler/sandbox/executor.d.ts +14 -0
  55. package/bundler/sandbox/executor.d.ts.map +1 -0
  56. package/bundler/sandbox/policy.d.ts +62 -0
  57. package/bundler/sandbox/policy.d.ts.map +1 -0
  58. package/bundler/types.d.ts +702 -0
  59. package/bundler/types.d.ts.map +1 -0
  60. package/components/alert.d.ts +66 -0
  61. package/components/alert.d.ts.map +1 -0
  62. package/components/alert.schema.d.ts +98 -0
  63. package/components/alert.schema.d.ts.map +1 -0
  64. package/components/avatar.d.ts +77 -0
  65. package/components/avatar.d.ts.map +1 -0
  66. package/components/avatar.schema.d.ts +170 -0
  67. package/components/avatar.schema.d.ts.map +1 -0
  68. package/components/badge.d.ts +64 -0
  69. package/components/badge.d.ts.map +1 -0
  70. package/components/badge.schema.d.ts +91 -0
  71. package/components/badge.schema.d.ts.map +1 -0
  72. package/components/button.d.ts +100 -0
  73. package/components/button.d.ts.map +1 -0
  74. package/components/button.schema.d.ts +120 -0
  75. package/components/button.schema.d.ts.map +1 -0
  76. package/components/card.d.ts +53 -0
  77. package/components/card.d.ts.map +1 -0
  78. package/components/card.schema.d.ts +93 -0
  79. package/components/card.schema.d.ts.map +1 -0
  80. package/components/form.d.ts +212 -0
  81. package/components/form.d.ts.map +1 -0
  82. package/components/form.schema.d.ts +365 -0
  83. package/components/form.schema.d.ts.map +1 -0
  84. package/components/index.d.ts +29 -0
  85. package/components/index.d.ts.map +1 -0
  86. package/components/index.js +2525 -0
  87. package/components/list.d.ts +121 -0
  88. package/components/list.d.ts.map +1 -0
  89. package/components/list.schema.d.ts +129 -0
  90. package/components/list.schema.d.ts.map +1 -0
  91. package/components/modal.d.ts +100 -0
  92. package/components/modal.d.ts.map +1 -0
  93. package/components/modal.schema.d.ts +151 -0
  94. package/components/modal.schema.d.ts.map +1 -0
  95. package/components/table.d.ts +91 -0
  96. package/components/table.d.ts.map +1 -0
  97. package/components/table.schema.d.ts +123 -0
  98. package/components/table.schema.d.ts.map +1 -0
  99. package/esm/bridge/adapters/base-adapter.d.ts +104 -0
  100. package/esm/bridge/adapters/base-adapter.d.ts.map +1 -0
  101. package/esm/bridge/adapters/claude.adapter.d.ts +67 -0
  102. package/esm/bridge/adapters/claude.adapter.d.ts.map +1 -0
  103. package/esm/bridge/adapters/ext-apps.adapter.d.ts +143 -0
  104. package/esm/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
  105. package/esm/bridge/adapters/gemini.adapter.d.ts +64 -0
  106. package/esm/bridge/adapters/gemini.adapter.d.ts.map +1 -0
  107. package/esm/bridge/adapters/generic.adapter.d.ts +56 -0
  108. package/esm/bridge/adapters/generic.adapter.d.ts.map +1 -0
  109. package/esm/bridge/adapters/index.d.ts +26 -0
  110. package/esm/bridge/adapters/index.d.ts.map +1 -0
  111. package/esm/bridge/adapters/openai.adapter.d.ts +65 -0
  112. package/esm/bridge/adapters/openai.adapter.d.ts.map +1 -0
  113. package/esm/bridge/core/adapter-registry.d.ts +122 -0
  114. package/esm/bridge/core/adapter-registry.d.ts.map +1 -0
  115. package/esm/bridge/core/bridge-factory.d.ts +199 -0
  116. package/esm/bridge/core/bridge-factory.d.ts.map +1 -0
  117. package/esm/bridge/core/index.d.ts +10 -0
  118. package/esm/bridge/core/index.d.ts.map +1 -0
  119. package/esm/bridge/index.d.ts +62 -0
  120. package/esm/bridge/index.d.ts.map +1 -0
  121. package/esm/bridge/index.js +2487 -0
  122. package/esm/bridge/runtime/iife-generator.d.ts +62 -0
  123. package/esm/bridge/runtime/iife-generator.d.ts.map +1 -0
  124. package/esm/bridge/runtime/index.d.ts +10 -0
  125. package/esm/bridge/runtime/index.d.ts.map +1 -0
  126. package/esm/bridge/types.d.ts +386 -0
  127. package/esm/bridge/types.d.ts.map +1 -0
  128. package/esm/bundler/bundler.d.ts +208 -0
  129. package/esm/bundler/bundler.d.ts.map +1 -0
  130. package/esm/bundler/cache.d.ts +173 -0
  131. package/esm/bundler/cache.d.ts.map +1 -0
  132. package/esm/bundler/file-cache/component-builder.d.ts +167 -0
  133. package/esm/bundler/file-cache/component-builder.d.ts.map +1 -0
  134. package/esm/bundler/file-cache/hash-calculator.d.ts +155 -0
  135. package/esm/bundler/file-cache/hash-calculator.d.ts.map +1 -0
  136. package/esm/bundler/file-cache/index.d.ts +12 -0
  137. package/esm/bundler/file-cache/index.d.ts.map +1 -0
  138. package/esm/bundler/file-cache/storage/filesystem.d.ts +149 -0
  139. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
  140. package/esm/bundler/file-cache/storage/index.d.ts +11 -0
  141. package/esm/bundler/file-cache/storage/index.d.ts.map +1 -0
  142. package/esm/bundler/file-cache/storage/interface.d.ts +152 -0
  143. package/esm/bundler/file-cache/storage/interface.d.ts.map +1 -0
  144. package/esm/bundler/file-cache/storage/redis.d.ts +139 -0
  145. package/esm/bundler/file-cache/storage/redis.d.ts.map +1 -0
  146. package/esm/bundler/index.d.ts +43 -0
  147. package/esm/bundler/index.d.ts.map +1 -0
  148. package/esm/bundler/index.js +3640 -0
  149. package/esm/bundler/sandbox/enclave-adapter.d.ts +121 -0
  150. package/esm/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
  151. package/esm/bundler/sandbox/executor.d.ts +14 -0
  152. package/esm/bundler/sandbox/executor.d.ts.map +1 -0
  153. package/esm/bundler/sandbox/policy.d.ts +62 -0
  154. package/esm/bundler/sandbox/policy.d.ts.map +1 -0
  155. package/esm/bundler/types.d.ts +702 -0
  156. package/esm/bundler/types.d.ts.map +1 -0
  157. package/esm/components/alert.d.ts +66 -0
  158. package/esm/components/alert.d.ts.map +1 -0
  159. package/esm/components/alert.schema.d.ts +98 -0
  160. package/esm/components/alert.schema.d.ts.map +1 -0
  161. package/esm/components/avatar.d.ts +77 -0
  162. package/esm/components/avatar.d.ts.map +1 -0
  163. package/esm/components/avatar.schema.d.ts +170 -0
  164. package/esm/components/avatar.schema.d.ts.map +1 -0
  165. package/esm/components/badge.d.ts +64 -0
  166. package/esm/components/badge.d.ts.map +1 -0
  167. package/esm/components/badge.schema.d.ts +91 -0
  168. package/esm/components/badge.schema.d.ts.map +1 -0
  169. package/esm/components/button.d.ts +100 -0
  170. package/esm/components/button.d.ts.map +1 -0
  171. package/esm/components/button.schema.d.ts +120 -0
  172. package/esm/components/button.schema.d.ts.map +1 -0
  173. package/esm/components/card.d.ts +53 -0
  174. package/esm/components/card.d.ts.map +1 -0
  175. package/esm/components/card.schema.d.ts +93 -0
  176. package/esm/components/card.schema.d.ts.map +1 -0
  177. package/esm/components/form.d.ts +212 -0
  178. package/esm/components/form.d.ts.map +1 -0
  179. package/esm/components/form.schema.d.ts +365 -0
  180. package/esm/components/form.schema.d.ts.map +1 -0
  181. package/esm/components/index.d.ts +29 -0
  182. package/esm/components/index.d.ts.map +1 -0
  183. package/esm/components/index.js +2396 -0
  184. package/esm/components/list.d.ts +121 -0
  185. package/esm/components/list.d.ts.map +1 -0
  186. package/esm/components/list.schema.d.ts +129 -0
  187. package/esm/components/list.schema.d.ts.map +1 -0
  188. package/esm/components/modal.d.ts +100 -0
  189. package/esm/components/modal.d.ts.map +1 -0
  190. package/esm/components/modal.schema.d.ts +151 -0
  191. package/esm/components/modal.schema.d.ts.map +1 -0
  192. package/esm/components/table.d.ts +91 -0
  193. package/esm/components/table.d.ts.map +1 -0
  194. package/esm/components/table.schema.d.ts +123 -0
  195. package/esm/components/table.schema.d.ts.map +1 -0
  196. package/esm/index.d.ts +40 -0
  197. package/esm/index.d.ts.map +1 -0
  198. package/esm/index.js +8326 -0
  199. package/esm/layouts/base.d.ts +86 -0
  200. package/esm/layouts/base.d.ts.map +1 -0
  201. package/esm/layouts/index.d.ts +8 -0
  202. package/esm/layouts/index.d.ts.map +1 -0
  203. package/esm/layouts/index.js +409 -0
  204. package/esm/layouts/presets.d.ts +134 -0
  205. package/esm/layouts/presets.d.ts.map +1 -0
  206. package/esm/package.json +72 -0
  207. package/esm/pages/consent.d.ts +117 -0
  208. package/esm/pages/consent.d.ts.map +1 -0
  209. package/esm/pages/error.d.ts +101 -0
  210. package/esm/pages/error.d.ts.map +1 -0
  211. package/esm/pages/index.d.ts +9 -0
  212. package/esm/pages/index.d.ts.map +1 -0
  213. package/esm/pages/index.js +1036 -0
  214. package/esm/react/Alert.d.ts +101 -0
  215. package/esm/react/Alert.d.ts.map +1 -0
  216. package/esm/react/Badge.d.ts +100 -0
  217. package/esm/react/Badge.d.ts.map +1 -0
  218. package/esm/react/Button.d.ts +108 -0
  219. package/esm/react/Button.d.ts.map +1 -0
  220. package/esm/react/Card.d.ts +103 -0
  221. package/esm/react/Card.d.ts.map +1 -0
  222. package/esm/react/hooks/context.d.ts +179 -0
  223. package/esm/react/hooks/context.d.ts.map +1 -0
  224. package/esm/react/hooks/index.d.ts +42 -0
  225. package/esm/react/hooks/index.d.ts.map +1 -0
  226. package/esm/react/hooks/tools.d.ts +284 -0
  227. package/esm/react/hooks/tools.d.ts.map +1 -0
  228. package/esm/react/index.d.ts +80 -0
  229. package/esm/react/index.d.ts.map +1 -0
  230. package/esm/react/index.js +3124 -0
  231. package/esm/react/types.d.ts +105 -0
  232. package/esm/react/types.d.ts.map +1 -0
  233. package/esm/react/utils.d.ts +43 -0
  234. package/esm/react/utils.d.ts.map +1 -0
  235. package/esm/render/index.d.ts +8 -0
  236. package/esm/render/index.d.ts.map +1 -0
  237. package/esm/render/index.js +45 -0
  238. package/esm/render/prerender.d.ts +57 -0
  239. package/esm/render/prerender.d.ts.map +1 -0
  240. package/esm/renderers/index.d.ts +21 -0
  241. package/esm/renderers/index.d.ts.map +1 -0
  242. package/esm/renderers/index.js +381 -0
  243. package/esm/renderers/react.adapter.d.ts +70 -0
  244. package/esm/renderers/react.adapter.d.ts.map +1 -0
  245. package/esm/renderers/react.renderer.d.ts +96 -0
  246. package/esm/renderers/react.renderer.d.ts.map +1 -0
  247. package/esm/universal/UniversalApp.d.ts +108 -0
  248. package/esm/universal/UniversalApp.d.ts.map +1 -0
  249. package/esm/universal/cached-runtime.d.ts +115 -0
  250. package/esm/universal/cached-runtime.d.ts.map +1 -0
  251. package/esm/universal/context.d.ts +122 -0
  252. package/esm/universal/context.d.ts.map +1 -0
  253. package/esm/universal/index.d.ts +57 -0
  254. package/esm/universal/index.d.ts.map +1 -0
  255. package/esm/universal/index.js +1755 -0
  256. package/esm/universal/renderers/html.renderer.d.ts +37 -0
  257. package/esm/universal/renderers/html.renderer.d.ts.map +1 -0
  258. package/esm/universal/renderers/index.d.ts +112 -0
  259. package/esm/universal/renderers/index.d.ts.map +1 -0
  260. package/esm/universal/renderers/markdown.renderer.d.ts +33 -0
  261. package/esm/universal/renderers/markdown.renderer.d.ts.map +1 -0
  262. package/esm/universal/renderers/mdx.renderer.d.ts +38 -0
  263. package/esm/universal/renderers/mdx.renderer.d.ts.map +1 -0
  264. package/esm/universal/renderers/react.renderer.d.ts +46 -0
  265. package/esm/universal/renderers/react.renderer.d.ts.map +1 -0
  266. package/esm/universal/runtime-builder.d.ts +33 -0
  267. package/esm/universal/runtime-builder.d.ts.map +1 -0
  268. package/esm/universal/store.d.ts +135 -0
  269. package/esm/universal/store.d.ts.map +1 -0
  270. package/esm/universal/types.d.ts +199 -0
  271. package/esm/universal/types.d.ts.map +1 -0
  272. package/esm/web-components/core/attribute-parser.d.ts +82 -0
  273. package/esm/web-components/core/attribute-parser.d.ts.map +1 -0
  274. package/esm/web-components/core/base-element.d.ts +197 -0
  275. package/esm/web-components/core/base-element.d.ts.map +1 -0
  276. package/esm/web-components/core/index.d.ts +9 -0
  277. package/esm/web-components/core/index.d.ts.map +1 -0
  278. package/esm/web-components/elements/fmcp-alert.d.ts +46 -0
  279. package/esm/web-components/elements/fmcp-alert.d.ts.map +1 -0
  280. package/esm/web-components/elements/fmcp-badge.d.ts +47 -0
  281. package/esm/web-components/elements/fmcp-badge.d.ts.map +1 -0
  282. package/esm/web-components/elements/fmcp-button.d.ts +117 -0
  283. package/esm/web-components/elements/fmcp-button.d.ts.map +1 -0
  284. package/esm/web-components/elements/fmcp-card.d.ts +53 -0
  285. package/esm/web-components/elements/fmcp-card.d.ts.map +1 -0
  286. package/esm/web-components/elements/fmcp-input.d.ts +96 -0
  287. package/esm/web-components/elements/fmcp-input.d.ts.map +1 -0
  288. package/esm/web-components/elements/fmcp-select.d.ts +100 -0
  289. package/esm/web-components/elements/fmcp-select.d.ts.map +1 -0
  290. package/esm/web-components/elements/index.d.ts +13 -0
  291. package/esm/web-components/elements/index.d.ts.map +1 -0
  292. package/esm/web-components/index.d.ts +50 -0
  293. package/esm/web-components/index.d.ts.map +1 -0
  294. package/esm/web-components/index.js +1993 -0
  295. package/esm/web-components/register.d.ts +57 -0
  296. package/esm/web-components/register.d.ts.map +1 -0
  297. package/esm/web-components/types.d.ts +122 -0
  298. package/esm/web-components/types.d.ts.map +1 -0
  299. package/esm/widgets/index.d.ts +8 -0
  300. package/esm/widgets/index.d.ts.map +1 -0
  301. package/esm/widgets/index.js +883 -0
  302. package/esm/widgets/progress.d.ts +133 -0
  303. package/esm/widgets/progress.d.ts.map +1 -0
  304. package/esm/widgets/resource.d.ts +163 -0
  305. package/esm/widgets/resource.d.ts.map +1 -0
  306. package/index.d.ts +40 -0
  307. package/index.d.ts.map +1 -0
  308. package/index.js +8526 -0
  309. package/layouts/base.d.ts +86 -0
  310. package/layouts/base.d.ts.map +1 -0
  311. package/layouts/index.d.ts +8 -0
  312. package/layouts/index.d.ts.map +1 -0
  313. package/layouts/index.js +437 -0
  314. package/layouts/presets.d.ts +134 -0
  315. package/layouts/presets.d.ts.map +1 -0
  316. package/package.json +33 -110
  317. package/pages/consent.d.ts +117 -0
  318. package/pages/consent.d.ts.map +1 -0
  319. package/pages/error.d.ts +101 -0
  320. package/pages/error.d.ts.map +1 -0
  321. package/pages/index.d.ts +9 -0
  322. package/pages/index.d.ts.map +1 -0
  323. package/pages/index.js +1065 -0
  324. package/react/Alert.d.ts +101 -0
  325. package/react/Alert.d.ts.map +1 -0
  326. package/react/Badge.d.ts +100 -0
  327. package/react/Badge.d.ts.map +1 -0
  328. package/react/Button.d.ts +108 -0
  329. package/react/Button.d.ts.map +1 -0
  330. package/react/Card.d.ts +103 -0
  331. package/react/Card.d.ts.map +1 -0
  332. package/react/hooks/context.d.ts +179 -0
  333. package/react/hooks/context.d.ts.map +1 -0
  334. package/react/hooks/index.d.ts +42 -0
  335. package/react/hooks/index.d.ts.map +1 -0
  336. package/react/hooks/tools.d.ts +284 -0
  337. package/react/hooks/tools.d.ts.map +1 -0
  338. package/react/index.d.ts +80 -0
  339. package/react/index.d.ts.map +1 -0
  340. package/react/index.js +3160 -0
  341. package/react/types.d.ts +105 -0
  342. package/react/types.d.ts.map +1 -0
  343. package/react/utils.d.ts +43 -0
  344. package/react/utils.d.ts.map +1 -0
  345. package/render/index.d.ts +8 -0
  346. package/render/index.d.ts.map +1 -0
  347. package/render/index.js +77 -0
  348. package/render/prerender.d.ts +57 -0
  349. package/render/prerender.d.ts.map +1 -0
  350. package/renderers/index.d.ts +21 -0
  351. package/renderers/index.d.ts.map +1 -0
  352. package/renderers/index.js +416 -0
  353. package/renderers/react.adapter.d.ts +70 -0
  354. package/renderers/react.adapter.d.ts.map +1 -0
  355. package/renderers/react.renderer.d.ts +96 -0
  356. package/renderers/react.renderer.d.ts.map +1 -0
  357. package/universal/UniversalApp.d.ts +108 -0
  358. package/universal/UniversalApp.d.ts.map +1 -0
  359. package/universal/cached-runtime.d.ts +115 -0
  360. package/universal/cached-runtime.d.ts.map +1 -0
  361. package/universal/context.d.ts +122 -0
  362. package/universal/context.d.ts.map +1 -0
  363. package/universal/index.d.ts +57 -0
  364. package/universal/index.d.ts.map +1 -0
  365. package/universal/index.js +1841 -0
  366. package/universal/renderers/html.renderer.d.ts +37 -0
  367. package/universal/renderers/html.renderer.d.ts.map +1 -0
  368. package/universal/renderers/index.d.ts +112 -0
  369. package/universal/renderers/index.d.ts.map +1 -0
  370. package/universal/renderers/markdown.renderer.d.ts +33 -0
  371. package/universal/renderers/markdown.renderer.d.ts.map +1 -0
  372. package/universal/renderers/mdx.renderer.d.ts +38 -0
  373. package/universal/renderers/mdx.renderer.d.ts.map +1 -0
  374. package/universal/renderers/react.renderer.d.ts +46 -0
  375. package/universal/renderers/react.renderer.d.ts.map +1 -0
  376. package/universal/runtime-builder.d.ts +33 -0
  377. package/universal/runtime-builder.d.ts.map +1 -0
  378. package/universal/store.d.ts +135 -0
  379. package/universal/store.d.ts.map +1 -0
  380. package/universal/types.d.ts +199 -0
  381. package/universal/types.d.ts.map +1 -0
  382. package/web-components/core/attribute-parser.d.ts +82 -0
  383. package/web-components/core/attribute-parser.d.ts.map +1 -0
  384. package/web-components/core/base-element.d.ts +197 -0
  385. package/web-components/core/base-element.d.ts.map +1 -0
  386. package/web-components/core/index.d.ts +9 -0
  387. package/web-components/core/index.d.ts.map +1 -0
  388. package/web-components/elements/fmcp-alert.d.ts +46 -0
  389. package/web-components/elements/fmcp-alert.d.ts.map +1 -0
  390. package/web-components/elements/fmcp-badge.d.ts +47 -0
  391. package/web-components/elements/fmcp-badge.d.ts.map +1 -0
  392. package/web-components/elements/fmcp-button.d.ts +117 -0
  393. package/web-components/elements/fmcp-button.d.ts.map +1 -0
  394. package/web-components/elements/fmcp-card.d.ts +53 -0
  395. package/web-components/elements/fmcp-card.d.ts.map +1 -0
  396. package/web-components/elements/fmcp-input.d.ts +96 -0
  397. package/web-components/elements/fmcp-input.d.ts.map +1 -0
  398. package/web-components/elements/fmcp-select.d.ts +100 -0
  399. package/web-components/elements/fmcp-select.d.ts.map +1 -0
  400. package/web-components/elements/index.d.ts +13 -0
  401. package/web-components/elements/index.d.ts.map +1 -0
  402. package/web-components/index.d.ts +50 -0
  403. package/web-components/index.d.ts.map +1 -0
  404. package/web-components/index.js +2028 -0
  405. package/web-components/register.d.ts +57 -0
  406. package/web-components/register.d.ts.map +1 -0
  407. package/web-components/types.d.ts +122 -0
  408. package/web-components/types.d.ts.map +1 -0
  409. package/widgets/index.d.ts +8 -0
  410. package/widgets/index.d.ts.map +1 -0
  411. package/widgets/index.js +910 -0
  412. package/widgets/progress.d.ts +133 -0
  413. package/widgets/progress.d.ts.map +1 -0
  414. package/widgets/resource.d.ts +163 -0
  415. package/widgets/resource.d.ts.map +1 -0
  416. package/src/adapters/index.d.ts +0 -10
  417. package/src/adapters/index.js +0 -18
  418. package/src/adapters/index.js.map +0 -1
  419. package/src/adapters/platform-meta.d.ts +0 -165
  420. package/src/adapters/platform-meta.js +0 -310
  421. package/src/adapters/platform-meta.js.map +0 -1
  422. package/src/base-template/bridge.d.ts +0 -89
  423. package/src/base-template/bridge.js +0 -452
  424. package/src/base-template/bridge.js.map +0 -1
  425. package/src/base-template/default-base-template.d.ts +0 -91
  426. package/src/base-template/default-base-template.js +0 -435
  427. package/src/base-template/default-base-template.js.map +0 -1
  428. package/src/base-template/index.d.ts +0 -14
  429. package/src/base-template/index.js +0 -30
  430. package/src/base-template/index.js.map +0 -1
  431. package/src/base-template/polyfills.d.ts +0 -30
  432. package/src/base-template/polyfills.js +0 -190
  433. package/src/base-template/polyfills.js.map +0 -1
  434. package/src/base-template/theme-styles.d.ts +0 -73
  435. package/src/base-template/theme-styles.js +0 -95
  436. package/src/base-template/theme-styles.js.map +0 -1
  437. package/src/bridge/adapters/base-adapter.d.ts +0 -103
  438. package/src/bridge/adapters/base-adapter.js +0 -314
  439. package/src/bridge/adapters/base-adapter.js.map +0 -1
  440. package/src/bridge/adapters/claude.adapter.d.ts +0 -66
  441. package/src/bridge/adapters/claude.adapter.js +0 -145
  442. package/src/bridge/adapters/claude.adapter.js.map +0 -1
  443. package/src/bridge/adapters/ext-apps.adapter.d.ts +0 -142
  444. package/src/bridge/adapters/ext-apps.adapter.js +0 -416
  445. package/src/bridge/adapters/ext-apps.adapter.js.map +0 -1
  446. package/src/bridge/adapters/gemini.adapter.d.ts +0 -63
  447. package/src/bridge/adapters/gemini.adapter.js +0 -160
  448. package/src/bridge/adapters/gemini.adapter.js.map +0 -1
  449. package/src/bridge/adapters/generic.adapter.d.ts +0 -55
  450. package/src/bridge/adapters/generic.adapter.js +0 -108
  451. package/src/bridge/adapters/generic.adapter.js.map +0 -1
  452. package/src/bridge/adapters/index.d.ts +0 -25
  453. package/src/bridge/adapters/index.js +0 -65
  454. package/src/bridge/adapters/index.js.map +0 -1
  455. package/src/bridge/adapters/openai.adapter.d.ts +0 -64
  456. package/src/bridge/adapters/openai.adapter.js +0 -194
  457. package/src/bridge/adapters/openai.adapter.js.map +0 -1
  458. package/src/bridge/core/adapter-registry.d.ts +0 -121
  459. package/src/bridge/core/adapter-registry.js +0 -271
  460. package/src/bridge/core/adapter-registry.js.map +0 -1
  461. package/src/bridge/core/bridge-factory.d.ts +0 -198
  462. package/src/bridge/core/bridge-factory.js +0 -428
  463. package/src/bridge/core/bridge-factory.js.map +0 -1
  464. package/src/bridge/core/index.d.ts +0 -9
  465. package/src/bridge/core/index.js +0 -22
  466. package/src/bridge/core/index.js.map +0 -1
  467. package/src/bridge/index.d.ts +0 -61
  468. package/src/bridge/index.js +0 -94
  469. package/src/bridge/index.js.map +0 -1
  470. package/src/bridge/runtime/iife-generator.d.ts +0 -61
  471. package/src/bridge/runtime/iife-generator.js +0 -940
  472. package/src/bridge/runtime/iife-generator.js.map +0 -1
  473. package/src/bridge/runtime/index.d.ts +0 -8
  474. package/src/bridge/runtime/index.js +0 -16
  475. package/src/bridge/runtime/index.js.map +0 -1
  476. package/src/bridge/types.d.ts +0 -385
  477. package/src/bridge/types.js +0 -11
  478. package/src/bridge/types.js.map +0 -1
  479. package/src/build/cdn-resources.d.ts +0 -140
  480. package/src/build/cdn-resources.js +0 -314
  481. package/src/build/cdn-resources.js.map +0 -1
  482. package/src/build/index.d.ts +0 -294
  483. package/src/build/index.js +0 -325
  484. package/src/build/index.js.map +0 -1
  485. package/src/build/widget-manifest.d.ts +0 -212
  486. package/src/build/widget-manifest.js +0 -652
  487. package/src/build/widget-manifest.js.map +0 -1
  488. package/src/bundler/bundler.d.ts +0 -110
  489. package/src/bundler/bundler.js +0 -432
  490. package/src/bundler/bundler.js.map +0 -1
  491. package/src/bundler/cache.d.ts +0 -172
  492. package/src/bundler/cache.js +0 -250
  493. package/src/bundler/cache.js.map +0 -1
  494. package/src/bundler/index.d.ts +0 -41
  495. package/src/bundler/index.js +0 -73
  496. package/src/bundler/index.js.map +0 -1
  497. package/src/bundler/sandbox/enclave-adapter.d.ts +0 -120
  498. package/src/bundler/sandbox/enclave-adapter.js +0 -339
  499. package/src/bundler/sandbox/enclave-adapter.js.map +0 -1
  500. package/src/bundler/sandbox/executor.d.ts +0 -13
  501. package/src/bundler/sandbox/executor.js +0 -22
  502. package/src/bundler/sandbox/executor.js.map +0 -1
  503. package/src/bundler/sandbox/policy.d.ts +0 -61
  504. package/src/bundler/sandbox/policy.js +0 -238
  505. package/src/bundler/sandbox/policy.js.map +0 -1
  506. package/src/bundler/types.d.ts +0 -347
  507. package/src/bundler/types.js +0 -132
  508. package/src/bundler/types.js.map +0 -1
  509. package/src/components/alert.d.ts +0 -71
  510. package/src/components/alert.js +0 -189
  511. package/src/components/alert.js.map +0 -1
  512. package/src/components/alert.schema.d.ts +0 -114
  513. package/src/components/alert.schema.js +0 -105
  514. package/src/components/alert.schema.js.map +0 -1
  515. package/src/components/avatar.d.ts +0 -76
  516. package/src/components/avatar.js +0 -176
  517. package/src/components/avatar.js.map +0 -1
  518. package/src/components/avatar.schema.d.ts +0 -169
  519. package/src/components/avatar.schema.js +0 -103
  520. package/src/components/avatar.schema.js.map +0 -1
  521. package/src/components/badge.d.ts +0 -70
  522. package/src/components/badge.js +0 -149
  523. package/src/components/badge.js.map +0 -1
  524. package/src/components/badge.schema.d.ts +0 -109
  525. package/src/components/badge.schema.js +0 -96
  526. package/src/components/badge.schema.js.map +0 -1
  527. package/src/components/button.d.ts +0 -111
  528. package/src/components/button.js +0 -336
  529. package/src/components/button.js.map +0 -1
  530. package/src/components/button.schema.d.ts +0 -148
  531. package/src/components/button.schema.js +0 -121
  532. package/src/components/button.schema.js.map +0 -1
  533. package/src/components/card.d.ts +0 -60
  534. package/src/components/card.js +0 -117
  535. package/src/components/card.js.map +0 -1
  536. package/src/components/card.schema.d.ts +0 -113
  537. package/src/components/card.schema.js +0 -98
  538. package/src/components/card.schema.js.map +0 -1
  539. package/src/components/form.d.ts +0 -239
  540. package/src/components/form.js +0 -420
  541. package/src/components/form.js.map +0 -1
  542. package/src/components/form.schema.d.ts +0 -441
  543. package/src/components/form.schema.js +0 -406
  544. package/src/components/form.schema.js.map +0 -1
  545. package/src/components/index.d.ts +0 -29
  546. package/src/components/index.js +0 -98
  547. package/src/components/index.js.map +0 -1
  548. package/src/components/list.d.ts +0 -127
  549. package/src/components/list.js +0 -279
  550. package/src/components/list.js.map +0 -1
  551. package/src/components/list.schema.d.ts +0 -134
  552. package/src/components/list.schema.js +0 -168
  553. package/src/components/list.schema.js.map +0 -1
  554. package/src/components/modal.d.ts +0 -111
  555. package/src/components/modal.js +0 -260
  556. package/src/components/modal.js.map +0 -1
  557. package/src/components/modal.schema.d.ts +0 -186
  558. package/src/components/modal.schema.js +0 -167
  559. package/src/components/modal.schema.js.map +0 -1
  560. package/src/components/table.d.ts +0 -105
  561. package/src/components/table.js +0 -283
  562. package/src/components/table.js.map +0 -1
  563. package/src/components/table.schema.d.ts +0 -159
  564. package/src/components/table.schema.js +0 -173
  565. package/src/components/table.schema.js.map +0 -1
  566. package/src/handlebars/helpers.d.ts +0 -348
  567. package/src/handlebars/helpers.js +0 -605
  568. package/src/handlebars/helpers.js.map +0 -1
  569. package/src/handlebars/index.d.ts +0 -193
  570. package/src/handlebars/index.js +0 -350
  571. package/src/handlebars/index.js.map +0 -1
  572. package/src/index.d.ts +0 -50
  573. package/src/index.js +0 -192
  574. package/src/index.js.map +0 -1
  575. package/src/layouts/base.d.ts +0 -88
  576. package/src/layouts/base.js +0 -227
  577. package/src/layouts/base.js.map +0 -1
  578. package/src/layouts/index.d.ts +0 -7
  579. package/src/layouts/index.js +0 -25
  580. package/src/layouts/index.js.map +0 -1
  581. package/src/layouts/presets.d.ts +0 -133
  582. package/src/layouts/presets.js +0 -277
  583. package/src/layouts/presets.js.map +0 -1
  584. package/src/pages/consent.d.ts +0 -116
  585. package/src/pages/consent.js +0 -218
  586. package/src/pages/consent.js.map +0 -1
  587. package/src/pages/error.d.ts +0 -100
  588. package/src/pages/error.js +0 -263
  589. package/src/pages/error.js.map +0 -1
  590. package/src/pages/index.d.ts +0 -8
  591. package/src/pages/index.js +0 -27
  592. package/src/pages/index.js.map +0 -1
  593. package/src/react/Alert.d.ts +0 -101
  594. package/src/react/Alert.js +0 -51
  595. package/src/react/Alert.js.map +0 -1
  596. package/src/react/Badge.d.ts +0 -100
  597. package/src/react/Badge.js +0 -55
  598. package/src/react/Badge.js.map +0 -1
  599. package/src/react/Button.d.ts +0 -108
  600. package/src/react/Button.js +0 -52
  601. package/src/react/Button.js.map +0 -1
  602. package/src/react/Card.d.ts +0 -103
  603. package/src/react/Card.js +0 -55
  604. package/src/react/Card.js.map +0 -1
  605. package/src/react/hooks/context.d.ts +0 -178
  606. package/src/react/hooks/context.js +0 -287
  607. package/src/react/hooks/context.js.map +0 -1
  608. package/src/react/hooks/index.d.ts +0 -41
  609. package/src/react/hooks/index.js +0 -61
  610. package/src/react/hooks/index.js.map +0 -1
  611. package/src/react/hooks/tools.d.ts +0 -283
  612. package/src/react/hooks/tools.js +0 -465
  613. package/src/react/hooks/tools.js.map +0 -1
  614. package/src/react/index.d.ts +0 -80
  615. package/src/react/index.js +0 -113
  616. package/src/react/index.js.map +0 -1
  617. package/src/react/types.d.ts +0 -105
  618. package/src/react/types.js +0 -12
  619. package/src/react/types.js.map +0 -1
  620. package/src/react/utils.d.ts +0 -42
  621. package/src/react/utils.js +0 -99
  622. package/src/react/utils.js.map +0 -1
  623. package/src/registry/index.d.ts +0 -45
  624. package/src/registry/index.js +0 -67
  625. package/src/registry/index.js.map +0 -1
  626. package/src/registry/render-template.d.ts +0 -86
  627. package/src/registry/render-template.js +0 -239
  628. package/src/registry/render-template.js.map +0 -1
  629. package/src/registry/tool-ui.registry.d.ts +0 -260
  630. package/src/registry/tool-ui.registry.js +0 -438
  631. package/src/registry/tool-ui.registry.js.map +0 -1
  632. package/src/registry/uri-utils.d.ts +0 -55
  633. package/src/registry/uri-utils.js +0 -97
  634. package/src/registry/uri-utils.js.map +0 -1
  635. package/src/render/index.d.ts +0 -7
  636. package/src/render/index.js +0 -14
  637. package/src/render/index.js.map +0 -1
  638. package/src/render/prerender.d.ts +0 -56
  639. package/src/render/prerender.js +0 -98
  640. package/src/render/prerender.js.map +0 -1
  641. package/src/renderers/cache.d.ts +0 -144
  642. package/src/renderers/cache.js +0 -240
  643. package/src/renderers/cache.js.map +0 -1
  644. package/src/renderers/html.renderer.d.ts +0 -122
  645. package/src/renderers/html.renderer.js +0 -204
  646. package/src/renderers/html.renderer.js.map +0 -1
  647. package/src/renderers/index.d.ts +0 -35
  648. package/src/renderers/index.js +0 -70
  649. package/src/renderers/index.js.map +0 -1
  650. package/src/renderers/mdx.renderer.d.ts +0 -119
  651. package/src/renderers/mdx.renderer.js +0 -305
  652. package/src/renderers/mdx.renderer.js.map +0 -1
  653. package/src/renderers/react.renderer.d.ts +0 -95
  654. package/src/renderers/react.renderer.js +0 -260
  655. package/src/renderers/react.renderer.js.map +0 -1
  656. package/src/renderers/registry.d.ts +0 -133
  657. package/src/renderers/registry.js +0 -232
  658. package/src/renderers/registry.js.map +0 -1
  659. package/src/renderers/types.d.ts +0 -341
  660. package/src/renderers/types.js +0 -9
  661. package/src/renderers/types.js.map +0 -1
  662. package/src/renderers/utils/detect.d.ts +0 -106
  663. package/src/renderers/utils/detect.js +0 -267
  664. package/src/renderers/utils/detect.js.map +0 -1
  665. package/src/renderers/utils/hash.d.ts +0 -39
  666. package/src/renderers/utils/hash.js +0 -75
  667. package/src/renderers/utils/hash.js.map +0 -1
  668. package/src/renderers/utils/index.d.ts +0 -8
  669. package/src/renderers/utils/index.js +0 -28
  670. package/src/renderers/utils/index.js.map +0 -1
  671. package/src/renderers/utils/transpiler.d.ts +0 -88
  672. package/src/renderers/utils/transpiler.js +0 -215
  673. package/src/renderers/utils/transpiler.js.map +0 -1
  674. package/src/runtime/adapters/html.adapter.d.ts +0 -58
  675. package/src/runtime/adapters/html.adapter.js +0 -131
  676. package/src/runtime/adapters/html.adapter.js.map +0 -1
  677. package/src/runtime/adapters/index.d.ts +0 -25
  678. package/src/runtime/adapters/index.js +0 -54
  679. package/src/runtime/adapters/index.js.map +0 -1
  680. package/src/runtime/adapters/mdx.adapter.d.ts +0 -72
  681. package/src/runtime/adapters/mdx.adapter.js +0 -241
  682. package/src/runtime/adapters/mdx.adapter.js.map +0 -1
  683. package/src/runtime/adapters/react.adapter.d.ts +0 -69
  684. package/src/runtime/adapters/react.adapter.js +0 -245
  685. package/src/runtime/adapters/react.adapter.js.map +0 -1
  686. package/src/runtime/adapters/types.d.ts +0 -94
  687. package/src/runtime/adapters/types.js +0 -11
  688. package/src/runtime/adapters/types.js.map +0 -1
  689. package/src/runtime/csp.d.ts +0 -37
  690. package/src/runtime/csp.js +0 -140
  691. package/src/runtime/csp.js.map +0 -1
  692. package/src/runtime/index.d.ts +0 -16
  693. package/src/runtime/index.js +0 -72
  694. package/src/runtime/index.js.map +0 -1
  695. package/src/runtime/mcp-bridge.d.ts +0 -100
  696. package/src/runtime/mcp-bridge.js +0 -581
  697. package/src/runtime/mcp-bridge.js.map +0 -1
  698. package/src/runtime/renderer-runtime.d.ts +0 -132
  699. package/src/runtime/renderer-runtime.js +0 -389
  700. package/src/runtime/renderer-runtime.js.map +0 -1
  701. package/src/runtime/sanitizer.d.ts +0 -171
  702. package/src/runtime/sanitizer.js +0 -318
  703. package/src/runtime/sanitizer.js.map +0 -1
  704. package/src/runtime/types.d.ts +0 -414
  705. package/src/runtime/types.js +0 -12
  706. package/src/runtime/types.js.map +0 -1
  707. package/src/runtime/wrapper.d.ts +0 -375
  708. package/src/runtime/wrapper.js +0 -1793
  709. package/src/runtime/wrapper.js.map +0 -1
  710. package/src/styles/index.d.ts +0 -7
  711. package/src/styles/index.js +0 -11
  712. package/src/styles/index.js.map +0 -1
  713. package/src/styles/variants.d.ts +0 -50
  714. package/src/styles/variants.js +0 -175
  715. package/src/styles/variants.js.map +0 -1
  716. package/src/theme/cdn.d.ts +0 -194
  717. package/src/theme/cdn.js +0 -375
  718. package/src/theme/cdn.js.map +0 -1
  719. package/src/theme/index.d.ts +0 -17
  720. package/src/theme/index.js +0 -57
  721. package/src/theme/index.js.map +0 -1
  722. package/src/theme/platforms.d.ts +0 -106
  723. package/src/theme/platforms.js +0 -161
  724. package/src/theme/platforms.js.map +0 -1
  725. package/src/theme/presets/github-openai.d.ts +0 -49
  726. package/src/theme/presets/github-openai.js +0 -189
  727. package/src/theme/presets/github-openai.js.map +0 -1
  728. package/src/theme/presets/index.d.ts +0 -10
  729. package/src/theme/presets/index.js +0 -17
  730. package/src/theme/presets/index.js.map +0 -1
  731. package/src/theme/theme.d.ts +0 -395
  732. package/src/theme/theme.js +0 -332
  733. package/src/theme/theme.js.map +0 -1
  734. package/src/tool-template/builder.d.ts +0 -212
  735. package/src/tool-template/builder.js +0 -397
  736. package/src/tool-template/builder.js.map +0 -1
  737. package/src/tool-template/index.d.ts +0 -15
  738. package/src/tool-template/index.js +0 -38
  739. package/src/tool-template/index.js.map +0 -1
  740. package/src/types/index.d.ts +0 -13
  741. package/src/types/index.js +0 -26
  742. package/src/types/index.js.map +0 -1
  743. package/src/types/ui-config.d.ts +0 -357
  744. package/src/types/ui-config.js +0 -12
  745. package/src/types/ui-config.js.map +0 -1
  746. package/src/types/ui-runtime.d.ts +0 -965
  747. package/src/types/ui-runtime.js +0 -117
  748. package/src/types/ui-runtime.js.map +0 -1
  749. package/src/validation/error-box.d.ts +0 -55
  750. package/src/validation/error-box.js +0 -75
  751. package/src/validation/error-box.js.map +0 -1
  752. package/src/validation/index.d.ts +0 -12
  753. package/src/validation/index.js +0 -21
  754. package/src/validation/index.js.map +0 -1
  755. package/src/validation/wrapper.d.ts +0 -96
  756. package/src/validation/wrapper.js +0 -117
  757. package/src/validation/wrapper.js.map +0 -1
  758. package/src/web-components/core/attribute-parser.d.ts +0 -85
  759. package/src/web-components/core/attribute-parser.js +0 -189
  760. package/src/web-components/core/attribute-parser.js.map +0 -1
  761. package/src/web-components/core/base-element.d.ts +0 -197
  762. package/src/web-components/core/base-element.js +0 -289
  763. package/src/web-components/core/base-element.js.map +0 -1
  764. package/src/web-components/core/index.d.ts +0 -8
  765. package/src/web-components/core/index.js +0 -18
  766. package/src/web-components/core/index.js.map +0 -1
  767. package/src/web-components/elements/fmcp-alert.d.ts +0 -45
  768. package/src/web-components/elements/fmcp-alert.js +0 -93
  769. package/src/web-components/elements/fmcp-alert.js.map +0 -1
  770. package/src/web-components/elements/fmcp-badge.d.ts +0 -46
  771. package/src/web-components/elements/fmcp-badge.js +0 -99
  772. package/src/web-components/elements/fmcp-badge.js.map +0 -1
  773. package/src/web-components/elements/fmcp-button.d.ts +0 -124
  774. package/src/web-components/elements/fmcp-button.js +0 -233
  775. package/src/web-components/elements/fmcp-button.js.map +0 -1
  776. package/src/web-components/elements/fmcp-card.d.ts +0 -52
  777. package/src/web-components/elements/fmcp-card.js +0 -115
  778. package/src/web-components/elements/fmcp-card.js.map +0 -1
  779. package/src/web-components/elements/fmcp-input.d.ts +0 -95
  780. package/src/web-components/elements/fmcp-input.js +0 -248
  781. package/src/web-components/elements/fmcp-input.js.map +0 -1
  782. package/src/web-components/elements/fmcp-select.d.ts +0 -99
  783. package/src/web-components/elements/fmcp-select.js +0 -243
  784. package/src/web-components/elements/fmcp-select.js.map +0 -1
  785. package/src/web-components/elements/index.d.ts +0 -12
  786. package/src/web-components/elements/index.js +0 -34
  787. package/src/web-components/elements/index.js.map +0 -1
  788. package/src/web-components/index.d.ts +0 -49
  789. package/src/web-components/index.js +0 -75
  790. package/src/web-components/index.js.map +0 -1
  791. package/src/web-components/register.d.ts +0 -56
  792. package/src/web-components/register.js +0 -80
  793. package/src/web-components/register.js.map +0 -1
  794. package/src/web-components/types.d.ts +0 -121
  795. package/src/web-components/types.js +0 -25
  796. package/src/web-components/types.js.map +0 -1
  797. package/src/widgets/index.d.ts +0 -7
  798. package/src/widgets/index.js +0 -24
  799. package/src/widgets/index.js.map +0 -1
  800. package/src/widgets/progress.d.ts +0 -132
  801. package/src/widgets/progress.js +0 -303
  802. package/src/widgets/progress.js.map +0 -1
  803. package/src/widgets/resource.d.ts +0 -162
  804. package/src/widgets/resource.js +0 -340
  805. package/src/widgets/resource.js.map +0 -1
package/react/index.js ADDED
@@ -0,0 +1,3160 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // libs/ui/src/react/index.ts
31
+ var react_exports = {};
32
+ __export(react_exports, {
33
+ Alert: () => Alert,
34
+ Badge: () => Badge,
35
+ Button: () => Button,
36
+ Card: () => Card,
37
+ McpBridgeProvider: () => McpBridgeProvider,
38
+ isBrowser: () => isBrowser,
39
+ isServer: () => isServer,
40
+ renderAlert: () => renderAlert,
41
+ renderAlertSync: () => renderAlertSync,
42
+ renderBadge: () => renderBadge,
43
+ renderBadgeSync: () => renderBadgeSync,
44
+ renderButton: () => renderButton,
45
+ renderButtonSync: () => renderButtonSync,
46
+ renderCard: () => renderCard,
47
+ renderCardSync: () => renderCardSync,
48
+ renderChildrenToString: () => renderChildrenToString,
49
+ useCallTool: () => useCallTool,
50
+ useCapability: () => useCapability,
51
+ useDisplayMode: () => useDisplayMode,
52
+ useHostContext: () => useHostContext,
53
+ useMcpBridge: () => useMcpBridge,
54
+ useMcpBridgeContext: () => useMcpBridgeContext,
55
+ useOpenLink: () => useOpenLink,
56
+ useSendMessage: () => useSendMessage,
57
+ useStructuredContent: () => useStructuredContent,
58
+ useTheme: () => useTheme,
59
+ useToolCalls: () => useToolCalls,
60
+ useToolInput: () => useToolInput,
61
+ useToolOutput: () => useToolOutput
62
+ });
63
+ module.exports = __toCommonJS(react_exports);
64
+
65
+ // libs/ui/src/react/Card.tsx
66
+ var import_styles = require("@frontmcp/uipack/styles");
67
+
68
+ // libs/ui/src/render/prerender.ts
69
+ async function renderToString(element) {
70
+ const { prerender } = await import("react-dom/static");
71
+ const { prelude } = await prerender(element);
72
+ const reader = prelude.getReader();
73
+ const chunks = [];
74
+ while (true) {
75
+ const { done, value } = await reader.read();
76
+ if (done) break;
77
+ if (value) chunks.push(value);
78
+ }
79
+ const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);
80
+ const combined = new Uint8Array(totalLength);
81
+ let offset = 0;
82
+ for (const chunk of chunks) {
83
+ combined.set(chunk, offset);
84
+ offset += chunk.length;
85
+ }
86
+ return new TextDecoder().decode(combined);
87
+ }
88
+ function renderToStringSync(element) {
89
+ const ReactDOMServer = require("react-dom/server");
90
+ return ReactDOMServer.renderToStaticMarkup(element);
91
+ }
92
+
93
+ // libs/ui/src/react/Card.tsx
94
+ var import_jsx_runtime = require("react/jsx-runtime");
95
+ function Card({
96
+ title,
97
+ subtitle,
98
+ headerActions,
99
+ footer,
100
+ variant = "default",
101
+ size = "md",
102
+ className,
103
+ id,
104
+ clickable,
105
+ href,
106
+ children
107
+ }) {
108
+ const variantClasses = (0, import_styles.getCardVariantClasses)(variant);
109
+ const sizeClasses = (0, import_styles.getCardSizeClasses)(size);
110
+ const clickableClasses = clickable ? "cursor-pointer hover:shadow-md transition-shadow" : "";
111
+ const allClasses = (0, import_styles.cn)(variantClasses, sizeClasses, clickableClasses, className);
112
+ const hasHeader = title || subtitle || headerActions;
113
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
114
+ hasHeader && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between mb-4", children: [
115
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
116
+ title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "text-lg font-semibold text-text-primary", children: title }),
117
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-text-secondary mt-1", children: subtitle })
118
+ ] }),
119
+ headerActions && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex items-center gap-2", children: headerActions })
120
+ ] }),
121
+ children,
122
+ footer && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "mt-4 pt-4 border-t border-divider", children: footer })
123
+ ] });
124
+ if (href) {
125
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", { href, className: allClasses, id, children: content });
126
+ }
127
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: allClasses, id, children: content });
128
+ }
129
+ async function renderCard(props) {
130
+ const { children, headerActions, footer, ...rest } = props;
131
+ const element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
132
+ Card,
133
+ {
134
+ ...rest,
135
+ headerActions: headerActions ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: headerActions } }) : void 0,
136
+ footer: footer ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: footer } }) : void 0,
137
+ children: children ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: children } }) : void 0
138
+ }
139
+ );
140
+ return renderToString(element);
141
+ }
142
+ function renderCardSync(props) {
143
+ const { children, headerActions, footer, ...rest } = props;
144
+ const element = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
145
+ Card,
146
+ {
147
+ ...rest,
148
+ headerActions: headerActions ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: headerActions } }) : void 0,
149
+ footer: footer ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: footer } }) : void 0,
150
+ children: children ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: children } }) : void 0
151
+ }
152
+ );
153
+ return renderToStringSync(element);
154
+ }
155
+
156
+ // libs/ui/src/react/Badge.tsx
157
+ var import_styles2 = require("@frontmcp/uipack/styles");
158
+ var import_jsx_runtime2 = require("react/jsx-runtime");
159
+ function Badge({
160
+ variant = "default",
161
+ size = "md",
162
+ pill = false,
163
+ icon,
164
+ dot = false,
165
+ className,
166
+ removable = false,
167
+ onRemove,
168
+ children
169
+ }) {
170
+ if (dot) {
171
+ const dotClasses = (0, import_styles2.cn)(
172
+ "inline-block rounded-full",
173
+ (0, import_styles2.getBadgeDotSizeClasses)(size),
174
+ (0, import_styles2.getBadgeDotVariantClasses)(variant),
175
+ className
176
+ );
177
+ const label = typeof children === "string" ? children : void 0;
178
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: dotClasses, "aria-label": label, title: label });
179
+ }
180
+ const variantClasses = (0, import_styles2.getBadgeVariantClasses)(variant);
181
+ const sizeClasses = (0, import_styles2.getBadgeSizeClasses)(size);
182
+ const baseClasses = (0, import_styles2.cn)(
183
+ "inline-flex items-center font-medium",
184
+ pill ? "rounded-full" : "rounded-md",
185
+ variantClasses,
186
+ sizeClasses,
187
+ className
188
+ );
189
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: baseClasses, children: [
190
+ icon && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "mr-1", children: icon }),
191
+ children,
192
+ removable && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
193
+ "button",
194
+ {
195
+ type: "button",
196
+ className: "ml-1.5 -mr-1 hover:opacity-70 transition-opacity",
197
+ "aria-label": "Remove",
198
+ onClick: onRemove,
199
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M6 18L18 6M6 6l12 12" }) })
200
+ }
201
+ )
202
+ ] });
203
+ }
204
+ async function renderBadge(props) {
205
+ const { children, icon, ...rest } = props;
206
+ const element = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Badge, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
207
+ return renderToString(element);
208
+ }
209
+ function renderBadgeSync(props) {
210
+ const { children, icon, ...rest } = props;
211
+ const element = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Badge, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
212
+ return renderToStringSync(element);
213
+ }
214
+
215
+ // libs/ui/src/react/Button.tsx
216
+ var import_styles3 = require("@frontmcp/uipack/styles");
217
+ var import_jsx_runtime3 = require("react/jsx-runtime");
218
+ function Button({
219
+ variant = "primary",
220
+ size = "md",
221
+ disabled = false,
222
+ loading = false,
223
+ fullWidth = false,
224
+ iconPosition = "left",
225
+ icon,
226
+ iconOnly = false,
227
+ type = "button",
228
+ className,
229
+ onClick,
230
+ children
231
+ }) {
232
+ const variantClasses = (0, import_styles3.getButtonVariantClasses)(variant);
233
+ const sizeClasses = (0, import_styles3.getButtonSizeClasses)(size, iconOnly);
234
+ const disabledClasses = disabled || loading ? "opacity-50 cursor-not-allowed" : "";
235
+ const widthClasses = fullWidth ? "w-full" : "";
236
+ const allClasses = (0, import_styles3.cn)(import_styles3.BUTTON_BASE_CLASSES, variantClasses, sizeClasses, disabledClasses, widthClasses, className);
237
+ const iconElement = icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: iconPosition === "left" ? "mr-2" : "ml-2", children: icon });
238
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { type, className: allClasses, disabled: disabled || loading, onClick, children: [
239
+ loading && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "mr-2", dangerouslySetInnerHTML: { __html: import_styles3.LOADING_SPINNER } }),
240
+ !loading && icon && iconPosition === "left" && iconElement,
241
+ !iconOnly && children,
242
+ !loading && icon && iconPosition === "right" && iconElement
243
+ ] });
244
+ }
245
+ async function renderButton(props) {
246
+ const { children, icon, ...rest } = props;
247
+ const element = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Button, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
248
+ return renderToString(element);
249
+ }
250
+ function renderButtonSync(props) {
251
+ const { children, icon, ...rest } = props;
252
+ const element = /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Button, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
253
+ return renderToStringSync(element);
254
+ }
255
+
256
+ // libs/ui/src/react/Alert.tsx
257
+ var import_styles4 = require("@frontmcp/uipack/styles");
258
+ var import_jsx_runtime4 = require("react/jsx-runtime");
259
+ function Alert({
260
+ variant = "info",
261
+ title,
262
+ icon,
263
+ showIcon = true,
264
+ dismissible = false,
265
+ onDismiss,
266
+ className,
267
+ children
268
+ }) {
269
+ const variantStyles = (0, import_styles4.getAlertVariantClasses)(variant);
270
+ const allClasses = (0, import_styles4.cn)(import_styles4.ALERT_BASE_CLASSES, variantStyles.container, className);
271
+ const iconContent = icon || (showIcon ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
272
+ "span",
273
+ {
274
+ className: (0, import_styles4.cn)("flex-shrink-0", variantStyles.icon),
275
+ dangerouslySetInnerHTML: { __html: import_styles4.ALERT_ICONS[variant] }
276
+ }
277
+ ) : null);
278
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: allClasses, role: "alert", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex", children: [
279
+ iconContent && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex-shrink-0 mr-3", children: iconContent }),
280
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex-1", children: [
281
+ title && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h4", { className: "font-semibold mb-1", children: title }),
282
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "text-sm", children })
283
+ ] }),
284
+ dismissible && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
285
+ "button",
286
+ {
287
+ type: "button",
288
+ className: "flex-shrink-0 ml-3 hover:opacity-70 transition-opacity",
289
+ "aria-label": "Dismiss",
290
+ onClick: onDismiss,
291
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { dangerouslySetInnerHTML: { __html: import_styles4.CLOSE_ICON } })
292
+ }
293
+ )
294
+ ] }) });
295
+ }
296
+ async function renderAlert(props) {
297
+ const { children, icon, ...rest } = props;
298
+ const element = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Alert, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
299
+ return renderToString(element);
300
+ }
301
+ function renderAlertSync(props) {
302
+ const { children, icon, ...rest } = props;
303
+ const element = /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(Alert, { ...rest, icon: icon ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { dangerouslySetInnerHTML: { __html: icon } }) : void 0, children });
304
+ return renderToStringSync(element);
305
+ }
306
+
307
+ // libs/ui/src/react/hooks/context.tsx
308
+ var import_react = require("react");
309
+
310
+ // libs/ui/src/bridge/core/adapter-registry.ts
311
+ var AdapterRegistry = class {
312
+ _adapters = /* @__PURE__ */ new Map();
313
+ _disabledAdapters = /* @__PURE__ */ new Set();
314
+ _adapterConfigs = /* @__PURE__ */ new Map();
315
+ _debug = false;
316
+ /**
317
+ * Enable or disable debug logging.
318
+ */
319
+ setDebug(enabled) {
320
+ this._debug = enabled;
321
+ }
322
+ /**
323
+ * Register an adapter factory with the registry.
324
+ * @param id - Unique adapter identifier
325
+ * @param factory - Factory function that creates the adapter
326
+ * @param defaultConfig - Optional default configuration
327
+ */
328
+ register(id, factory, defaultConfig) {
329
+ if (this._adapters.has(id)) {
330
+ this._log(`Overwriting existing adapter: ${id}`);
331
+ }
332
+ this._adapters.set(id, {
333
+ id,
334
+ factory,
335
+ defaultConfig
336
+ });
337
+ this._log(`Registered adapter: ${id}`);
338
+ }
339
+ /**
340
+ * Unregister an adapter from the registry.
341
+ * @param id - Adapter identifier to remove
342
+ */
343
+ unregister(id) {
344
+ const removed = this._adapters.delete(id);
345
+ if (removed) {
346
+ this._log(`Unregistered adapter: ${id}`);
347
+ }
348
+ return removed;
349
+ }
350
+ /**
351
+ * Check if an adapter is registered.
352
+ * @param id - Adapter identifier
353
+ */
354
+ has(id) {
355
+ return this._adapters.has(id);
356
+ }
357
+ /**
358
+ * Get all registered adapter IDs.
359
+ */
360
+ getRegisteredIds() {
361
+ return Array.from(this._adapters.keys());
362
+ }
363
+ /**
364
+ * Disable specific adapters (they won't be selected during auto-detection).
365
+ * @param ids - Adapter IDs to disable
366
+ */
367
+ disable(...ids) {
368
+ for (const id of ids) {
369
+ this._disabledAdapters.add(id);
370
+ this._log(`Disabled adapter: ${id}`);
371
+ }
372
+ }
373
+ /**
374
+ * Enable previously disabled adapters.
375
+ * @param ids - Adapter IDs to enable
376
+ */
377
+ enable(...ids) {
378
+ for (const id of ids) {
379
+ this._disabledAdapters.delete(id);
380
+ this._log(`Enabled adapter: ${id}`);
381
+ }
382
+ }
383
+ /**
384
+ * Check if an adapter is disabled.
385
+ * @param id - Adapter identifier
386
+ */
387
+ isDisabled(id) {
388
+ return this._disabledAdapters.has(id);
389
+ }
390
+ /**
391
+ * Set adapter-specific configuration.
392
+ * @param id - Adapter identifier
393
+ * @param config - Configuration to apply
394
+ */
395
+ configure(id, config) {
396
+ this._adapterConfigs.set(id, config);
397
+ this._log(`Configured adapter: ${id}`);
398
+ }
399
+ /**
400
+ * Get an adapter instance by ID.
401
+ * @param id - Adapter identifier
402
+ * @returns Adapter instance or undefined if not found/disabled
403
+ */
404
+ get(id) {
405
+ if (this._disabledAdapters.has(id)) {
406
+ this._log(`Adapter ${id} is disabled`);
407
+ return void 0;
408
+ }
409
+ const registration = this._adapters.get(id);
410
+ if (!registration) {
411
+ this._log(`Adapter ${id} not found`);
412
+ return void 0;
413
+ }
414
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(id));
415
+ if (config?.enabled === false) {
416
+ this._log(`Adapter ${id} is disabled via config`);
417
+ return void 0;
418
+ }
419
+ return registration.factory(config);
420
+ }
421
+ /**
422
+ * Auto-detect and return the best adapter for the current environment.
423
+ * Adapters are checked in priority order (highest first).
424
+ * @returns The first adapter that can handle the current environment, or undefined
425
+ */
426
+ detect() {
427
+ const candidates = this._getSortedCandidates();
428
+ for (const registration of candidates) {
429
+ if (this._disabledAdapters.has(registration.id)) {
430
+ this._log(`Skipping disabled adapter: ${registration.id}`);
431
+ continue;
432
+ }
433
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(registration.id));
434
+ if (config?.enabled === false) {
435
+ this._log(`Skipping adapter disabled via config: ${registration.id}`);
436
+ continue;
437
+ }
438
+ try {
439
+ const adapter = registration.factory(config);
440
+ if (adapter.canHandle()) {
441
+ this._log(`Detected adapter: ${registration.id} (priority: ${adapter.priority})`);
442
+ return adapter;
443
+ }
444
+ this._log(`Adapter ${registration.id} cannot handle current environment`);
445
+ } catch (error) {
446
+ this._log(`Error creating adapter ${registration.id}: ${error}`);
447
+ }
448
+ }
449
+ this._log("No suitable adapter detected");
450
+ return void 0;
451
+ }
452
+ /**
453
+ * Get all adapters that can handle the current environment.
454
+ * Useful for debugging or showing available options.
455
+ * @returns Array of compatible adapters sorted by priority (highest first)
456
+ */
457
+ detectAll() {
458
+ const candidates = this._getSortedCandidates();
459
+ const compatible = [];
460
+ for (const registration of candidates) {
461
+ if (this._disabledAdapters.has(registration.id)) {
462
+ continue;
463
+ }
464
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(registration.id));
465
+ if (config?.enabled === false) {
466
+ continue;
467
+ }
468
+ try {
469
+ const adapter = registration.factory(config);
470
+ if (adapter.canHandle()) {
471
+ compatible.push(adapter);
472
+ }
473
+ } catch {
474
+ }
475
+ }
476
+ return compatible;
477
+ }
478
+ /**
479
+ * Clear all registered adapters.
480
+ */
481
+ clear() {
482
+ this._adapters.clear();
483
+ this._disabledAdapters.clear();
484
+ this._adapterConfigs.clear();
485
+ this._log("Cleared all adapters");
486
+ }
487
+ /**
488
+ * Get sorted candidate adapters by priority (highest first).
489
+ */
490
+ _getSortedCandidates() {
491
+ const registrations = Array.from(this._adapters.values());
492
+ const withPriority = registrations.map((reg) => {
493
+ try {
494
+ const adapter = reg.factory(reg.defaultConfig);
495
+ return { registration: reg, priority: adapter.priority };
496
+ } catch {
497
+ return { registration: reg, priority: -1 };
498
+ }
499
+ });
500
+ withPriority.sort((a, b) => b.priority - a.priority);
501
+ return withPriority.map((item) => item.registration);
502
+ }
503
+ /**
504
+ * Merge default config with user config.
505
+ */
506
+ _mergeConfig(defaultConfig, userConfig) {
507
+ if (!defaultConfig && !userConfig) {
508
+ return void 0;
509
+ }
510
+ return {
511
+ ...defaultConfig,
512
+ ...userConfig,
513
+ options: {
514
+ ...defaultConfig?.options,
515
+ ...userConfig?.options
516
+ }
517
+ };
518
+ }
519
+ /**
520
+ * Log debug message if debugging is enabled.
521
+ */
522
+ _log(message) {
523
+ if (this._debug) {
524
+ console.log(`[AdapterRegistry] ${message}`);
525
+ }
526
+ }
527
+ };
528
+ var defaultRegistry = new AdapterRegistry();
529
+
530
+ // libs/ui/src/bridge/core/bridge-factory.ts
531
+ var DEFAULT_CONFIG = {
532
+ debug: false,
533
+ initTimeout: 5e3
534
+ };
535
+ var FrontMcpBridge = class {
536
+ _config;
537
+ _registry;
538
+ _adapter;
539
+ _initialized = false;
540
+ _initPromise;
541
+ /**
542
+ * Create a new FrontMcpBridge instance.
543
+ * @param config - Bridge configuration
544
+ * @param registry - Optional custom adapter registry (uses default if not provided)
545
+ */
546
+ constructor(config = {}, registry) {
547
+ this._config = { ...DEFAULT_CONFIG, ...config };
548
+ this._registry = registry || defaultRegistry;
549
+ if (this._config.debug) {
550
+ this._registry.setDebug(true);
551
+ }
552
+ if (this._config.disabledAdapters) {
553
+ this._registry.disable(...this._config.disabledAdapters);
554
+ }
555
+ if (this._config.adapterConfigs) {
556
+ for (const [id, adapterConfig] of Object.entries(this._config.adapterConfigs)) {
557
+ this._registry.configure(id, adapterConfig);
558
+ }
559
+ }
560
+ }
561
+ // ============================================
562
+ // Public Properties
563
+ // ============================================
564
+ /**
565
+ * Whether the bridge has been initialized.
566
+ */
567
+ get initialized() {
568
+ return this._initialized;
569
+ }
570
+ /**
571
+ * Current adapter ID, or undefined if not initialized.
572
+ */
573
+ get adapterId() {
574
+ return this._adapter?.id;
575
+ }
576
+ /**
577
+ * Current adapter capabilities, or undefined if not initialized.
578
+ */
579
+ get capabilities() {
580
+ return this._adapter?.capabilities;
581
+ }
582
+ // ============================================
583
+ // Lifecycle
584
+ // ============================================
585
+ /**
586
+ * Initialize the bridge.
587
+ * Auto-detects the best adapter for the current platform unless
588
+ * `forceAdapter` is specified in the config.
589
+ *
590
+ * @throws Error if no suitable adapter is found
591
+ */
592
+ async initialize() {
593
+ if (this._initPromise) {
594
+ return this._initPromise;
595
+ }
596
+ if (this._initialized) {
597
+ return;
598
+ }
599
+ this._initPromise = this._doInitialize();
600
+ try {
601
+ await this._initPromise;
602
+ } finally {
603
+ this._initPromise = void 0;
604
+ }
605
+ }
606
+ /**
607
+ * Internal initialization logic.
608
+ */
609
+ async _doInitialize() {
610
+ this._log("Initializing FrontMcpBridge...");
611
+ if (this._config.forceAdapter) {
612
+ this._adapter = this._registry.get(this._config.forceAdapter);
613
+ if (!this._adapter) {
614
+ throw new Error(`Forced adapter "${this._config.forceAdapter}" not found or disabled`);
615
+ }
616
+ this._log(`Using forced adapter: ${this._config.forceAdapter}`);
617
+ } else {
618
+ this._adapter = this._registry.detect();
619
+ if (!this._adapter) {
620
+ throw new Error("No suitable adapter detected for current environment");
621
+ }
622
+ this._log(`Auto-detected adapter: ${this._adapter.id}`);
623
+ }
624
+ try {
625
+ await this._withTimeout(this._adapter.initialize(), this._config.initTimeout || 5e3);
626
+ this._initialized = true;
627
+ this._log(`Bridge initialized with adapter: ${this._adapter.id}`);
628
+ this._emitEvent("bridge:ready", { adapter: this._adapter.id });
629
+ } catch (error) {
630
+ this._emitEvent("bridge:error", {
631
+ error: error instanceof Error ? error : new Error(String(error)),
632
+ adapter: this._adapter?.id
633
+ });
634
+ throw error;
635
+ }
636
+ }
637
+ /**
638
+ * Dispose the bridge and release resources.
639
+ */
640
+ dispose() {
641
+ if (this._adapter) {
642
+ this._adapter.dispose();
643
+ this._log(`Disposed adapter: ${this._adapter.id}`);
644
+ }
645
+ this._adapter = void 0;
646
+ this._initialized = false;
647
+ }
648
+ // ============================================
649
+ // Adapter Access
650
+ // ============================================
651
+ /**
652
+ * Get the active adapter instance.
653
+ */
654
+ getAdapter() {
655
+ return this._adapter;
656
+ }
657
+ /**
658
+ * Check if a specific capability is available.
659
+ * @param cap - Capability key to check
660
+ */
661
+ hasCapability(cap) {
662
+ return this._adapter?.capabilities[cap] === true;
663
+ }
664
+ // ============================================
665
+ // Data Access (delegate to adapter)
666
+ // ============================================
667
+ /**
668
+ * Get current theme.
669
+ */
670
+ getTheme() {
671
+ this._ensureInitialized();
672
+ return this._adapter.getTheme();
673
+ }
674
+ /**
675
+ * Get current display mode.
676
+ */
677
+ getDisplayMode() {
678
+ this._ensureInitialized();
679
+ return this._adapter.getDisplayMode();
680
+ }
681
+ /**
682
+ * Get tool input arguments.
683
+ */
684
+ getToolInput() {
685
+ this._ensureInitialized();
686
+ return this._adapter.getToolInput();
687
+ }
688
+ /**
689
+ * Get tool output/result.
690
+ */
691
+ getToolOutput() {
692
+ this._ensureInitialized();
693
+ return this._adapter.getToolOutput();
694
+ }
695
+ /**
696
+ * Get structured content (parsed output).
697
+ */
698
+ getStructuredContent() {
699
+ this._ensureInitialized();
700
+ return this._adapter.getStructuredContent();
701
+ }
702
+ /**
703
+ * Get persisted widget state.
704
+ */
705
+ getWidgetState() {
706
+ this._ensureInitialized();
707
+ return this._adapter.getWidgetState();
708
+ }
709
+ /**
710
+ * Get full host context.
711
+ */
712
+ getHostContext() {
713
+ this._ensureInitialized();
714
+ return this._adapter.getHostContext();
715
+ }
716
+ // ============================================
717
+ // Actions (delegate to adapter)
718
+ // ============================================
719
+ /**
720
+ * Call a tool on the MCP server.
721
+ * @param name - Tool name
722
+ * @param args - Tool arguments
723
+ */
724
+ async callTool(name, args) {
725
+ this._ensureInitialized();
726
+ if (!this.hasCapability("canCallTools")) {
727
+ throw new Error("Tool calls are not supported by the current adapter");
728
+ }
729
+ return this._adapter.callTool(name, args);
730
+ }
731
+ /**
732
+ * Send a follow-up message to the conversation.
733
+ * @param content - Message content
734
+ */
735
+ async sendMessage(content) {
736
+ this._ensureInitialized();
737
+ if (!this.hasCapability("canSendMessages")) {
738
+ throw new Error("Sending messages is not supported by the current adapter");
739
+ }
740
+ return this._adapter.sendMessage(content);
741
+ }
742
+ /**
743
+ * Open an external link.
744
+ * @param url - URL to open
745
+ */
746
+ async openLink(url) {
747
+ this._ensureInitialized();
748
+ return this._adapter.openLink(url);
749
+ }
750
+ /**
751
+ * Request a display mode change.
752
+ * @param mode - Desired display mode
753
+ */
754
+ async requestDisplayMode(mode) {
755
+ this._ensureInitialized();
756
+ return this._adapter.requestDisplayMode(mode);
757
+ }
758
+ /**
759
+ * Request widget close.
760
+ */
761
+ async requestClose() {
762
+ this._ensureInitialized();
763
+ return this._adapter.requestClose();
764
+ }
765
+ /**
766
+ * Set widget state (persisted across sessions).
767
+ * @param state - State object to persist
768
+ */
769
+ setWidgetState(state) {
770
+ this._ensureInitialized();
771
+ this._adapter.setWidgetState(state);
772
+ }
773
+ // ============================================
774
+ // Events (delegate to adapter)
775
+ // ============================================
776
+ /**
777
+ * Subscribe to host context changes.
778
+ * @param callback - Called when context changes
779
+ * @returns Unsubscribe function
780
+ */
781
+ onContextChange(callback) {
782
+ this._ensureInitialized();
783
+ return this._adapter.onContextChange(callback);
784
+ }
785
+ /**
786
+ * Subscribe to tool result updates.
787
+ * @param callback - Called when tool result is received
788
+ * @returns Unsubscribe function
789
+ */
790
+ onToolResult(callback) {
791
+ this._ensureInitialized();
792
+ return this._adapter.onToolResult(callback);
793
+ }
794
+ // ============================================
795
+ // Private Helpers
796
+ // ============================================
797
+ /**
798
+ * Ensure the bridge is initialized before operations.
799
+ */
800
+ _ensureInitialized() {
801
+ if (!this._initialized || !this._adapter) {
802
+ throw new Error("FrontMcpBridge is not initialized. Call initialize() first.");
803
+ }
804
+ }
805
+ /**
806
+ * Wrap a promise with a timeout.
807
+ */
808
+ _withTimeout(promise, ms) {
809
+ return new Promise((resolve, reject) => {
810
+ const timer = setTimeout(() => {
811
+ reject(new Error(`Operation timed out after ${ms}ms`));
812
+ }, ms);
813
+ promise.then((result) => {
814
+ clearTimeout(timer);
815
+ resolve(result);
816
+ }).catch((error) => {
817
+ clearTimeout(timer);
818
+ reject(error);
819
+ });
820
+ });
821
+ }
822
+ /**
823
+ * Emit a bridge event via CustomEvent.
824
+ */
825
+ _emitEvent(type, payload) {
826
+ if (typeof window !== "undefined" && typeof CustomEvent !== "undefined") {
827
+ try {
828
+ const event = new CustomEvent(type, { detail: payload });
829
+ window.dispatchEvent(event);
830
+ } catch {
831
+ }
832
+ }
833
+ }
834
+ /**
835
+ * Log debug message if debugging is enabled.
836
+ */
837
+ _log(message) {
838
+ if (this._config.debug) {
839
+ console.log(`[FrontMcpBridge] ${message}`);
840
+ }
841
+ }
842
+ };
843
+
844
+ // libs/ui/src/bridge/adapters/base-adapter.ts
845
+ var DEFAULT_CAPABILITIES = {
846
+ canCallTools: false,
847
+ canSendMessages: false,
848
+ canOpenLinks: false,
849
+ canPersistState: true,
850
+ // localStorage fallback
851
+ hasNetworkAccess: true,
852
+ supportsDisplayModes: false,
853
+ supportsTheme: true
854
+ };
855
+ var DEFAULT_SAFE_AREA = {
856
+ top: 0,
857
+ bottom: 0,
858
+ left: 0,
859
+ right: 0
860
+ };
861
+ var BaseAdapter = class {
862
+ _capabilities = { ...DEFAULT_CAPABILITIES };
863
+ _hostContext;
864
+ _widgetState = {};
865
+ _toolInput = {};
866
+ _toolOutput = void 0;
867
+ _structuredContent = void 0;
868
+ _initialized = false;
869
+ _contextListeners = /* @__PURE__ */ new Set();
870
+ _toolResultListeners = /* @__PURE__ */ new Set();
871
+ constructor() {
872
+ this._hostContext = this._createDefaultHostContext();
873
+ }
874
+ get capabilities() {
875
+ return this._capabilities;
876
+ }
877
+ async initialize() {
878
+ if (this._initialized) return;
879
+ this._loadWidgetState();
880
+ this._readInjectedData();
881
+ this._initialized = true;
882
+ }
883
+ dispose() {
884
+ this._contextListeners.clear();
885
+ this._toolResultListeners.clear();
886
+ this._initialized = false;
887
+ }
888
+ // ============================================
889
+ // Data Access
890
+ // ============================================
891
+ getTheme() {
892
+ return this._hostContext.theme;
893
+ }
894
+ getDisplayMode() {
895
+ return this._hostContext.displayMode;
896
+ }
897
+ getUserAgent() {
898
+ return this._hostContext.userAgent;
899
+ }
900
+ getLocale() {
901
+ return this._hostContext.locale;
902
+ }
903
+ getToolInput() {
904
+ return this._toolInput;
905
+ }
906
+ getToolOutput() {
907
+ return this._toolOutput;
908
+ }
909
+ getStructuredContent() {
910
+ return this._structuredContent;
911
+ }
912
+ getWidgetState() {
913
+ return this._widgetState;
914
+ }
915
+ getSafeArea() {
916
+ return this._hostContext.safeArea;
917
+ }
918
+ getViewport() {
919
+ return this._hostContext.viewport;
920
+ }
921
+ getHostContext() {
922
+ return { ...this._hostContext };
923
+ }
924
+ // ============================================
925
+ // Actions (override in subclasses for real functionality)
926
+ // ============================================
927
+ async callTool(_name, _args) {
928
+ if (!this._capabilities.canCallTools) {
929
+ throw new Error(`Tool calls are not supported by ${this.name} adapter`);
930
+ }
931
+ throw new Error("callTool not implemented");
932
+ }
933
+ async sendMessage(_content) {
934
+ if (!this._capabilities.canSendMessages) {
935
+ throw new Error(`Sending messages is not supported by ${this.name} adapter`);
936
+ }
937
+ throw new Error("sendMessage not implemented");
938
+ }
939
+ async openLink(url) {
940
+ if (!this._capabilities.canOpenLinks) {
941
+ if (typeof window !== "undefined") {
942
+ window.open(url, "_blank", "noopener,noreferrer");
943
+ return;
944
+ }
945
+ throw new Error(`Opening links is not supported by ${this.name} adapter`);
946
+ }
947
+ throw new Error("openLink not implemented");
948
+ }
949
+ async requestDisplayMode(_mode) {
950
+ if (!this._capabilities.supportsDisplayModes) {
951
+ return;
952
+ }
953
+ throw new Error("requestDisplayMode not implemented");
954
+ }
955
+ async requestClose() {
956
+ }
957
+ setWidgetState(state) {
958
+ this._widgetState = { ...this._widgetState, ...state };
959
+ this._persistWidgetState();
960
+ }
961
+ // ============================================
962
+ // Events
963
+ // ============================================
964
+ onContextChange(callback) {
965
+ this._contextListeners.add(callback);
966
+ return () => {
967
+ this._contextListeners.delete(callback);
968
+ };
969
+ }
970
+ onToolResult(callback) {
971
+ this._toolResultListeners.add(callback);
972
+ return () => {
973
+ this._toolResultListeners.delete(callback);
974
+ };
975
+ }
976
+ // ============================================
977
+ // Protected Helpers
978
+ // ============================================
979
+ /**
980
+ * Create default host context from environment detection.
981
+ */
982
+ _createDefaultHostContext() {
983
+ return {
984
+ theme: this._detectTheme(),
985
+ displayMode: "inline",
986
+ locale: this._detectLocale(),
987
+ userAgent: this._detectUserAgent(),
988
+ safeArea: DEFAULT_SAFE_AREA,
989
+ viewport: this._detectViewport()
990
+ };
991
+ }
992
+ /**
993
+ * Detect theme from CSS media query.
994
+ */
995
+ _detectTheme() {
996
+ if (typeof window !== "undefined" && window.matchMedia) {
997
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
998
+ }
999
+ return "light";
1000
+ }
1001
+ /**
1002
+ * Detect locale from navigator.
1003
+ */
1004
+ _detectLocale() {
1005
+ if (typeof navigator !== "undefined") {
1006
+ return navigator.language || "en-US";
1007
+ }
1008
+ return "en-US";
1009
+ }
1010
+ /**
1011
+ * Detect user agent capabilities.
1012
+ */
1013
+ _detectUserAgent() {
1014
+ if (typeof navigator === "undefined") {
1015
+ return { type: "web", hover: true, touch: false };
1016
+ }
1017
+ const ua = navigator.userAgent || "";
1018
+ const isMobile = /iPhone|iPad|iPod|Android/i.test(ua);
1019
+ const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
1020
+ const hasHover = typeof window !== "undefined" && window.matchMedia && window.matchMedia("(hover: hover)").matches;
1021
+ return {
1022
+ type: isMobile ? "mobile" : "web",
1023
+ hover: hasHover !== false,
1024
+ touch: hasTouch
1025
+ };
1026
+ }
1027
+ /**
1028
+ * Detect viewport dimensions.
1029
+ */
1030
+ _detectViewport() {
1031
+ if (typeof window !== "undefined") {
1032
+ return {
1033
+ width: window.innerWidth,
1034
+ height: window.innerHeight
1035
+ };
1036
+ }
1037
+ return void 0;
1038
+ }
1039
+ /**
1040
+ * Read injected tool data from window globals.
1041
+ */
1042
+ _readInjectedData() {
1043
+ if (typeof window === "undefined") return;
1044
+ const win = window;
1045
+ if (win.__mcpToolInput) {
1046
+ this._toolInput = win.__mcpToolInput;
1047
+ }
1048
+ if (win.__mcpToolOutput) {
1049
+ this._toolOutput = win.__mcpToolOutput;
1050
+ }
1051
+ if (win.__mcpStructuredContent) {
1052
+ this._structuredContent = win.__mcpStructuredContent;
1053
+ }
1054
+ if (win.__mcpHostContext) {
1055
+ this._hostContext = { ...this._hostContext, ...win.__mcpHostContext };
1056
+ }
1057
+ }
1058
+ /**
1059
+ * Load widget state from localStorage.
1060
+ */
1061
+ _loadWidgetState() {
1062
+ if (typeof localStorage === "undefined") return;
1063
+ try {
1064
+ const key = this._getStateKey();
1065
+ const stored = localStorage.getItem(key);
1066
+ if (stored) {
1067
+ this._widgetState = JSON.parse(stored);
1068
+ }
1069
+ } catch {
1070
+ }
1071
+ }
1072
+ /**
1073
+ * Persist widget state to localStorage.
1074
+ */
1075
+ _persistWidgetState() {
1076
+ if (typeof localStorage === "undefined") return;
1077
+ try {
1078
+ const key = this._getStateKey();
1079
+ localStorage.setItem(key, JSON.stringify(this._widgetState));
1080
+ } catch {
1081
+ }
1082
+ }
1083
+ /**
1084
+ * Get localStorage key for widget state.
1085
+ */
1086
+ _getStateKey() {
1087
+ if (typeof window !== "undefined") {
1088
+ const toolName = window.__mcpToolName || "unknown";
1089
+ return `frontmcp:widget:${toolName}`;
1090
+ }
1091
+ return "frontmcp:widget:unknown";
1092
+ }
1093
+ /**
1094
+ * Notify context change listeners.
1095
+ */
1096
+ _notifyContextChange(changes) {
1097
+ this._hostContext = { ...this._hostContext, ...changes };
1098
+ this._contextListeners.forEach((cb) => {
1099
+ try {
1100
+ cb(changes);
1101
+ } catch (e) {
1102
+ console.error("[FrontMcpBridge] Context change listener error:", e);
1103
+ }
1104
+ });
1105
+ }
1106
+ /**
1107
+ * Notify tool result listeners.
1108
+ */
1109
+ _notifyToolResult(result) {
1110
+ this._toolOutput = result;
1111
+ this._toolResultListeners.forEach((cb) => {
1112
+ try {
1113
+ cb(result);
1114
+ } catch (e) {
1115
+ console.error("[FrontMcpBridge] Tool result listener error:", e);
1116
+ }
1117
+ });
1118
+ }
1119
+ };
1120
+
1121
+ // libs/ui/src/bridge/adapters/openai.adapter.ts
1122
+ var OpenAIAdapter = class extends BaseAdapter {
1123
+ id = "openai";
1124
+ name = "OpenAI ChatGPT";
1125
+ priority = 100;
1126
+ // Highest priority
1127
+ _openai;
1128
+ _unsubscribeContext;
1129
+ _unsubscribeToolResult;
1130
+ constructor() {
1131
+ super();
1132
+ this._capabilities = {
1133
+ ...DEFAULT_CAPABILITIES,
1134
+ canCallTools: true,
1135
+ canSendMessages: true,
1136
+ canOpenLinks: true,
1137
+ canPersistState: true,
1138
+ hasNetworkAccess: true,
1139
+ supportsDisplayModes: true,
1140
+ supportsTheme: true
1141
+ };
1142
+ }
1143
+ /**
1144
+ * Check if OpenAI Apps SDK is available.
1145
+ */
1146
+ canHandle() {
1147
+ if (typeof window === "undefined") return false;
1148
+ const win = window;
1149
+ return Boolean(win.openai?.canvas);
1150
+ }
1151
+ /**
1152
+ * Initialize the OpenAI adapter.
1153
+ */
1154
+ async initialize() {
1155
+ if (this._initialized) return;
1156
+ this._openai = window.openai;
1157
+ await super.initialize();
1158
+ this._syncContextFromSDK();
1159
+ if (this._openai?.canvas?.onContextChange) {
1160
+ this._unsubscribeContext = this._openai.canvas.onContextChange((changes) => {
1161
+ this._notifyContextChange(changes);
1162
+ });
1163
+ }
1164
+ if (this._openai?.canvas?.onToolResult) {
1165
+ this._unsubscribeToolResult = this._openai.canvas.onToolResult((result) => {
1166
+ this._notifyToolResult(result);
1167
+ });
1168
+ }
1169
+ }
1170
+ /**
1171
+ * Dispose adapter resources.
1172
+ */
1173
+ dispose() {
1174
+ if (this._unsubscribeContext) {
1175
+ this._unsubscribeContext();
1176
+ this._unsubscribeContext = void 0;
1177
+ }
1178
+ if (this._unsubscribeToolResult) {
1179
+ this._unsubscribeToolResult();
1180
+ this._unsubscribeToolResult = void 0;
1181
+ }
1182
+ this._openai = void 0;
1183
+ super.dispose();
1184
+ }
1185
+ // ============================================
1186
+ // Data Access (override with SDK calls)
1187
+ // ============================================
1188
+ getTheme() {
1189
+ if (this._openai?.canvas?.getTheme) {
1190
+ const theme = this._openai.canvas.getTheme();
1191
+ return theme === "dark" ? "dark" : "light";
1192
+ }
1193
+ return super.getTheme();
1194
+ }
1195
+ getDisplayMode() {
1196
+ if (this._openai?.canvas?.getDisplayMode) {
1197
+ const mode = this._openai.canvas.getDisplayMode();
1198
+ if (mode === "fullscreen" || mode === "pip" || mode === "carousel") {
1199
+ return mode;
1200
+ }
1201
+ return "inline";
1202
+ }
1203
+ return super.getDisplayMode();
1204
+ }
1205
+ // ============================================
1206
+ // Actions (proxy to SDK)
1207
+ // ============================================
1208
+ async callTool(name, args) {
1209
+ if (!this._openai?.canvas?.callServerTool) {
1210
+ throw new Error("callServerTool not available in OpenAI SDK");
1211
+ }
1212
+ return this._openai.canvas.callServerTool(name, args);
1213
+ }
1214
+ async sendMessage(content) {
1215
+ if (!this._openai?.canvas?.sendMessage) {
1216
+ throw new Error("sendMessage not available in OpenAI SDK");
1217
+ }
1218
+ await this._openai.canvas.sendMessage(content);
1219
+ }
1220
+ async openLink(url) {
1221
+ if (!this._openai?.canvas?.openLink) {
1222
+ return super.openLink(url);
1223
+ }
1224
+ await this._openai.canvas.openLink(url);
1225
+ }
1226
+ async requestDisplayMode(mode) {
1227
+ if (!this._openai?.canvas?.setDisplayMode) {
1228
+ return super.requestDisplayMode(mode);
1229
+ }
1230
+ await this._openai.canvas.setDisplayMode(mode);
1231
+ this._hostContext = { ...this._hostContext, displayMode: mode };
1232
+ }
1233
+ async requestClose() {
1234
+ if (this._openai?.canvas?.close) {
1235
+ await this._openai.canvas.close();
1236
+ }
1237
+ }
1238
+ // ============================================
1239
+ // Private Helpers
1240
+ // ============================================
1241
+ /**
1242
+ * Sync context from OpenAI SDK.
1243
+ */
1244
+ _syncContextFromSDK() {
1245
+ if (!this._openai?.canvas) return;
1246
+ if (this._openai.canvas.getTheme) {
1247
+ const theme = this._openai.canvas.getTheme();
1248
+ this._hostContext.theme = theme === "dark" ? "dark" : "light";
1249
+ }
1250
+ if (this._openai.canvas.getDisplayMode) {
1251
+ const mode = this._openai.canvas.getDisplayMode();
1252
+ if (mode === "fullscreen" || mode === "pip" || mode === "carousel" || mode === "inline") {
1253
+ this._hostContext.displayMode = mode;
1254
+ }
1255
+ }
1256
+ if (this._openai.canvas.getContext) {
1257
+ const ctx = this._openai.canvas.getContext();
1258
+ if (ctx) {
1259
+ this._hostContext = { ...this._hostContext, ...ctx };
1260
+ }
1261
+ }
1262
+ }
1263
+ };
1264
+ function createOpenAIAdapter() {
1265
+ return new OpenAIAdapter();
1266
+ }
1267
+
1268
+ // libs/ui/src/bridge/adapters/ext-apps.adapter.ts
1269
+ var ExtAppsAdapter = class extends BaseAdapter {
1270
+ id = "ext-apps";
1271
+ name = "ext-apps (SEP-1865)";
1272
+ priority = 80;
1273
+ // High priority, but below OpenAI native
1274
+ _config;
1275
+ _messageListener;
1276
+ _pendingRequests = /* @__PURE__ */ new Map();
1277
+ _requestId = 0;
1278
+ _trustedOrigin;
1279
+ _hostCapabilities = {};
1280
+ constructor(config) {
1281
+ super();
1282
+ this._config = config || {};
1283
+ this._capabilities = {
1284
+ ...DEFAULT_CAPABILITIES,
1285
+ canPersistState: true,
1286
+ hasNetworkAccess: true,
1287
+ // ext-apps usually allows network
1288
+ supportsTheme: true
1289
+ };
1290
+ }
1291
+ /**
1292
+ * Check if we're in an iframe (potential ext-apps context).
1293
+ */
1294
+ canHandle() {
1295
+ if (typeof window === "undefined") return false;
1296
+ const inIframe = window.parent !== window;
1297
+ if (!inIframe) return false;
1298
+ const win = window;
1299
+ if (win.openai?.canvas) return false;
1300
+ if (win.__mcpPlatform === "ext-apps") return true;
1301
+ return true;
1302
+ }
1303
+ /**
1304
+ * Initialize the ext-apps adapter with protocol handshake.
1305
+ */
1306
+ async initialize() {
1307
+ if (this._initialized) return;
1308
+ this._setupMessageListener();
1309
+ await super.initialize();
1310
+ await this._performHandshake();
1311
+ this._initialized = true;
1312
+ }
1313
+ /**
1314
+ * Dispose adapter resources.
1315
+ */
1316
+ dispose() {
1317
+ if (this._messageListener && typeof window !== "undefined") {
1318
+ window.removeEventListener("message", this._messageListener);
1319
+ this._messageListener = void 0;
1320
+ }
1321
+ for (const [id, pending] of this._pendingRequests) {
1322
+ clearTimeout(pending.timeout);
1323
+ pending.reject(new Error("Adapter disposed"));
1324
+ }
1325
+ this._pendingRequests.clear();
1326
+ super.dispose();
1327
+ }
1328
+ // ============================================
1329
+ // Actions (via JSON-RPC)
1330
+ // ============================================
1331
+ async callTool(name, args) {
1332
+ if (!this._hostCapabilities.serverToolProxy) {
1333
+ throw new Error("Server tool proxy not supported by host");
1334
+ }
1335
+ return this._sendRequest("ui/callServerTool", {
1336
+ name,
1337
+ arguments: args
1338
+ });
1339
+ }
1340
+ async sendMessage(content) {
1341
+ await this._sendRequest("ui/message", { content });
1342
+ }
1343
+ async openLink(url) {
1344
+ if (!this._hostCapabilities.openLink) {
1345
+ return super.openLink(url);
1346
+ }
1347
+ await this._sendRequest("ui/openLink", { url });
1348
+ }
1349
+ async requestDisplayMode(mode) {
1350
+ await this._sendRequest("ui/setDisplayMode", { mode });
1351
+ this._hostContext = { ...this._hostContext, displayMode: mode };
1352
+ }
1353
+ async requestClose() {
1354
+ await this._sendRequest("ui/close", {});
1355
+ }
1356
+ // ============================================
1357
+ // Private: Message Handling
1358
+ // ============================================
1359
+ /**
1360
+ * Setup postMessage listener for incoming messages.
1361
+ */
1362
+ _setupMessageListener() {
1363
+ if (typeof window === "undefined") return;
1364
+ this._messageListener = (event) => {
1365
+ this._handleMessage(event);
1366
+ };
1367
+ window.addEventListener("message", this._messageListener);
1368
+ }
1369
+ /**
1370
+ * Handle incoming postMessage events.
1371
+ */
1372
+ _handleMessage(event) {
1373
+ if (!this._isOriginTrusted(event.origin)) {
1374
+ return;
1375
+ }
1376
+ const data = event.data;
1377
+ if (!data || typeof data !== "object") return;
1378
+ if (data.jsonrpc !== "2.0") return;
1379
+ if ("id" in data && (data.result !== void 0 || data.error !== void 0)) {
1380
+ this._handleResponse(data);
1381
+ return;
1382
+ }
1383
+ if ("method" in data && !("id" in data)) {
1384
+ this._handleNotification(data);
1385
+ return;
1386
+ }
1387
+ }
1388
+ /**
1389
+ * Handle JSON-RPC response.
1390
+ */
1391
+ _handleResponse(response) {
1392
+ const pending = this._pendingRequests.get(response.id);
1393
+ if (!pending) return;
1394
+ clearTimeout(pending.timeout);
1395
+ this._pendingRequests.delete(response.id);
1396
+ if (response.error) {
1397
+ pending.reject(new Error(`${response.error.message} (code: ${response.error.code})`));
1398
+ } else {
1399
+ pending.resolve(response.result);
1400
+ }
1401
+ }
1402
+ /**
1403
+ * Handle JSON-RPC notification from host.
1404
+ */
1405
+ _handleNotification(notification) {
1406
+ switch (notification.method) {
1407
+ case "ui/notifications/tool-input":
1408
+ this._handleToolInput(notification.params);
1409
+ break;
1410
+ case "ui/notifications/tool-input-partial":
1411
+ this._handleToolInputPartial(notification.params);
1412
+ break;
1413
+ case "ui/notifications/tool-result":
1414
+ this._handleToolResult(notification.params);
1415
+ break;
1416
+ case "ui/notifications/host-context-changed":
1417
+ this._handleHostContextChange(notification.params);
1418
+ break;
1419
+ case "ui/notifications/initialized":
1420
+ break;
1421
+ case "ui/notifications/cancelled":
1422
+ this._handleCancelled(notification.params);
1423
+ break;
1424
+ }
1425
+ }
1426
+ /**
1427
+ * Handle tool input notification.
1428
+ */
1429
+ _handleToolInput(params) {
1430
+ this._toolInput = params.arguments || {};
1431
+ this._emitBridgeEvent("tool:input", { arguments: this._toolInput });
1432
+ }
1433
+ /**
1434
+ * Handle partial tool input (streaming).
1435
+ */
1436
+ _handleToolInputPartial(params) {
1437
+ this._toolInput = { ...this._toolInput, ...params.arguments };
1438
+ this._emitBridgeEvent("tool:input-partial", { arguments: this._toolInput });
1439
+ }
1440
+ /**
1441
+ * Handle tool result notification.
1442
+ */
1443
+ _handleToolResult(params) {
1444
+ this._toolOutput = params.content;
1445
+ this._structuredContent = params.structuredContent;
1446
+ this._notifyToolResult(params.content);
1447
+ this._emitBridgeEvent("tool:result", {
1448
+ content: params.content,
1449
+ structuredContent: params.structuredContent
1450
+ });
1451
+ }
1452
+ /**
1453
+ * Handle host context change notification.
1454
+ */
1455
+ _handleHostContextChange(params) {
1456
+ const changes = {};
1457
+ if (params.theme !== void 0) {
1458
+ changes.theme = params.theme;
1459
+ }
1460
+ if (params.displayMode !== void 0) {
1461
+ changes.displayMode = params.displayMode;
1462
+ }
1463
+ if (params.viewport !== void 0) {
1464
+ changes.viewport = params.viewport;
1465
+ }
1466
+ if (params.locale !== void 0) {
1467
+ changes.locale = params.locale;
1468
+ }
1469
+ if (params.timezone !== void 0) {
1470
+ changes.timezone = params.timezone;
1471
+ }
1472
+ this._notifyContextChange(changes);
1473
+ }
1474
+ /**
1475
+ * Handle cancellation notification.
1476
+ */
1477
+ _handleCancelled(params) {
1478
+ const reason = params?.reason;
1479
+ this._emitBridgeEvent("tool:cancelled", { reason });
1480
+ }
1481
+ // ============================================
1482
+ // Private: JSON-RPC Transport
1483
+ // ============================================
1484
+ /**
1485
+ * Send a JSON-RPC request to the host.
1486
+ */
1487
+ _sendRequest(method, params) {
1488
+ return new Promise((resolve, reject) => {
1489
+ const id = ++this._requestId;
1490
+ const timeout = this._config.options?.initTimeout || 1e4;
1491
+ const request = {
1492
+ jsonrpc: "2.0",
1493
+ id,
1494
+ method,
1495
+ params
1496
+ };
1497
+ const timeoutHandle = setTimeout(() => {
1498
+ this._pendingRequests.delete(id);
1499
+ reject(new Error(`Request ${method} timed out after ${timeout}ms`));
1500
+ }, timeout);
1501
+ this._pendingRequests.set(id, {
1502
+ resolve,
1503
+ reject,
1504
+ timeout: timeoutHandle
1505
+ });
1506
+ this._postMessage(request);
1507
+ });
1508
+ }
1509
+ /**
1510
+ * Send a JSON-RPC notification (no response expected).
1511
+ */
1512
+ _sendNotification(method, params) {
1513
+ const notification = {
1514
+ jsonrpc: "2.0",
1515
+ method,
1516
+ params
1517
+ };
1518
+ this._postMessage(notification);
1519
+ }
1520
+ /**
1521
+ * Post a message to the parent window.
1522
+ */
1523
+ _postMessage(message) {
1524
+ if (typeof window === "undefined") return;
1525
+ const targetOrigin = this._trustedOrigin || "*";
1526
+ window.parent.postMessage(message, targetOrigin);
1527
+ }
1528
+ // ============================================
1529
+ // Private: Handshake
1530
+ // ============================================
1531
+ /**
1532
+ * Perform the ui/initialize handshake with the host.
1533
+ */
1534
+ async _performHandshake() {
1535
+ const params = {
1536
+ appInfo: {
1537
+ name: this._config.options?.appName || "FrontMCP Widget",
1538
+ version: this._config.options?.appVersion || "1.0.0"
1539
+ },
1540
+ appCapabilities: {
1541
+ tools: {
1542
+ listChanged: false
1543
+ }
1544
+ },
1545
+ protocolVersion: this._config.options?.protocolVersion || "2024-11-05"
1546
+ };
1547
+ try {
1548
+ const result = await this._sendRequest("ui/initialize", params);
1549
+ this._hostCapabilities = result.hostCapabilities || {};
1550
+ this._capabilities = {
1551
+ ...this._capabilities,
1552
+ canCallTools: Boolean(this._hostCapabilities.serverToolProxy),
1553
+ canSendMessages: true,
1554
+ canOpenLinks: Boolean(this._hostCapabilities.openLink),
1555
+ supportsDisplayModes: true
1556
+ };
1557
+ if (result.hostContext) {
1558
+ this._hostContext = {
1559
+ ...this._hostContext,
1560
+ ...result.hostContext
1561
+ };
1562
+ }
1563
+ if (!this._config.options?.trustedOrigins?.length) {
1564
+ }
1565
+ } catch (error) {
1566
+ throw new Error(`ext-apps handshake failed: ${error}`);
1567
+ }
1568
+ }
1569
+ // ============================================
1570
+ // Private: Origin Security
1571
+ // ============================================
1572
+ /**
1573
+ * Check if an origin is trusted.
1574
+ * Uses trust-on-first-use if no explicit origins configured.
1575
+ */
1576
+ _isOriginTrusted(origin) {
1577
+ const trustedOrigins = this._config.options?.trustedOrigins;
1578
+ if (trustedOrigins && trustedOrigins.length > 0) {
1579
+ return trustedOrigins.includes(origin);
1580
+ }
1581
+ if (!this._trustedOrigin) {
1582
+ this._trustedOrigin = origin;
1583
+ return true;
1584
+ }
1585
+ return this._trustedOrigin === origin;
1586
+ }
1587
+ // ============================================
1588
+ // Private: Events
1589
+ // ============================================
1590
+ /**
1591
+ * Emit a bridge event via CustomEvent.
1592
+ */
1593
+ _emitBridgeEvent(type, detail) {
1594
+ if (typeof window !== "undefined" && typeof CustomEvent !== "undefined") {
1595
+ try {
1596
+ const event = new CustomEvent(type, { detail });
1597
+ window.dispatchEvent(event);
1598
+ } catch {
1599
+ }
1600
+ }
1601
+ }
1602
+ };
1603
+ function createExtAppsAdapter(config) {
1604
+ return new ExtAppsAdapter(config);
1605
+ }
1606
+
1607
+ // libs/ui/src/bridge/adapters/claude.adapter.ts
1608
+ var ClaudeAdapter = class extends BaseAdapter {
1609
+ id = "claude";
1610
+ name = "Claude (Anthropic)";
1611
+ priority = 60;
1612
+ constructor() {
1613
+ super();
1614
+ this._capabilities = {
1615
+ ...DEFAULT_CAPABILITIES,
1616
+ canCallTools: false,
1617
+ // Claude artifacts can't call tools
1618
+ canSendMessages: false,
1619
+ // Can't send messages back to conversation
1620
+ canOpenLinks: true,
1621
+ // Can open links via window.open
1622
+ canPersistState: true,
1623
+ // localStorage works
1624
+ hasNetworkAccess: false,
1625
+ // Network is blocked
1626
+ supportsDisplayModes: false,
1627
+ // No display mode control
1628
+ supportsTheme: true
1629
+ // Can detect system theme
1630
+ };
1631
+ }
1632
+ /**
1633
+ * Check if we're running in a Claude artifact/widget context.
1634
+ */
1635
+ canHandle() {
1636
+ if (typeof window === "undefined") return false;
1637
+ const win = window;
1638
+ if (win.__mcpPlatform === "claude") return true;
1639
+ if (win.claude) return true;
1640
+ if (win.__claudeArtifact) return true;
1641
+ if (typeof location !== "undefined") {
1642
+ const href = location.href;
1643
+ if (href.includes("claude.ai") || href.includes("anthropic.com")) {
1644
+ return true;
1645
+ }
1646
+ }
1647
+ return false;
1648
+ }
1649
+ /**
1650
+ * Initialize the Claude adapter.
1651
+ */
1652
+ async initialize() {
1653
+ if (this._initialized) return;
1654
+ await super.initialize();
1655
+ this._setupThemeListener();
1656
+ }
1657
+ /**
1658
+ * Open a link in a new tab.
1659
+ * This is one of the few actions available in Claude artifacts.
1660
+ */
1661
+ async openLink(url) {
1662
+ if (typeof window !== "undefined") {
1663
+ window.open(url, "_blank", "noopener,noreferrer");
1664
+ }
1665
+ }
1666
+ /**
1667
+ * Request display mode change (no-op for Claude).
1668
+ */
1669
+ async requestDisplayMode(_mode) {
1670
+ }
1671
+ /**
1672
+ * Request close (no-op for Claude).
1673
+ */
1674
+ async requestClose() {
1675
+ }
1676
+ // ============================================
1677
+ // Private Helpers
1678
+ // ============================================
1679
+ /**
1680
+ * Setup listener for system theme changes.
1681
+ */
1682
+ _setupThemeListener() {
1683
+ if (typeof window === "undefined" || !window.matchMedia) return;
1684
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1685
+ const handleChange = (e) => {
1686
+ const newTheme = e.matches ? "dark" : "light";
1687
+ if (newTheme !== this._hostContext.theme) {
1688
+ this._notifyContextChange({ theme: newTheme });
1689
+ }
1690
+ };
1691
+ if (mediaQuery.addEventListener) {
1692
+ mediaQuery.addEventListener("change", handleChange);
1693
+ } else if (mediaQuery.addListener) {
1694
+ mediaQuery.addListener(handleChange);
1695
+ }
1696
+ }
1697
+ };
1698
+ function createClaudeAdapter() {
1699
+ return new ClaudeAdapter();
1700
+ }
1701
+
1702
+ // libs/ui/src/bridge/adapters/gemini.adapter.ts
1703
+ var GeminiAdapter = class extends BaseAdapter {
1704
+ id = "gemini";
1705
+ name = "Google Gemini";
1706
+ priority = 40;
1707
+ _gemini;
1708
+ constructor() {
1709
+ super();
1710
+ this._capabilities = {
1711
+ ...DEFAULT_CAPABILITIES,
1712
+ canCallTools: false,
1713
+ // May be enabled if SDK supports it
1714
+ canSendMessages: false,
1715
+ // May be enabled if SDK supports it
1716
+ canOpenLinks: true,
1717
+ canPersistState: true,
1718
+ hasNetworkAccess: true,
1719
+ supportsDisplayModes: false,
1720
+ supportsTheme: true
1721
+ };
1722
+ }
1723
+ /**
1724
+ * Check if we're running in a Gemini context.
1725
+ */
1726
+ canHandle() {
1727
+ if (typeof window === "undefined") return false;
1728
+ const win = window;
1729
+ if (win.__mcpPlatform === "gemini") return true;
1730
+ if (win.gemini) return true;
1731
+ if (typeof location !== "undefined") {
1732
+ const href = location.href;
1733
+ if (href.includes("gemini.google.com") || href.includes("bard.google.com")) {
1734
+ return true;
1735
+ }
1736
+ }
1737
+ return false;
1738
+ }
1739
+ /**
1740
+ * Initialize the Gemini adapter.
1741
+ */
1742
+ async initialize() {
1743
+ if (this._initialized) return;
1744
+ const win = window;
1745
+ this._gemini = win.gemini;
1746
+ if (this._gemini?.ui) {
1747
+ if (this._gemini.ui.sendMessage) {
1748
+ this._capabilities = { ...this._capabilities, canSendMessages: true };
1749
+ }
1750
+ }
1751
+ await super.initialize();
1752
+ this._setupThemeListener();
1753
+ }
1754
+ /**
1755
+ * Get current theme.
1756
+ */
1757
+ getTheme() {
1758
+ if (this._gemini?.ui?.getTheme) {
1759
+ const theme = this._gemini.ui.getTheme();
1760
+ return theme === "dark" ? "dark" : "light";
1761
+ }
1762
+ return super.getTheme();
1763
+ }
1764
+ /**
1765
+ * Send a message (if supported by SDK).
1766
+ */
1767
+ async sendMessage(content) {
1768
+ if (this._gemini?.ui?.sendMessage) {
1769
+ await this._gemini.ui.sendMessage(content);
1770
+ return;
1771
+ }
1772
+ throw new Error("Sending messages is not supported by Gemini adapter");
1773
+ }
1774
+ /**
1775
+ * Open a link.
1776
+ */
1777
+ async openLink(url) {
1778
+ if (this._gemini?.ui?.openLink) {
1779
+ await this._gemini.ui.openLink(url);
1780
+ return;
1781
+ }
1782
+ return super.openLink(url);
1783
+ }
1784
+ // ============================================
1785
+ // Private Helpers
1786
+ // ============================================
1787
+ /**
1788
+ * Setup listener for system theme changes.
1789
+ */
1790
+ _setupThemeListener() {
1791
+ if (typeof window === "undefined" || !window.matchMedia) return;
1792
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1793
+ const handleChange = (e) => {
1794
+ if (!this._gemini?.ui?.getTheme) {
1795
+ const newTheme = e.matches ? "dark" : "light";
1796
+ if (newTheme !== this._hostContext.theme) {
1797
+ this._notifyContextChange({ theme: newTheme });
1798
+ }
1799
+ }
1800
+ };
1801
+ if (mediaQuery.addEventListener) {
1802
+ mediaQuery.addEventListener("change", handleChange);
1803
+ } else if (mediaQuery.addListener) {
1804
+ mediaQuery.addListener(handleChange);
1805
+ }
1806
+ }
1807
+ };
1808
+ function createGeminiAdapter() {
1809
+ return new GeminiAdapter();
1810
+ }
1811
+
1812
+ // libs/ui/src/bridge/adapters/generic.adapter.ts
1813
+ var GenericAdapter = class extends BaseAdapter {
1814
+ id = "generic";
1815
+ name = "Generic Web";
1816
+ priority = 0;
1817
+ // Lowest priority - fallback only
1818
+ constructor() {
1819
+ super();
1820
+ this._capabilities = {
1821
+ ...DEFAULT_CAPABILITIES,
1822
+ canCallTools: false,
1823
+ canSendMessages: false,
1824
+ canOpenLinks: true,
1825
+ // window.open works
1826
+ canPersistState: true,
1827
+ // localStorage works
1828
+ hasNetworkAccess: true,
1829
+ // Assume network available
1830
+ supportsDisplayModes: false,
1831
+ supportsTheme: true
1832
+ // System theme detection
1833
+ };
1834
+ }
1835
+ /**
1836
+ * Generic adapter can always handle the environment.
1837
+ * It serves as the fallback when no other adapter matches.
1838
+ */
1839
+ canHandle() {
1840
+ return typeof window !== "undefined";
1841
+ }
1842
+ /**
1843
+ * Initialize the generic adapter.
1844
+ */
1845
+ async initialize() {
1846
+ if (this._initialized) return;
1847
+ await super.initialize();
1848
+ this._setupThemeListener();
1849
+ }
1850
+ /**
1851
+ * Open a link using window.open.
1852
+ */
1853
+ async openLink(url) {
1854
+ if (typeof window !== "undefined") {
1855
+ window.open(url, "_blank", "noopener,noreferrer");
1856
+ }
1857
+ }
1858
+ // ============================================
1859
+ // Private Helpers
1860
+ // ============================================
1861
+ /**
1862
+ * Setup listener for system theme changes.
1863
+ */
1864
+ _setupThemeListener() {
1865
+ if (typeof window === "undefined" || !window.matchMedia) return;
1866
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1867
+ const handleChange = (e) => {
1868
+ const newTheme = e.matches ? "dark" : "light";
1869
+ if (newTheme !== this._hostContext.theme) {
1870
+ this._notifyContextChange({ theme: newTheme });
1871
+ }
1872
+ };
1873
+ if (mediaQuery.addEventListener) {
1874
+ mediaQuery.addEventListener("change", handleChange);
1875
+ } else if (mediaQuery.addListener) {
1876
+ mediaQuery.addListener(handleChange);
1877
+ }
1878
+ }
1879
+ };
1880
+ function createGenericAdapter() {
1881
+ return new GenericAdapter();
1882
+ }
1883
+
1884
+ // libs/ui/src/bridge/adapters/index.ts
1885
+ function registerBuiltInAdapters() {
1886
+ defaultRegistry.register("openai", createOpenAIAdapter);
1887
+ defaultRegistry.register("ext-apps", createExtAppsAdapter);
1888
+ defaultRegistry.register("claude", createClaudeAdapter);
1889
+ defaultRegistry.register("gemini", createGeminiAdapter);
1890
+ defaultRegistry.register("generic", createGenericAdapter);
1891
+ }
1892
+ registerBuiltInAdapters();
1893
+
1894
+ // libs/ui/src/bridge/runtime/iife-generator.ts
1895
+ function generateBridgeIIFE(options = {}) {
1896
+ const { debug = false, trustedOrigins = [], minify = false } = options;
1897
+ const adapters = options.adapters || ["openai", "ext-apps", "claude", "gemini", "generic"];
1898
+ const parts = [];
1899
+ parts.push("(function() {");
1900
+ parts.push('"use strict";');
1901
+ parts.push("");
1902
+ if (debug) {
1903
+ parts.push('function log(msg) { console.log("[FrontMcpBridge] " + msg); }');
1904
+ } else {
1905
+ parts.push("function log() {}");
1906
+ }
1907
+ parts.push("");
1908
+ parts.push("var DEFAULT_SAFE_AREA = { top: 0, bottom: 0, left: 0, right: 0 };");
1909
+ parts.push("");
1910
+ parts.push(generateContextDetection());
1911
+ parts.push("");
1912
+ parts.push(generateBaseCapabilities());
1913
+ parts.push("");
1914
+ if (adapters.includes("openai")) {
1915
+ parts.push(generateOpenAIAdapter());
1916
+ parts.push("");
1917
+ }
1918
+ if (adapters.includes("ext-apps")) {
1919
+ parts.push(generateExtAppsAdapter(trustedOrigins));
1920
+ parts.push("");
1921
+ }
1922
+ if (adapters.includes("claude")) {
1923
+ parts.push(generateClaudeAdapter());
1924
+ parts.push("");
1925
+ }
1926
+ if (adapters.includes("gemini")) {
1927
+ parts.push(generateGeminiAdapter());
1928
+ parts.push("");
1929
+ }
1930
+ if (adapters.includes("generic")) {
1931
+ parts.push(generateGenericAdapter());
1932
+ parts.push("");
1933
+ }
1934
+ parts.push(generatePlatformDetection(adapters));
1935
+ parts.push("");
1936
+ parts.push(generateBridgeClass());
1937
+ parts.push("");
1938
+ parts.push("var bridge = new FrontMcpBridge();");
1939
+ parts.push("bridge.initialize().then(function() {");
1940
+ parts.push(' log("Bridge initialized with adapter: " + bridge.adapterId);');
1941
+ parts.push(' window.dispatchEvent(new CustomEvent("bridge:ready", { detail: { adapter: bridge.adapterId } }));');
1942
+ parts.push("}).catch(function(err) {");
1943
+ parts.push(' console.error("[FrontMcpBridge] Init failed:", err);');
1944
+ parts.push(' window.dispatchEvent(new CustomEvent("bridge:error", { detail: { error: err } }));');
1945
+ parts.push("});");
1946
+ parts.push("");
1947
+ parts.push("window.FrontMcpBridge = bridge;");
1948
+ parts.push("})();");
1949
+ const code = parts.join("\n");
1950
+ if (minify) {
1951
+ return minifyJS(code);
1952
+ }
1953
+ return code;
1954
+ }
1955
+ function generateContextDetection() {
1956
+ return `
1957
+ function detectTheme() {
1958
+ if (typeof window !== 'undefined' && window.matchMedia) {
1959
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
1960
+ }
1961
+ return 'light';
1962
+ }
1963
+
1964
+ function detectLocale() {
1965
+ if (typeof navigator !== 'undefined') {
1966
+ return navigator.language || 'en-US';
1967
+ }
1968
+ return 'en-US';
1969
+ }
1970
+
1971
+ function detectUserAgent() {
1972
+ if (typeof navigator === 'undefined') {
1973
+ return { type: 'web', hover: true, touch: false };
1974
+ }
1975
+ var ua = navigator.userAgent || '';
1976
+ var isMobile = /iPhone|iPad|iPod|Android/i.test(ua);
1977
+ var hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
1978
+ var hasHover = window.matchMedia && window.matchMedia('(hover: hover)').matches;
1979
+ return { type: isMobile ? 'mobile' : 'web', hover: hasHover !== false, touch: hasTouch };
1980
+ }
1981
+
1982
+ function detectViewport() {
1983
+ if (typeof window !== 'undefined') {
1984
+ return { width: window.innerWidth, height: window.innerHeight };
1985
+ }
1986
+ return undefined;
1987
+ }
1988
+
1989
+ function readInjectedData() {
1990
+ var data = { toolInput: {}, toolOutput: undefined, structuredContent: undefined };
1991
+ if (typeof window !== 'undefined') {
1992
+ if (window.__mcpToolInput) data.toolInput = window.__mcpToolInput;
1993
+ if (window.__mcpToolOutput) data.toolOutput = window.__mcpToolOutput;
1994
+ if (window.__mcpStructuredContent) data.structuredContent = window.__mcpStructuredContent;
1995
+ }
1996
+ return data;
1997
+ }
1998
+ `.trim();
1999
+ }
2000
+ function generateBaseCapabilities() {
2001
+ return `
2002
+ var DEFAULT_CAPABILITIES = {
2003
+ canCallTools: false,
2004
+ canSendMessages: false,
2005
+ canOpenLinks: false,
2006
+ canPersistState: true,
2007
+ hasNetworkAccess: true,
2008
+ supportsDisplayModes: false,
2009
+ supportsTheme: true
2010
+ };
2011
+ `.trim();
2012
+ }
2013
+ function generateOpenAIAdapter() {
2014
+ return `
2015
+ var OpenAIAdapter = {
2016
+ id: 'openai',
2017
+ name: 'OpenAI ChatGPT',
2018
+ priority: 100,
2019
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
2020
+ canCallTools: true,
2021
+ canSendMessages: true,
2022
+ canOpenLinks: true,
2023
+ supportsDisplayModes: true
2024
+ }),
2025
+ canHandle: function() {
2026
+ if (typeof window === 'undefined') return false;
2027
+ // Check for window.openai.callTool (the actual OpenAI SDK API)
2028
+ if (window.openai && typeof window.openai.callTool === 'function') return true;
2029
+ // Also check if we're being injected with tool metadata (OpenAI injects toolOutput)
2030
+ if (window.openai && (window.openai.toolOutput !== undefined || window.openai.toolInput !== undefined)) return true;
2031
+ return false;
2032
+ },
2033
+ initialize: function(context) {
2034
+ var sdk = window.openai;
2035
+ context.sdk = sdk;
2036
+ // OpenAI SDK exposes theme and displayMode directly as properties
2037
+ if (sdk.theme) {
2038
+ context.hostContext.theme = sdk.theme;
2039
+ }
2040
+ if (sdk.displayMode) {
2041
+ context.hostContext.displayMode = sdk.displayMode;
2042
+ }
2043
+ // Note: OpenAI SDK does not have an onContextChange equivalent
2044
+ return Promise.resolve();
2045
+ },
2046
+ callTool: function(context, name, args) {
2047
+ return context.sdk.callTool(name, args);
2048
+ },
2049
+ sendMessage: function(context, content) {
2050
+ if (typeof context.sdk.sendFollowUpMessage === 'function') {
2051
+ return context.sdk.sendFollowUpMessage(content);
2052
+ }
2053
+ return Promise.reject(new Error('Messages not supported'));
2054
+ },
2055
+ openLink: function(context, url) {
2056
+ window.open(url, '_blank', 'noopener,noreferrer');
2057
+ return Promise.resolve();
2058
+ },
2059
+ requestDisplayMode: function(context, mode) {
2060
+ return Promise.resolve();
2061
+ },
2062
+ requestClose: function(context) {
2063
+ return Promise.resolve();
2064
+ }
2065
+ };
2066
+ `.trim();
2067
+ }
2068
+ function generateExtAppsAdapter(trustedOrigins) {
2069
+ const originsArray = trustedOrigins.length > 0 ? JSON.stringify(trustedOrigins) : "[]";
2070
+ return `
2071
+ var ExtAppsAdapter = {
2072
+ id: 'ext-apps',
2073
+ name: 'ext-apps (SEP-1865)',
2074
+ priority: 80,
2075
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, { canPersistState: true, hasNetworkAccess: true }),
2076
+ trustedOrigins: ${originsArray},
2077
+ trustedOrigin: null,
2078
+ pendingRequests: {},
2079
+ requestId: 0,
2080
+ hostCapabilities: {},
2081
+ canHandle: function() {
2082
+ if (typeof window === 'undefined') return false;
2083
+ if (window.parent === window) return false;
2084
+ // Check for OpenAI SDK (window.openai.callTool) - defer to OpenAIAdapter
2085
+ if (window.openai && typeof window.openai.callTool === 'function') return false;
2086
+ if (window.__mcpPlatform === 'ext-apps') return true;
2087
+ return true;
2088
+ },
2089
+ initialize: function(context) {
2090
+ var self = this;
2091
+ context.extApps = this;
2092
+
2093
+ window.addEventListener('message', function(event) {
2094
+ self.handleMessage(context, event);
2095
+ });
2096
+
2097
+ return self.performHandshake(context);
2098
+ },
2099
+ handleMessage: function(context, event) {
2100
+ if (!this.isOriginTrusted(event.origin)) return;
2101
+ var data = event.data;
2102
+ if (!data || typeof data !== 'object' || data.jsonrpc !== '2.0') return;
2103
+
2104
+ if ('id' in data && (data.result !== undefined || data.error !== undefined)) {
2105
+ var pending = this.pendingRequests[data.id];
2106
+ if (pending) {
2107
+ clearTimeout(pending.timeout);
2108
+ delete this.pendingRequests[data.id];
2109
+ if (data.error) {
2110
+ pending.reject(new Error(data.error.message + ' (code: ' + data.error.code + ')'));
2111
+ } else {
2112
+ pending.resolve(data.result);
2113
+ }
2114
+ }
2115
+ return;
2116
+ }
2117
+
2118
+ if ('method' in data && !('id' in data)) {
2119
+ this.handleNotification(context, data);
2120
+ }
2121
+ },
2122
+ handleNotification: function(context, notification) {
2123
+ var params = notification.params || {};
2124
+ switch (notification.method) {
2125
+ case 'ui/notifications/tool-input':
2126
+ context.toolInput = params.arguments || {};
2127
+ window.dispatchEvent(new CustomEvent('tool:input', { detail: { arguments: context.toolInput } }));
2128
+ break;
2129
+ case 'ui/notifications/tool-result':
2130
+ context.toolOutput = params.content;
2131
+ context.structuredContent = params.structuredContent;
2132
+ context.notifyToolResult(params.content);
2133
+ window.dispatchEvent(new CustomEvent('tool:result', { detail: params }));
2134
+ break;
2135
+ case 'ui/notifications/host-context-changed':
2136
+ Object.assign(context.hostContext, params);
2137
+ context.notifyContextChange(params);
2138
+ break;
2139
+ }
2140
+ },
2141
+ isOriginTrusted: function(origin) {
2142
+ if (this.trustedOrigins.length > 0) {
2143
+ return this.trustedOrigins.indexOf(origin) !== -1;
2144
+ }
2145
+ // When no trusted origins configured, only trust first message in iframe context
2146
+ // This helps mitigate race conditions where a malicious iframe could establish trust
2147
+ if (!this.trustedOrigin) {
2148
+ if (window.parent !== window && origin) {
2149
+ this.trustedOrigin = origin;
2150
+ return true;
2151
+ }
2152
+ return false;
2153
+ }
2154
+ return this.trustedOrigin === origin;
2155
+ },
2156
+ sendRequest: function(method, params) {
2157
+ var self = this;
2158
+ return new Promise(function(resolve, reject) {
2159
+ // Security: Require trusted origin before sending requests to prevent message leaks
2160
+ if (!self.trustedOrigin && self.trustedOrigins.length === 0) {
2161
+ reject(new Error('Cannot send request: no trusted origin established'));
2162
+ return;
2163
+ }
2164
+
2165
+ var id = ++self.requestId;
2166
+ var timeout = setTimeout(function() {
2167
+ delete self.pendingRequests[id];
2168
+ reject(new Error('Request ' + method + ' timed out'));
2169
+ }, 10000);
2170
+
2171
+ self.pendingRequests[id] = { resolve: resolve, reject: reject, timeout: timeout };
2172
+
2173
+ var targetOrigin = self.trustedOrigin || self.trustedOrigins[0];
2174
+ window.parent.postMessage({ jsonrpc: '2.0', id: id, method: method, params: params }, targetOrigin);
2175
+ });
2176
+ },
2177
+ performHandshake: function(context) {
2178
+ var self = this;
2179
+ var params = {
2180
+ appInfo: { name: 'FrontMCP Widget', version: '1.0.0' },
2181
+ appCapabilities: { tools: { listChanged: false } },
2182
+ protocolVersion: '2024-11-05'
2183
+ };
2184
+
2185
+ return this.sendRequest('ui/initialize', params).then(function(result) {
2186
+ self.hostCapabilities = result.hostCapabilities || {};
2187
+ self.capabilities = Object.assign({}, self.capabilities, {
2188
+ canCallTools: Boolean(self.hostCapabilities.serverToolProxy),
2189
+ canSendMessages: true,
2190
+ canOpenLinks: Boolean(self.hostCapabilities.openLink),
2191
+ supportsDisplayModes: true
2192
+ });
2193
+ if (result.hostContext) {
2194
+ Object.assign(context.hostContext, result.hostContext);
2195
+ }
2196
+ });
2197
+ },
2198
+ callTool: function(context, name, args) {
2199
+ if (!this.hostCapabilities.serverToolProxy) {
2200
+ return Promise.reject(new Error('Server tool proxy not supported'));
2201
+ }
2202
+ return this.sendRequest('ui/callServerTool', { name: name, arguments: args });
2203
+ },
2204
+ sendMessage: function(context, content) {
2205
+ return this.sendRequest('ui/message', { content: content });
2206
+ },
2207
+ openLink: function(context, url) {
2208
+ if (!this.hostCapabilities.openLink) {
2209
+ window.open(url, '_blank', 'noopener,noreferrer');
2210
+ return Promise.resolve();
2211
+ }
2212
+ return this.sendRequest('ui/openLink', { url: url });
2213
+ },
2214
+ requestDisplayMode: function(context, mode) {
2215
+ return this.sendRequest('ui/setDisplayMode', { mode: mode });
2216
+ },
2217
+ requestClose: function(context) {
2218
+ return this.sendRequest('ui/close', {});
2219
+ }
2220
+ };
2221
+ `.trim();
2222
+ }
2223
+ function generateClaudeAdapter() {
2224
+ return `
2225
+ var ClaudeAdapter = {
2226
+ id: 'claude',
2227
+ name: 'Claude (Anthropic)',
2228
+ priority: 60,
2229
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
2230
+ canCallTools: false,
2231
+ canSendMessages: false,
2232
+ canOpenLinks: true,
2233
+ hasNetworkAccess: false,
2234
+ supportsDisplayModes: false
2235
+ }),
2236
+ canHandle: function() {
2237
+ if (typeof window === 'undefined') return false;
2238
+ if (window.__mcpPlatform === 'claude') return true;
2239
+ if (window.claude) return true;
2240
+ if (window.__claudeArtifact) return true;
2241
+ if (typeof location !== 'undefined') {
2242
+ var href = location.href;
2243
+ if (href.indexOf('claude.ai') !== -1 || href.indexOf('anthropic.com') !== -1) return true;
2244
+ }
2245
+ return false;
2246
+ },
2247
+ initialize: function(context) {
2248
+ return Promise.resolve();
2249
+ },
2250
+ callTool: function() {
2251
+ return Promise.reject(new Error('Tool calls not supported in Claude'));
2252
+ },
2253
+ sendMessage: function() {
2254
+ return Promise.reject(new Error('Messages not supported in Claude'));
2255
+ },
2256
+ openLink: function(context, url) {
2257
+ window.open(url, '_blank', 'noopener,noreferrer');
2258
+ return Promise.resolve();
2259
+ },
2260
+ requestDisplayMode: function() {
2261
+ return Promise.resolve();
2262
+ },
2263
+ requestClose: function() {
2264
+ return Promise.resolve();
2265
+ }
2266
+ };
2267
+ `.trim();
2268
+ }
2269
+ function generateGeminiAdapter() {
2270
+ return `
2271
+ var GeminiAdapter = {
2272
+ id: 'gemini',
2273
+ name: 'Google Gemini',
2274
+ priority: 40,
2275
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
2276
+ canOpenLinks: true,
2277
+ hasNetworkAccess: true
2278
+ }),
2279
+ canHandle: function() {
2280
+ if (typeof window === 'undefined') return false;
2281
+ if (window.__mcpPlatform === 'gemini') return true;
2282
+ if (window.gemini) return true;
2283
+ if (typeof location !== 'undefined') {
2284
+ var href = location.href;
2285
+ if (href.indexOf('gemini.google.com') !== -1 || href.indexOf('bard.google.com') !== -1) return true;
2286
+ }
2287
+ return false;
2288
+ },
2289
+ initialize: function(context) {
2290
+ if (window.gemini && window.gemini.ui && window.gemini.ui.getTheme) {
2291
+ context.hostContext.theme = window.gemini.ui.getTheme() === 'dark' ? 'dark' : 'light';
2292
+ }
2293
+ return Promise.resolve();
2294
+ },
2295
+ callTool: function() {
2296
+ return Promise.reject(new Error('Tool calls not supported in Gemini'));
2297
+ },
2298
+ sendMessage: function(context, content) {
2299
+ if (window.gemini && window.gemini.ui && window.gemini.ui.sendMessage) {
2300
+ return window.gemini.ui.sendMessage(content);
2301
+ }
2302
+ return Promise.reject(new Error('Messages not supported in Gemini'));
2303
+ },
2304
+ openLink: function(context, url) {
2305
+ if (window.gemini && window.gemini.ui && window.gemini.ui.openLink) {
2306
+ return window.gemini.ui.openLink(url);
2307
+ }
2308
+ window.open(url, '_blank', 'noopener,noreferrer');
2309
+ return Promise.resolve();
2310
+ },
2311
+ requestDisplayMode: function() {
2312
+ return Promise.resolve();
2313
+ },
2314
+ requestClose: function() {
2315
+ return Promise.resolve();
2316
+ }
2317
+ };
2318
+ `.trim();
2319
+ }
2320
+ function generateGenericAdapter() {
2321
+ return `
2322
+ var GenericAdapter = {
2323
+ id: 'generic',
2324
+ name: 'Generic Web',
2325
+ priority: 0,
2326
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
2327
+ canOpenLinks: true,
2328
+ hasNetworkAccess: true
2329
+ }),
2330
+ canHandle: function() {
2331
+ return typeof window !== 'undefined';
2332
+ },
2333
+ initialize: function(context) {
2334
+ return Promise.resolve();
2335
+ },
2336
+ callTool: function() {
2337
+ return Promise.reject(new Error('Tool calls not supported'));
2338
+ },
2339
+ sendMessage: function() {
2340
+ return Promise.reject(new Error('Messages not supported'));
2341
+ },
2342
+ openLink: function(context, url) {
2343
+ window.open(url, '_blank', 'noopener,noreferrer');
2344
+ return Promise.resolve();
2345
+ },
2346
+ requestDisplayMode: function() {
2347
+ return Promise.resolve();
2348
+ },
2349
+ requestClose: function() {
2350
+ return Promise.resolve();
2351
+ }
2352
+ };
2353
+ `.trim();
2354
+ }
2355
+ function generatePlatformDetection(adapters) {
2356
+ const adapterVars = adapters.map((a) => {
2357
+ switch (a) {
2358
+ case "openai":
2359
+ return "OpenAIAdapter";
2360
+ case "ext-apps":
2361
+ return "ExtAppsAdapter";
2362
+ case "claude":
2363
+ return "ClaudeAdapter";
2364
+ case "gemini":
2365
+ return "GeminiAdapter";
2366
+ case "generic":
2367
+ return "GenericAdapter";
2368
+ default:
2369
+ return "";
2370
+ }
2371
+ }).filter(Boolean);
2372
+ return `
2373
+ var ADAPTERS = [${adapterVars.join(", ")}].sort(function(a, b) { return b.priority - a.priority; });
2374
+
2375
+ function detectPlatform() {
2376
+ for (var i = 0; i < ADAPTERS.length; i++) {
2377
+ if (ADAPTERS[i].canHandle()) {
2378
+ log('Detected platform: ' + ADAPTERS[i].id);
2379
+ return ADAPTERS[i];
2380
+ }
2381
+ }
2382
+ log('No platform detected, using generic');
2383
+ return GenericAdapter;
2384
+ }
2385
+ `.trim();
2386
+ }
2387
+ function generateBridgeClass() {
2388
+ return `
2389
+ function FrontMcpBridge() {
2390
+ this._adapter = null;
2391
+ this._initialized = false;
2392
+ this._context = {
2393
+ hostContext: {
2394
+ theme: detectTheme(),
2395
+ displayMode: 'inline',
2396
+ locale: detectLocale(),
2397
+ userAgent: detectUserAgent(),
2398
+ safeArea: DEFAULT_SAFE_AREA,
2399
+ viewport: detectViewport()
2400
+ },
2401
+ toolInput: {},
2402
+ toolOutput: undefined,
2403
+ structuredContent: undefined,
2404
+ widgetState: {},
2405
+ contextListeners: [],
2406
+ toolResultListeners: [],
2407
+ notifyContextChange: function(changes) {
2408
+ Object.assign(this.hostContext, changes);
2409
+ for (var i = 0; i < this.contextListeners.length; i++) {
2410
+ try { this.contextListeners[i](changes); } catch(e) {}
2411
+ }
2412
+ },
2413
+ notifyToolResult: function(result) {
2414
+ this.toolOutput = result;
2415
+ for (var i = 0; i < this.toolResultListeners.length; i++) {
2416
+ try { this.toolResultListeners[i](result); } catch(e) {}
2417
+ }
2418
+ }
2419
+ };
2420
+
2421
+ var injected = readInjectedData();
2422
+ this._context.toolInput = injected.toolInput;
2423
+ this._context.toolOutput = injected.toolOutput;
2424
+ this._context.structuredContent = injected.structuredContent;
2425
+
2426
+ this._loadWidgetState();
2427
+ }
2428
+
2429
+ FrontMcpBridge.prototype._loadWidgetState = function() {
2430
+ try {
2431
+ var key = 'frontmcp:widget:' + (window.__mcpToolName || 'unknown');
2432
+ var stored = localStorage.getItem(key);
2433
+ if (stored) this._context.widgetState = JSON.parse(stored);
2434
+ } catch(e) {}
2435
+ };
2436
+
2437
+ FrontMcpBridge.prototype._saveWidgetState = function() {
2438
+ try {
2439
+ var key = 'frontmcp:widget:' + (window.__mcpToolName || 'unknown');
2440
+ localStorage.setItem(key, JSON.stringify(this._context.widgetState));
2441
+ } catch(e) {}
2442
+ };
2443
+
2444
+ FrontMcpBridge.prototype.initialize = function() {
2445
+ if (this._initialized) return Promise.resolve();
2446
+ var self = this;
2447
+ this._adapter = detectPlatform();
2448
+ return this._adapter.initialize(this._context).then(function() {
2449
+ self._initialized = true;
2450
+ // Set up the data-tool-call click handler after initialization
2451
+ self._setupDataToolCallHandler();
2452
+ });
2453
+ };
2454
+
2455
+ Object.defineProperty(FrontMcpBridge.prototype, 'initialized', { get: function() { return this._initialized; } });
2456
+ Object.defineProperty(FrontMcpBridge.prototype, 'adapterId', { get: function() { return this._adapter ? this._adapter.id : undefined; } });
2457
+ Object.defineProperty(FrontMcpBridge.prototype, 'capabilities', { get: function() { return this._adapter ? this._adapter.capabilities : DEFAULT_CAPABILITIES; } });
2458
+
2459
+ FrontMcpBridge.prototype.getTheme = function() { return this._context.hostContext.theme; };
2460
+ FrontMcpBridge.prototype.getDisplayMode = function() { return this._context.hostContext.displayMode; };
2461
+ FrontMcpBridge.prototype.getToolInput = function() { return this._context.toolInput; };
2462
+ FrontMcpBridge.prototype.getToolOutput = function() { return this._context.toolOutput; };
2463
+ FrontMcpBridge.prototype.getStructuredContent = function() { return this._context.structuredContent; };
2464
+ FrontMcpBridge.prototype.getWidgetState = function() { return this._context.widgetState; };
2465
+ FrontMcpBridge.prototype.getHostContext = function() { return Object.assign({}, this._context.hostContext); };
2466
+ FrontMcpBridge.prototype.hasCapability = function(cap) { return this._adapter && this._adapter.capabilities[cap] === true; };
2467
+
2468
+ // Get tool response metadata (platform-agnostic)
2469
+ // Used by inline mode widgets to detect when ui/html arrives
2470
+ FrontMcpBridge.prototype.getToolResponseMetadata = function() {
2471
+ // OpenAI injects toolResponseMetadata for widget-producing tools
2472
+ if (typeof window !== 'undefined' && window.openai && window.openai.toolResponseMetadata) {
2473
+ return window.openai.toolResponseMetadata;
2474
+ }
2475
+ // Claude (future support)
2476
+ if (typeof window !== 'undefined' && window.claude && window.claude.toolResponseMetadata) {
2477
+ return window.claude.toolResponseMetadata;
2478
+ }
2479
+ // FrontMCP direct injection (for testing/ext-apps)
2480
+ if (typeof window !== 'undefined' && window.__mcpToolResponseMetadata) {
2481
+ return window.__mcpToolResponseMetadata;
2482
+ }
2483
+ return null;
2484
+ };
2485
+
2486
+ // Subscribe to tool response metadata changes (for inline mode injection)
2487
+ FrontMcpBridge.prototype.onToolResponseMetadata = function(callback) {
2488
+ var self = this;
2489
+ var called = false;
2490
+
2491
+ // Check if already available
2492
+ var existing = self.getToolResponseMetadata();
2493
+ if (existing) {
2494
+ called = true;
2495
+ callback(existing);
2496
+ }
2497
+
2498
+ // Set up property interceptors for OpenAI
2499
+ if (typeof window !== 'undefined') {
2500
+ // OpenAI: Intercept toolResponseMetadata assignment
2501
+ if (!window.__frontmcpMetadataIntercepted) {
2502
+ window.__frontmcpMetadataIntercepted = true;
2503
+ window.__frontmcpMetadataCallbacks = [];
2504
+
2505
+ // Create openai object if it doesn't exist
2506
+ if (!window.openai) window.openai = {};
2507
+
2508
+ var originalMetadata = window.openai.toolResponseMetadata;
2509
+ Object.defineProperty(window.openai, 'toolResponseMetadata', {
2510
+ get: function() { return originalMetadata; },
2511
+ set: function(val) {
2512
+ originalMetadata = val;
2513
+ log('toolResponseMetadata set, notifying ' + window.__frontmcpMetadataCallbacks.length + ' listeners');
2514
+ for (var i = 0; i < window.__frontmcpMetadataCallbacks.length; i++) {
2515
+ try { window.__frontmcpMetadataCallbacks[i](val); } catch(e) {}
2516
+ }
2517
+ },
2518
+ configurable: true
2519
+ });
2520
+ }
2521
+
2522
+ // Register callback wrapper (store reference for unsubscribe)
2523
+ var wrapper = function(metadata) {
2524
+ if (!called) {
2525
+ called = true;
2526
+ callback(metadata);
2527
+ }
2528
+ };
2529
+ window.__frontmcpMetadataCallbacks.push(wrapper);
2530
+
2531
+ // Return unsubscribe function that removes the wrapper (not the original callback)
2532
+ return function() {
2533
+ if (window.__frontmcpMetadataCallbacks) {
2534
+ var idx = window.__frontmcpMetadataCallbacks.indexOf(wrapper);
2535
+ if (idx !== -1) window.__frontmcpMetadataCallbacks.splice(idx, 1);
2536
+ }
2537
+ };
2538
+ }
2539
+
2540
+ // Return no-op unsubscribe for non-window environments
2541
+ return function() {};
2542
+ };
2543
+
2544
+ FrontMcpBridge.prototype.callTool = function(name, args) {
2545
+ // Priority 1: Direct OpenAI SDK call (most reliable in OpenAI iframe)
2546
+ // This bypasses adapter abstraction for maximum compatibility
2547
+ if (typeof window !== 'undefined' && window.openai && typeof window.openai.callTool === 'function') {
2548
+ log('callTool: Using OpenAI SDK directly');
2549
+ return window.openai.callTool(name, args);
2550
+ }
2551
+
2552
+ // Priority 2: Use adapter (if initialized and supports tool calls)
2553
+ if (this._adapter && this._adapter.capabilities && this._adapter.capabilities.canCallTools) {
2554
+ log('callTool: Using adapter ' + this._adapter.id);
2555
+ return this._adapter.callTool(this._context, name, args);
2556
+ }
2557
+
2558
+ // Not initialized or no tool support
2559
+ if (!this._adapter) {
2560
+ return Promise.reject(new Error('Bridge not initialized. Wait for bridge:ready event.'));
2561
+ }
2562
+ return Promise.reject(new Error('Tool calls not supported on this platform (' + this._adapter.id + ')'));
2563
+ };
2564
+
2565
+ FrontMcpBridge.prototype.sendMessage = function(content) {
2566
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2567
+ return this._adapter.sendMessage(this._context, content);
2568
+ };
2569
+
2570
+ FrontMcpBridge.prototype.openLink = function(url) {
2571
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2572
+ return this._adapter.openLink(this._context, url);
2573
+ };
2574
+
2575
+ FrontMcpBridge.prototype.requestDisplayMode = function(mode) {
2576
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2577
+ var self = this;
2578
+ return this._adapter.requestDisplayMode(this._context, mode).then(function() {
2579
+ self._context.hostContext.displayMode = mode;
2580
+ });
2581
+ };
2582
+
2583
+ FrontMcpBridge.prototype.requestClose = function() {
2584
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2585
+ return this._adapter.requestClose(this._context);
2586
+ };
2587
+
2588
+ FrontMcpBridge.prototype.setWidgetState = function(state) {
2589
+ Object.assign(this._context.widgetState, state);
2590
+ this._saveWidgetState();
2591
+ };
2592
+
2593
+ FrontMcpBridge.prototype.onContextChange = function(callback) {
2594
+ var listeners = this._context.contextListeners;
2595
+ listeners.push(callback);
2596
+ return function() {
2597
+ var idx = listeners.indexOf(callback);
2598
+ if (idx !== -1) listeners.splice(idx, 1);
2599
+ };
2600
+ };
2601
+
2602
+ FrontMcpBridge.prototype.onToolResult = function(callback) {
2603
+ var listeners = this._context.toolResultListeners;
2604
+ listeners.push(callback);
2605
+ return function() {
2606
+ var idx = listeners.indexOf(callback);
2607
+ if (idx !== -1) listeners.splice(idx, 1);
2608
+ };
2609
+ };
2610
+
2611
+ // ==================== data-tool-call Click Handler ====================
2612
+
2613
+ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
2614
+ var self = this;
2615
+
2616
+ document.addEventListener('click', function(e) {
2617
+ // Find the closest element with data-tool-call attribute
2618
+ var target = e.target;
2619
+ while (target && target !== document) {
2620
+ if (target.hasAttribute && target.hasAttribute('data-tool-call')) {
2621
+ var toolName = target.getAttribute('data-tool-call');
2622
+ var argsAttr = target.getAttribute('data-tool-args');
2623
+ var args = {};
2624
+
2625
+ try {
2626
+ if (argsAttr) {
2627
+ args = JSON.parse(argsAttr);
2628
+ }
2629
+ } catch (parseErr) {
2630
+ console.error('[frontmcp] Failed to parse data-tool-args:', parseErr);
2631
+ }
2632
+
2633
+ log('data-tool-call clicked: ' + toolName);
2634
+
2635
+ // Show loading state - save original content first
2636
+ var originalContent = target.innerHTML;
2637
+ var originalDisabled = target.disabled;
2638
+ target.disabled = true;
2639
+ target.classList.add('opacity-50', 'cursor-not-allowed');
2640
+
2641
+ // Add spinner for buttons
2642
+ var spinner = '<svg class="animate-spin -ml-1 mr-2 h-4 w-4 inline" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg>';
2643
+ if (target.tagName === 'BUTTON') {
2644
+ target.innerHTML = spinner + 'Loading...';
2645
+ }
2646
+
2647
+ // Helper to reset button state
2648
+ function resetButton() {
2649
+ target.innerHTML = originalContent;
2650
+ target.disabled = originalDisabled;
2651
+ target.classList.remove('opacity-50', 'cursor-not-allowed');
2652
+ }
2653
+
2654
+ // Determine how to call the tool
2655
+ var toolCallPromise;
2656
+
2657
+ // Priority 1: Direct OpenAI SDK call (bypasses adapter abstraction)
2658
+ if (typeof window !== 'undefined' && window.openai && typeof window.openai.callTool === 'function') {
2659
+ log('Using OpenAI SDK directly for tool call');
2660
+ toolCallPromise = window.openai.callTool(toolName, args);
2661
+ }
2662
+ // Priority 2: Use adapter (if it supports tool calls)
2663
+ else if (self.hasCapability('canCallTools')) {
2664
+ log('Using adapter for tool call');
2665
+ toolCallPromise = self.callTool(toolName, args);
2666
+ }
2667
+ // No tool call capability
2668
+ else {
2669
+ console.error('[frontmcp] Tool calls not supported on this platform (' + self.adapterId + ')');
2670
+ resetButton();
2671
+ target.dispatchEvent(new CustomEvent('tool:error', {
2672
+ detail: { name: toolName, args: args, error: 'Tool calls not supported on this platform' },
2673
+ bubbles: true
2674
+ }));
2675
+ e.preventDefault();
2676
+ return;
2677
+ }
2678
+
2679
+ // Handle the tool call result
2680
+ toolCallPromise.then(function(result) {
2681
+ log('Tool call succeeded: ' + toolName);
2682
+ resetButton();
2683
+
2684
+ // Update bridge state to trigger widget re-render
2685
+ // React isn't hydrated in OpenAI iframe, so useState doesn't work
2686
+ // Instead, we use the bridge's reactive state system
2687
+ if (result && window.__frontmcp && window.__frontmcp.bridge && typeof window.__frontmcp.bridge.setWidgetState === 'function') {
2688
+ var newData = result.structuredContent || result;
2689
+ log('Updating bridge state with new data');
2690
+ window.__frontmcp.bridge.setWidgetState(newData);
2691
+ }
2692
+
2693
+ // Dispatch success event
2694
+ target.dispatchEvent(new CustomEvent('tool:success', {
2695
+ detail: { name: toolName, args: args, result: result },
2696
+ bubbles: true
2697
+ }));
2698
+ }).catch(function(err) {
2699
+ console.error('[frontmcp] Tool call failed: ' + toolName, err);
2700
+ resetButton();
2701
+ // Dispatch error event
2702
+ target.dispatchEvent(new CustomEvent('tool:error', {
2703
+ detail: { name: toolName, args: args, error: err.message || err },
2704
+ bubbles: true
2705
+ }));
2706
+ });
2707
+
2708
+ // Prevent default behavior (e.g., form submission)
2709
+ e.preventDefault();
2710
+ return;
2711
+ }
2712
+ target = target.parentElement;
2713
+ }
2714
+ }, true); // Use capture phase to handle before React handlers
2715
+ };
2716
+ `.trim();
2717
+ }
2718
+ function minifyJS(code) {
2719
+ return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
2720
+ }
2721
+ function generatePlatformBundle(platform, options = {}) {
2722
+ const platformAdapters = {
2723
+ chatgpt: ["openai", "generic"],
2724
+ claude: ["claude", "generic"],
2725
+ gemini: ["gemini", "generic"],
2726
+ universal: ["openai", "ext-apps", "claude", "gemini", "generic"]
2727
+ };
2728
+ return generateBridgeIIFE({
2729
+ ...options,
2730
+ adapters: platformAdapters[platform]
2731
+ });
2732
+ }
2733
+ var UNIVERSAL_BRIDGE_SCRIPT = generateBridgeIIFE();
2734
+ var BRIDGE_SCRIPT_TAGS = {
2735
+ universal: `<script>${UNIVERSAL_BRIDGE_SCRIPT}</script>`,
2736
+ chatgpt: `<script>${generatePlatformBundle("chatgpt")}</script>`,
2737
+ claude: `<script>${generatePlatformBundle("claude")}</script>`,
2738
+ gemini: `<script>${generatePlatformBundle("gemini")}</script>`
2739
+ };
2740
+
2741
+ // libs/ui/src/react/hooks/context.tsx
2742
+ var import_jsx_runtime5 = require("react/jsx-runtime");
2743
+ var McpBridgeContext = (0, import_react.createContext)(null);
2744
+ function McpBridgeProvider({ children, config, onReady, onError }) {
2745
+ const [bridge, setBridge] = (0, import_react.useState)(null);
2746
+ const [loading, setLoading] = (0, import_react.useState)(true);
2747
+ const [error, setError] = (0, import_react.useState)(null);
2748
+ (0, import_react.useEffect)(() => {
2749
+ let mounted = true;
2750
+ let bridgeInstance = null;
2751
+ const initBridge = async () => {
2752
+ try {
2753
+ bridgeInstance = new FrontMcpBridge(config);
2754
+ await bridgeInstance.initialize();
2755
+ if (mounted) {
2756
+ setBridge(bridgeInstance);
2757
+ setLoading(false);
2758
+ onReady?.(bridgeInstance);
2759
+ }
2760
+ } catch (err) {
2761
+ if (mounted) {
2762
+ const error2 = err instanceof Error ? err : new Error(String(err));
2763
+ setError(error2);
2764
+ setLoading(false);
2765
+ onError?.(error2);
2766
+ }
2767
+ }
2768
+ };
2769
+ initBridge();
2770
+ return () => {
2771
+ mounted = false;
2772
+ if (bridgeInstance) {
2773
+ bridgeInstance.dispose();
2774
+ }
2775
+ };
2776
+ }, [config, onReady, onError]);
2777
+ const contextValue = (0, import_react.useMemo)(
2778
+ () => ({
2779
+ bridge,
2780
+ loading,
2781
+ error,
2782
+ ready: !loading && !error && bridge !== null,
2783
+ adapterId: bridge?.adapterId,
2784
+ capabilities: bridge?.capabilities
2785
+ }),
2786
+ [bridge, loading, error]
2787
+ );
2788
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(McpBridgeContext.Provider, { value: contextValue, children });
2789
+ }
2790
+ var SSR_DEFAULT_CONTEXT = {
2791
+ bridge: null,
2792
+ loading: false,
2793
+ error: null,
2794
+ ready: false,
2795
+ adapterId: void 0,
2796
+ capabilities: void 0
2797
+ };
2798
+ function useMcpBridgeContext() {
2799
+ const context = (0, import_react.useContext)(McpBridgeContext);
2800
+ if (!context) {
2801
+ return SSR_DEFAULT_CONTEXT;
2802
+ }
2803
+ return context;
2804
+ }
2805
+ function useMcpBridge() {
2806
+ const { bridge } = useMcpBridgeContext();
2807
+ return bridge;
2808
+ }
2809
+ function useTheme() {
2810
+ const { bridge, ready } = useMcpBridgeContext();
2811
+ const [theme, setTheme] = (0, import_react.useState)("light");
2812
+ (0, import_react.useEffect)(() => {
2813
+ if (!ready || !bridge) return;
2814
+ setTheme(bridge.getTheme());
2815
+ const unsubscribe = bridge.onContextChange((changes) => {
2816
+ if (changes.theme) {
2817
+ setTheme(changes.theme);
2818
+ }
2819
+ });
2820
+ return unsubscribe;
2821
+ }, [bridge, ready]);
2822
+ return theme;
2823
+ }
2824
+ function useDisplayMode() {
2825
+ const { bridge, ready } = useMcpBridgeContext();
2826
+ const [displayMode, setDisplayMode] = (0, import_react.useState)("inline");
2827
+ (0, import_react.useEffect)(() => {
2828
+ if (!ready || !bridge) return;
2829
+ setDisplayMode(bridge.getDisplayMode());
2830
+ const unsubscribe = bridge.onContextChange((changes) => {
2831
+ if (changes.displayMode) {
2832
+ setDisplayMode(changes.displayMode);
2833
+ }
2834
+ });
2835
+ return unsubscribe;
2836
+ }, [bridge, ready]);
2837
+ return displayMode;
2838
+ }
2839
+ function useHostContext() {
2840
+ const { bridge, ready } = useMcpBridgeContext();
2841
+ const [context, setContext] = (0, import_react.useState)(null);
2842
+ (0, import_react.useEffect)(() => {
2843
+ if (!ready || !bridge) return;
2844
+ const adapter = bridge.getAdapter?.();
2845
+ if (adapter) {
2846
+ setContext(adapter.getHostContext());
2847
+ }
2848
+ const unsubscribe = bridge.onContextChange((changes) => {
2849
+ setContext((prev) => prev ? { ...prev, ...changes } : null);
2850
+ });
2851
+ return unsubscribe;
2852
+ }, [bridge, ready]);
2853
+ return context;
2854
+ }
2855
+ function useCapability(cap) {
2856
+ const { capabilities } = useMcpBridgeContext();
2857
+ return capabilities?.[cap] === true;
2858
+ }
2859
+
2860
+ // libs/ui/src/react/hooks/tools.tsx
2861
+ var import_react2 = require("react");
2862
+ function useToolInput() {
2863
+ const { bridge, ready } = useMcpBridgeContext();
2864
+ if (!ready || !bridge) {
2865
+ return null;
2866
+ }
2867
+ try {
2868
+ return bridge.getToolInput();
2869
+ } catch {
2870
+ return null;
2871
+ }
2872
+ }
2873
+ function useToolOutput() {
2874
+ const { bridge, ready } = useMcpBridgeContext();
2875
+ const [output, setOutput] = (0, import_react2.useState)(null);
2876
+ (0, import_react2.useEffect)(() => {
2877
+ if (!ready || !bridge) return;
2878
+ try {
2879
+ const initialOutput = bridge.getToolOutput();
2880
+ if (initialOutput !== void 0) {
2881
+ setOutput(initialOutput);
2882
+ }
2883
+ } catch {
2884
+ }
2885
+ const unsubscribe = bridge.onToolResult((result) => {
2886
+ setOutput(result);
2887
+ });
2888
+ return unsubscribe;
2889
+ }, [bridge, ready]);
2890
+ return output;
2891
+ }
2892
+ function useStructuredContent() {
2893
+ const { bridge, ready } = useMcpBridgeContext();
2894
+ if (!ready || !bridge) {
2895
+ return null;
2896
+ }
2897
+ try {
2898
+ const adapter = bridge.getAdapter?.();
2899
+ if (adapter) {
2900
+ return adapter.getStructuredContent();
2901
+ }
2902
+ return null;
2903
+ } catch {
2904
+ return null;
2905
+ }
2906
+ }
2907
+ function useCallTool(toolName, options = {}) {
2908
+ const { bridge, ready } = useMcpBridgeContext();
2909
+ const { onSuccess, onError, resetOnToolChange = true } = options;
2910
+ console.log("useCallTool", toolName, bridge);
2911
+ const [state, setState] = (0, import_react2.useState)({
2912
+ data: null,
2913
+ loading: false,
2914
+ error: null,
2915
+ called: false
2916
+ });
2917
+ (0, import_react2.useEffect)(() => {
2918
+ if (resetOnToolChange) {
2919
+ setState({
2920
+ data: null,
2921
+ loading: false,
2922
+ error: null,
2923
+ called: false
2924
+ });
2925
+ }
2926
+ }, [toolName, resetOnToolChange]);
2927
+ const reset = (0, import_react2.useCallback)(() => {
2928
+ setState({
2929
+ data: null,
2930
+ loading: false,
2931
+ error: null,
2932
+ called: false
2933
+ });
2934
+ }, []);
2935
+ const callTool = (0, import_react2.useCallback)(
2936
+ async (args) => {
2937
+ if (!ready || !bridge) {
2938
+ const error = new Error("Bridge not initialized");
2939
+ setState((prev) => ({ ...prev, error, called: true }));
2940
+ onError?.(error);
2941
+ return null;
2942
+ }
2943
+ setState((prev) => ({
2944
+ ...prev,
2945
+ loading: true,
2946
+ error: null,
2947
+ called: true
2948
+ }));
2949
+ try {
2950
+ const result = await bridge.callTool(toolName, args);
2951
+ const data = result;
2952
+ setState({
2953
+ data,
2954
+ loading: false,
2955
+ error: null,
2956
+ called: true
2957
+ });
2958
+ onSuccess?.(data);
2959
+ return data;
2960
+ } catch (err) {
2961
+ const error = err instanceof Error ? err : new Error(String(err));
2962
+ setState({
2963
+ data: null,
2964
+ loading: false,
2965
+ error,
2966
+ called: true
2967
+ });
2968
+ onError?.(error);
2969
+ return null;
2970
+ }
2971
+ },
2972
+ [bridge, ready, toolName, onSuccess, onError]
2973
+ );
2974
+ return [callTool, state, reset];
2975
+ }
2976
+ function useToolCalls(toolMap) {
2977
+ const bridge = useMcpBridge();
2978
+ const [states, setStates] = (0, import_react2.useState)(() => {
2979
+ const initial = {};
2980
+ for (const key of Object.keys(toolMap)) {
2981
+ initial[key] = { data: null, loading: false, error: null, called: false };
2982
+ }
2983
+ return initial;
2984
+ });
2985
+ const createCallFn = (0, import_react2.useCallback)(
2986
+ (key, toolName) => async (args) => {
2987
+ if (!bridge) {
2988
+ setStates((prev) => ({
2989
+ ...prev,
2990
+ [key]: {
2991
+ ...prev[key],
2992
+ error: new Error("Bridge not initialized"),
2993
+ called: true
2994
+ }
2995
+ }));
2996
+ return null;
2997
+ }
2998
+ setStates((prev) => ({
2999
+ ...prev,
3000
+ [key]: { ...prev[key], loading: true, error: null, called: true }
3001
+ }));
3002
+ try {
3003
+ const result2 = await bridge.callTool(toolName, args);
3004
+ setStates((prev) => ({
3005
+ ...prev,
3006
+ [key]: { data: result2, loading: false, error: null, called: true }
3007
+ }));
3008
+ return result2;
3009
+ } catch (err) {
3010
+ const error = err instanceof Error ? err : new Error(String(err));
3011
+ setStates((prev) => ({
3012
+ ...prev,
3013
+ [key]: { data: null, loading: false, error, called: true }
3014
+ }));
3015
+ return null;
3016
+ }
3017
+ },
3018
+ [bridge]
3019
+ );
3020
+ const createResetFn = (0, import_react2.useCallback)(
3021
+ (key) => () => {
3022
+ setStates((prev) => ({
3023
+ ...prev,
3024
+ [key]: { data: null, loading: false, error: null, called: false }
3025
+ }));
3026
+ },
3027
+ []
3028
+ );
3029
+ const result = {};
3030
+ for (const [key, toolName] of Object.entries(toolMap)) {
3031
+ const state = states[key] || {
3032
+ data: null,
3033
+ loading: false,
3034
+ error: null,
3035
+ called: false
3036
+ };
3037
+ result[key] = {
3038
+ call: createCallFn(key, toolName),
3039
+ data: state.data,
3040
+ loading: state.loading,
3041
+ error: state.error,
3042
+ reset: createResetFn(key)
3043
+ };
3044
+ }
3045
+ return result;
3046
+ }
3047
+ function useSendMessage() {
3048
+ const bridge = useMcpBridge();
3049
+ const [state, setState] = (0, import_react2.useState)({
3050
+ loading: false,
3051
+ error: null,
3052
+ sent: false
3053
+ });
3054
+ const sendMessage = (0, import_react2.useCallback)(
3055
+ async (content) => {
3056
+ if (!bridge) {
3057
+ setState({ loading: false, error: new Error("Bridge not initialized"), sent: false });
3058
+ return;
3059
+ }
3060
+ setState({ loading: true, error: null, sent: false });
3061
+ try {
3062
+ await bridge.sendMessage(content);
3063
+ setState({ loading: false, error: null, sent: true });
3064
+ } catch (err) {
3065
+ const error = err instanceof Error ? err : new Error(String(err));
3066
+ setState({ loading: false, error, sent: false });
3067
+ }
3068
+ },
3069
+ [bridge]
3070
+ );
3071
+ return [sendMessage, state];
3072
+ }
3073
+ function useOpenLink() {
3074
+ const bridge = useMcpBridge();
3075
+ return (0, import_react2.useCallback)(
3076
+ async (url) => {
3077
+ if (!bridge) {
3078
+ console.warn("Bridge not initialized, cannot open link");
3079
+ return;
3080
+ }
3081
+ await bridge.openLink(url);
3082
+ },
3083
+ [bridge]
3084
+ );
3085
+ }
3086
+
3087
+ // libs/ui/src/react/utils.ts
3088
+ var import_utils = require("@frontmcp/uipack/utils");
3089
+ var cachedReactDOMServer = null;
3090
+ function getReactDOMServer() {
3091
+ if (!cachedReactDOMServer) {
3092
+ try {
3093
+ cachedReactDOMServer = require("react-dom/server");
3094
+ } catch {
3095
+ return null;
3096
+ }
3097
+ }
3098
+ return cachedReactDOMServer;
3099
+ }
3100
+ function renderChildrenToString(children) {
3101
+ if (children == null) {
3102
+ return "";
3103
+ }
3104
+ if (typeof children === "string") {
3105
+ return (0, import_utils.escapeHtml)(children);
3106
+ }
3107
+ if (typeof children === "number") {
3108
+ return String(children);
3109
+ }
3110
+ if (typeof children === "boolean") {
3111
+ return "";
3112
+ }
3113
+ try {
3114
+ const server = getReactDOMServer();
3115
+ if (server) {
3116
+ return server.renderToStaticMarkup(children);
3117
+ }
3118
+ return String(children);
3119
+ } catch {
3120
+ return String(children);
3121
+ }
3122
+ }
3123
+ function isBrowser() {
3124
+ return typeof window !== "undefined";
3125
+ }
3126
+ function isServer() {
3127
+ return typeof window === "undefined";
3128
+ }
3129
+ // Annotate the CommonJS export names for ESM import in node:
3130
+ 0 && (module.exports = {
3131
+ Alert,
3132
+ Badge,
3133
+ Button,
3134
+ Card,
3135
+ McpBridgeProvider,
3136
+ isBrowser,
3137
+ isServer,
3138
+ renderAlert,
3139
+ renderAlertSync,
3140
+ renderBadge,
3141
+ renderBadgeSync,
3142
+ renderButton,
3143
+ renderButtonSync,
3144
+ renderCard,
3145
+ renderCardSync,
3146
+ renderChildrenToString,
3147
+ useCallTool,
3148
+ useCapability,
3149
+ useDisplayMode,
3150
+ useHostContext,
3151
+ useMcpBridge,
3152
+ useMcpBridgeContext,
3153
+ useOpenLink,
3154
+ useSendMessage,
3155
+ useStructuredContent,
3156
+ useTheme,
3157
+ useToolCalls,
3158
+ useToolInput,
3159
+ useToolOutput
3160
+ });