@frontmcp/ui 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1134) hide show
  1. package/adapters/index.d.ts +13 -0
  2. package/adapters/index.d.ts.map +1 -0
  3. package/adapters/index.js +462 -0
  4. package/adapters/platform-meta.d.ts +166 -0
  5. package/adapters/platform-meta.d.ts.map +1 -0
  6. package/adapters/response-builder.d.ts +108 -0
  7. package/adapters/response-builder.d.ts.map +1 -0
  8. package/adapters/serving-mode.d.ts +107 -0
  9. package/adapters/serving-mode.d.ts.map +1 -0
  10. package/base-template/bridge.d.ts +90 -0
  11. package/base-template/bridge.d.ts.map +1 -0
  12. package/base-template/default-base-template.d.ts +92 -0
  13. package/base-template/default-base-template.d.ts.map +1 -0
  14. package/base-template/index.d.ts +15 -0
  15. package/base-template/index.d.ts.map +1 -0
  16. package/base-template/index.js +1398 -0
  17. package/base-template/polyfills.d.ts +31 -0
  18. package/base-template/polyfills.d.ts.map +1 -0
  19. package/base-template/theme-styles.d.ts +74 -0
  20. package/base-template/theme-styles.d.ts.map +1 -0
  21. package/bridge/adapters/base-adapter.d.ts +104 -0
  22. package/bridge/adapters/base-adapter.d.ts.map +1 -0
  23. package/bridge/adapters/claude.adapter.d.ts +67 -0
  24. package/bridge/adapters/claude.adapter.d.ts.map +1 -0
  25. package/bridge/adapters/ext-apps.adapter.d.ts +143 -0
  26. package/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
  27. package/bridge/adapters/gemini.adapter.d.ts +64 -0
  28. package/bridge/adapters/gemini.adapter.d.ts.map +1 -0
  29. package/bridge/adapters/generic.adapter.d.ts +56 -0
  30. package/bridge/adapters/generic.adapter.d.ts.map +1 -0
  31. package/bridge/adapters/index.d.ts +26 -0
  32. package/bridge/adapters/index.d.ts.map +1 -0
  33. package/bridge/adapters/openai.adapter.d.ts +65 -0
  34. package/bridge/adapters/openai.adapter.d.ts.map +1 -0
  35. package/bridge/core/adapter-registry.d.ts +122 -0
  36. package/bridge/core/adapter-registry.d.ts.map +1 -0
  37. package/bridge/core/bridge-factory.d.ts +199 -0
  38. package/bridge/core/bridge-factory.d.ts.map +1 -0
  39. package/bridge/core/index.d.ts +10 -0
  40. package/bridge/core/index.d.ts.map +1 -0
  41. package/bridge/index.d.ts +62 -0
  42. package/bridge/index.d.ts.map +1 -0
  43. package/bridge/index.js +2540 -0
  44. package/bridge/runtime/iife-generator.d.ts +62 -0
  45. package/bridge/runtime/iife-generator.d.ts.map +1 -0
  46. package/bridge/runtime/index.d.ts +9 -0
  47. package/bridge/runtime/index.d.ts.map +1 -0
  48. package/bridge/types.d.ts +386 -0
  49. package/bridge/types.d.ts.map +1 -0
  50. package/build/cdn-resources.d.ts +243 -0
  51. package/build/cdn-resources.d.ts.map +1 -0
  52. package/build/index.d.ts +295 -0
  53. package/build/index.d.ts.map +1 -0
  54. package/build/index.js +7096 -0
  55. package/build/widget-manifest.d.ts +362 -0
  56. package/build/widget-manifest.d.ts.map +1 -0
  57. package/bundler/bundler.d.ts +208 -0
  58. package/bundler/bundler.d.ts.map +1 -0
  59. package/bundler/cache.d.ts +173 -0
  60. package/bundler/cache.d.ts.map +1 -0
  61. package/bundler/file-cache/component-builder.d.ts +167 -0
  62. package/bundler/file-cache/component-builder.d.ts.map +1 -0
  63. package/bundler/file-cache/hash-calculator.d.ts +155 -0
  64. package/bundler/file-cache/hash-calculator.d.ts.map +1 -0
  65. package/bundler/file-cache/index.d.ts +12 -0
  66. package/bundler/file-cache/index.d.ts.map +1 -0
  67. package/bundler/file-cache/storage/filesystem.d.ts +149 -0
  68. package/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
  69. package/bundler/file-cache/storage/index.d.ts +11 -0
  70. package/bundler/file-cache/storage/index.d.ts.map +1 -0
  71. package/bundler/file-cache/storage/interface.d.ts +152 -0
  72. package/bundler/file-cache/storage/interface.d.ts.map +1 -0
  73. package/bundler/file-cache/storage/redis.d.ts +139 -0
  74. package/bundler/file-cache/storage/redis.d.ts.map +1 -0
  75. package/bundler/index.d.ts +43 -0
  76. package/bundler/index.d.ts.map +1 -0
  77. package/bundler/index.js +4754 -0
  78. package/bundler/sandbox/enclave-adapter.d.ts +121 -0
  79. package/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
  80. package/bundler/sandbox/executor.d.ts +14 -0
  81. package/bundler/sandbox/executor.d.ts.map +1 -0
  82. package/bundler/sandbox/policy.d.ts +62 -0
  83. package/bundler/sandbox/policy.d.ts.map +1 -0
  84. package/bundler/types.d.ts +702 -0
  85. package/bundler/types.d.ts.map +1 -0
  86. package/components/alert.d.ts +66 -0
  87. package/components/alert.d.ts.map +1 -0
  88. package/components/alert.schema.d.ts +98 -0
  89. package/components/alert.schema.d.ts.map +1 -0
  90. package/components/avatar.d.ts +77 -0
  91. package/components/avatar.d.ts.map +1 -0
  92. package/components/avatar.schema.d.ts +170 -0
  93. package/components/avatar.schema.d.ts.map +1 -0
  94. package/components/badge.d.ts +64 -0
  95. package/components/badge.d.ts.map +1 -0
  96. package/components/badge.schema.d.ts +91 -0
  97. package/components/badge.schema.d.ts.map +1 -0
  98. package/components/button.d.ts +100 -0
  99. package/components/button.d.ts.map +1 -0
  100. package/components/button.schema.d.ts +120 -0
  101. package/components/button.schema.d.ts.map +1 -0
  102. package/components/card.d.ts +53 -0
  103. package/components/card.d.ts.map +1 -0
  104. package/components/card.schema.d.ts +93 -0
  105. package/components/card.schema.d.ts.map +1 -0
  106. package/components/form.d.ts +212 -0
  107. package/components/form.d.ts.map +1 -0
  108. package/components/form.schema.d.ts +365 -0
  109. package/components/form.schema.d.ts.map +1 -0
  110. package/components/index.d.ts +29 -0
  111. package/components/index.d.ts.map +1 -0
  112. package/components/index.js +2595 -0
  113. package/components/list.d.ts +121 -0
  114. package/components/list.d.ts.map +1 -0
  115. package/components/list.schema.d.ts +129 -0
  116. package/components/list.schema.d.ts.map +1 -0
  117. package/components/modal.d.ts +100 -0
  118. package/components/modal.d.ts.map +1 -0
  119. package/components/modal.schema.d.ts +151 -0
  120. package/components/modal.schema.d.ts.map +1 -0
  121. package/components/table.d.ts +91 -0
  122. package/components/table.d.ts.map +1 -0
  123. package/components/table.schema.d.ts +123 -0
  124. package/components/table.schema.d.ts.map +1 -0
  125. package/dependency/cdn-registry.d.ts +98 -0
  126. package/dependency/cdn-registry.d.ts.map +1 -0
  127. package/dependency/import-map.d.ts +186 -0
  128. package/dependency/import-map.d.ts.map +1 -0
  129. package/dependency/import-parser.d.ts +82 -0
  130. package/dependency/import-parser.d.ts.map +1 -0
  131. package/dependency/index.d.ts +17 -0
  132. package/dependency/index.d.ts.map +1 -0
  133. package/dependency/resolver.d.ts +164 -0
  134. package/dependency/resolver.d.ts.map +1 -0
  135. package/dependency/schemas.d.ts +486 -0
  136. package/dependency/schemas.d.ts.map +1 -0
  137. package/dependency/template-loader.d.ts +204 -0
  138. package/dependency/template-loader.d.ts.map +1 -0
  139. package/dependency/template-processor.d.ts +118 -0
  140. package/dependency/template-processor.d.ts.map +1 -0
  141. package/dependency/types.d.ts +739 -0
  142. package/dependency/types.d.ts.map +1 -0
  143. package/esm/adapters/index.d.ts +13 -0
  144. package/esm/adapters/index.d.ts.map +1 -0
  145. package/esm/adapters/index.js +427 -0
  146. package/esm/adapters/platform-meta.d.ts +166 -0
  147. package/esm/adapters/platform-meta.d.ts.map +1 -0
  148. package/esm/adapters/response-builder.d.ts +108 -0
  149. package/esm/adapters/response-builder.d.ts.map +1 -0
  150. package/esm/adapters/serving-mode.d.ts +107 -0
  151. package/esm/adapters/serving-mode.d.ts.map +1 -0
  152. package/esm/base-template/bridge.d.ts +90 -0
  153. package/esm/base-template/bridge.d.ts.map +1 -0
  154. package/esm/base-template/default-base-template.d.ts +92 -0
  155. package/esm/base-template/default-base-template.d.ts.map +1 -0
  156. package/esm/base-template/index.d.ts +15 -0
  157. package/esm/base-template/index.d.ts.map +1 -0
  158. package/esm/base-template/index.js +1364 -0
  159. package/esm/base-template/polyfills.d.ts +31 -0
  160. package/esm/base-template/polyfills.d.ts.map +1 -0
  161. package/esm/base-template/theme-styles.d.ts +74 -0
  162. package/esm/base-template/theme-styles.d.ts.map +1 -0
  163. package/esm/bridge/adapters/base-adapter.d.ts +104 -0
  164. package/esm/bridge/adapters/base-adapter.d.ts.map +1 -0
  165. package/esm/bridge/adapters/claude.adapter.d.ts +67 -0
  166. package/esm/bridge/adapters/claude.adapter.d.ts.map +1 -0
  167. package/esm/bridge/adapters/ext-apps.adapter.d.ts +143 -0
  168. package/esm/bridge/adapters/ext-apps.adapter.d.ts.map +1 -0
  169. package/esm/bridge/adapters/gemini.adapter.d.ts +64 -0
  170. package/esm/bridge/adapters/gemini.adapter.d.ts.map +1 -0
  171. package/esm/bridge/adapters/generic.adapter.d.ts +56 -0
  172. package/esm/bridge/adapters/generic.adapter.d.ts.map +1 -0
  173. package/esm/bridge/adapters/index.d.ts +26 -0
  174. package/esm/bridge/adapters/index.d.ts.map +1 -0
  175. package/esm/bridge/adapters/openai.adapter.d.ts +65 -0
  176. package/esm/bridge/adapters/openai.adapter.d.ts.map +1 -0
  177. package/esm/bridge/core/adapter-registry.d.ts +122 -0
  178. package/esm/bridge/core/adapter-registry.d.ts.map +1 -0
  179. package/esm/bridge/core/bridge-factory.d.ts +199 -0
  180. package/esm/bridge/core/bridge-factory.d.ts.map +1 -0
  181. package/esm/bridge/core/index.d.ts +10 -0
  182. package/esm/bridge/core/index.d.ts.map +1 -0
  183. package/esm/bridge/index.d.ts +62 -0
  184. package/esm/bridge/index.d.ts.map +1 -0
  185. package/esm/bridge/index.js +2487 -0
  186. package/esm/bridge/runtime/iife-generator.d.ts +62 -0
  187. package/esm/bridge/runtime/iife-generator.d.ts.map +1 -0
  188. package/esm/bridge/runtime/index.d.ts +9 -0
  189. package/esm/bridge/runtime/index.d.ts.map +1 -0
  190. package/esm/bridge/types.d.ts +386 -0
  191. package/esm/bridge/types.d.ts.map +1 -0
  192. package/esm/build/cdn-resources.d.ts +243 -0
  193. package/esm/build/cdn-resources.d.ts.map +1 -0
  194. package/esm/build/index.d.ts +295 -0
  195. package/esm/build/index.d.ts.map +1 -0
  196. package/esm/build/index.js +7021 -0
  197. package/esm/build/widget-manifest.d.ts +362 -0
  198. package/esm/build/widget-manifest.d.ts.map +1 -0
  199. package/esm/bundler/bundler.d.ts +208 -0
  200. package/esm/bundler/bundler.d.ts.map +1 -0
  201. package/esm/bundler/cache.d.ts +173 -0
  202. package/esm/bundler/cache.d.ts.map +1 -0
  203. package/esm/bundler/file-cache/component-builder.d.ts +167 -0
  204. package/esm/bundler/file-cache/component-builder.d.ts.map +1 -0
  205. package/esm/bundler/file-cache/hash-calculator.d.ts +155 -0
  206. package/esm/bundler/file-cache/hash-calculator.d.ts.map +1 -0
  207. package/esm/bundler/file-cache/index.d.ts +12 -0
  208. package/esm/bundler/file-cache/index.d.ts.map +1 -0
  209. package/esm/bundler/file-cache/storage/filesystem.d.ts +149 -0
  210. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +1 -0
  211. package/esm/bundler/file-cache/storage/index.d.ts +11 -0
  212. package/esm/bundler/file-cache/storage/index.d.ts.map +1 -0
  213. package/esm/bundler/file-cache/storage/interface.d.ts +152 -0
  214. package/esm/bundler/file-cache/storage/interface.d.ts.map +1 -0
  215. package/esm/bundler/file-cache/storage/redis.d.ts +139 -0
  216. package/esm/bundler/file-cache/storage/redis.d.ts.map +1 -0
  217. package/esm/bundler/index.d.ts +43 -0
  218. package/esm/bundler/index.d.ts.map +1 -0
  219. package/esm/bundler/index.js +4687 -0
  220. package/esm/bundler/sandbox/enclave-adapter.d.ts +121 -0
  221. package/esm/bundler/sandbox/enclave-adapter.d.ts.map +1 -0
  222. package/esm/bundler/sandbox/executor.d.ts +14 -0
  223. package/esm/bundler/sandbox/executor.d.ts.map +1 -0
  224. package/esm/bundler/sandbox/policy.d.ts +62 -0
  225. package/esm/bundler/sandbox/policy.d.ts.map +1 -0
  226. package/esm/bundler/types.d.ts +702 -0
  227. package/esm/bundler/types.d.ts.map +1 -0
  228. package/esm/components/alert.d.ts +66 -0
  229. package/esm/components/alert.d.ts.map +1 -0
  230. package/esm/components/alert.schema.d.ts +98 -0
  231. package/esm/components/alert.schema.d.ts.map +1 -0
  232. package/esm/components/avatar.d.ts +77 -0
  233. package/esm/components/avatar.d.ts.map +1 -0
  234. package/esm/components/avatar.schema.d.ts +170 -0
  235. package/esm/components/avatar.schema.d.ts.map +1 -0
  236. package/esm/components/badge.d.ts +64 -0
  237. package/esm/components/badge.d.ts.map +1 -0
  238. package/esm/components/badge.schema.d.ts +91 -0
  239. package/esm/components/badge.schema.d.ts.map +1 -0
  240. package/esm/components/button.d.ts +100 -0
  241. package/esm/components/button.d.ts.map +1 -0
  242. package/esm/components/button.schema.d.ts +120 -0
  243. package/esm/components/button.schema.d.ts.map +1 -0
  244. package/esm/components/card.d.ts +53 -0
  245. package/esm/components/card.d.ts.map +1 -0
  246. package/esm/components/card.schema.d.ts +93 -0
  247. package/esm/components/card.schema.d.ts.map +1 -0
  248. package/esm/components/form.d.ts +212 -0
  249. package/esm/components/form.d.ts.map +1 -0
  250. package/esm/components/form.schema.d.ts +365 -0
  251. package/esm/components/form.schema.d.ts.map +1 -0
  252. package/esm/components/index.d.ts +29 -0
  253. package/esm/components/index.d.ts.map +1 -0
  254. package/esm/components/index.js +2456 -0
  255. package/esm/components/list.d.ts +121 -0
  256. package/esm/components/list.d.ts.map +1 -0
  257. package/esm/components/list.schema.d.ts +129 -0
  258. package/esm/components/list.schema.d.ts.map +1 -0
  259. package/esm/components/modal.d.ts +100 -0
  260. package/esm/components/modal.d.ts.map +1 -0
  261. package/esm/components/modal.schema.d.ts +151 -0
  262. package/esm/components/modal.schema.d.ts.map +1 -0
  263. package/esm/components/table.d.ts +91 -0
  264. package/esm/components/table.d.ts.map +1 -0
  265. package/esm/components/table.schema.d.ts +123 -0
  266. package/esm/components/table.schema.d.ts.map +1 -0
  267. package/esm/dependency/cdn-registry.d.ts +98 -0
  268. package/esm/dependency/cdn-registry.d.ts.map +1 -0
  269. package/esm/dependency/import-map.d.ts +186 -0
  270. package/esm/dependency/import-map.d.ts.map +1 -0
  271. package/esm/dependency/import-parser.d.ts +82 -0
  272. package/esm/dependency/import-parser.d.ts.map +1 -0
  273. package/esm/dependency/index.d.ts +17 -0
  274. package/esm/dependency/index.d.ts.map +1 -0
  275. package/esm/dependency/resolver.d.ts +164 -0
  276. package/esm/dependency/resolver.d.ts.map +1 -0
  277. package/esm/dependency/schemas.d.ts +486 -0
  278. package/esm/dependency/schemas.d.ts.map +1 -0
  279. package/esm/dependency/template-loader.d.ts +204 -0
  280. package/esm/dependency/template-loader.d.ts.map +1 -0
  281. package/esm/dependency/template-processor.d.ts +118 -0
  282. package/esm/dependency/template-processor.d.ts.map +1 -0
  283. package/esm/dependency/types.d.ts +739 -0
  284. package/esm/dependency/types.d.ts.map +1 -0
  285. package/esm/handlebars/expression-extractor.d.ts +147 -0
  286. package/esm/handlebars/expression-extractor.d.ts.map +1 -0
  287. package/esm/handlebars/helpers.d.ts +339 -0
  288. package/esm/handlebars/helpers.d.ts.map +1 -0
  289. package/esm/handlebars/index.d.ts +195 -0
  290. package/esm/handlebars/index.d.ts.map +1 -0
  291. package/esm/handlebars/index.js +587 -0
  292. package/esm/index.d.ts +56 -0
  293. package/esm/index.d.ts.map +1 -0
  294. package/esm/index.js +20511 -0
  295. package/esm/layouts/base.d.ts +86 -0
  296. package/esm/layouts/base.d.ts.map +1 -0
  297. package/esm/layouts/index.d.ts +8 -0
  298. package/esm/layouts/index.d.ts.map +1 -0
  299. package/esm/layouts/index.js +892 -0
  300. package/esm/layouts/presets.d.ts +134 -0
  301. package/esm/layouts/presets.d.ts.map +1 -0
  302. package/esm/package.json +90 -0
  303. package/esm/pages/consent.d.ts +117 -0
  304. package/esm/pages/consent.d.ts.map +1 -0
  305. package/esm/pages/error.d.ts +101 -0
  306. package/esm/pages/error.d.ts.map +1 -0
  307. package/esm/pages/index.d.ts +9 -0
  308. package/esm/pages/index.d.ts.map +1 -0
  309. package/esm/pages/index.js +1563 -0
  310. package/esm/react/Alert.d.ts +102 -0
  311. package/esm/react/Alert.d.ts.map +1 -0
  312. package/esm/react/Badge.d.ts +101 -0
  313. package/esm/react/Badge.d.ts.map +1 -0
  314. package/esm/react/Button.d.ts +109 -0
  315. package/esm/react/Button.d.ts.map +1 -0
  316. package/esm/react/Card.d.ts +104 -0
  317. package/esm/react/Card.d.ts.map +1 -0
  318. package/esm/react/hooks/context.d.ts +179 -0
  319. package/esm/react/hooks/context.d.ts.map +1 -0
  320. package/esm/react/hooks/index.d.ts +42 -0
  321. package/esm/react/hooks/index.d.ts.map +1 -0
  322. package/esm/react/hooks/tools.d.ts +284 -0
  323. package/esm/react/hooks/tools.d.ts.map +1 -0
  324. package/esm/react/index.d.ts +81 -0
  325. package/esm/react/index.d.ts.map +1 -0
  326. package/esm/react/index.js +1372 -0
  327. package/esm/react/types.d.ts +106 -0
  328. package/esm/react/types.d.ts.map +1 -0
  329. package/esm/react/utils.d.ts +43 -0
  330. package/esm/react/utils.d.ts.map +1 -0
  331. package/esm/registry/index.d.ts +46 -0
  332. package/esm/registry/index.d.ts.map +1 -0
  333. package/esm/registry/index.js +6422 -0
  334. package/esm/registry/render-template.d.ts +91 -0
  335. package/esm/registry/render-template.d.ts.map +1 -0
  336. package/esm/registry/tool-ui.registry.d.ts +294 -0
  337. package/esm/registry/tool-ui.registry.d.ts.map +1 -0
  338. package/esm/registry/uri-utils.d.ts +56 -0
  339. package/esm/registry/uri-utils.d.ts.map +1 -0
  340. package/esm/render/index.d.ts +8 -0
  341. package/esm/render/index.d.ts.map +1 -0
  342. package/esm/render/index.js +45 -0
  343. package/esm/render/prerender.d.ts +57 -0
  344. package/esm/render/prerender.d.ts.map +1 -0
  345. package/esm/renderers/cache.d.ts +145 -0
  346. package/esm/renderers/cache.d.ts.map +1 -0
  347. package/esm/renderers/html.renderer.d.ts +123 -0
  348. package/esm/renderers/html.renderer.d.ts.map +1 -0
  349. package/esm/renderers/index.d.ts +36 -0
  350. package/esm/renderers/index.d.ts.map +1 -0
  351. package/esm/renderers/index.js +1827 -0
  352. package/esm/renderers/mdx.renderer.d.ts +120 -0
  353. package/esm/renderers/mdx.renderer.d.ts.map +1 -0
  354. package/esm/renderers/react.renderer.d.ts +96 -0
  355. package/esm/renderers/react.renderer.d.ts.map +1 -0
  356. package/esm/renderers/registry.d.ts +134 -0
  357. package/esm/renderers/registry.d.ts.map +1 -0
  358. package/esm/renderers/types.d.ts +342 -0
  359. package/esm/renderers/types.d.ts.map +1 -0
  360. package/esm/renderers/utils/detect.d.ts +107 -0
  361. package/esm/renderers/utils/detect.d.ts.map +1 -0
  362. package/esm/renderers/utils/hash.d.ts +40 -0
  363. package/esm/renderers/utils/hash.d.ts.map +1 -0
  364. package/esm/renderers/utils/index.d.ts +9 -0
  365. package/esm/renderers/utils/index.d.ts.map +1 -0
  366. package/esm/renderers/utils/transpiler.d.ts +89 -0
  367. package/esm/renderers/utils/transpiler.d.ts.map +1 -0
  368. package/esm/runtime/adapters/html.adapter.d.ts +59 -0
  369. package/esm/runtime/adapters/html.adapter.d.ts.map +1 -0
  370. package/esm/runtime/adapters/index.d.ts +26 -0
  371. package/esm/runtime/adapters/index.d.ts.map +1 -0
  372. package/esm/runtime/adapters/mdx.adapter.d.ts +73 -0
  373. package/esm/runtime/adapters/mdx.adapter.d.ts.map +1 -0
  374. package/esm/runtime/adapters/react.adapter.d.ts +70 -0
  375. package/esm/runtime/adapters/react.adapter.d.ts.map +1 -0
  376. package/esm/runtime/adapters/types.d.ts +95 -0
  377. package/esm/runtime/adapters/types.d.ts.map +1 -0
  378. package/esm/runtime/csp.d.ts +48 -0
  379. package/esm/runtime/csp.d.ts.map +1 -0
  380. package/esm/runtime/index.d.ts +17 -0
  381. package/esm/runtime/index.d.ts.map +1 -0
  382. package/esm/runtime/index.js +5186 -0
  383. package/esm/runtime/mcp-bridge.d.ts +101 -0
  384. package/esm/runtime/mcp-bridge.d.ts.map +1 -0
  385. package/esm/runtime/renderer-runtime.d.ts +133 -0
  386. package/esm/runtime/renderer-runtime.d.ts.map +1 -0
  387. package/esm/runtime/sanitizer.d.ts +172 -0
  388. package/esm/runtime/sanitizer.d.ts.map +1 -0
  389. package/esm/runtime/types.d.ts +415 -0
  390. package/esm/runtime/types.d.ts.map +1 -0
  391. package/esm/runtime/wrapper.d.ts +421 -0
  392. package/esm/runtime/wrapper.d.ts.map +1 -0
  393. package/esm/styles/index.d.ts +8 -0
  394. package/esm/styles/index.d.ts.map +1 -0
  395. package/esm/styles/index.js +171 -0
  396. package/esm/styles/variants.d.ts +51 -0
  397. package/esm/styles/variants.d.ts.map +1 -0
  398. package/esm/theme/cdn.d.ts +195 -0
  399. package/esm/theme/cdn.d.ts.map +1 -0
  400. package/esm/theme/index.d.ts +18 -0
  401. package/esm/theme/index.d.ts.map +1 -0
  402. package/esm/theme/index.js +700 -0
  403. package/esm/theme/platforms.d.ts +107 -0
  404. package/esm/theme/platforms.d.ts.map +1 -0
  405. package/esm/theme/presets/github-openai.d.ts +50 -0
  406. package/esm/theme/presets/github-openai.d.ts.map +1 -0
  407. package/esm/theme/presets/index.d.ts +11 -0
  408. package/esm/theme/presets/index.d.ts.map +1 -0
  409. package/esm/theme/theme.d.ts +396 -0
  410. package/esm/theme/theme.d.ts.map +1 -0
  411. package/esm/tool-template/builder.d.ts +213 -0
  412. package/esm/tool-template/builder.d.ts.map +1 -0
  413. package/esm/tool-template/index.d.ts +16 -0
  414. package/esm/tool-template/index.d.ts.map +1 -0
  415. package/esm/tool-template/index.js +3515 -0
  416. package/esm/types/index.d.ts +14 -0
  417. package/esm/types/index.d.ts.map +1 -0
  418. package/esm/types/index.js +75 -0
  419. package/esm/types/ui-config.d.ts +639 -0
  420. package/esm/types/ui-config.d.ts.map +1 -0
  421. package/esm/types/ui-runtime.d.ts +1007 -0
  422. package/esm/types/ui-runtime.d.ts.map +1 -0
  423. package/esm/typings/cache/cache-adapter.d.ts +125 -0
  424. package/esm/typings/cache/cache-adapter.d.ts.map +1 -0
  425. package/esm/typings/cache/index.d.ts +10 -0
  426. package/esm/typings/cache/index.d.ts.map +1 -0
  427. package/esm/typings/cache/memory-cache.d.ts +92 -0
  428. package/esm/typings/cache/memory-cache.d.ts.map +1 -0
  429. package/esm/typings/dts-parser.d.ts +90 -0
  430. package/esm/typings/dts-parser.d.ts.map +1 -0
  431. package/esm/typings/index.d.ts +48 -0
  432. package/esm/typings/index.d.ts.map +1 -0
  433. package/esm/typings/schemas.d.ts +232 -0
  434. package/esm/typings/schemas.d.ts.map +1 -0
  435. package/esm/typings/type-fetcher.d.ts +89 -0
  436. package/esm/typings/type-fetcher.d.ts.map +1 -0
  437. package/esm/typings/types.d.ts +320 -0
  438. package/esm/typings/types.d.ts.map +1 -0
  439. package/esm/universal/UniversalApp.d.ts +108 -0
  440. package/esm/universal/UniversalApp.d.ts.map +1 -0
  441. package/esm/universal/cached-runtime.d.ts +115 -0
  442. package/esm/universal/cached-runtime.d.ts.map +1 -0
  443. package/esm/universal/context.d.ts +122 -0
  444. package/esm/universal/context.d.ts.map +1 -0
  445. package/esm/universal/index.d.ts +57 -0
  446. package/esm/universal/index.d.ts.map +1 -0
  447. package/esm/universal/renderers/html.renderer.d.ts +37 -0
  448. package/esm/universal/renderers/html.renderer.d.ts.map +1 -0
  449. package/esm/universal/renderers/index.d.ts +112 -0
  450. package/esm/universal/renderers/index.d.ts.map +1 -0
  451. package/esm/universal/renderers/markdown.renderer.d.ts +33 -0
  452. package/esm/universal/renderers/markdown.renderer.d.ts.map +1 -0
  453. package/esm/universal/renderers/mdx.renderer.d.ts +38 -0
  454. package/esm/universal/renderers/mdx.renderer.d.ts.map +1 -0
  455. package/esm/universal/renderers/react.renderer.d.ts +46 -0
  456. package/esm/universal/renderers/react.renderer.d.ts.map +1 -0
  457. package/esm/universal/runtime-builder.d.ts +33 -0
  458. package/esm/universal/runtime-builder.d.ts.map +1 -0
  459. package/esm/universal/store.d.ts +135 -0
  460. package/esm/universal/store.d.ts.map +1 -0
  461. package/esm/universal/types.d.ts +199 -0
  462. package/esm/universal/types.d.ts.map +1 -0
  463. package/esm/utils/escape-html.d.ts +58 -0
  464. package/esm/utils/escape-html.d.ts.map +1 -0
  465. package/esm/utils/index.d.ts +10 -0
  466. package/esm/utils/index.d.ts.map +1 -0
  467. package/esm/utils/index.js +40 -0
  468. package/esm/utils/safe-stringify.d.ts +30 -0
  469. package/esm/utils/safe-stringify.d.ts.map +1 -0
  470. package/esm/validation/error-box.d.ts +56 -0
  471. package/esm/validation/error-box.d.ts.map +1 -0
  472. package/esm/validation/index.d.ts +13 -0
  473. package/esm/validation/index.d.ts.map +1 -0
  474. package/esm/validation/index.js +562 -0
  475. package/esm/validation/schema-paths.d.ts +118 -0
  476. package/esm/validation/schema-paths.d.ts.map +1 -0
  477. package/esm/validation/template-validator.d.ts +143 -0
  478. package/esm/validation/template-validator.d.ts.map +1 -0
  479. package/esm/validation/wrapper.d.ts +97 -0
  480. package/esm/validation/wrapper.d.ts.map +1 -0
  481. package/esm/web-components/core/attribute-parser.d.ts +82 -0
  482. package/esm/web-components/core/attribute-parser.d.ts.map +1 -0
  483. package/esm/web-components/core/base-element.d.ts +197 -0
  484. package/esm/web-components/core/base-element.d.ts.map +1 -0
  485. package/esm/web-components/core/index.d.ts +9 -0
  486. package/esm/web-components/core/index.d.ts.map +1 -0
  487. package/esm/web-components/elements/fmcp-alert.d.ts +46 -0
  488. package/esm/web-components/elements/fmcp-alert.d.ts.map +1 -0
  489. package/esm/web-components/elements/fmcp-badge.d.ts +47 -0
  490. package/esm/web-components/elements/fmcp-badge.d.ts.map +1 -0
  491. package/esm/web-components/elements/fmcp-button.d.ts +117 -0
  492. package/esm/web-components/elements/fmcp-button.d.ts.map +1 -0
  493. package/esm/web-components/elements/fmcp-card.d.ts +53 -0
  494. package/esm/web-components/elements/fmcp-card.d.ts.map +1 -0
  495. package/esm/web-components/elements/fmcp-input.d.ts +96 -0
  496. package/esm/web-components/elements/fmcp-input.d.ts.map +1 -0
  497. package/esm/web-components/elements/fmcp-select.d.ts +100 -0
  498. package/esm/web-components/elements/fmcp-select.d.ts.map +1 -0
  499. package/esm/web-components/elements/index.d.ts +13 -0
  500. package/esm/web-components/elements/index.d.ts.map +1 -0
  501. package/esm/web-components/index.d.ts +50 -0
  502. package/esm/web-components/index.d.ts.map +1 -0
  503. package/esm/web-components/index.js +2048 -0
  504. package/esm/web-components/register.d.ts +57 -0
  505. package/esm/web-components/register.d.ts.map +1 -0
  506. package/esm/web-components/types.d.ts +122 -0
  507. package/esm/web-components/types.d.ts.map +1 -0
  508. package/esm/widgets/index.d.ts +8 -0
  509. package/esm/widgets/index.d.ts.map +1 -0
  510. package/esm/widgets/index.js +941 -0
  511. package/esm/widgets/progress.d.ts +133 -0
  512. package/esm/widgets/progress.d.ts.map +1 -0
  513. package/esm/widgets/resource.d.ts +163 -0
  514. package/esm/widgets/resource.d.ts.map +1 -0
  515. package/handlebars/expression-extractor.d.ts +147 -0
  516. package/handlebars/expression-extractor.d.ts.map +1 -0
  517. package/handlebars/helpers.d.ts +339 -0
  518. package/handlebars/helpers.d.ts.map +1 -0
  519. package/handlebars/index.d.ts +195 -0
  520. package/handlebars/index.d.ts.map +1 -0
  521. package/handlebars/index.js +666 -0
  522. package/index.d.ts +56 -0
  523. package/index.d.ts.map +1 -0
  524. package/index.js +20942 -0
  525. package/layouts/base.d.ts +86 -0
  526. package/layouts/base.d.ts.map +1 -0
  527. package/layouts/index.d.ts +8 -0
  528. package/layouts/index.d.ts.map +1 -0
  529. package/layouts/index.js +930 -0
  530. package/layouts/presets.d.ts +134 -0
  531. package/layouts/presets.d.ts.map +1 -0
  532. package/package.json +26 -85
  533. package/pages/consent.d.ts +117 -0
  534. package/pages/consent.d.ts.map +1 -0
  535. package/pages/error.d.ts +101 -0
  536. package/pages/error.d.ts.map +1 -0
  537. package/pages/index.d.ts +9 -0
  538. package/pages/index.d.ts.map +1 -0
  539. package/pages/index.js +1602 -0
  540. package/react/Alert.d.ts +102 -0
  541. package/react/Alert.d.ts.map +1 -0
  542. package/react/Badge.d.ts +101 -0
  543. package/react/Badge.d.ts.map +1 -0
  544. package/react/Button.d.ts +109 -0
  545. package/react/Button.d.ts.map +1 -0
  546. package/react/Card.d.ts +104 -0
  547. package/react/Card.d.ts.map +1 -0
  548. package/react/hooks/context.d.ts +179 -0
  549. package/react/hooks/context.d.ts.map +1 -0
  550. package/react/hooks/index.d.ts +42 -0
  551. package/react/hooks/index.d.ts.map +1 -0
  552. package/react/hooks/tools.d.ts +284 -0
  553. package/react/hooks/tools.d.ts.map +1 -0
  554. package/react/index.d.ts +81 -0
  555. package/react/index.d.ts.map +1 -0
  556. package/react/index.js +1430 -0
  557. package/react/types.d.ts +106 -0
  558. package/react/types.d.ts.map +1 -0
  559. package/react/utils.d.ts +43 -0
  560. package/react/utils.d.ts.map +1 -0
  561. package/registry/index.d.ts +46 -0
  562. package/registry/index.d.ts.map +1 -0
  563. package/registry/index.js +6465 -0
  564. package/registry/render-template.d.ts +91 -0
  565. package/registry/render-template.d.ts.map +1 -0
  566. package/registry/tool-ui.registry.d.ts +294 -0
  567. package/registry/tool-ui.registry.d.ts.map +1 -0
  568. package/registry/uri-utils.d.ts +56 -0
  569. package/registry/uri-utils.d.ts.map +1 -0
  570. package/render/index.d.ts +8 -0
  571. package/render/index.d.ts.map +1 -0
  572. package/render/index.js +77 -0
  573. package/render/prerender.d.ts +57 -0
  574. package/render/prerender.d.ts.map +1 -0
  575. package/renderers/cache.d.ts +145 -0
  576. package/renderers/cache.d.ts.map +1 -0
  577. package/renderers/html.renderer.d.ts +123 -0
  578. package/renderers/html.renderer.d.ts.map +1 -0
  579. package/renderers/index.d.ts +36 -0
  580. package/renderers/index.d.ts.map +1 -0
  581. package/renderers/index.js +1882 -0
  582. package/renderers/mdx.renderer.d.ts +120 -0
  583. package/renderers/mdx.renderer.d.ts.map +1 -0
  584. package/renderers/react.renderer.d.ts +96 -0
  585. package/renderers/react.renderer.d.ts.map +1 -0
  586. package/renderers/registry.d.ts +134 -0
  587. package/renderers/registry.d.ts.map +1 -0
  588. package/renderers/types.d.ts +342 -0
  589. package/renderers/types.d.ts.map +1 -0
  590. package/renderers/utils/detect.d.ts +107 -0
  591. package/renderers/utils/detect.d.ts.map +1 -0
  592. package/renderers/utils/hash.d.ts +40 -0
  593. package/renderers/utils/hash.d.ts.map +1 -0
  594. package/renderers/utils/index.d.ts +9 -0
  595. package/renderers/utils/index.d.ts.map +1 -0
  596. package/renderers/utils/transpiler.d.ts +89 -0
  597. package/renderers/utils/transpiler.d.ts.map +1 -0
  598. package/runtime/adapters/html.adapter.d.ts +59 -0
  599. package/runtime/adapters/html.adapter.d.ts.map +1 -0
  600. package/runtime/adapters/index.d.ts +26 -0
  601. package/runtime/adapters/index.d.ts.map +1 -0
  602. package/runtime/adapters/mdx.adapter.d.ts +73 -0
  603. package/runtime/adapters/mdx.adapter.d.ts.map +1 -0
  604. package/runtime/adapters/react.adapter.d.ts +70 -0
  605. package/runtime/adapters/react.adapter.d.ts.map +1 -0
  606. package/runtime/adapters/types.d.ts +95 -0
  607. package/runtime/adapters/types.d.ts.map +1 -0
  608. package/runtime/csp.d.ts +48 -0
  609. package/runtime/csp.d.ts.map +1 -0
  610. package/runtime/index.d.ts +17 -0
  611. package/runtime/index.d.ts.map +1 -0
  612. package/runtime/index.js +5264 -0
  613. package/runtime/mcp-bridge.d.ts +101 -0
  614. package/runtime/mcp-bridge.d.ts.map +1 -0
  615. package/runtime/renderer-runtime.d.ts +133 -0
  616. package/runtime/renderer-runtime.d.ts.map +1 -0
  617. package/runtime/sanitizer.d.ts +172 -0
  618. package/runtime/sanitizer.d.ts.map +1 -0
  619. package/runtime/types.d.ts +415 -0
  620. package/runtime/types.d.ts.map +1 -0
  621. package/runtime/wrapper.d.ts +421 -0
  622. package/runtime/wrapper.d.ts.map +1 -0
  623. package/styles/index.d.ts +8 -0
  624. package/styles/index.d.ts.map +1 -0
  625. package/styles/index.js +222 -0
  626. package/styles/variants.d.ts +51 -0
  627. package/styles/variants.d.ts.map +1 -0
  628. package/theme/cdn.d.ts +195 -0
  629. package/theme/cdn.d.ts.map +1 -0
  630. package/theme/index.d.ts +18 -0
  631. package/theme/index.d.ts.map +1 -0
  632. package/theme/index.js +757 -0
  633. package/theme/platforms.d.ts +107 -0
  634. package/theme/platforms.d.ts.map +1 -0
  635. package/theme/presets/github-openai.d.ts +50 -0
  636. package/theme/presets/github-openai.d.ts.map +1 -0
  637. package/theme/presets/index.d.ts +11 -0
  638. package/theme/presets/index.d.ts.map +1 -0
  639. package/theme/theme.d.ts +396 -0
  640. package/theme/theme.d.ts.map +1 -0
  641. package/tool-template/builder.d.ts +213 -0
  642. package/tool-template/builder.d.ts.map +1 -0
  643. package/tool-template/index.d.ts +16 -0
  644. package/tool-template/index.d.ts.map +1 -0
  645. package/tool-template/index.js +3559 -0
  646. package/types/index.d.ts +14 -0
  647. package/types/index.d.ts.map +1 -0
  648. package/types/index.js +108 -0
  649. package/types/ui-config.d.ts +639 -0
  650. package/types/ui-config.d.ts.map +1 -0
  651. package/types/ui-runtime.d.ts +1007 -0
  652. package/types/ui-runtime.d.ts.map +1 -0
  653. package/typings/cache/cache-adapter.d.ts +125 -0
  654. package/typings/cache/cache-adapter.d.ts.map +1 -0
  655. package/typings/cache/index.d.ts +10 -0
  656. package/typings/cache/index.d.ts.map +1 -0
  657. package/typings/cache/memory-cache.d.ts +92 -0
  658. package/typings/cache/memory-cache.d.ts.map +1 -0
  659. package/typings/dts-parser.d.ts +90 -0
  660. package/typings/dts-parser.d.ts.map +1 -0
  661. package/typings/index.d.ts +48 -0
  662. package/typings/index.d.ts.map +1 -0
  663. package/typings/schemas.d.ts +232 -0
  664. package/typings/schemas.d.ts.map +1 -0
  665. package/typings/type-fetcher.d.ts +89 -0
  666. package/typings/type-fetcher.d.ts.map +1 -0
  667. package/typings/types.d.ts +320 -0
  668. package/typings/types.d.ts.map +1 -0
  669. package/universal/UniversalApp.d.ts +108 -0
  670. package/universal/UniversalApp.d.ts.map +1 -0
  671. package/universal/cached-runtime.d.ts +115 -0
  672. package/universal/cached-runtime.d.ts.map +1 -0
  673. package/universal/context.d.ts +122 -0
  674. package/universal/context.d.ts.map +1 -0
  675. package/universal/index.d.ts +57 -0
  676. package/universal/index.d.ts.map +1 -0
  677. package/universal/renderers/html.renderer.d.ts +37 -0
  678. package/universal/renderers/html.renderer.d.ts.map +1 -0
  679. package/universal/renderers/index.d.ts +112 -0
  680. package/universal/renderers/index.d.ts.map +1 -0
  681. package/universal/renderers/markdown.renderer.d.ts +33 -0
  682. package/universal/renderers/markdown.renderer.d.ts.map +1 -0
  683. package/universal/renderers/mdx.renderer.d.ts +38 -0
  684. package/universal/renderers/mdx.renderer.d.ts.map +1 -0
  685. package/universal/renderers/react.renderer.d.ts +46 -0
  686. package/universal/renderers/react.renderer.d.ts.map +1 -0
  687. package/universal/runtime-builder.d.ts +33 -0
  688. package/universal/runtime-builder.d.ts.map +1 -0
  689. package/universal/store.d.ts +135 -0
  690. package/universal/store.d.ts.map +1 -0
  691. package/universal/types.d.ts +199 -0
  692. package/universal/types.d.ts.map +1 -0
  693. package/utils/escape-html.d.ts +58 -0
  694. package/utils/escape-html.d.ts.map +1 -0
  695. package/utils/index.d.ts +10 -0
  696. package/utils/index.d.ts.map +1 -0
  697. package/utils/index.js +70 -0
  698. package/utils/safe-stringify.d.ts +30 -0
  699. package/utils/safe-stringify.d.ts.map +1 -0
  700. package/validation/error-box.d.ts +56 -0
  701. package/validation/error-box.d.ts.map +1 -0
  702. package/validation/index.d.ts +13 -0
  703. package/validation/index.d.ts.map +1 -0
  704. package/validation/index.js +603 -0
  705. package/validation/schema-paths.d.ts +118 -0
  706. package/validation/schema-paths.d.ts.map +1 -0
  707. package/validation/template-validator.d.ts +143 -0
  708. package/validation/template-validator.d.ts.map +1 -0
  709. package/validation/wrapper.d.ts +97 -0
  710. package/validation/wrapper.d.ts.map +1 -0
  711. package/web-components/core/attribute-parser.d.ts +82 -0
  712. package/web-components/core/attribute-parser.d.ts.map +1 -0
  713. package/web-components/core/base-element.d.ts +197 -0
  714. package/web-components/core/base-element.d.ts.map +1 -0
  715. package/web-components/core/index.d.ts +9 -0
  716. package/web-components/core/index.d.ts.map +1 -0
  717. package/web-components/elements/fmcp-alert.d.ts +46 -0
  718. package/web-components/elements/fmcp-alert.d.ts.map +1 -0
  719. package/web-components/elements/fmcp-badge.d.ts +47 -0
  720. package/web-components/elements/fmcp-badge.d.ts.map +1 -0
  721. package/web-components/elements/fmcp-button.d.ts +117 -0
  722. package/web-components/elements/fmcp-button.d.ts.map +1 -0
  723. package/web-components/elements/fmcp-card.d.ts +53 -0
  724. package/web-components/elements/fmcp-card.d.ts.map +1 -0
  725. package/web-components/elements/fmcp-input.d.ts +96 -0
  726. package/web-components/elements/fmcp-input.d.ts.map +1 -0
  727. package/web-components/elements/fmcp-select.d.ts +100 -0
  728. package/web-components/elements/fmcp-select.d.ts.map +1 -0
  729. package/web-components/elements/index.d.ts +13 -0
  730. package/web-components/elements/index.d.ts.map +1 -0
  731. package/web-components/index.d.ts +50 -0
  732. package/web-components/index.d.ts.map +1 -0
  733. package/web-components/index.js +2093 -0
  734. package/web-components/register.d.ts +57 -0
  735. package/web-components/register.d.ts.map +1 -0
  736. package/web-components/types.d.ts +122 -0
  737. package/web-components/types.d.ts.map +1 -0
  738. package/widgets/index.d.ts +8 -0
  739. package/widgets/index.d.ts.map +1 -0
  740. package/widgets/index.js +978 -0
  741. package/widgets/progress.d.ts +133 -0
  742. package/widgets/progress.d.ts.map +1 -0
  743. package/widgets/resource.d.ts +163 -0
  744. package/widgets/resource.d.ts.map +1 -0
  745. package/src/adapters/index.d.ts +0 -10
  746. package/src/adapters/index.js +0 -18
  747. package/src/adapters/index.js.map +0 -1
  748. package/src/adapters/platform-meta.d.ts +0 -165
  749. package/src/adapters/platform-meta.js +0 -310
  750. package/src/adapters/platform-meta.js.map +0 -1
  751. package/src/base-template/bridge.d.ts +0 -89
  752. package/src/base-template/bridge.js +0 -452
  753. package/src/base-template/bridge.js.map +0 -1
  754. package/src/base-template/default-base-template.d.ts +0 -91
  755. package/src/base-template/default-base-template.js +0 -435
  756. package/src/base-template/default-base-template.js.map +0 -1
  757. package/src/base-template/index.d.ts +0 -14
  758. package/src/base-template/index.js +0 -30
  759. package/src/base-template/index.js.map +0 -1
  760. package/src/base-template/polyfills.d.ts +0 -30
  761. package/src/base-template/polyfills.js +0 -190
  762. package/src/base-template/polyfills.js.map +0 -1
  763. package/src/base-template/theme-styles.d.ts +0 -73
  764. package/src/base-template/theme-styles.js +0 -95
  765. package/src/base-template/theme-styles.js.map +0 -1
  766. package/src/bridge/adapters/base-adapter.d.ts +0 -103
  767. package/src/bridge/adapters/base-adapter.js +0 -314
  768. package/src/bridge/adapters/base-adapter.js.map +0 -1
  769. package/src/bridge/adapters/claude.adapter.d.ts +0 -66
  770. package/src/bridge/adapters/claude.adapter.js +0 -145
  771. package/src/bridge/adapters/claude.adapter.js.map +0 -1
  772. package/src/bridge/adapters/ext-apps.adapter.d.ts +0 -142
  773. package/src/bridge/adapters/ext-apps.adapter.js +0 -416
  774. package/src/bridge/adapters/ext-apps.adapter.js.map +0 -1
  775. package/src/bridge/adapters/gemini.adapter.d.ts +0 -63
  776. package/src/bridge/adapters/gemini.adapter.js +0 -160
  777. package/src/bridge/adapters/gemini.adapter.js.map +0 -1
  778. package/src/bridge/adapters/generic.adapter.d.ts +0 -55
  779. package/src/bridge/adapters/generic.adapter.js +0 -108
  780. package/src/bridge/adapters/generic.adapter.js.map +0 -1
  781. package/src/bridge/adapters/index.d.ts +0 -25
  782. package/src/bridge/adapters/index.js +0 -65
  783. package/src/bridge/adapters/index.js.map +0 -1
  784. package/src/bridge/adapters/openai.adapter.d.ts +0 -64
  785. package/src/bridge/adapters/openai.adapter.js +0 -194
  786. package/src/bridge/adapters/openai.adapter.js.map +0 -1
  787. package/src/bridge/core/adapter-registry.d.ts +0 -121
  788. package/src/bridge/core/adapter-registry.js +0 -271
  789. package/src/bridge/core/adapter-registry.js.map +0 -1
  790. package/src/bridge/core/bridge-factory.d.ts +0 -198
  791. package/src/bridge/core/bridge-factory.js +0 -428
  792. package/src/bridge/core/bridge-factory.js.map +0 -1
  793. package/src/bridge/core/index.d.ts +0 -9
  794. package/src/bridge/core/index.js +0 -22
  795. package/src/bridge/core/index.js.map +0 -1
  796. package/src/bridge/index.d.ts +0 -61
  797. package/src/bridge/index.js +0 -94
  798. package/src/bridge/index.js.map +0 -1
  799. package/src/bridge/runtime/iife-generator.d.ts +0 -61
  800. package/src/bridge/runtime/iife-generator.js +0 -940
  801. package/src/bridge/runtime/iife-generator.js.map +0 -1
  802. package/src/bridge/runtime/index.d.ts +0 -8
  803. package/src/bridge/runtime/index.js +0 -16
  804. package/src/bridge/runtime/index.js.map +0 -1
  805. package/src/bridge/types.d.ts +0 -385
  806. package/src/bridge/types.js +0 -11
  807. package/src/bridge/types.js.map +0 -1
  808. package/src/build/cdn-resources.d.ts +0 -140
  809. package/src/build/cdn-resources.js +0 -314
  810. package/src/build/cdn-resources.js.map +0 -1
  811. package/src/build/index.d.ts +0 -294
  812. package/src/build/index.js +0 -325
  813. package/src/build/index.js.map +0 -1
  814. package/src/build/widget-manifest.d.ts +0 -212
  815. package/src/build/widget-manifest.js +0 -652
  816. package/src/build/widget-manifest.js.map +0 -1
  817. package/src/bundler/bundler.d.ts +0 -110
  818. package/src/bundler/bundler.js +0 -432
  819. package/src/bundler/bundler.js.map +0 -1
  820. package/src/bundler/cache.d.ts +0 -172
  821. package/src/bundler/cache.js +0 -250
  822. package/src/bundler/cache.js.map +0 -1
  823. package/src/bundler/index.d.ts +0 -41
  824. package/src/bundler/index.js +0 -73
  825. package/src/bundler/index.js.map +0 -1
  826. package/src/bundler/sandbox/enclave-adapter.d.ts +0 -120
  827. package/src/bundler/sandbox/enclave-adapter.js +0 -339
  828. package/src/bundler/sandbox/enclave-adapter.js.map +0 -1
  829. package/src/bundler/sandbox/executor.d.ts +0 -13
  830. package/src/bundler/sandbox/executor.js +0 -22
  831. package/src/bundler/sandbox/executor.js.map +0 -1
  832. package/src/bundler/sandbox/policy.d.ts +0 -61
  833. package/src/bundler/sandbox/policy.js +0 -238
  834. package/src/bundler/sandbox/policy.js.map +0 -1
  835. package/src/bundler/types.d.ts +0 -347
  836. package/src/bundler/types.js +0 -132
  837. package/src/bundler/types.js.map +0 -1
  838. package/src/components/alert.d.ts +0 -71
  839. package/src/components/alert.js +0 -189
  840. package/src/components/alert.js.map +0 -1
  841. package/src/components/alert.schema.d.ts +0 -114
  842. package/src/components/alert.schema.js +0 -105
  843. package/src/components/alert.schema.js.map +0 -1
  844. package/src/components/avatar.d.ts +0 -76
  845. package/src/components/avatar.js +0 -176
  846. package/src/components/avatar.js.map +0 -1
  847. package/src/components/avatar.schema.d.ts +0 -169
  848. package/src/components/avatar.schema.js +0 -103
  849. package/src/components/avatar.schema.js.map +0 -1
  850. package/src/components/badge.d.ts +0 -70
  851. package/src/components/badge.js +0 -149
  852. package/src/components/badge.js.map +0 -1
  853. package/src/components/badge.schema.d.ts +0 -109
  854. package/src/components/badge.schema.js +0 -96
  855. package/src/components/badge.schema.js.map +0 -1
  856. package/src/components/button.d.ts +0 -111
  857. package/src/components/button.js +0 -336
  858. package/src/components/button.js.map +0 -1
  859. package/src/components/button.schema.d.ts +0 -148
  860. package/src/components/button.schema.js +0 -121
  861. package/src/components/button.schema.js.map +0 -1
  862. package/src/components/card.d.ts +0 -60
  863. package/src/components/card.js +0 -117
  864. package/src/components/card.js.map +0 -1
  865. package/src/components/card.schema.d.ts +0 -113
  866. package/src/components/card.schema.js +0 -98
  867. package/src/components/card.schema.js.map +0 -1
  868. package/src/components/form.d.ts +0 -239
  869. package/src/components/form.js +0 -420
  870. package/src/components/form.js.map +0 -1
  871. package/src/components/form.schema.d.ts +0 -441
  872. package/src/components/form.schema.js +0 -406
  873. package/src/components/form.schema.js.map +0 -1
  874. package/src/components/index.d.ts +0 -29
  875. package/src/components/index.js +0 -98
  876. package/src/components/index.js.map +0 -1
  877. package/src/components/list.d.ts +0 -127
  878. package/src/components/list.js +0 -279
  879. package/src/components/list.js.map +0 -1
  880. package/src/components/list.schema.d.ts +0 -134
  881. package/src/components/list.schema.js +0 -168
  882. package/src/components/list.schema.js.map +0 -1
  883. package/src/components/modal.d.ts +0 -111
  884. package/src/components/modal.js +0 -260
  885. package/src/components/modal.js.map +0 -1
  886. package/src/components/modal.schema.d.ts +0 -186
  887. package/src/components/modal.schema.js +0 -167
  888. package/src/components/modal.schema.js.map +0 -1
  889. package/src/components/table.d.ts +0 -105
  890. package/src/components/table.js +0 -283
  891. package/src/components/table.js.map +0 -1
  892. package/src/components/table.schema.d.ts +0 -159
  893. package/src/components/table.schema.js +0 -173
  894. package/src/components/table.schema.js.map +0 -1
  895. package/src/handlebars/helpers.d.ts +0 -348
  896. package/src/handlebars/helpers.js +0 -605
  897. package/src/handlebars/helpers.js.map +0 -1
  898. package/src/handlebars/index.d.ts +0 -193
  899. package/src/handlebars/index.js +0 -350
  900. package/src/handlebars/index.js.map +0 -1
  901. package/src/index.d.ts +0 -50
  902. package/src/index.js +0 -192
  903. package/src/index.js.map +0 -1
  904. package/src/layouts/base.d.ts +0 -88
  905. package/src/layouts/base.js +0 -227
  906. package/src/layouts/base.js.map +0 -1
  907. package/src/layouts/index.d.ts +0 -7
  908. package/src/layouts/index.js +0 -25
  909. package/src/layouts/index.js.map +0 -1
  910. package/src/layouts/presets.d.ts +0 -133
  911. package/src/layouts/presets.js +0 -277
  912. package/src/layouts/presets.js.map +0 -1
  913. package/src/pages/consent.d.ts +0 -116
  914. package/src/pages/consent.js +0 -218
  915. package/src/pages/consent.js.map +0 -1
  916. package/src/pages/error.d.ts +0 -100
  917. package/src/pages/error.js +0 -263
  918. package/src/pages/error.js.map +0 -1
  919. package/src/pages/index.d.ts +0 -8
  920. package/src/pages/index.js +0 -27
  921. package/src/pages/index.js.map +0 -1
  922. package/src/react/Alert.d.ts +0 -101
  923. package/src/react/Alert.js +0 -51
  924. package/src/react/Alert.js.map +0 -1
  925. package/src/react/Badge.d.ts +0 -100
  926. package/src/react/Badge.js +0 -55
  927. package/src/react/Badge.js.map +0 -1
  928. package/src/react/Button.d.ts +0 -108
  929. package/src/react/Button.js +0 -52
  930. package/src/react/Button.js.map +0 -1
  931. package/src/react/Card.d.ts +0 -103
  932. package/src/react/Card.js +0 -55
  933. package/src/react/Card.js.map +0 -1
  934. package/src/react/hooks/context.d.ts +0 -178
  935. package/src/react/hooks/context.js +0 -287
  936. package/src/react/hooks/context.js.map +0 -1
  937. package/src/react/hooks/index.d.ts +0 -41
  938. package/src/react/hooks/index.js +0 -61
  939. package/src/react/hooks/index.js.map +0 -1
  940. package/src/react/hooks/tools.d.ts +0 -283
  941. package/src/react/hooks/tools.js +0 -465
  942. package/src/react/hooks/tools.js.map +0 -1
  943. package/src/react/index.d.ts +0 -80
  944. package/src/react/index.js +0 -113
  945. package/src/react/index.js.map +0 -1
  946. package/src/react/types.d.ts +0 -105
  947. package/src/react/types.js +0 -12
  948. package/src/react/types.js.map +0 -1
  949. package/src/react/utils.d.ts +0 -42
  950. package/src/react/utils.js +0 -99
  951. package/src/react/utils.js.map +0 -1
  952. package/src/registry/index.d.ts +0 -45
  953. package/src/registry/index.js +0 -67
  954. package/src/registry/index.js.map +0 -1
  955. package/src/registry/render-template.d.ts +0 -86
  956. package/src/registry/render-template.js +0 -239
  957. package/src/registry/render-template.js.map +0 -1
  958. package/src/registry/tool-ui.registry.d.ts +0 -260
  959. package/src/registry/tool-ui.registry.js +0 -438
  960. package/src/registry/tool-ui.registry.js.map +0 -1
  961. package/src/registry/uri-utils.d.ts +0 -55
  962. package/src/registry/uri-utils.js +0 -97
  963. package/src/registry/uri-utils.js.map +0 -1
  964. package/src/render/index.d.ts +0 -7
  965. package/src/render/index.js +0 -14
  966. package/src/render/index.js.map +0 -1
  967. package/src/render/prerender.d.ts +0 -56
  968. package/src/render/prerender.js +0 -98
  969. package/src/render/prerender.js.map +0 -1
  970. package/src/renderers/cache.d.ts +0 -144
  971. package/src/renderers/cache.js +0 -240
  972. package/src/renderers/cache.js.map +0 -1
  973. package/src/renderers/html.renderer.d.ts +0 -122
  974. package/src/renderers/html.renderer.js +0 -204
  975. package/src/renderers/html.renderer.js.map +0 -1
  976. package/src/renderers/index.d.ts +0 -35
  977. package/src/renderers/index.js +0 -70
  978. package/src/renderers/index.js.map +0 -1
  979. package/src/renderers/mdx.renderer.d.ts +0 -119
  980. package/src/renderers/mdx.renderer.js +0 -305
  981. package/src/renderers/mdx.renderer.js.map +0 -1
  982. package/src/renderers/react.renderer.d.ts +0 -95
  983. package/src/renderers/react.renderer.js +0 -260
  984. package/src/renderers/react.renderer.js.map +0 -1
  985. package/src/renderers/registry.d.ts +0 -133
  986. package/src/renderers/registry.js +0 -232
  987. package/src/renderers/registry.js.map +0 -1
  988. package/src/renderers/types.d.ts +0 -341
  989. package/src/renderers/types.js +0 -9
  990. package/src/renderers/types.js.map +0 -1
  991. package/src/renderers/utils/detect.d.ts +0 -106
  992. package/src/renderers/utils/detect.js +0 -267
  993. package/src/renderers/utils/detect.js.map +0 -1
  994. package/src/renderers/utils/hash.d.ts +0 -39
  995. package/src/renderers/utils/hash.js +0 -75
  996. package/src/renderers/utils/hash.js.map +0 -1
  997. package/src/renderers/utils/index.d.ts +0 -8
  998. package/src/renderers/utils/index.js +0 -28
  999. package/src/renderers/utils/index.js.map +0 -1
  1000. package/src/renderers/utils/transpiler.d.ts +0 -88
  1001. package/src/renderers/utils/transpiler.js +0 -215
  1002. package/src/renderers/utils/transpiler.js.map +0 -1
  1003. package/src/runtime/adapters/html.adapter.d.ts +0 -58
  1004. package/src/runtime/adapters/html.adapter.js +0 -131
  1005. package/src/runtime/adapters/html.adapter.js.map +0 -1
  1006. package/src/runtime/adapters/index.d.ts +0 -25
  1007. package/src/runtime/adapters/index.js +0 -54
  1008. package/src/runtime/adapters/index.js.map +0 -1
  1009. package/src/runtime/adapters/mdx.adapter.d.ts +0 -72
  1010. package/src/runtime/adapters/mdx.adapter.js +0 -241
  1011. package/src/runtime/adapters/mdx.adapter.js.map +0 -1
  1012. package/src/runtime/adapters/react.adapter.d.ts +0 -69
  1013. package/src/runtime/adapters/react.adapter.js +0 -245
  1014. package/src/runtime/adapters/react.adapter.js.map +0 -1
  1015. package/src/runtime/adapters/types.d.ts +0 -94
  1016. package/src/runtime/adapters/types.js +0 -11
  1017. package/src/runtime/adapters/types.js.map +0 -1
  1018. package/src/runtime/csp.d.ts +0 -37
  1019. package/src/runtime/csp.js +0 -140
  1020. package/src/runtime/csp.js.map +0 -1
  1021. package/src/runtime/index.d.ts +0 -16
  1022. package/src/runtime/index.js +0 -72
  1023. package/src/runtime/index.js.map +0 -1
  1024. package/src/runtime/mcp-bridge.d.ts +0 -100
  1025. package/src/runtime/mcp-bridge.js +0 -581
  1026. package/src/runtime/mcp-bridge.js.map +0 -1
  1027. package/src/runtime/renderer-runtime.d.ts +0 -132
  1028. package/src/runtime/renderer-runtime.js +0 -389
  1029. package/src/runtime/renderer-runtime.js.map +0 -1
  1030. package/src/runtime/sanitizer.d.ts +0 -171
  1031. package/src/runtime/sanitizer.js +0 -318
  1032. package/src/runtime/sanitizer.js.map +0 -1
  1033. package/src/runtime/types.d.ts +0 -414
  1034. package/src/runtime/types.js +0 -12
  1035. package/src/runtime/types.js.map +0 -1
  1036. package/src/runtime/wrapper.d.ts +0 -375
  1037. package/src/runtime/wrapper.js +0 -1793
  1038. package/src/runtime/wrapper.js.map +0 -1
  1039. package/src/styles/index.d.ts +0 -7
  1040. package/src/styles/index.js +0 -11
  1041. package/src/styles/index.js.map +0 -1
  1042. package/src/styles/variants.d.ts +0 -50
  1043. package/src/styles/variants.js +0 -175
  1044. package/src/styles/variants.js.map +0 -1
  1045. package/src/theme/cdn.d.ts +0 -194
  1046. package/src/theme/cdn.js +0 -375
  1047. package/src/theme/cdn.js.map +0 -1
  1048. package/src/theme/index.d.ts +0 -17
  1049. package/src/theme/index.js +0 -57
  1050. package/src/theme/index.js.map +0 -1
  1051. package/src/theme/platforms.d.ts +0 -106
  1052. package/src/theme/platforms.js +0 -161
  1053. package/src/theme/platforms.js.map +0 -1
  1054. package/src/theme/presets/github-openai.d.ts +0 -49
  1055. package/src/theme/presets/github-openai.js +0 -189
  1056. package/src/theme/presets/github-openai.js.map +0 -1
  1057. package/src/theme/presets/index.d.ts +0 -10
  1058. package/src/theme/presets/index.js +0 -17
  1059. package/src/theme/presets/index.js.map +0 -1
  1060. package/src/theme/theme.d.ts +0 -395
  1061. package/src/theme/theme.js +0 -332
  1062. package/src/theme/theme.js.map +0 -1
  1063. package/src/tool-template/builder.d.ts +0 -212
  1064. package/src/tool-template/builder.js +0 -397
  1065. package/src/tool-template/builder.js.map +0 -1
  1066. package/src/tool-template/index.d.ts +0 -15
  1067. package/src/tool-template/index.js +0 -38
  1068. package/src/tool-template/index.js.map +0 -1
  1069. package/src/types/index.d.ts +0 -13
  1070. package/src/types/index.js +0 -26
  1071. package/src/types/index.js.map +0 -1
  1072. package/src/types/ui-config.d.ts +0 -357
  1073. package/src/types/ui-config.js +0 -12
  1074. package/src/types/ui-config.js.map +0 -1
  1075. package/src/types/ui-runtime.d.ts +0 -965
  1076. package/src/types/ui-runtime.js +0 -117
  1077. package/src/types/ui-runtime.js.map +0 -1
  1078. package/src/validation/error-box.d.ts +0 -55
  1079. package/src/validation/error-box.js +0 -75
  1080. package/src/validation/error-box.js.map +0 -1
  1081. package/src/validation/index.d.ts +0 -12
  1082. package/src/validation/index.js +0 -21
  1083. package/src/validation/index.js.map +0 -1
  1084. package/src/validation/wrapper.d.ts +0 -96
  1085. package/src/validation/wrapper.js +0 -117
  1086. package/src/validation/wrapper.js.map +0 -1
  1087. package/src/web-components/core/attribute-parser.d.ts +0 -85
  1088. package/src/web-components/core/attribute-parser.js +0 -189
  1089. package/src/web-components/core/attribute-parser.js.map +0 -1
  1090. package/src/web-components/core/base-element.d.ts +0 -197
  1091. package/src/web-components/core/base-element.js +0 -289
  1092. package/src/web-components/core/base-element.js.map +0 -1
  1093. package/src/web-components/core/index.d.ts +0 -8
  1094. package/src/web-components/core/index.js +0 -18
  1095. package/src/web-components/core/index.js.map +0 -1
  1096. package/src/web-components/elements/fmcp-alert.d.ts +0 -45
  1097. package/src/web-components/elements/fmcp-alert.js +0 -93
  1098. package/src/web-components/elements/fmcp-alert.js.map +0 -1
  1099. package/src/web-components/elements/fmcp-badge.d.ts +0 -46
  1100. package/src/web-components/elements/fmcp-badge.js +0 -99
  1101. package/src/web-components/elements/fmcp-badge.js.map +0 -1
  1102. package/src/web-components/elements/fmcp-button.d.ts +0 -124
  1103. package/src/web-components/elements/fmcp-button.js +0 -233
  1104. package/src/web-components/elements/fmcp-button.js.map +0 -1
  1105. package/src/web-components/elements/fmcp-card.d.ts +0 -52
  1106. package/src/web-components/elements/fmcp-card.js +0 -115
  1107. package/src/web-components/elements/fmcp-card.js.map +0 -1
  1108. package/src/web-components/elements/fmcp-input.d.ts +0 -95
  1109. package/src/web-components/elements/fmcp-input.js +0 -248
  1110. package/src/web-components/elements/fmcp-input.js.map +0 -1
  1111. package/src/web-components/elements/fmcp-select.d.ts +0 -99
  1112. package/src/web-components/elements/fmcp-select.js +0 -243
  1113. package/src/web-components/elements/fmcp-select.js.map +0 -1
  1114. package/src/web-components/elements/index.d.ts +0 -12
  1115. package/src/web-components/elements/index.js +0 -34
  1116. package/src/web-components/elements/index.js.map +0 -1
  1117. package/src/web-components/index.d.ts +0 -49
  1118. package/src/web-components/index.js +0 -75
  1119. package/src/web-components/index.js.map +0 -1
  1120. package/src/web-components/register.d.ts +0 -56
  1121. package/src/web-components/register.js +0 -80
  1122. package/src/web-components/register.js.map +0 -1
  1123. package/src/web-components/types.d.ts +0 -121
  1124. package/src/web-components/types.js +0 -25
  1125. package/src/web-components/types.js.map +0 -1
  1126. package/src/widgets/index.d.ts +0 -7
  1127. package/src/widgets/index.js +0 -24
  1128. package/src/widgets/index.js.map +0 -1
  1129. package/src/widgets/progress.d.ts +0 -132
  1130. package/src/widgets/progress.js +0 -303
  1131. package/src/widgets/progress.js.map +0 -1
  1132. package/src/widgets/resource.d.ts +0 -162
  1133. package/src/widgets/resource.js +0 -340
  1134. package/src/widgets/resource.js.map +0 -1
@@ -0,0 +1,2487 @@
1
+ // libs/ui/src/bridge/core/adapter-registry.ts
2
+ var AdapterRegistry = class {
3
+ _adapters = /* @__PURE__ */ new Map();
4
+ _disabledAdapters = /* @__PURE__ */ new Set();
5
+ _adapterConfigs = /* @__PURE__ */ new Map();
6
+ _debug = false;
7
+ /**
8
+ * Enable or disable debug logging.
9
+ */
10
+ setDebug(enabled) {
11
+ this._debug = enabled;
12
+ }
13
+ /**
14
+ * Register an adapter factory with the registry.
15
+ * @param id - Unique adapter identifier
16
+ * @param factory - Factory function that creates the adapter
17
+ * @param defaultConfig - Optional default configuration
18
+ */
19
+ register(id, factory, defaultConfig) {
20
+ if (this._adapters.has(id)) {
21
+ this._log(`Overwriting existing adapter: ${id}`);
22
+ }
23
+ this._adapters.set(id, {
24
+ id,
25
+ factory,
26
+ defaultConfig
27
+ });
28
+ this._log(`Registered adapter: ${id}`);
29
+ }
30
+ /**
31
+ * Unregister an adapter from the registry.
32
+ * @param id - Adapter identifier to remove
33
+ */
34
+ unregister(id) {
35
+ const removed = this._adapters.delete(id);
36
+ if (removed) {
37
+ this._log(`Unregistered adapter: ${id}`);
38
+ }
39
+ return removed;
40
+ }
41
+ /**
42
+ * Check if an adapter is registered.
43
+ * @param id - Adapter identifier
44
+ */
45
+ has(id) {
46
+ return this._adapters.has(id);
47
+ }
48
+ /**
49
+ * Get all registered adapter IDs.
50
+ */
51
+ getRegisteredIds() {
52
+ return Array.from(this._adapters.keys());
53
+ }
54
+ /**
55
+ * Disable specific adapters (they won't be selected during auto-detection).
56
+ * @param ids - Adapter IDs to disable
57
+ */
58
+ disable(...ids) {
59
+ for (const id of ids) {
60
+ this._disabledAdapters.add(id);
61
+ this._log(`Disabled adapter: ${id}`);
62
+ }
63
+ }
64
+ /**
65
+ * Enable previously disabled adapters.
66
+ * @param ids - Adapter IDs to enable
67
+ */
68
+ enable(...ids) {
69
+ for (const id of ids) {
70
+ this._disabledAdapters.delete(id);
71
+ this._log(`Enabled adapter: ${id}`);
72
+ }
73
+ }
74
+ /**
75
+ * Check if an adapter is disabled.
76
+ * @param id - Adapter identifier
77
+ */
78
+ isDisabled(id) {
79
+ return this._disabledAdapters.has(id);
80
+ }
81
+ /**
82
+ * Set adapter-specific configuration.
83
+ * @param id - Adapter identifier
84
+ * @param config - Configuration to apply
85
+ */
86
+ configure(id, config) {
87
+ this._adapterConfigs.set(id, config);
88
+ this._log(`Configured adapter: ${id}`);
89
+ }
90
+ /**
91
+ * Get an adapter instance by ID.
92
+ * @param id - Adapter identifier
93
+ * @returns Adapter instance or undefined if not found/disabled
94
+ */
95
+ get(id) {
96
+ if (this._disabledAdapters.has(id)) {
97
+ this._log(`Adapter ${id} is disabled`);
98
+ return void 0;
99
+ }
100
+ const registration = this._adapters.get(id);
101
+ if (!registration) {
102
+ this._log(`Adapter ${id} not found`);
103
+ return void 0;
104
+ }
105
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(id));
106
+ if (config?.enabled === false) {
107
+ this._log(`Adapter ${id} is disabled via config`);
108
+ return void 0;
109
+ }
110
+ return registration.factory(config);
111
+ }
112
+ /**
113
+ * Auto-detect and return the best adapter for the current environment.
114
+ * Adapters are checked in priority order (highest first).
115
+ * @returns The first adapter that can handle the current environment, or undefined
116
+ */
117
+ detect() {
118
+ const candidates = this._getSortedCandidates();
119
+ for (const registration of candidates) {
120
+ if (this._disabledAdapters.has(registration.id)) {
121
+ this._log(`Skipping disabled adapter: ${registration.id}`);
122
+ continue;
123
+ }
124
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(registration.id));
125
+ if (config?.enabled === false) {
126
+ this._log(`Skipping adapter disabled via config: ${registration.id}`);
127
+ continue;
128
+ }
129
+ try {
130
+ const adapter = registration.factory(config);
131
+ if (adapter.canHandle()) {
132
+ this._log(`Detected adapter: ${registration.id} (priority: ${adapter.priority})`);
133
+ return adapter;
134
+ }
135
+ this._log(`Adapter ${registration.id} cannot handle current environment`);
136
+ } catch (error) {
137
+ this._log(`Error creating adapter ${registration.id}: ${error}`);
138
+ }
139
+ }
140
+ this._log("No suitable adapter detected");
141
+ return void 0;
142
+ }
143
+ /**
144
+ * Get all adapters that can handle the current environment.
145
+ * Useful for debugging or showing available options.
146
+ * @returns Array of compatible adapters sorted by priority (highest first)
147
+ */
148
+ detectAll() {
149
+ const candidates = this._getSortedCandidates();
150
+ const compatible = [];
151
+ for (const registration of candidates) {
152
+ if (this._disabledAdapters.has(registration.id)) {
153
+ continue;
154
+ }
155
+ const config = this._mergeConfig(registration.defaultConfig, this._adapterConfigs.get(registration.id));
156
+ if (config?.enabled === false) {
157
+ continue;
158
+ }
159
+ try {
160
+ const adapter = registration.factory(config);
161
+ if (adapter.canHandle()) {
162
+ compatible.push(adapter);
163
+ }
164
+ } catch {
165
+ }
166
+ }
167
+ return compatible;
168
+ }
169
+ /**
170
+ * Clear all registered adapters.
171
+ */
172
+ clear() {
173
+ this._adapters.clear();
174
+ this._disabledAdapters.clear();
175
+ this._adapterConfigs.clear();
176
+ this._log("Cleared all adapters");
177
+ }
178
+ /**
179
+ * Get sorted candidate adapters by priority (highest first).
180
+ */
181
+ _getSortedCandidates() {
182
+ const registrations = Array.from(this._adapters.values());
183
+ const withPriority = registrations.map((reg) => {
184
+ try {
185
+ const adapter = reg.factory(reg.defaultConfig);
186
+ return { registration: reg, priority: adapter.priority };
187
+ } catch {
188
+ return { registration: reg, priority: -1 };
189
+ }
190
+ });
191
+ withPriority.sort((a, b) => b.priority - a.priority);
192
+ return withPriority.map((item) => item.registration);
193
+ }
194
+ /**
195
+ * Merge default config with user config.
196
+ */
197
+ _mergeConfig(defaultConfig, userConfig) {
198
+ if (!defaultConfig && !userConfig) {
199
+ return void 0;
200
+ }
201
+ return {
202
+ ...defaultConfig,
203
+ ...userConfig,
204
+ options: {
205
+ ...defaultConfig?.options,
206
+ ...userConfig?.options
207
+ }
208
+ };
209
+ }
210
+ /**
211
+ * Log debug message if debugging is enabled.
212
+ */
213
+ _log(message) {
214
+ if (this._debug) {
215
+ console.log(`[AdapterRegistry] ${message}`);
216
+ }
217
+ }
218
+ };
219
+ var defaultRegistry = new AdapterRegistry();
220
+ function registerAdapter(id, factory, defaultConfig) {
221
+ defaultRegistry.register(id, factory, defaultConfig);
222
+ }
223
+ function getAdapter(id) {
224
+ return defaultRegistry.get(id);
225
+ }
226
+ function detectAdapter() {
227
+ return defaultRegistry.detect();
228
+ }
229
+
230
+ // libs/ui/src/bridge/core/bridge-factory.ts
231
+ var DEFAULT_CONFIG = {
232
+ debug: false,
233
+ initTimeout: 5e3
234
+ };
235
+ var FrontMcpBridge = class {
236
+ _config;
237
+ _registry;
238
+ _adapter;
239
+ _initialized = false;
240
+ _initPromise;
241
+ /**
242
+ * Create a new FrontMcpBridge instance.
243
+ * @param config - Bridge configuration
244
+ * @param registry - Optional custom adapter registry (uses default if not provided)
245
+ */
246
+ constructor(config = {}, registry) {
247
+ this._config = { ...DEFAULT_CONFIG, ...config };
248
+ this._registry = registry || defaultRegistry;
249
+ if (this._config.debug) {
250
+ this._registry.setDebug(true);
251
+ }
252
+ if (this._config.disabledAdapters) {
253
+ this._registry.disable(...this._config.disabledAdapters);
254
+ }
255
+ if (this._config.adapterConfigs) {
256
+ for (const [id, adapterConfig] of Object.entries(this._config.adapterConfigs)) {
257
+ this._registry.configure(id, adapterConfig);
258
+ }
259
+ }
260
+ }
261
+ // ============================================
262
+ // Public Properties
263
+ // ============================================
264
+ /**
265
+ * Whether the bridge has been initialized.
266
+ */
267
+ get initialized() {
268
+ return this._initialized;
269
+ }
270
+ /**
271
+ * Current adapter ID, or undefined if not initialized.
272
+ */
273
+ get adapterId() {
274
+ return this._adapter?.id;
275
+ }
276
+ /**
277
+ * Current adapter capabilities, or undefined if not initialized.
278
+ */
279
+ get capabilities() {
280
+ return this._adapter?.capabilities;
281
+ }
282
+ // ============================================
283
+ // Lifecycle
284
+ // ============================================
285
+ /**
286
+ * Initialize the bridge.
287
+ * Auto-detects the best adapter for the current platform unless
288
+ * `forceAdapter` is specified in the config.
289
+ *
290
+ * @throws Error if no suitable adapter is found
291
+ */
292
+ async initialize() {
293
+ if (this._initPromise) {
294
+ return this._initPromise;
295
+ }
296
+ if (this._initialized) {
297
+ return;
298
+ }
299
+ this._initPromise = this._doInitialize();
300
+ try {
301
+ await this._initPromise;
302
+ } finally {
303
+ this._initPromise = void 0;
304
+ }
305
+ }
306
+ /**
307
+ * Internal initialization logic.
308
+ */
309
+ async _doInitialize() {
310
+ this._log("Initializing FrontMcpBridge...");
311
+ if (this._config.forceAdapter) {
312
+ this._adapter = this._registry.get(this._config.forceAdapter);
313
+ if (!this._adapter) {
314
+ throw new Error(`Forced adapter "${this._config.forceAdapter}" not found or disabled`);
315
+ }
316
+ this._log(`Using forced adapter: ${this._config.forceAdapter}`);
317
+ } else {
318
+ this._adapter = this._registry.detect();
319
+ if (!this._adapter) {
320
+ throw new Error("No suitable adapter detected for current environment");
321
+ }
322
+ this._log(`Auto-detected adapter: ${this._adapter.id}`);
323
+ }
324
+ try {
325
+ await this._withTimeout(this._adapter.initialize(), this._config.initTimeout || 5e3);
326
+ this._initialized = true;
327
+ this._log(`Bridge initialized with adapter: ${this._adapter.id}`);
328
+ this._emitEvent("bridge:ready", { adapter: this._adapter.id });
329
+ } catch (error) {
330
+ this._emitEvent("bridge:error", {
331
+ error: error instanceof Error ? error : new Error(String(error)),
332
+ adapter: this._adapter?.id
333
+ });
334
+ throw error;
335
+ }
336
+ }
337
+ /**
338
+ * Dispose the bridge and release resources.
339
+ */
340
+ dispose() {
341
+ if (this._adapter) {
342
+ this._adapter.dispose();
343
+ this._log(`Disposed adapter: ${this._adapter.id}`);
344
+ }
345
+ this._adapter = void 0;
346
+ this._initialized = false;
347
+ }
348
+ // ============================================
349
+ // Adapter Access
350
+ // ============================================
351
+ /**
352
+ * Get the active adapter instance.
353
+ */
354
+ getAdapter() {
355
+ return this._adapter;
356
+ }
357
+ /**
358
+ * Check if a specific capability is available.
359
+ * @param cap - Capability key to check
360
+ */
361
+ hasCapability(cap) {
362
+ return this._adapter?.capabilities[cap] === true;
363
+ }
364
+ // ============================================
365
+ // Data Access (delegate to adapter)
366
+ // ============================================
367
+ /**
368
+ * Get current theme.
369
+ */
370
+ getTheme() {
371
+ this._ensureInitialized();
372
+ return this._adapter.getTheme();
373
+ }
374
+ /**
375
+ * Get current display mode.
376
+ */
377
+ getDisplayMode() {
378
+ this._ensureInitialized();
379
+ return this._adapter.getDisplayMode();
380
+ }
381
+ /**
382
+ * Get tool input arguments.
383
+ */
384
+ getToolInput() {
385
+ this._ensureInitialized();
386
+ return this._adapter.getToolInput();
387
+ }
388
+ /**
389
+ * Get tool output/result.
390
+ */
391
+ getToolOutput() {
392
+ this._ensureInitialized();
393
+ return this._adapter.getToolOutput();
394
+ }
395
+ /**
396
+ * Get structured content (parsed output).
397
+ */
398
+ getStructuredContent() {
399
+ this._ensureInitialized();
400
+ return this._adapter.getStructuredContent();
401
+ }
402
+ /**
403
+ * Get persisted widget state.
404
+ */
405
+ getWidgetState() {
406
+ this._ensureInitialized();
407
+ return this._adapter.getWidgetState();
408
+ }
409
+ /**
410
+ * Get full host context.
411
+ */
412
+ getHostContext() {
413
+ this._ensureInitialized();
414
+ return this._adapter.getHostContext();
415
+ }
416
+ // ============================================
417
+ // Actions (delegate to adapter)
418
+ // ============================================
419
+ /**
420
+ * Call a tool on the MCP server.
421
+ * @param name - Tool name
422
+ * @param args - Tool arguments
423
+ */
424
+ async callTool(name, args) {
425
+ this._ensureInitialized();
426
+ if (!this.hasCapability("canCallTools")) {
427
+ throw new Error("Tool calls are not supported by the current adapter");
428
+ }
429
+ return this._adapter.callTool(name, args);
430
+ }
431
+ /**
432
+ * Send a follow-up message to the conversation.
433
+ * @param content - Message content
434
+ */
435
+ async sendMessage(content) {
436
+ this._ensureInitialized();
437
+ if (!this.hasCapability("canSendMessages")) {
438
+ throw new Error("Sending messages is not supported by the current adapter");
439
+ }
440
+ return this._adapter.sendMessage(content);
441
+ }
442
+ /**
443
+ * Open an external link.
444
+ * @param url - URL to open
445
+ */
446
+ async openLink(url) {
447
+ this._ensureInitialized();
448
+ return this._adapter.openLink(url);
449
+ }
450
+ /**
451
+ * Request a display mode change.
452
+ * @param mode - Desired display mode
453
+ */
454
+ async requestDisplayMode(mode) {
455
+ this._ensureInitialized();
456
+ return this._adapter.requestDisplayMode(mode);
457
+ }
458
+ /**
459
+ * Request widget close.
460
+ */
461
+ async requestClose() {
462
+ this._ensureInitialized();
463
+ return this._adapter.requestClose();
464
+ }
465
+ /**
466
+ * Set widget state (persisted across sessions).
467
+ * @param state - State object to persist
468
+ */
469
+ setWidgetState(state) {
470
+ this._ensureInitialized();
471
+ this._adapter.setWidgetState(state);
472
+ }
473
+ // ============================================
474
+ // Events (delegate to adapter)
475
+ // ============================================
476
+ /**
477
+ * Subscribe to host context changes.
478
+ * @param callback - Called when context changes
479
+ * @returns Unsubscribe function
480
+ */
481
+ onContextChange(callback) {
482
+ this._ensureInitialized();
483
+ return this._adapter.onContextChange(callback);
484
+ }
485
+ /**
486
+ * Subscribe to tool result updates.
487
+ * @param callback - Called when tool result is received
488
+ * @returns Unsubscribe function
489
+ */
490
+ onToolResult(callback) {
491
+ this._ensureInitialized();
492
+ return this._adapter.onToolResult(callback);
493
+ }
494
+ // ============================================
495
+ // Private Helpers
496
+ // ============================================
497
+ /**
498
+ * Ensure the bridge is initialized before operations.
499
+ */
500
+ _ensureInitialized() {
501
+ if (!this._initialized || !this._adapter) {
502
+ throw new Error("FrontMcpBridge is not initialized. Call initialize() first.");
503
+ }
504
+ }
505
+ /**
506
+ * Wrap a promise with a timeout.
507
+ */
508
+ _withTimeout(promise, ms) {
509
+ return new Promise((resolve, reject) => {
510
+ const timer = setTimeout(() => {
511
+ reject(new Error(`Operation timed out after ${ms}ms`));
512
+ }, ms);
513
+ promise.then((result) => {
514
+ clearTimeout(timer);
515
+ resolve(result);
516
+ }).catch((error) => {
517
+ clearTimeout(timer);
518
+ reject(error);
519
+ });
520
+ });
521
+ }
522
+ /**
523
+ * Emit a bridge event via CustomEvent.
524
+ */
525
+ _emitEvent(type, payload) {
526
+ if (typeof window !== "undefined" && typeof CustomEvent !== "undefined") {
527
+ try {
528
+ const event = new CustomEvent(type, { detail: payload });
529
+ window.dispatchEvent(event);
530
+ } catch {
531
+ }
532
+ }
533
+ }
534
+ /**
535
+ * Log debug message if debugging is enabled.
536
+ */
537
+ _log(message) {
538
+ if (this._config.debug) {
539
+ console.log(`[FrontMcpBridge] ${message}`);
540
+ }
541
+ }
542
+ };
543
+ async function createBridge(config, registry) {
544
+ const bridge = new FrontMcpBridge(config, registry);
545
+ await bridge.initialize();
546
+ return bridge;
547
+ }
548
+ var _globalBridge;
549
+ async function getGlobalBridge(config) {
550
+ if (!_globalBridge) {
551
+ _globalBridge = new FrontMcpBridge(config);
552
+ await _globalBridge.initialize();
553
+ }
554
+ return _globalBridge;
555
+ }
556
+ function resetGlobalBridge() {
557
+ if (_globalBridge) {
558
+ _globalBridge.dispose();
559
+ _globalBridge = void 0;
560
+ }
561
+ }
562
+
563
+ // libs/ui/src/bridge/adapters/base-adapter.ts
564
+ var DEFAULT_CAPABILITIES = {
565
+ canCallTools: false,
566
+ canSendMessages: false,
567
+ canOpenLinks: false,
568
+ canPersistState: true,
569
+ // localStorage fallback
570
+ hasNetworkAccess: true,
571
+ supportsDisplayModes: false,
572
+ supportsTheme: true
573
+ };
574
+ var DEFAULT_SAFE_AREA = {
575
+ top: 0,
576
+ bottom: 0,
577
+ left: 0,
578
+ right: 0
579
+ };
580
+ var BaseAdapter = class {
581
+ _capabilities = { ...DEFAULT_CAPABILITIES };
582
+ _hostContext;
583
+ _widgetState = {};
584
+ _toolInput = {};
585
+ _toolOutput = void 0;
586
+ _structuredContent = void 0;
587
+ _initialized = false;
588
+ _contextListeners = /* @__PURE__ */ new Set();
589
+ _toolResultListeners = /* @__PURE__ */ new Set();
590
+ constructor() {
591
+ this._hostContext = this._createDefaultHostContext();
592
+ }
593
+ get capabilities() {
594
+ return this._capabilities;
595
+ }
596
+ async initialize() {
597
+ if (this._initialized) return;
598
+ this._loadWidgetState();
599
+ this._readInjectedData();
600
+ this._initialized = true;
601
+ }
602
+ dispose() {
603
+ this._contextListeners.clear();
604
+ this._toolResultListeners.clear();
605
+ this._initialized = false;
606
+ }
607
+ // ============================================
608
+ // Data Access
609
+ // ============================================
610
+ getTheme() {
611
+ return this._hostContext.theme;
612
+ }
613
+ getDisplayMode() {
614
+ return this._hostContext.displayMode;
615
+ }
616
+ getUserAgent() {
617
+ return this._hostContext.userAgent;
618
+ }
619
+ getLocale() {
620
+ return this._hostContext.locale;
621
+ }
622
+ getToolInput() {
623
+ return this._toolInput;
624
+ }
625
+ getToolOutput() {
626
+ return this._toolOutput;
627
+ }
628
+ getStructuredContent() {
629
+ return this._structuredContent;
630
+ }
631
+ getWidgetState() {
632
+ return this._widgetState;
633
+ }
634
+ getSafeArea() {
635
+ return this._hostContext.safeArea;
636
+ }
637
+ getViewport() {
638
+ return this._hostContext.viewport;
639
+ }
640
+ getHostContext() {
641
+ return { ...this._hostContext };
642
+ }
643
+ // ============================================
644
+ // Actions (override in subclasses for real functionality)
645
+ // ============================================
646
+ async callTool(_name, _args) {
647
+ if (!this._capabilities.canCallTools) {
648
+ throw new Error(`Tool calls are not supported by ${this.name} adapter`);
649
+ }
650
+ throw new Error("callTool not implemented");
651
+ }
652
+ async sendMessage(_content) {
653
+ if (!this._capabilities.canSendMessages) {
654
+ throw new Error(`Sending messages is not supported by ${this.name} adapter`);
655
+ }
656
+ throw new Error("sendMessage not implemented");
657
+ }
658
+ async openLink(url) {
659
+ if (!this._capabilities.canOpenLinks) {
660
+ if (typeof window !== "undefined") {
661
+ window.open(url, "_blank", "noopener,noreferrer");
662
+ return;
663
+ }
664
+ throw new Error(`Opening links is not supported by ${this.name} adapter`);
665
+ }
666
+ throw new Error("openLink not implemented");
667
+ }
668
+ async requestDisplayMode(_mode) {
669
+ if (!this._capabilities.supportsDisplayModes) {
670
+ return;
671
+ }
672
+ throw new Error("requestDisplayMode not implemented");
673
+ }
674
+ async requestClose() {
675
+ }
676
+ setWidgetState(state) {
677
+ this._widgetState = { ...this._widgetState, ...state };
678
+ this._persistWidgetState();
679
+ }
680
+ // ============================================
681
+ // Events
682
+ // ============================================
683
+ onContextChange(callback) {
684
+ this._contextListeners.add(callback);
685
+ return () => {
686
+ this._contextListeners.delete(callback);
687
+ };
688
+ }
689
+ onToolResult(callback) {
690
+ this._toolResultListeners.add(callback);
691
+ return () => {
692
+ this._toolResultListeners.delete(callback);
693
+ };
694
+ }
695
+ // ============================================
696
+ // Protected Helpers
697
+ // ============================================
698
+ /**
699
+ * Create default host context from environment detection.
700
+ */
701
+ _createDefaultHostContext() {
702
+ return {
703
+ theme: this._detectTheme(),
704
+ displayMode: "inline",
705
+ locale: this._detectLocale(),
706
+ userAgent: this._detectUserAgent(),
707
+ safeArea: DEFAULT_SAFE_AREA,
708
+ viewport: this._detectViewport()
709
+ };
710
+ }
711
+ /**
712
+ * Detect theme from CSS media query.
713
+ */
714
+ _detectTheme() {
715
+ if (typeof window !== "undefined" && window.matchMedia) {
716
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
717
+ }
718
+ return "light";
719
+ }
720
+ /**
721
+ * Detect locale from navigator.
722
+ */
723
+ _detectLocale() {
724
+ if (typeof navigator !== "undefined") {
725
+ return navigator.language || "en-US";
726
+ }
727
+ return "en-US";
728
+ }
729
+ /**
730
+ * Detect user agent capabilities.
731
+ */
732
+ _detectUserAgent() {
733
+ if (typeof navigator === "undefined") {
734
+ return { type: "web", hover: true, touch: false };
735
+ }
736
+ const ua = navigator.userAgent || "";
737
+ const isMobile = /iPhone|iPad|iPod|Android/i.test(ua);
738
+ const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
739
+ const hasHover = typeof window !== "undefined" && window.matchMedia && window.matchMedia("(hover: hover)").matches;
740
+ return {
741
+ type: isMobile ? "mobile" : "web",
742
+ hover: hasHover !== false,
743
+ touch: hasTouch
744
+ };
745
+ }
746
+ /**
747
+ * Detect viewport dimensions.
748
+ */
749
+ _detectViewport() {
750
+ if (typeof window !== "undefined") {
751
+ return {
752
+ width: window.innerWidth,
753
+ height: window.innerHeight
754
+ };
755
+ }
756
+ return void 0;
757
+ }
758
+ /**
759
+ * Read injected tool data from window globals.
760
+ */
761
+ _readInjectedData() {
762
+ if (typeof window === "undefined") return;
763
+ const win = window;
764
+ if (win.__mcpToolInput) {
765
+ this._toolInput = win.__mcpToolInput;
766
+ }
767
+ if (win.__mcpToolOutput) {
768
+ this._toolOutput = win.__mcpToolOutput;
769
+ }
770
+ if (win.__mcpStructuredContent) {
771
+ this._structuredContent = win.__mcpStructuredContent;
772
+ }
773
+ if (win.__mcpHostContext) {
774
+ this._hostContext = { ...this._hostContext, ...win.__mcpHostContext };
775
+ }
776
+ }
777
+ /**
778
+ * Load widget state from localStorage.
779
+ */
780
+ _loadWidgetState() {
781
+ if (typeof localStorage === "undefined") return;
782
+ try {
783
+ const key = this._getStateKey();
784
+ const stored = localStorage.getItem(key);
785
+ if (stored) {
786
+ this._widgetState = JSON.parse(stored);
787
+ }
788
+ } catch {
789
+ }
790
+ }
791
+ /**
792
+ * Persist widget state to localStorage.
793
+ */
794
+ _persistWidgetState() {
795
+ if (typeof localStorage === "undefined") return;
796
+ try {
797
+ const key = this._getStateKey();
798
+ localStorage.setItem(key, JSON.stringify(this._widgetState));
799
+ } catch {
800
+ }
801
+ }
802
+ /**
803
+ * Get localStorage key for widget state.
804
+ */
805
+ _getStateKey() {
806
+ if (typeof window !== "undefined") {
807
+ const toolName = window.__mcpToolName || "unknown";
808
+ return `frontmcp:widget:${toolName}`;
809
+ }
810
+ return "frontmcp:widget:unknown";
811
+ }
812
+ /**
813
+ * Notify context change listeners.
814
+ */
815
+ _notifyContextChange(changes) {
816
+ this._hostContext = { ...this._hostContext, ...changes };
817
+ this._contextListeners.forEach((cb) => {
818
+ try {
819
+ cb(changes);
820
+ } catch (e) {
821
+ console.error("[FrontMcpBridge] Context change listener error:", e);
822
+ }
823
+ });
824
+ }
825
+ /**
826
+ * Notify tool result listeners.
827
+ */
828
+ _notifyToolResult(result) {
829
+ this._toolOutput = result;
830
+ this._toolResultListeners.forEach((cb) => {
831
+ try {
832
+ cb(result);
833
+ } catch (e) {
834
+ console.error("[FrontMcpBridge] Tool result listener error:", e);
835
+ }
836
+ });
837
+ }
838
+ };
839
+
840
+ // libs/ui/src/bridge/adapters/openai.adapter.ts
841
+ var OpenAIAdapter = class extends BaseAdapter {
842
+ id = "openai";
843
+ name = "OpenAI ChatGPT";
844
+ priority = 100;
845
+ // Highest priority
846
+ _openai;
847
+ _unsubscribeContext;
848
+ _unsubscribeToolResult;
849
+ constructor() {
850
+ super();
851
+ this._capabilities = {
852
+ ...DEFAULT_CAPABILITIES,
853
+ canCallTools: true,
854
+ canSendMessages: true,
855
+ canOpenLinks: true,
856
+ canPersistState: true,
857
+ hasNetworkAccess: true,
858
+ supportsDisplayModes: true,
859
+ supportsTheme: true
860
+ };
861
+ }
862
+ /**
863
+ * Check if OpenAI Apps SDK is available.
864
+ */
865
+ canHandle() {
866
+ if (typeof window === "undefined") return false;
867
+ const win = window;
868
+ return Boolean(win.openai?.canvas);
869
+ }
870
+ /**
871
+ * Initialize the OpenAI adapter.
872
+ */
873
+ async initialize() {
874
+ if (this._initialized) return;
875
+ this._openai = window.openai;
876
+ await super.initialize();
877
+ this._syncContextFromSDK();
878
+ if (this._openai?.canvas?.onContextChange) {
879
+ this._unsubscribeContext = this._openai.canvas.onContextChange((changes) => {
880
+ this._notifyContextChange(changes);
881
+ });
882
+ }
883
+ if (this._openai?.canvas?.onToolResult) {
884
+ this._unsubscribeToolResult = this._openai.canvas.onToolResult((result) => {
885
+ this._notifyToolResult(result);
886
+ });
887
+ }
888
+ }
889
+ /**
890
+ * Dispose adapter resources.
891
+ */
892
+ dispose() {
893
+ if (this._unsubscribeContext) {
894
+ this._unsubscribeContext();
895
+ this._unsubscribeContext = void 0;
896
+ }
897
+ if (this._unsubscribeToolResult) {
898
+ this._unsubscribeToolResult();
899
+ this._unsubscribeToolResult = void 0;
900
+ }
901
+ this._openai = void 0;
902
+ super.dispose();
903
+ }
904
+ // ============================================
905
+ // Data Access (override with SDK calls)
906
+ // ============================================
907
+ getTheme() {
908
+ if (this._openai?.canvas?.getTheme) {
909
+ const theme = this._openai.canvas.getTheme();
910
+ return theme === "dark" ? "dark" : "light";
911
+ }
912
+ return super.getTheme();
913
+ }
914
+ getDisplayMode() {
915
+ if (this._openai?.canvas?.getDisplayMode) {
916
+ const mode = this._openai.canvas.getDisplayMode();
917
+ if (mode === "fullscreen" || mode === "pip" || mode === "carousel") {
918
+ return mode;
919
+ }
920
+ return "inline";
921
+ }
922
+ return super.getDisplayMode();
923
+ }
924
+ // ============================================
925
+ // Actions (proxy to SDK)
926
+ // ============================================
927
+ async callTool(name, args) {
928
+ if (!this._openai?.canvas?.callServerTool) {
929
+ throw new Error("callServerTool not available in OpenAI SDK");
930
+ }
931
+ return this._openai.canvas.callServerTool(name, args);
932
+ }
933
+ async sendMessage(content) {
934
+ if (!this._openai?.canvas?.sendMessage) {
935
+ throw new Error("sendMessage not available in OpenAI SDK");
936
+ }
937
+ await this._openai.canvas.sendMessage(content);
938
+ }
939
+ async openLink(url) {
940
+ if (!this._openai?.canvas?.openLink) {
941
+ return super.openLink(url);
942
+ }
943
+ await this._openai.canvas.openLink(url);
944
+ }
945
+ async requestDisplayMode(mode) {
946
+ if (!this._openai?.canvas?.setDisplayMode) {
947
+ return super.requestDisplayMode(mode);
948
+ }
949
+ await this._openai.canvas.setDisplayMode(mode);
950
+ this._hostContext = { ...this._hostContext, displayMode: mode };
951
+ }
952
+ async requestClose() {
953
+ if (this._openai?.canvas?.close) {
954
+ await this._openai.canvas.close();
955
+ }
956
+ }
957
+ // ============================================
958
+ // Private Helpers
959
+ // ============================================
960
+ /**
961
+ * Sync context from OpenAI SDK.
962
+ */
963
+ _syncContextFromSDK() {
964
+ if (!this._openai?.canvas) return;
965
+ if (this._openai.canvas.getTheme) {
966
+ const theme = this._openai.canvas.getTheme();
967
+ this._hostContext.theme = theme === "dark" ? "dark" : "light";
968
+ }
969
+ if (this._openai.canvas.getDisplayMode) {
970
+ const mode = this._openai.canvas.getDisplayMode();
971
+ if (mode === "fullscreen" || mode === "pip" || mode === "carousel" || mode === "inline") {
972
+ this._hostContext.displayMode = mode;
973
+ }
974
+ }
975
+ if (this._openai.canvas.getContext) {
976
+ const ctx = this._openai.canvas.getContext();
977
+ if (ctx) {
978
+ this._hostContext = { ...this._hostContext, ...ctx };
979
+ }
980
+ }
981
+ }
982
+ };
983
+ function createOpenAIAdapter() {
984
+ return new OpenAIAdapter();
985
+ }
986
+
987
+ // libs/ui/src/bridge/adapters/ext-apps.adapter.ts
988
+ var ExtAppsAdapter = class extends BaseAdapter {
989
+ id = "ext-apps";
990
+ name = "ext-apps (SEP-1865)";
991
+ priority = 80;
992
+ // High priority, but below OpenAI native
993
+ _config;
994
+ _messageListener;
995
+ _pendingRequests = /* @__PURE__ */ new Map();
996
+ _requestId = 0;
997
+ _trustedOrigin;
998
+ _hostCapabilities = {};
999
+ constructor(config) {
1000
+ super();
1001
+ this._config = config || {};
1002
+ this._capabilities = {
1003
+ ...DEFAULT_CAPABILITIES,
1004
+ canPersistState: true,
1005
+ hasNetworkAccess: true,
1006
+ // ext-apps usually allows network
1007
+ supportsTheme: true
1008
+ };
1009
+ }
1010
+ /**
1011
+ * Check if we're in an iframe (potential ext-apps context).
1012
+ */
1013
+ canHandle() {
1014
+ if (typeof window === "undefined") return false;
1015
+ const inIframe = window.parent !== window;
1016
+ if (!inIframe) return false;
1017
+ const win = window;
1018
+ if (win.openai?.canvas) return false;
1019
+ if (win.__mcpPlatform === "ext-apps") return true;
1020
+ return true;
1021
+ }
1022
+ /**
1023
+ * Initialize the ext-apps adapter with protocol handshake.
1024
+ */
1025
+ async initialize() {
1026
+ if (this._initialized) return;
1027
+ this._setupMessageListener();
1028
+ await super.initialize();
1029
+ await this._performHandshake();
1030
+ this._initialized = true;
1031
+ }
1032
+ /**
1033
+ * Dispose adapter resources.
1034
+ */
1035
+ dispose() {
1036
+ if (this._messageListener && typeof window !== "undefined") {
1037
+ window.removeEventListener("message", this._messageListener);
1038
+ this._messageListener = void 0;
1039
+ }
1040
+ for (const [id, pending] of this._pendingRequests) {
1041
+ clearTimeout(pending.timeout);
1042
+ pending.reject(new Error("Adapter disposed"));
1043
+ }
1044
+ this._pendingRequests.clear();
1045
+ super.dispose();
1046
+ }
1047
+ // ============================================
1048
+ // Actions (via JSON-RPC)
1049
+ // ============================================
1050
+ async callTool(name, args) {
1051
+ if (!this._hostCapabilities.serverToolProxy) {
1052
+ throw new Error("Server tool proxy not supported by host");
1053
+ }
1054
+ return this._sendRequest("ui/callServerTool", {
1055
+ name,
1056
+ arguments: args
1057
+ });
1058
+ }
1059
+ async sendMessage(content) {
1060
+ await this._sendRequest("ui/message", { content });
1061
+ }
1062
+ async openLink(url) {
1063
+ if (!this._hostCapabilities.openLink) {
1064
+ return super.openLink(url);
1065
+ }
1066
+ await this._sendRequest("ui/openLink", { url });
1067
+ }
1068
+ async requestDisplayMode(mode) {
1069
+ await this._sendRequest("ui/setDisplayMode", { mode });
1070
+ this._hostContext = { ...this._hostContext, displayMode: mode };
1071
+ }
1072
+ async requestClose() {
1073
+ await this._sendRequest("ui/close", {});
1074
+ }
1075
+ // ============================================
1076
+ // Private: Message Handling
1077
+ // ============================================
1078
+ /**
1079
+ * Setup postMessage listener for incoming messages.
1080
+ */
1081
+ _setupMessageListener() {
1082
+ if (typeof window === "undefined") return;
1083
+ this._messageListener = (event) => {
1084
+ this._handleMessage(event);
1085
+ };
1086
+ window.addEventListener("message", this._messageListener);
1087
+ }
1088
+ /**
1089
+ * Handle incoming postMessage events.
1090
+ */
1091
+ _handleMessage(event) {
1092
+ if (!this._isOriginTrusted(event.origin)) {
1093
+ return;
1094
+ }
1095
+ const data = event.data;
1096
+ if (!data || typeof data !== "object") return;
1097
+ if (data.jsonrpc !== "2.0") return;
1098
+ if ("id" in data && (data.result !== void 0 || data.error !== void 0)) {
1099
+ this._handleResponse(data);
1100
+ return;
1101
+ }
1102
+ if ("method" in data && !("id" in data)) {
1103
+ this._handleNotification(data);
1104
+ return;
1105
+ }
1106
+ }
1107
+ /**
1108
+ * Handle JSON-RPC response.
1109
+ */
1110
+ _handleResponse(response) {
1111
+ const pending = this._pendingRequests.get(response.id);
1112
+ if (!pending) return;
1113
+ clearTimeout(pending.timeout);
1114
+ this._pendingRequests.delete(response.id);
1115
+ if (response.error) {
1116
+ pending.reject(new Error(`${response.error.message} (code: ${response.error.code})`));
1117
+ } else {
1118
+ pending.resolve(response.result);
1119
+ }
1120
+ }
1121
+ /**
1122
+ * Handle JSON-RPC notification from host.
1123
+ */
1124
+ _handleNotification(notification) {
1125
+ switch (notification.method) {
1126
+ case "ui/notifications/tool-input":
1127
+ this._handleToolInput(notification.params);
1128
+ break;
1129
+ case "ui/notifications/tool-input-partial":
1130
+ this._handleToolInputPartial(notification.params);
1131
+ break;
1132
+ case "ui/notifications/tool-result":
1133
+ this._handleToolResult(notification.params);
1134
+ break;
1135
+ case "ui/notifications/host-context-changed":
1136
+ this._handleHostContextChange(notification.params);
1137
+ break;
1138
+ case "ui/notifications/initialized":
1139
+ break;
1140
+ case "ui/notifications/cancelled":
1141
+ this._handleCancelled(notification.params);
1142
+ break;
1143
+ }
1144
+ }
1145
+ /**
1146
+ * Handle tool input notification.
1147
+ */
1148
+ _handleToolInput(params) {
1149
+ this._toolInput = params.arguments || {};
1150
+ this._emitBridgeEvent("tool:input", { arguments: this._toolInput });
1151
+ }
1152
+ /**
1153
+ * Handle partial tool input (streaming).
1154
+ */
1155
+ _handleToolInputPartial(params) {
1156
+ this._toolInput = { ...this._toolInput, ...params.arguments };
1157
+ this._emitBridgeEvent("tool:input-partial", { arguments: this._toolInput });
1158
+ }
1159
+ /**
1160
+ * Handle tool result notification.
1161
+ */
1162
+ _handleToolResult(params) {
1163
+ this._toolOutput = params.content;
1164
+ this._structuredContent = params.structuredContent;
1165
+ this._notifyToolResult(params.content);
1166
+ this._emitBridgeEvent("tool:result", {
1167
+ content: params.content,
1168
+ structuredContent: params.structuredContent
1169
+ });
1170
+ }
1171
+ /**
1172
+ * Handle host context change notification.
1173
+ */
1174
+ _handleHostContextChange(params) {
1175
+ const changes = {};
1176
+ if (params.theme !== void 0) {
1177
+ changes.theme = params.theme;
1178
+ }
1179
+ if (params.displayMode !== void 0) {
1180
+ changes.displayMode = params.displayMode;
1181
+ }
1182
+ if (params.viewport !== void 0) {
1183
+ changes.viewport = params.viewport;
1184
+ }
1185
+ if (params.locale !== void 0) {
1186
+ changes.locale = params.locale;
1187
+ }
1188
+ if (params.timezone !== void 0) {
1189
+ changes.timezone = params.timezone;
1190
+ }
1191
+ this._notifyContextChange(changes);
1192
+ }
1193
+ /**
1194
+ * Handle cancellation notification.
1195
+ */
1196
+ _handleCancelled(params) {
1197
+ const reason = params?.reason;
1198
+ this._emitBridgeEvent("tool:cancelled", { reason });
1199
+ }
1200
+ // ============================================
1201
+ // Private: JSON-RPC Transport
1202
+ // ============================================
1203
+ /**
1204
+ * Send a JSON-RPC request to the host.
1205
+ */
1206
+ _sendRequest(method, params) {
1207
+ return new Promise((resolve, reject) => {
1208
+ const id = ++this._requestId;
1209
+ const timeout = this._config.options?.initTimeout || 1e4;
1210
+ const request = {
1211
+ jsonrpc: "2.0",
1212
+ id,
1213
+ method,
1214
+ params
1215
+ };
1216
+ const timeoutHandle = setTimeout(() => {
1217
+ this._pendingRequests.delete(id);
1218
+ reject(new Error(`Request ${method} timed out after ${timeout}ms`));
1219
+ }, timeout);
1220
+ this._pendingRequests.set(id, {
1221
+ resolve,
1222
+ reject,
1223
+ timeout: timeoutHandle
1224
+ });
1225
+ this._postMessage(request);
1226
+ });
1227
+ }
1228
+ /**
1229
+ * Send a JSON-RPC notification (no response expected).
1230
+ */
1231
+ _sendNotification(method, params) {
1232
+ const notification = {
1233
+ jsonrpc: "2.0",
1234
+ method,
1235
+ params
1236
+ };
1237
+ this._postMessage(notification);
1238
+ }
1239
+ /**
1240
+ * Post a message to the parent window.
1241
+ */
1242
+ _postMessage(message) {
1243
+ if (typeof window === "undefined") return;
1244
+ const targetOrigin = this._trustedOrigin || "*";
1245
+ window.parent.postMessage(message, targetOrigin);
1246
+ }
1247
+ // ============================================
1248
+ // Private: Handshake
1249
+ // ============================================
1250
+ /**
1251
+ * Perform the ui/initialize handshake with the host.
1252
+ */
1253
+ async _performHandshake() {
1254
+ const params = {
1255
+ appInfo: {
1256
+ name: this._config.options?.appName || "FrontMCP Widget",
1257
+ version: this._config.options?.appVersion || "1.0.0"
1258
+ },
1259
+ appCapabilities: {
1260
+ tools: {
1261
+ listChanged: false
1262
+ }
1263
+ },
1264
+ protocolVersion: this._config.options?.protocolVersion || "2024-11-05"
1265
+ };
1266
+ try {
1267
+ const result = await this._sendRequest("ui/initialize", params);
1268
+ this._hostCapabilities = result.hostCapabilities || {};
1269
+ this._capabilities = {
1270
+ ...this._capabilities,
1271
+ canCallTools: Boolean(this._hostCapabilities.serverToolProxy),
1272
+ canSendMessages: true,
1273
+ canOpenLinks: Boolean(this._hostCapabilities.openLink),
1274
+ supportsDisplayModes: true
1275
+ };
1276
+ if (result.hostContext) {
1277
+ this._hostContext = {
1278
+ ...this._hostContext,
1279
+ ...result.hostContext
1280
+ };
1281
+ }
1282
+ if (!this._config.options?.trustedOrigins?.length) {
1283
+ }
1284
+ } catch (error) {
1285
+ throw new Error(`ext-apps handshake failed: ${error}`);
1286
+ }
1287
+ }
1288
+ // ============================================
1289
+ // Private: Origin Security
1290
+ // ============================================
1291
+ /**
1292
+ * Check if an origin is trusted.
1293
+ * Uses trust-on-first-use if no explicit origins configured.
1294
+ */
1295
+ _isOriginTrusted(origin) {
1296
+ const trustedOrigins = this._config.options?.trustedOrigins;
1297
+ if (trustedOrigins && trustedOrigins.length > 0) {
1298
+ return trustedOrigins.includes(origin);
1299
+ }
1300
+ if (!this._trustedOrigin) {
1301
+ this._trustedOrigin = origin;
1302
+ return true;
1303
+ }
1304
+ return this._trustedOrigin === origin;
1305
+ }
1306
+ // ============================================
1307
+ // Private: Events
1308
+ // ============================================
1309
+ /**
1310
+ * Emit a bridge event via CustomEvent.
1311
+ */
1312
+ _emitBridgeEvent(type, detail) {
1313
+ if (typeof window !== "undefined" && typeof CustomEvent !== "undefined") {
1314
+ try {
1315
+ const event = new CustomEvent(type, { detail });
1316
+ window.dispatchEvent(event);
1317
+ } catch {
1318
+ }
1319
+ }
1320
+ }
1321
+ };
1322
+ function createExtAppsAdapter(config) {
1323
+ return new ExtAppsAdapter(config);
1324
+ }
1325
+
1326
+ // libs/ui/src/bridge/adapters/claude.adapter.ts
1327
+ var ClaudeAdapter = class extends BaseAdapter {
1328
+ id = "claude";
1329
+ name = "Claude (Anthropic)";
1330
+ priority = 60;
1331
+ constructor() {
1332
+ super();
1333
+ this._capabilities = {
1334
+ ...DEFAULT_CAPABILITIES,
1335
+ canCallTools: false,
1336
+ // Claude artifacts can't call tools
1337
+ canSendMessages: false,
1338
+ // Can't send messages back to conversation
1339
+ canOpenLinks: true,
1340
+ // Can open links via window.open
1341
+ canPersistState: true,
1342
+ // localStorage works
1343
+ hasNetworkAccess: false,
1344
+ // Network is blocked
1345
+ supportsDisplayModes: false,
1346
+ // No display mode control
1347
+ supportsTheme: true
1348
+ // Can detect system theme
1349
+ };
1350
+ }
1351
+ /**
1352
+ * Check if we're running in a Claude artifact/widget context.
1353
+ */
1354
+ canHandle() {
1355
+ if (typeof window === "undefined") return false;
1356
+ const win = window;
1357
+ if (win.__mcpPlatform === "claude") return true;
1358
+ if (win.claude) return true;
1359
+ if (win.__claudeArtifact) return true;
1360
+ if (typeof location !== "undefined") {
1361
+ const href = location.href;
1362
+ if (href.includes("claude.ai") || href.includes("anthropic.com")) {
1363
+ return true;
1364
+ }
1365
+ }
1366
+ return false;
1367
+ }
1368
+ /**
1369
+ * Initialize the Claude adapter.
1370
+ */
1371
+ async initialize() {
1372
+ if (this._initialized) return;
1373
+ await super.initialize();
1374
+ this._setupThemeListener();
1375
+ }
1376
+ /**
1377
+ * Open a link in a new tab.
1378
+ * This is one of the few actions available in Claude artifacts.
1379
+ */
1380
+ async openLink(url) {
1381
+ if (typeof window !== "undefined") {
1382
+ window.open(url, "_blank", "noopener,noreferrer");
1383
+ }
1384
+ }
1385
+ /**
1386
+ * Request display mode change (no-op for Claude).
1387
+ */
1388
+ async requestDisplayMode(_mode) {
1389
+ }
1390
+ /**
1391
+ * Request close (no-op for Claude).
1392
+ */
1393
+ async requestClose() {
1394
+ }
1395
+ // ============================================
1396
+ // Private Helpers
1397
+ // ============================================
1398
+ /**
1399
+ * Setup listener for system theme changes.
1400
+ */
1401
+ _setupThemeListener() {
1402
+ if (typeof window === "undefined" || !window.matchMedia) return;
1403
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1404
+ const handleChange = (e) => {
1405
+ const newTheme = e.matches ? "dark" : "light";
1406
+ if (newTheme !== this._hostContext.theme) {
1407
+ this._notifyContextChange({ theme: newTheme });
1408
+ }
1409
+ };
1410
+ if (mediaQuery.addEventListener) {
1411
+ mediaQuery.addEventListener("change", handleChange);
1412
+ } else if (mediaQuery.addListener) {
1413
+ mediaQuery.addListener(handleChange);
1414
+ }
1415
+ }
1416
+ };
1417
+ function createClaudeAdapter() {
1418
+ return new ClaudeAdapter();
1419
+ }
1420
+
1421
+ // libs/ui/src/bridge/adapters/gemini.adapter.ts
1422
+ var GeminiAdapter = class extends BaseAdapter {
1423
+ id = "gemini";
1424
+ name = "Google Gemini";
1425
+ priority = 40;
1426
+ _gemini;
1427
+ constructor() {
1428
+ super();
1429
+ this._capabilities = {
1430
+ ...DEFAULT_CAPABILITIES,
1431
+ canCallTools: false,
1432
+ // May be enabled if SDK supports it
1433
+ canSendMessages: false,
1434
+ // May be enabled if SDK supports it
1435
+ canOpenLinks: true,
1436
+ canPersistState: true,
1437
+ hasNetworkAccess: true,
1438
+ supportsDisplayModes: false,
1439
+ supportsTheme: true
1440
+ };
1441
+ }
1442
+ /**
1443
+ * Check if we're running in a Gemini context.
1444
+ */
1445
+ canHandle() {
1446
+ if (typeof window === "undefined") return false;
1447
+ const win = window;
1448
+ if (win.__mcpPlatform === "gemini") return true;
1449
+ if (win.gemini) return true;
1450
+ if (typeof location !== "undefined") {
1451
+ const href = location.href;
1452
+ if (href.includes("gemini.google.com") || href.includes("bard.google.com")) {
1453
+ return true;
1454
+ }
1455
+ }
1456
+ return false;
1457
+ }
1458
+ /**
1459
+ * Initialize the Gemini adapter.
1460
+ */
1461
+ async initialize() {
1462
+ if (this._initialized) return;
1463
+ const win = window;
1464
+ this._gemini = win.gemini;
1465
+ if (this._gemini?.ui) {
1466
+ if (this._gemini.ui.sendMessage) {
1467
+ this._capabilities = { ...this._capabilities, canSendMessages: true };
1468
+ }
1469
+ }
1470
+ await super.initialize();
1471
+ this._setupThemeListener();
1472
+ }
1473
+ /**
1474
+ * Get current theme.
1475
+ */
1476
+ getTheme() {
1477
+ if (this._gemini?.ui?.getTheme) {
1478
+ const theme = this._gemini.ui.getTheme();
1479
+ return theme === "dark" ? "dark" : "light";
1480
+ }
1481
+ return super.getTheme();
1482
+ }
1483
+ /**
1484
+ * Send a message (if supported by SDK).
1485
+ */
1486
+ async sendMessage(content) {
1487
+ if (this._gemini?.ui?.sendMessage) {
1488
+ await this._gemini.ui.sendMessage(content);
1489
+ return;
1490
+ }
1491
+ throw new Error("Sending messages is not supported by Gemini adapter");
1492
+ }
1493
+ /**
1494
+ * Open a link.
1495
+ */
1496
+ async openLink(url) {
1497
+ if (this._gemini?.ui?.openLink) {
1498
+ await this._gemini.ui.openLink(url);
1499
+ return;
1500
+ }
1501
+ return super.openLink(url);
1502
+ }
1503
+ // ============================================
1504
+ // Private Helpers
1505
+ // ============================================
1506
+ /**
1507
+ * Setup listener for system theme changes.
1508
+ */
1509
+ _setupThemeListener() {
1510
+ if (typeof window === "undefined" || !window.matchMedia) return;
1511
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1512
+ const handleChange = (e) => {
1513
+ if (!this._gemini?.ui?.getTheme) {
1514
+ const newTheme = e.matches ? "dark" : "light";
1515
+ if (newTheme !== this._hostContext.theme) {
1516
+ this._notifyContextChange({ theme: newTheme });
1517
+ }
1518
+ }
1519
+ };
1520
+ if (mediaQuery.addEventListener) {
1521
+ mediaQuery.addEventListener("change", handleChange);
1522
+ } else if (mediaQuery.addListener) {
1523
+ mediaQuery.addListener(handleChange);
1524
+ }
1525
+ }
1526
+ };
1527
+ function createGeminiAdapter() {
1528
+ return new GeminiAdapter();
1529
+ }
1530
+
1531
+ // libs/ui/src/bridge/adapters/generic.adapter.ts
1532
+ var GenericAdapter = class extends BaseAdapter {
1533
+ id = "generic";
1534
+ name = "Generic Web";
1535
+ priority = 0;
1536
+ // Lowest priority - fallback only
1537
+ constructor() {
1538
+ super();
1539
+ this._capabilities = {
1540
+ ...DEFAULT_CAPABILITIES,
1541
+ canCallTools: false,
1542
+ canSendMessages: false,
1543
+ canOpenLinks: true,
1544
+ // window.open works
1545
+ canPersistState: true,
1546
+ // localStorage works
1547
+ hasNetworkAccess: true,
1548
+ // Assume network available
1549
+ supportsDisplayModes: false,
1550
+ supportsTheme: true
1551
+ // System theme detection
1552
+ };
1553
+ }
1554
+ /**
1555
+ * Generic adapter can always handle the environment.
1556
+ * It serves as the fallback when no other adapter matches.
1557
+ */
1558
+ canHandle() {
1559
+ return typeof window !== "undefined";
1560
+ }
1561
+ /**
1562
+ * Initialize the generic adapter.
1563
+ */
1564
+ async initialize() {
1565
+ if (this._initialized) return;
1566
+ await super.initialize();
1567
+ this._setupThemeListener();
1568
+ }
1569
+ /**
1570
+ * Open a link using window.open.
1571
+ */
1572
+ async openLink(url) {
1573
+ if (typeof window !== "undefined") {
1574
+ window.open(url, "_blank", "noopener,noreferrer");
1575
+ }
1576
+ }
1577
+ // ============================================
1578
+ // Private Helpers
1579
+ // ============================================
1580
+ /**
1581
+ * Setup listener for system theme changes.
1582
+ */
1583
+ _setupThemeListener() {
1584
+ if (typeof window === "undefined" || !window.matchMedia) return;
1585
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
1586
+ const handleChange = (e) => {
1587
+ const newTheme = e.matches ? "dark" : "light";
1588
+ if (newTheme !== this._hostContext.theme) {
1589
+ this._notifyContextChange({ theme: newTheme });
1590
+ }
1591
+ };
1592
+ if (mediaQuery.addEventListener) {
1593
+ mediaQuery.addEventListener("change", handleChange);
1594
+ } else if (mediaQuery.addListener) {
1595
+ mediaQuery.addListener(handleChange);
1596
+ }
1597
+ }
1598
+ };
1599
+ function createGenericAdapter() {
1600
+ return new GenericAdapter();
1601
+ }
1602
+
1603
+ // libs/ui/src/bridge/adapters/index.ts
1604
+ function registerBuiltInAdapters() {
1605
+ defaultRegistry.register("openai", createOpenAIAdapter);
1606
+ defaultRegistry.register("ext-apps", createExtAppsAdapter);
1607
+ defaultRegistry.register("claude", createClaudeAdapter);
1608
+ defaultRegistry.register("gemini", createGeminiAdapter);
1609
+ defaultRegistry.register("generic", createGenericAdapter);
1610
+ }
1611
+ registerBuiltInAdapters();
1612
+
1613
+ // libs/ui/src/bridge/runtime/iife-generator.ts
1614
+ function generateBridgeIIFE(options = {}) {
1615
+ const { debug = false, trustedOrigins = [], minify = false } = options;
1616
+ const adapters = options.adapters || ["openai", "ext-apps", "claude", "gemini", "generic"];
1617
+ const parts = [];
1618
+ parts.push("(function() {");
1619
+ parts.push('"use strict";');
1620
+ parts.push("");
1621
+ if (debug) {
1622
+ parts.push('function log(msg) { console.log("[FrontMcpBridge] " + msg); }');
1623
+ } else {
1624
+ parts.push("function log() {}");
1625
+ }
1626
+ parts.push("");
1627
+ parts.push("var DEFAULT_SAFE_AREA = { top: 0, bottom: 0, left: 0, right: 0 };");
1628
+ parts.push("");
1629
+ parts.push(generateContextDetection());
1630
+ parts.push("");
1631
+ parts.push(generateBaseCapabilities());
1632
+ parts.push("");
1633
+ if (adapters.includes("openai")) {
1634
+ parts.push(generateOpenAIAdapter());
1635
+ parts.push("");
1636
+ }
1637
+ if (adapters.includes("ext-apps")) {
1638
+ parts.push(generateExtAppsAdapter(trustedOrigins));
1639
+ parts.push("");
1640
+ }
1641
+ if (adapters.includes("claude")) {
1642
+ parts.push(generateClaudeAdapter());
1643
+ parts.push("");
1644
+ }
1645
+ if (adapters.includes("gemini")) {
1646
+ parts.push(generateGeminiAdapter());
1647
+ parts.push("");
1648
+ }
1649
+ if (adapters.includes("generic")) {
1650
+ parts.push(generateGenericAdapter());
1651
+ parts.push("");
1652
+ }
1653
+ parts.push(generatePlatformDetection(adapters));
1654
+ parts.push("");
1655
+ parts.push(generateBridgeClass());
1656
+ parts.push("");
1657
+ parts.push("var bridge = new FrontMcpBridge();");
1658
+ parts.push("bridge.initialize().then(function() {");
1659
+ parts.push(' log("Bridge initialized with adapter: " + bridge.adapterId);');
1660
+ parts.push(' window.dispatchEvent(new CustomEvent("bridge:ready", { detail: { adapter: bridge.adapterId } }));');
1661
+ parts.push("}).catch(function(err) {");
1662
+ parts.push(' console.error("[FrontMcpBridge] Init failed:", err);');
1663
+ parts.push(' window.dispatchEvent(new CustomEvent("bridge:error", { detail: { error: err } }));');
1664
+ parts.push("});");
1665
+ parts.push("");
1666
+ parts.push("window.FrontMcpBridge = bridge;");
1667
+ parts.push("})();");
1668
+ const code = parts.join("\n");
1669
+ if (minify) {
1670
+ return minifyJS(code);
1671
+ }
1672
+ return code;
1673
+ }
1674
+ function generateContextDetection() {
1675
+ return `
1676
+ function detectTheme() {
1677
+ if (typeof window !== 'undefined' && window.matchMedia) {
1678
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
1679
+ }
1680
+ return 'light';
1681
+ }
1682
+
1683
+ function detectLocale() {
1684
+ if (typeof navigator !== 'undefined') {
1685
+ return navigator.language || 'en-US';
1686
+ }
1687
+ return 'en-US';
1688
+ }
1689
+
1690
+ function detectUserAgent() {
1691
+ if (typeof navigator === 'undefined') {
1692
+ return { type: 'web', hover: true, touch: false };
1693
+ }
1694
+ var ua = navigator.userAgent || '';
1695
+ var isMobile = /iPhone|iPad|iPod|Android/i.test(ua);
1696
+ var hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
1697
+ var hasHover = window.matchMedia && window.matchMedia('(hover: hover)').matches;
1698
+ return { type: isMobile ? 'mobile' : 'web', hover: hasHover !== false, touch: hasTouch };
1699
+ }
1700
+
1701
+ function detectViewport() {
1702
+ if (typeof window !== 'undefined') {
1703
+ return { width: window.innerWidth, height: window.innerHeight };
1704
+ }
1705
+ return undefined;
1706
+ }
1707
+
1708
+ function readInjectedData() {
1709
+ var data = { toolInput: {}, toolOutput: undefined, structuredContent: undefined };
1710
+ if (typeof window !== 'undefined') {
1711
+ if (window.__mcpToolInput) data.toolInput = window.__mcpToolInput;
1712
+ if (window.__mcpToolOutput) data.toolOutput = window.__mcpToolOutput;
1713
+ if (window.__mcpStructuredContent) data.structuredContent = window.__mcpStructuredContent;
1714
+ }
1715
+ return data;
1716
+ }
1717
+ `.trim();
1718
+ }
1719
+ function generateBaseCapabilities() {
1720
+ return `
1721
+ var DEFAULT_CAPABILITIES = {
1722
+ canCallTools: false,
1723
+ canSendMessages: false,
1724
+ canOpenLinks: false,
1725
+ canPersistState: true,
1726
+ hasNetworkAccess: true,
1727
+ supportsDisplayModes: false,
1728
+ supportsTheme: true
1729
+ };
1730
+ `.trim();
1731
+ }
1732
+ function generateOpenAIAdapter() {
1733
+ return `
1734
+ var OpenAIAdapter = {
1735
+ id: 'openai',
1736
+ name: 'OpenAI ChatGPT',
1737
+ priority: 100,
1738
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
1739
+ canCallTools: true,
1740
+ canSendMessages: true,
1741
+ canOpenLinks: true,
1742
+ supportsDisplayModes: true
1743
+ }),
1744
+ canHandle: function() {
1745
+ if (typeof window === 'undefined') return false;
1746
+ // Check for window.openai.callTool (the actual OpenAI SDK API)
1747
+ if (window.openai && typeof window.openai.callTool === 'function') return true;
1748
+ // Also check if we're being injected with tool metadata (OpenAI injects toolOutput)
1749
+ if (window.openai && (window.openai.toolOutput !== undefined || window.openai.toolInput !== undefined)) return true;
1750
+ return false;
1751
+ },
1752
+ initialize: function(context) {
1753
+ var sdk = window.openai;
1754
+ context.sdk = sdk;
1755
+ // OpenAI SDK exposes theme and displayMode directly as properties
1756
+ if (sdk.theme) {
1757
+ context.hostContext.theme = sdk.theme;
1758
+ }
1759
+ if (sdk.displayMode) {
1760
+ context.hostContext.displayMode = sdk.displayMode;
1761
+ }
1762
+ // Note: OpenAI SDK does not have an onContextChange equivalent
1763
+ return Promise.resolve();
1764
+ },
1765
+ callTool: function(context, name, args) {
1766
+ return context.sdk.callTool(name, args);
1767
+ },
1768
+ sendMessage: function(context, content) {
1769
+ if (typeof context.sdk.sendFollowUpMessage === 'function') {
1770
+ return context.sdk.sendFollowUpMessage(content);
1771
+ }
1772
+ return Promise.reject(new Error('Messages not supported'));
1773
+ },
1774
+ openLink: function(context, url) {
1775
+ window.open(url, '_blank', 'noopener,noreferrer');
1776
+ return Promise.resolve();
1777
+ },
1778
+ requestDisplayMode: function(context, mode) {
1779
+ return Promise.resolve();
1780
+ },
1781
+ requestClose: function(context) {
1782
+ return Promise.resolve();
1783
+ }
1784
+ };
1785
+ `.trim();
1786
+ }
1787
+ function generateExtAppsAdapter(trustedOrigins) {
1788
+ const originsArray = trustedOrigins.length > 0 ? JSON.stringify(trustedOrigins) : "[]";
1789
+ return `
1790
+ var ExtAppsAdapter = {
1791
+ id: 'ext-apps',
1792
+ name: 'ext-apps (SEP-1865)',
1793
+ priority: 80,
1794
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, { canPersistState: true, hasNetworkAccess: true }),
1795
+ trustedOrigins: ${originsArray},
1796
+ trustedOrigin: null,
1797
+ pendingRequests: {},
1798
+ requestId: 0,
1799
+ hostCapabilities: {},
1800
+ canHandle: function() {
1801
+ if (typeof window === 'undefined') return false;
1802
+ if (window.parent === window) return false;
1803
+ // Check for OpenAI SDK (window.openai.callTool) - defer to OpenAIAdapter
1804
+ if (window.openai && typeof window.openai.callTool === 'function') return false;
1805
+ if (window.__mcpPlatform === 'ext-apps') return true;
1806
+ return true;
1807
+ },
1808
+ initialize: function(context) {
1809
+ var self = this;
1810
+ context.extApps = this;
1811
+
1812
+ window.addEventListener('message', function(event) {
1813
+ self.handleMessage(context, event);
1814
+ });
1815
+
1816
+ return self.performHandshake(context);
1817
+ },
1818
+ handleMessage: function(context, event) {
1819
+ if (!this.isOriginTrusted(event.origin)) return;
1820
+ var data = event.data;
1821
+ if (!data || typeof data !== 'object' || data.jsonrpc !== '2.0') return;
1822
+
1823
+ if ('id' in data && (data.result !== undefined || data.error !== undefined)) {
1824
+ var pending = this.pendingRequests[data.id];
1825
+ if (pending) {
1826
+ clearTimeout(pending.timeout);
1827
+ delete this.pendingRequests[data.id];
1828
+ if (data.error) {
1829
+ pending.reject(new Error(data.error.message + ' (code: ' + data.error.code + ')'));
1830
+ } else {
1831
+ pending.resolve(data.result);
1832
+ }
1833
+ }
1834
+ return;
1835
+ }
1836
+
1837
+ if ('method' in data && !('id' in data)) {
1838
+ this.handleNotification(context, data);
1839
+ }
1840
+ },
1841
+ handleNotification: function(context, notification) {
1842
+ var params = notification.params || {};
1843
+ switch (notification.method) {
1844
+ case 'ui/notifications/tool-input':
1845
+ context.toolInput = params.arguments || {};
1846
+ window.dispatchEvent(new CustomEvent('tool:input', { detail: { arguments: context.toolInput } }));
1847
+ break;
1848
+ case 'ui/notifications/tool-result':
1849
+ context.toolOutput = params.content;
1850
+ context.structuredContent = params.structuredContent;
1851
+ context.notifyToolResult(params.content);
1852
+ window.dispatchEvent(new CustomEvent('tool:result', { detail: params }));
1853
+ break;
1854
+ case 'ui/notifications/host-context-changed':
1855
+ Object.assign(context.hostContext, params);
1856
+ context.notifyContextChange(params);
1857
+ break;
1858
+ }
1859
+ },
1860
+ isOriginTrusted: function(origin) {
1861
+ if (this.trustedOrigins.length > 0) {
1862
+ return this.trustedOrigins.indexOf(origin) !== -1;
1863
+ }
1864
+ // When no trusted origins configured, only trust first message in iframe context
1865
+ // This helps mitigate race conditions where a malicious iframe could establish trust
1866
+ if (!this.trustedOrigin) {
1867
+ if (window.parent !== window && origin) {
1868
+ this.trustedOrigin = origin;
1869
+ return true;
1870
+ }
1871
+ return false;
1872
+ }
1873
+ return this.trustedOrigin === origin;
1874
+ },
1875
+ sendRequest: function(method, params) {
1876
+ var self = this;
1877
+ return new Promise(function(resolve, reject) {
1878
+ // Security: Require trusted origin before sending requests to prevent message leaks
1879
+ if (!self.trustedOrigin && self.trustedOrigins.length === 0) {
1880
+ reject(new Error('Cannot send request: no trusted origin established'));
1881
+ return;
1882
+ }
1883
+
1884
+ var id = ++self.requestId;
1885
+ var timeout = setTimeout(function() {
1886
+ delete self.pendingRequests[id];
1887
+ reject(new Error('Request ' + method + ' timed out'));
1888
+ }, 10000);
1889
+
1890
+ self.pendingRequests[id] = { resolve: resolve, reject: reject, timeout: timeout };
1891
+
1892
+ var targetOrigin = self.trustedOrigin || self.trustedOrigins[0];
1893
+ window.parent.postMessage({ jsonrpc: '2.0', id: id, method: method, params: params }, targetOrigin);
1894
+ });
1895
+ },
1896
+ performHandshake: function(context) {
1897
+ var self = this;
1898
+ var params = {
1899
+ appInfo: { name: 'FrontMCP Widget', version: '1.0.0' },
1900
+ appCapabilities: { tools: { listChanged: false } },
1901
+ protocolVersion: '2024-11-05'
1902
+ };
1903
+
1904
+ return this.sendRequest('ui/initialize', params).then(function(result) {
1905
+ self.hostCapabilities = result.hostCapabilities || {};
1906
+ self.capabilities = Object.assign({}, self.capabilities, {
1907
+ canCallTools: Boolean(self.hostCapabilities.serverToolProxy),
1908
+ canSendMessages: true,
1909
+ canOpenLinks: Boolean(self.hostCapabilities.openLink),
1910
+ supportsDisplayModes: true
1911
+ });
1912
+ if (result.hostContext) {
1913
+ Object.assign(context.hostContext, result.hostContext);
1914
+ }
1915
+ });
1916
+ },
1917
+ callTool: function(context, name, args) {
1918
+ if (!this.hostCapabilities.serverToolProxy) {
1919
+ return Promise.reject(new Error('Server tool proxy not supported'));
1920
+ }
1921
+ return this.sendRequest('ui/callServerTool', { name: name, arguments: args });
1922
+ },
1923
+ sendMessage: function(context, content) {
1924
+ return this.sendRequest('ui/message', { content: content });
1925
+ },
1926
+ openLink: function(context, url) {
1927
+ if (!this.hostCapabilities.openLink) {
1928
+ window.open(url, '_blank', 'noopener,noreferrer');
1929
+ return Promise.resolve();
1930
+ }
1931
+ return this.sendRequest('ui/openLink', { url: url });
1932
+ },
1933
+ requestDisplayMode: function(context, mode) {
1934
+ return this.sendRequest('ui/setDisplayMode', { mode: mode });
1935
+ },
1936
+ requestClose: function(context) {
1937
+ return this.sendRequest('ui/close', {});
1938
+ }
1939
+ };
1940
+ `.trim();
1941
+ }
1942
+ function generateClaudeAdapter() {
1943
+ return `
1944
+ var ClaudeAdapter = {
1945
+ id: 'claude',
1946
+ name: 'Claude (Anthropic)',
1947
+ priority: 60,
1948
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
1949
+ canCallTools: false,
1950
+ canSendMessages: false,
1951
+ canOpenLinks: true,
1952
+ hasNetworkAccess: false,
1953
+ supportsDisplayModes: false
1954
+ }),
1955
+ canHandle: function() {
1956
+ if (typeof window === 'undefined') return false;
1957
+ if (window.__mcpPlatform === 'claude') return true;
1958
+ if (window.claude) return true;
1959
+ if (window.__claudeArtifact) return true;
1960
+ if (typeof location !== 'undefined') {
1961
+ var href = location.href;
1962
+ if (href.indexOf('claude.ai') !== -1 || href.indexOf('anthropic.com') !== -1) return true;
1963
+ }
1964
+ return false;
1965
+ },
1966
+ initialize: function(context) {
1967
+ return Promise.resolve();
1968
+ },
1969
+ callTool: function() {
1970
+ return Promise.reject(new Error('Tool calls not supported in Claude'));
1971
+ },
1972
+ sendMessage: function() {
1973
+ return Promise.reject(new Error('Messages not supported in Claude'));
1974
+ },
1975
+ openLink: function(context, url) {
1976
+ window.open(url, '_blank', 'noopener,noreferrer');
1977
+ return Promise.resolve();
1978
+ },
1979
+ requestDisplayMode: function() {
1980
+ return Promise.resolve();
1981
+ },
1982
+ requestClose: function() {
1983
+ return Promise.resolve();
1984
+ }
1985
+ };
1986
+ `.trim();
1987
+ }
1988
+ function generateGeminiAdapter() {
1989
+ return `
1990
+ var GeminiAdapter = {
1991
+ id: 'gemini',
1992
+ name: 'Google Gemini',
1993
+ priority: 40,
1994
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
1995
+ canOpenLinks: true,
1996
+ hasNetworkAccess: true
1997
+ }),
1998
+ canHandle: function() {
1999
+ if (typeof window === 'undefined') return false;
2000
+ if (window.__mcpPlatform === 'gemini') return true;
2001
+ if (window.gemini) return true;
2002
+ if (typeof location !== 'undefined') {
2003
+ var href = location.href;
2004
+ if (href.indexOf('gemini.google.com') !== -1 || href.indexOf('bard.google.com') !== -1) return true;
2005
+ }
2006
+ return false;
2007
+ },
2008
+ initialize: function(context) {
2009
+ if (window.gemini && window.gemini.ui && window.gemini.ui.getTheme) {
2010
+ context.hostContext.theme = window.gemini.ui.getTheme() === 'dark' ? 'dark' : 'light';
2011
+ }
2012
+ return Promise.resolve();
2013
+ },
2014
+ callTool: function() {
2015
+ return Promise.reject(new Error('Tool calls not supported in Gemini'));
2016
+ },
2017
+ sendMessage: function(context, content) {
2018
+ if (window.gemini && window.gemini.ui && window.gemini.ui.sendMessage) {
2019
+ return window.gemini.ui.sendMessage(content);
2020
+ }
2021
+ return Promise.reject(new Error('Messages not supported in Gemini'));
2022
+ },
2023
+ openLink: function(context, url) {
2024
+ if (window.gemini && window.gemini.ui && window.gemini.ui.openLink) {
2025
+ return window.gemini.ui.openLink(url);
2026
+ }
2027
+ window.open(url, '_blank', 'noopener,noreferrer');
2028
+ return Promise.resolve();
2029
+ },
2030
+ requestDisplayMode: function() {
2031
+ return Promise.resolve();
2032
+ },
2033
+ requestClose: function() {
2034
+ return Promise.resolve();
2035
+ }
2036
+ };
2037
+ `.trim();
2038
+ }
2039
+ function generateGenericAdapter() {
2040
+ return `
2041
+ var GenericAdapter = {
2042
+ id: 'generic',
2043
+ name: 'Generic Web',
2044
+ priority: 0,
2045
+ capabilities: Object.assign({}, DEFAULT_CAPABILITIES, {
2046
+ canOpenLinks: true,
2047
+ hasNetworkAccess: true
2048
+ }),
2049
+ canHandle: function() {
2050
+ return typeof window !== 'undefined';
2051
+ },
2052
+ initialize: function(context) {
2053
+ return Promise.resolve();
2054
+ },
2055
+ callTool: function() {
2056
+ return Promise.reject(new Error('Tool calls not supported'));
2057
+ },
2058
+ sendMessage: function() {
2059
+ return Promise.reject(new Error('Messages not supported'));
2060
+ },
2061
+ openLink: function(context, url) {
2062
+ window.open(url, '_blank', 'noopener,noreferrer');
2063
+ return Promise.resolve();
2064
+ },
2065
+ requestDisplayMode: function() {
2066
+ return Promise.resolve();
2067
+ },
2068
+ requestClose: function() {
2069
+ return Promise.resolve();
2070
+ }
2071
+ };
2072
+ `.trim();
2073
+ }
2074
+ function generatePlatformDetection(adapters) {
2075
+ const adapterVars = adapters.map((a) => {
2076
+ switch (a) {
2077
+ case "openai":
2078
+ return "OpenAIAdapter";
2079
+ case "ext-apps":
2080
+ return "ExtAppsAdapter";
2081
+ case "claude":
2082
+ return "ClaudeAdapter";
2083
+ case "gemini":
2084
+ return "GeminiAdapter";
2085
+ case "generic":
2086
+ return "GenericAdapter";
2087
+ default:
2088
+ return "";
2089
+ }
2090
+ }).filter(Boolean);
2091
+ return `
2092
+ var ADAPTERS = [${adapterVars.join(", ")}].sort(function(a, b) { return b.priority - a.priority; });
2093
+
2094
+ function detectPlatform() {
2095
+ for (var i = 0; i < ADAPTERS.length; i++) {
2096
+ if (ADAPTERS[i].canHandle()) {
2097
+ log('Detected platform: ' + ADAPTERS[i].id);
2098
+ return ADAPTERS[i];
2099
+ }
2100
+ }
2101
+ log('No platform detected, using generic');
2102
+ return GenericAdapter;
2103
+ }
2104
+ `.trim();
2105
+ }
2106
+ function generateBridgeClass() {
2107
+ return `
2108
+ function FrontMcpBridge() {
2109
+ this._adapter = null;
2110
+ this._initialized = false;
2111
+ this._context = {
2112
+ hostContext: {
2113
+ theme: detectTheme(),
2114
+ displayMode: 'inline',
2115
+ locale: detectLocale(),
2116
+ userAgent: detectUserAgent(),
2117
+ safeArea: DEFAULT_SAFE_AREA,
2118
+ viewport: detectViewport()
2119
+ },
2120
+ toolInput: {},
2121
+ toolOutput: undefined,
2122
+ structuredContent: undefined,
2123
+ widgetState: {},
2124
+ contextListeners: [],
2125
+ toolResultListeners: [],
2126
+ notifyContextChange: function(changes) {
2127
+ Object.assign(this.hostContext, changes);
2128
+ for (var i = 0; i < this.contextListeners.length; i++) {
2129
+ try { this.contextListeners[i](changes); } catch(e) {}
2130
+ }
2131
+ },
2132
+ notifyToolResult: function(result) {
2133
+ this.toolOutput = result;
2134
+ for (var i = 0; i < this.toolResultListeners.length; i++) {
2135
+ try { this.toolResultListeners[i](result); } catch(e) {}
2136
+ }
2137
+ }
2138
+ };
2139
+
2140
+ var injected = readInjectedData();
2141
+ this._context.toolInput = injected.toolInput;
2142
+ this._context.toolOutput = injected.toolOutput;
2143
+ this._context.structuredContent = injected.structuredContent;
2144
+
2145
+ this._loadWidgetState();
2146
+ }
2147
+
2148
+ FrontMcpBridge.prototype._loadWidgetState = function() {
2149
+ try {
2150
+ var key = 'frontmcp:widget:' + (window.__mcpToolName || 'unknown');
2151
+ var stored = localStorage.getItem(key);
2152
+ if (stored) this._context.widgetState = JSON.parse(stored);
2153
+ } catch(e) {}
2154
+ };
2155
+
2156
+ FrontMcpBridge.prototype._saveWidgetState = function() {
2157
+ try {
2158
+ var key = 'frontmcp:widget:' + (window.__mcpToolName || 'unknown');
2159
+ localStorage.setItem(key, JSON.stringify(this._context.widgetState));
2160
+ } catch(e) {}
2161
+ };
2162
+
2163
+ FrontMcpBridge.prototype.initialize = function() {
2164
+ if (this._initialized) return Promise.resolve();
2165
+ var self = this;
2166
+ this._adapter = detectPlatform();
2167
+ return this._adapter.initialize(this._context).then(function() {
2168
+ self._initialized = true;
2169
+ // Set up the data-tool-call click handler after initialization
2170
+ self._setupDataToolCallHandler();
2171
+ });
2172
+ };
2173
+
2174
+ Object.defineProperty(FrontMcpBridge.prototype, 'initialized', { get: function() { return this._initialized; } });
2175
+ Object.defineProperty(FrontMcpBridge.prototype, 'adapterId', { get: function() { return this._adapter ? this._adapter.id : undefined; } });
2176
+ Object.defineProperty(FrontMcpBridge.prototype, 'capabilities', { get: function() { return this._adapter ? this._adapter.capabilities : DEFAULT_CAPABILITIES; } });
2177
+
2178
+ FrontMcpBridge.prototype.getTheme = function() { return this._context.hostContext.theme; };
2179
+ FrontMcpBridge.prototype.getDisplayMode = function() { return this._context.hostContext.displayMode; };
2180
+ FrontMcpBridge.prototype.getToolInput = function() { return this._context.toolInput; };
2181
+ FrontMcpBridge.prototype.getToolOutput = function() { return this._context.toolOutput; };
2182
+ FrontMcpBridge.prototype.getStructuredContent = function() { return this._context.structuredContent; };
2183
+ FrontMcpBridge.prototype.getWidgetState = function() { return this._context.widgetState; };
2184
+ FrontMcpBridge.prototype.getHostContext = function() { return Object.assign({}, this._context.hostContext); };
2185
+ FrontMcpBridge.prototype.hasCapability = function(cap) { return this._adapter && this._adapter.capabilities[cap] === true; };
2186
+
2187
+ // Get tool response metadata (platform-agnostic)
2188
+ // Used by inline mode widgets to detect when ui/html arrives
2189
+ FrontMcpBridge.prototype.getToolResponseMetadata = function() {
2190
+ // OpenAI injects toolResponseMetadata for widget-producing tools
2191
+ if (typeof window !== 'undefined' && window.openai && window.openai.toolResponseMetadata) {
2192
+ return window.openai.toolResponseMetadata;
2193
+ }
2194
+ // Claude (future support)
2195
+ if (typeof window !== 'undefined' && window.claude && window.claude.toolResponseMetadata) {
2196
+ return window.claude.toolResponseMetadata;
2197
+ }
2198
+ // FrontMCP direct injection (for testing/ext-apps)
2199
+ if (typeof window !== 'undefined' && window.__mcpToolResponseMetadata) {
2200
+ return window.__mcpToolResponseMetadata;
2201
+ }
2202
+ return null;
2203
+ };
2204
+
2205
+ // Subscribe to tool response metadata changes (for inline mode injection)
2206
+ FrontMcpBridge.prototype.onToolResponseMetadata = function(callback) {
2207
+ var self = this;
2208
+ var called = false;
2209
+
2210
+ // Check if already available
2211
+ var existing = self.getToolResponseMetadata();
2212
+ if (existing) {
2213
+ called = true;
2214
+ callback(existing);
2215
+ }
2216
+
2217
+ // Set up property interceptors for OpenAI
2218
+ if (typeof window !== 'undefined') {
2219
+ // OpenAI: Intercept toolResponseMetadata assignment
2220
+ if (!window.__frontmcpMetadataIntercepted) {
2221
+ window.__frontmcpMetadataIntercepted = true;
2222
+ window.__frontmcpMetadataCallbacks = [];
2223
+
2224
+ // Create openai object if it doesn't exist
2225
+ if (!window.openai) window.openai = {};
2226
+
2227
+ var originalMetadata = window.openai.toolResponseMetadata;
2228
+ Object.defineProperty(window.openai, 'toolResponseMetadata', {
2229
+ get: function() { return originalMetadata; },
2230
+ set: function(val) {
2231
+ originalMetadata = val;
2232
+ log('toolResponseMetadata set, notifying ' + window.__frontmcpMetadataCallbacks.length + ' listeners');
2233
+ for (var i = 0; i < window.__frontmcpMetadataCallbacks.length; i++) {
2234
+ try { window.__frontmcpMetadataCallbacks[i](val); } catch(e) {}
2235
+ }
2236
+ },
2237
+ configurable: true
2238
+ });
2239
+ }
2240
+
2241
+ // Register callback wrapper (store reference for unsubscribe)
2242
+ var wrapper = function(metadata) {
2243
+ if (!called) {
2244
+ called = true;
2245
+ callback(metadata);
2246
+ }
2247
+ };
2248
+ window.__frontmcpMetadataCallbacks.push(wrapper);
2249
+
2250
+ // Return unsubscribe function that removes the wrapper (not the original callback)
2251
+ return function() {
2252
+ if (window.__frontmcpMetadataCallbacks) {
2253
+ var idx = window.__frontmcpMetadataCallbacks.indexOf(wrapper);
2254
+ if (idx !== -1) window.__frontmcpMetadataCallbacks.splice(idx, 1);
2255
+ }
2256
+ };
2257
+ }
2258
+
2259
+ // Return no-op unsubscribe for non-window environments
2260
+ return function() {};
2261
+ };
2262
+
2263
+ FrontMcpBridge.prototype.callTool = function(name, args) {
2264
+ // Priority 1: Direct OpenAI SDK call (most reliable in OpenAI iframe)
2265
+ // This bypasses adapter abstraction for maximum compatibility
2266
+ if (typeof window !== 'undefined' && window.openai && typeof window.openai.callTool === 'function') {
2267
+ log('callTool: Using OpenAI SDK directly');
2268
+ return window.openai.callTool(name, args);
2269
+ }
2270
+
2271
+ // Priority 2: Use adapter (if initialized and supports tool calls)
2272
+ if (this._adapter && this._adapter.capabilities && this._adapter.capabilities.canCallTools) {
2273
+ log('callTool: Using adapter ' + this._adapter.id);
2274
+ return this._adapter.callTool(this._context, name, args);
2275
+ }
2276
+
2277
+ // Not initialized or no tool support
2278
+ if (!this._adapter) {
2279
+ return Promise.reject(new Error('Bridge not initialized. Wait for bridge:ready event.'));
2280
+ }
2281
+ return Promise.reject(new Error('Tool calls not supported on this platform (' + this._adapter.id + ')'));
2282
+ };
2283
+
2284
+ FrontMcpBridge.prototype.sendMessage = function(content) {
2285
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2286
+ return this._adapter.sendMessage(this._context, content);
2287
+ };
2288
+
2289
+ FrontMcpBridge.prototype.openLink = function(url) {
2290
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2291
+ return this._adapter.openLink(this._context, url);
2292
+ };
2293
+
2294
+ FrontMcpBridge.prototype.requestDisplayMode = function(mode) {
2295
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2296
+ var self = this;
2297
+ return this._adapter.requestDisplayMode(this._context, mode).then(function() {
2298
+ self._context.hostContext.displayMode = mode;
2299
+ });
2300
+ };
2301
+
2302
+ FrontMcpBridge.prototype.requestClose = function() {
2303
+ if (!this._adapter) return Promise.reject(new Error('Not initialized'));
2304
+ return this._adapter.requestClose(this._context);
2305
+ };
2306
+
2307
+ FrontMcpBridge.prototype.setWidgetState = function(state) {
2308
+ Object.assign(this._context.widgetState, state);
2309
+ this._saveWidgetState();
2310
+ };
2311
+
2312
+ FrontMcpBridge.prototype.onContextChange = function(callback) {
2313
+ var listeners = this._context.contextListeners;
2314
+ listeners.push(callback);
2315
+ return function() {
2316
+ var idx = listeners.indexOf(callback);
2317
+ if (idx !== -1) listeners.splice(idx, 1);
2318
+ };
2319
+ };
2320
+
2321
+ FrontMcpBridge.prototype.onToolResult = function(callback) {
2322
+ var listeners = this._context.toolResultListeners;
2323
+ listeners.push(callback);
2324
+ return function() {
2325
+ var idx = listeners.indexOf(callback);
2326
+ if (idx !== -1) listeners.splice(idx, 1);
2327
+ };
2328
+ };
2329
+
2330
+ // ==================== data-tool-call Click Handler ====================
2331
+
2332
+ FrontMcpBridge.prototype._setupDataToolCallHandler = function() {
2333
+ var self = this;
2334
+
2335
+ document.addEventListener('click', function(e) {
2336
+ // Find the closest element with data-tool-call attribute
2337
+ var target = e.target;
2338
+ while (target && target !== document) {
2339
+ if (target.hasAttribute && target.hasAttribute('data-tool-call')) {
2340
+ var toolName = target.getAttribute('data-tool-call');
2341
+ var argsAttr = target.getAttribute('data-tool-args');
2342
+ var args = {};
2343
+
2344
+ try {
2345
+ if (argsAttr) {
2346
+ args = JSON.parse(argsAttr);
2347
+ }
2348
+ } catch (parseErr) {
2349
+ console.error('[frontmcp] Failed to parse data-tool-args:', parseErr);
2350
+ }
2351
+
2352
+ log('data-tool-call clicked: ' + toolName);
2353
+
2354
+ // Show loading state - save original content first
2355
+ var originalContent = target.innerHTML;
2356
+ var originalDisabled = target.disabled;
2357
+ target.disabled = true;
2358
+ target.classList.add('opacity-50', 'cursor-not-allowed');
2359
+
2360
+ // Add spinner for buttons
2361
+ 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>';
2362
+ if (target.tagName === 'BUTTON') {
2363
+ target.innerHTML = spinner + 'Loading...';
2364
+ }
2365
+
2366
+ // Helper to reset button state
2367
+ function resetButton() {
2368
+ target.innerHTML = originalContent;
2369
+ target.disabled = originalDisabled;
2370
+ target.classList.remove('opacity-50', 'cursor-not-allowed');
2371
+ }
2372
+
2373
+ // Determine how to call the tool
2374
+ var toolCallPromise;
2375
+
2376
+ // Priority 1: Direct OpenAI SDK call (bypasses adapter abstraction)
2377
+ if (typeof window !== 'undefined' && window.openai && typeof window.openai.callTool === 'function') {
2378
+ log('Using OpenAI SDK directly for tool call');
2379
+ toolCallPromise = window.openai.callTool(toolName, args);
2380
+ }
2381
+ // Priority 2: Use adapter (if it supports tool calls)
2382
+ else if (self.hasCapability('canCallTools')) {
2383
+ log('Using adapter for tool call');
2384
+ toolCallPromise = self.callTool(toolName, args);
2385
+ }
2386
+ // No tool call capability
2387
+ else {
2388
+ console.error('[frontmcp] Tool calls not supported on this platform (' + self.adapterId + ')');
2389
+ resetButton();
2390
+ target.dispatchEvent(new CustomEvent('tool:error', {
2391
+ detail: { name: toolName, args: args, error: 'Tool calls not supported on this platform' },
2392
+ bubbles: true
2393
+ }));
2394
+ e.preventDefault();
2395
+ return;
2396
+ }
2397
+
2398
+ // Handle the tool call result
2399
+ toolCallPromise.then(function(result) {
2400
+ log('Tool call succeeded: ' + toolName);
2401
+ resetButton();
2402
+
2403
+ // Update bridge state to trigger widget re-render
2404
+ // React isn't hydrated in OpenAI iframe, so useState doesn't work
2405
+ // Instead, we use the bridge's reactive state system
2406
+ if (result && window.__frontmcp && window.__frontmcp.bridge && typeof window.__frontmcp.bridge.setWidgetState === 'function') {
2407
+ var newData = result.structuredContent || result;
2408
+ log('Updating bridge state with new data');
2409
+ window.__frontmcp.bridge.setWidgetState(newData);
2410
+ }
2411
+
2412
+ // Dispatch success event
2413
+ target.dispatchEvent(new CustomEvent('tool:success', {
2414
+ detail: { name: toolName, args: args, result: result },
2415
+ bubbles: true
2416
+ }));
2417
+ }).catch(function(err) {
2418
+ console.error('[frontmcp] Tool call failed: ' + toolName, err);
2419
+ resetButton();
2420
+ // Dispatch error event
2421
+ target.dispatchEvent(new CustomEvent('tool:error', {
2422
+ detail: { name: toolName, args: args, error: err.message || err },
2423
+ bubbles: true
2424
+ }));
2425
+ });
2426
+
2427
+ // Prevent default behavior (e.g., form submission)
2428
+ e.preventDefault();
2429
+ return;
2430
+ }
2431
+ target = target.parentElement;
2432
+ }
2433
+ }, true); // Use capture phase to handle before React handlers
2434
+ };
2435
+ `.trim();
2436
+ }
2437
+ function minifyJS(code) {
2438
+ return code.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/.*$/gm, "").replace(/\s+/g, " ").replace(/\s*([{};,:()[\]])\s*/g, "$1").replace(/;\}/g, "}").trim();
2439
+ }
2440
+ function generatePlatformBundle(platform, options = {}) {
2441
+ const platformAdapters = {
2442
+ chatgpt: ["openai", "generic"],
2443
+ claude: ["claude", "generic"],
2444
+ gemini: ["gemini", "generic"],
2445
+ universal: ["openai", "ext-apps", "claude", "gemini", "generic"]
2446
+ };
2447
+ return generateBridgeIIFE({
2448
+ ...options,
2449
+ adapters: platformAdapters[platform]
2450
+ });
2451
+ }
2452
+ var UNIVERSAL_BRIDGE_SCRIPT = generateBridgeIIFE();
2453
+ var BRIDGE_SCRIPT_TAGS = {
2454
+ universal: `<script>${UNIVERSAL_BRIDGE_SCRIPT}</script>`,
2455
+ chatgpt: `<script>${generatePlatformBundle("chatgpt")}</script>`,
2456
+ claude: `<script>${generatePlatformBundle("claude")}</script>`,
2457
+ gemini: `<script>${generatePlatformBundle("gemini")}</script>`
2458
+ };
2459
+ export {
2460
+ AdapterRegistry,
2461
+ BRIDGE_SCRIPT_TAGS,
2462
+ BaseAdapter,
2463
+ ClaudeAdapter,
2464
+ DEFAULT_CAPABILITIES,
2465
+ DEFAULT_SAFE_AREA,
2466
+ ExtAppsAdapter,
2467
+ FrontMcpBridge,
2468
+ GeminiAdapter,
2469
+ GenericAdapter,
2470
+ OpenAIAdapter,
2471
+ UNIVERSAL_BRIDGE_SCRIPT,
2472
+ createBridge,
2473
+ createClaudeAdapter,
2474
+ createExtAppsAdapter,
2475
+ createGeminiAdapter,
2476
+ createGenericAdapter,
2477
+ createOpenAIAdapter,
2478
+ defaultRegistry,
2479
+ detectAdapter,
2480
+ generateBridgeIIFE,
2481
+ generatePlatformBundle,
2482
+ getAdapter,
2483
+ getGlobalBridge,
2484
+ registerAdapter,
2485
+ registerBuiltInAdapters,
2486
+ resetGlobalBridge
2487
+ };