@frontmcp/ui 0.6.0 → 0.6.2

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 (650) hide show
  1. package/README.md +140 -362
  2. package/bridge/core/bridge-factory.d.ts +1 -0
  3. package/bridge/core/bridge-factory.d.ts.map +1 -1
  4. package/bridge/index.d.ts +1 -1
  5. package/bridge/index.d.ts.map +1 -1
  6. package/bridge/index.js +39 -881
  7. package/bridge/runtime/index.d.ts +2 -1
  8. package/bridge/runtime/index.d.ts.map +1 -1
  9. package/bundler/browser-components.d.ts +42 -0
  10. package/bundler/browser-components.d.ts.map +1 -0
  11. package/bundler/bundler.d.ts +78 -4
  12. package/bundler/bundler.d.ts.map +1 -1
  13. package/bundler/index.d.ts +8 -8
  14. package/bundler/index.d.ts.map +1 -1
  15. package/bundler/index.js +1411 -2997
  16. package/bundler/types.d.ts +188 -7
  17. package/bundler/types.d.ts.map +1 -1
  18. package/components/alert.schema.d.ts +6 -6
  19. package/components/avatar.schema.d.ts +9 -9
  20. package/components/badge.schema.d.ts +9 -9
  21. package/components/button.schema.d.ts +9 -9
  22. package/components/card.schema.d.ts +7 -7
  23. package/components/form.schema.d.ts +24 -24
  24. package/components/index.js +128 -198
  25. package/components/modal.schema.d.ts +8 -8
  26. package/components/table.schema.d.ts +6 -6
  27. package/esm/bridge/{index.js → index.mjs} +40 -877
  28. package/esm/bundler/index.mjs +3136 -0
  29. package/esm/components/{index.js → index.mjs} +136 -196
  30. package/esm/index.mjs +5450 -0
  31. package/esm/layouts/index.mjs +409 -0
  32. package/esm/package.json +15 -32
  33. package/esm/react/{index.js → index.mjs} +71 -260
  34. package/esm/renderers/index.mjs +611 -0
  35. package/esm/universal/index.mjs +1951 -0
  36. package/esm/web-components/{index.js → index.mjs} +232 -287
  37. package/index.d.ts +22 -41
  38. package/index.d.ts.map +1 -1
  39. package/index.js +4286 -19607
  40. package/layouts/base.d.ts +2 -2
  41. package/layouts/base.d.ts.map +1 -1
  42. package/layouts/index.js +46 -539
  43. package/layouts/presets.d.ts.map +1 -1
  44. package/package.json +15 -32
  45. package/react/Alert.d.ts +1 -2
  46. package/react/Alert.d.ts.map +1 -1
  47. package/react/Badge.d.ts +1 -2
  48. package/react/Badge.d.ts.map +1 -1
  49. package/react/Button.d.ts +1 -2
  50. package/react/Button.d.ts.map +1 -1
  51. package/react/Card.d.ts +1 -2
  52. package/react/Card.d.ts.map +1 -1
  53. package/react/hooks/context.d.ts +1 -1
  54. package/react/hooks/context.d.ts.map +1 -1
  55. package/react/index.d.ts +5 -7
  56. package/react/index.d.ts.map +1 -1
  57. package/react/index.js +55 -269
  58. package/react/types.d.ts +1 -2
  59. package/react/types.d.ts.map +1 -1
  60. package/renderers/index.d.ts +15 -25
  61. package/renderers/index.d.ts.map +1 -1
  62. package/renderers/index.js +393 -1619
  63. package/renderers/mdx.renderer.d.ts +13 -34
  64. package/renderers/mdx.renderer.d.ts.map +1 -1
  65. package/{esm/runtime/adapters → renderers}/react.adapter.d.ts +2 -2
  66. package/renderers/react.adapter.d.ts.map +1 -0
  67. package/renderers/react.renderer.d.ts +25 -16
  68. package/renderers/react.renderer.d.ts.map +1 -1
  69. package/renderers/transpiler.d.ts +49 -0
  70. package/renderers/transpiler.d.ts.map +1 -0
  71. package/universal/cached-runtime.d.ts +25 -1
  72. package/universal/cached-runtime.d.ts.map +1 -1
  73. package/universal/index.js +2037 -0
  74. package/universal/runtime-builder.d.ts.map +1 -1
  75. package/universal/types.d.ts.map +1 -1
  76. package/web-components/elements/fmcp-input.d.ts.map +1 -1
  77. package/web-components/elements/fmcp-select.d.ts.map +1 -1
  78. package/web-components/index.d.ts +0 -1
  79. package/web-components/index.d.ts.map +1 -1
  80. package/web-components/index.js +224 -289
  81. package/adapters/index.d.ts +0 -13
  82. package/adapters/index.d.ts.map +0 -1
  83. package/adapters/index.js +0 -462
  84. package/adapters/platform-meta.d.ts +0 -166
  85. package/adapters/platform-meta.d.ts.map +0 -1
  86. package/adapters/response-builder.d.ts +0 -108
  87. package/adapters/response-builder.d.ts.map +0 -1
  88. package/adapters/serving-mode.d.ts +0 -107
  89. package/adapters/serving-mode.d.ts.map +0 -1
  90. package/base-template/bridge.d.ts +0 -90
  91. package/base-template/bridge.d.ts.map +0 -1
  92. package/base-template/default-base-template.d.ts +0 -92
  93. package/base-template/default-base-template.d.ts.map +0 -1
  94. package/base-template/index.d.ts +0 -15
  95. package/base-template/index.d.ts.map +0 -1
  96. package/base-template/index.js +0 -1398
  97. package/base-template/polyfills.d.ts +0 -31
  98. package/base-template/polyfills.d.ts.map +0 -1
  99. package/base-template/theme-styles.d.ts +0 -74
  100. package/base-template/theme-styles.d.ts.map +0 -1
  101. package/build/cdn-resources.d.ts +0 -243
  102. package/build/cdn-resources.d.ts.map +0 -1
  103. package/build/index.d.ts +0 -295
  104. package/build/index.d.ts.map +0 -1
  105. package/build/index.js +0 -7096
  106. package/build/widget-manifest.d.ts +0 -362
  107. package/build/widget-manifest.d.ts.map +0 -1
  108. package/bundler/cache.d.ts +0 -173
  109. package/bundler/cache.d.ts.map +0 -1
  110. package/bundler/file-cache/component-builder.d.ts +0 -167
  111. package/bundler/file-cache/component-builder.d.ts.map +0 -1
  112. package/bundler/file-cache/hash-calculator.d.ts +0 -155
  113. package/bundler/file-cache/hash-calculator.d.ts.map +0 -1
  114. package/bundler/file-cache/index.d.ts +0 -12
  115. package/bundler/file-cache/index.d.ts.map +0 -1
  116. package/bundler/file-cache/storage/filesystem.d.ts +0 -149
  117. package/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
  118. package/bundler/file-cache/storage/index.d.ts +0 -11
  119. package/bundler/file-cache/storage/index.d.ts.map +0 -1
  120. package/bundler/file-cache/storage/interface.d.ts +0 -152
  121. package/bundler/file-cache/storage/interface.d.ts.map +0 -1
  122. package/bundler/file-cache/storage/redis.d.ts +0 -139
  123. package/bundler/file-cache/storage/redis.d.ts.map +0 -1
  124. package/bundler/sandbox/enclave-adapter.d.ts +0 -121
  125. package/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
  126. package/bundler/sandbox/executor.d.ts +0 -14
  127. package/bundler/sandbox/executor.d.ts.map +0 -1
  128. package/bundler/sandbox/policy.d.ts +0 -62
  129. package/bundler/sandbox/policy.d.ts.map +0 -1
  130. package/dependency/cdn-registry.d.ts +0 -98
  131. package/dependency/cdn-registry.d.ts.map +0 -1
  132. package/dependency/import-map.d.ts +0 -186
  133. package/dependency/import-map.d.ts.map +0 -1
  134. package/dependency/import-parser.d.ts +0 -82
  135. package/dependency/import-parser.d.ts.map +0 -1
  136. package/dependency/index.d.ts +0 -17
  137. package/dependency/index.d.ts.map +0 -1
  138. package/dependency/resolver.d.ts +0 -164
  139. package/dependency/resolver.d.ts.map +0 -1
  140. package/dependency/schemas.d.ts +0 -486
  141. package/dependency/schemas.d.ts.map +0 -1
  142. package/dependency/template-loader.d.ts +0 -204
  143. package/dependency/template-loader.d.ts.map +0 -1
  144. package/dependency/template-processor.d.ts +0 -118
  145. package/dependency/template-processor.d.ts.map +0 -1
  146. package/dependency/types.d.ts +0 -739
  147. package/dependency/types.d.ts.map +0 -1
  148. package/esm/adapters/index.d.ts +0 -13
  149. package/esm/adapters/index.d.ts.map +0 -1
  150. package/esm/adapters/index.js +0 -427
  151. package/esm/adapters/platform-meta.d.ts +0 -166
  152. package/esm/adapters/platform-meta.d.ts.map +0 -1
  153. package/esm/adapters/response-builder.d.ts +0 -108
  154. package/esm/adapters/response-builder.d.ts.map +0 -1
  155. package/esm/adapters/serving-mode.d.ts +0 -107
  156. package/esm/adapters/serving-mode.d.ts.map +0 -1
  157. package/esm/base-template/bridge.d.ts +0 -90
  158. package/esm/base-template/bridge.d.ts.map +0 -1
  159. package/esm/base-template/default-base-template.d.ts +0 -92
  160. package/esm/base-template/default-base-template.d.ts.map +0 -1
  161. package/esm/base-template/index.d.ts +0 -15
  162. package/esm/base-template/index.d.ts.map +0 -1
  163. package/esm/base-template/index.js +0 -1364
  164. package/esm/base-template/polyfills.d.ts +0 -31
  165. package/esm/base-template/polyfills.d.ts.map +0 -1
  166. package/esm/base-template/theme-styles.d.ts +0 -74
  167. package/esm/base-template/theme-styles.d.ts.map +0 -1
  168. package/esm/bridge/adapters/base-adapter.d.ts +0 -104
  169. package/esm/bridge/adapters/base-adapter.d.ts.map +0 -1
  170. package/esm/bridge/adapters/claude.adapter.d.ts +0 -67
  171. package/esm/bridge/adapters/claude.adapter.d.ts.map +0 -1
  172. package/esm/bridge/adapters/ext-apps.adapter.d.ts +0 -143
  173. package/esm/bridge/adapters/ext-apps.adapter.d.ts.map +0 -1
  174. package/esm/bridge/adapters/gemini.adapter.d.ts +0 -64
  175. package/esm/bridge/adapters/gemini.adapter.d.ts.map +0 -1
  176. package/esm/bridge/adapters/generic.adapter.d.ts +0 -56
  177. package/esm/bridge/adapters/generic.adapter.d.ts.map +0 -1
  178. package/esm/bridge/adapters/index.d.ts +0 -26
  179. package/esm/bridge/adapters/index.d.ts.map +0 -1
  180. package/esm/bridge/adapters/openai.adapter.d.ts +0 -65
  181. package/esm/bridge/adapters/openai.adapter.d.ts.map +0 -1
  182. package/esm/bridge/core/adapter-registry.d.ts +0 -122
  183. package/esm/bridge/core/adapter-registry.d.ts.map +0 -1
  184. package/esm/bridge/core/bridge-factory.d.ts +0 -199
  185. package/esm/bridge/core/bridge-factory.d.ts.map +0 -1
  186. package/esm/bridge/core/index.d.ts +0 -10
  187. package/esm/bridge/core/index.d.ts.map +0 -1
  188. package/esm/bridge/index.d.ts +0 -62
  189. package/esm/bridge/index.d.ts.map +0 -1
  190. package/esm/bridge/runtime/iife-generator.d.ts +0 -62
  191. package/esm/bridge/runtime/iife-generator.d.ts.map +0 -1
  192. package/esm/bridge/runtime/index.d.ts +0 -9
  193. package/esm/bridge/runtime/index.d.ts.map +0 -1
  194. package/esm/bridge/types.d.ts +0 -386
  195. package/esm/bridge/types.d.ts.map +0 -1
  196. package/esm/build/cdn-resources.d.ts +0 -243
  197. package/esm/build/cdn-resources.d.ts.map +0 -1
  198. package/esm/build/index.d.ts +0 -295
  199. package/esm/build/index.d.ts.map +0 -1
  200. package/esm/build/index.js +0 -7021
  201. package/esm/build/widget-manifest.d.ts +0 -362
  202. package/esm/build/widget-manifest.d.ts.map +0 -1
  203. package/esm/bundler/bundler.d.ts +0 -208
  204. package/esm/bundler/bundler.d.ts.map +0 -1
  205. package/esm/bundler/cache.d.ts +0 -173
  206. package/esm/bundler/cache.d.ts.map +0 -1
  207. package/esm/bundler/file-cache/component-builder.d.ts +0 -167
  208. package/esm/bundler/file-cache/component-builder.d.ts.map +0 -1
  209. package/esm/bundler/file-cache/hash-calculator.d.ts +0 -155
  210. package/esm/bundler/file-cache/hash-calculator.d.ts.map +0 -1
  211. package/esm/bundler/file-cache/index.d.ts +0 -12
  212. package/esm/bundler/file-cache/index.d.ts.map +0 -1
  213. package/esm/bundler/file-cache/storage/filesystem.d.ts +0 -149
  214. package/esm/bundler/file-cache/storage/filesystem.d.ts.map +0 -1
  215. package/esm/bundler/file-cache/storage/index.d.ts +0 -11
  216. package/esm/bundler/file-cache/storage/index.d.ts.map +0 -1
  217. package/esm/bundler/file-cache/storage/interface.d.ts +0 -152
  218. package/esm/bundler/file-cache/storage/interface.d.ts.map +0 -1
  219. package/esm/bundler/file-cache/storage/redis.d.ts +0 -139
  220. package/esm/bundler/file-cache/storage/redis.d.ts.map +0 -1
  221. package/esm/bundler/index.d.ts +0 -43
  222. package/esm/bundler/index.d.ts.map +0 -1
  223. package/esm/bundler/index.js +0 -4687
  224. package/esm/bundler/sandbox/enclave-adapter.d.ts +0 -121
  225. package/esm/bundler/sandbox/enclave-adapter.d.ts.map +0 -1
  226. package/esm/bundler/sandbox/executor.d.ts +0 -14
  227. package/esm/bundler/sandbox/executor.d.ts.map +0 -1
  228. package/esm/bundler/sandbox/policy.d.ts +0 -62
  229. package/esm/bundler/sandbox/policy.d.ts.map +0 -1
  230. package/esm/bundler/types.d.ts +0 -702
  231. package/esm/bundler/types.d.ts.map +0 -1
  232. package/esm/components/alert.d.ts +0 -66
  233. package/esm/components/alert.d.ts.map +0 -1
  234. package/esm/components/alert.schema.d.ts +0 -98
  235. package/esm/components/alert.schema.d.ts.map +0 -1
  236. package/esm/components/avatar.d.ts +0 -77
  237. package/esm/components/avatar.d.ts.map +0 -1
  238. package/esm/components/avatar.schema.d.ts +0 -170
  239. package/esm/components/avatar.schema.d.ts.map +0 -1
  240. package/esm/components/badge.d.ts +0 -64
  241. package/esm/components/badge.d.ts.map +0 -1
  242. package/esm/components/badge.schema.d.ts +0 -91
  243. package/esm/components/badge.schema.d.ts.map +0 -1
  244. package/esm/components/button.d.ts +0 -100
  245. package/esm/components/button.d.ts.map +0 -1
  246. package/esm/components/button.schema.d.ts +0 -120
  247. package/esm/components/button.schema.d.ts.map +0 -1
  248. package/esm/components/card.d.ts +0 -53
  249. package/esm/components/card.d.ts.map +0 -1
  250. package/esm/components/card.schema.d.ts +0 -93
  251. package/esm/components/card.schema.d.ts.map +0 -1
  252. package/esm/components/form.d.ts +0 -212
  253. package/esm/components/form.d.ts.map +0 -1
  254. package/esm/components/form.schema.d.ts +0 -365
  255. package/esm/components/form.schema.d.ts.map +0 -1
  256. package/esm/components/index.d.ts +0 -29
  257. package/esm/components/index.d.ts.map +0 -1
  258. package/esm/components/list.d.ts +0 -121
  259. package/esm/components/list.d.ts.map +0 -1
  260. package/esm/components/list.schema.d.ts +0 -129
  261. package/esm/components/list.schema.d.ts.map +0 -1
  262. package/esm/components/modal.d.ts +0 -100
  263. package/esm/components/modal.d.ts.map +0 -1
  264. package/esm/components/modal.schema.d.ts +0 -151
  265. package/esm/components/modal.schema.d.ts.map +0 -1
  266. package/esm/components/table.d.ts +0 -91
  267. package/esm/components/table.d.ts.map +0 -1
  268. package/esm/components/table.schema.d.ts +0 -123
  269. package/esm/components/table.schema.d.ts.map +0 -1
  270. package/esm/dependency/cdn-registry.d.ts +0 -98
  271. package/esm/dependency/cdn-registry.d.ts.map +0 -1
  272. package/esm/dependency/import-map.d.ts +0 -186
  273. package/esm/dependency/import-map.d.ts.map +0 -1
  274. package/esm/dependency/import-parser.d.ts +0 -82
  275. package/esm/dependency/import-parser.d.ts.map +0 -1
  276. package/esm/dependency/index.d.ts +0 -17
  277. package/esm/dependency/index.d.ts.map +0 -1
  278. package/esm/dependency/resolver.d.ts +0 -164
  279. package/esm/dependency/resolver.d.ts.map +0 -1
  280. package/esm/dependency/schemas.d.ts +0 -486
  281. package/esm/dependency/schemas.d.ts.map +0 -1
  282. package/esm/dependency/template-loader.d.ts +0 -204
  283. package/esm/dependency/template-loader.d.ts.map +0 -1
  284. package/esm/dependency/template-processor.d.ts +0 -118
  285. package/esm/dependency/template-processor.d.ts.map +0 -1
  286. package/esm/dependency/types.d.ts +0 -739
  287. package/esm/dependency/types.d.ts.map +0 -1
  288. package/esm/handlebars/expression-extractor.d.ts +0 -147
  289. package/esm/handlebars/expression-extractor.d.ts.map +0 -1
  290. package/esm/handlebars/helpers.d.ts +0 -339
  291. package/esm/handlebars/helpers.d.ts.map +0 -1
  292. package/esm/handlebars/index.d.ts +0 -195
  293. package/esm/handlebars/index.d.ts.map +0 -1
  294. package/esm/handlebars/index.js +0 -587
  295. package/esm/index.d.ts +0 -56
  296. package/esm/index.d.ts.map +0 -1
  297. package/esm/index.js +0 -20511
  298. package/esm/layouts/base.d.ts +0 -86
  299. package/esm/layouts/base.d.ts.map +0 -1
  300. package/esm/layouts/index.d.ts +0 -8
  301. package/esm/layouts/index.d.ts.map +0 -1
  302. package/esm/layouts/index.js +0 -892
  303. package/esm/layouts/presets.d.ts +0 -134
  304. package/esm/layouts/presets.d.ts.map +0 -1
  305. package/esm/pages/consent.d.ts +0 -117
  306. package/esm/pages/consent.d.ts.map +0 -1
  307. package/esm/pages/error.d.ts +0 -101
  308. package/esm/pages/error.d.ts.map +0 -1
  309. package/esm/pages/index.d.ts +0 -9
  310. package/esm/pages/index.d.ts.map +0 -1
  311. package/esm/pages/index.js +0 -1563
  312. package/esm/react/Alert.d.ts +0 -102
  313. package/esm/react/Alert.d.ts.map +0 -1
  314. package/esm/react/Badge.d.ts +0 -101
  315. package/esm/react/Badge.d.ts.map +0 -1
  316. package/esm/react/Button.d.ts +0 -109
  317. package/esm/react/Button.d.ts.map +0 -1
  318. package/esm/react/Card.d.ts +0 -104
  319. package/esm/react/Card.d.ts.map +0 -1
  320. package/esm/react/hooks/context.d.ts +0 -179
  321. package/esm/react/hooks/context.d.ts.map +0 -1
  322. package/esm/react/hooks/index.d.ts +0 -42
  323. package/esm/react/hooks/index.d.ts.map +0 -1
  324. package/esm/react/hooks/tools.d.ts +0 -284
  325. package/esm/react/hooks/tools.d.ts.map +0 -1
  326. package/esm/react/index.d.ts +0 -81
  327. package/esm/react/index.d.ts.map +0 -1
  328. package/esm/react/types.d.ts +0 -106
  329. package/esm/react/types.d.ts.map +0 -1
  330. package/esm/react/utils.d.ts +0 -43
  331. package/esm/react/utils.d.ts.map +0 -1
  332. package/esm/registry/index.d.ts +0 -46
  333. package/esm/registry/index.d.ts.map +0 -1
  334. package/esm/registry/index.js +0 -6422
  335. package/esm/registry/render-template.d.ts +0 -91
  336. package/esm/registry/render-template.d.ts.map +0 -1
  337. package/esm/registry/tool-ui.registry.d.ts +0 -294
  338. package/esm/registry/tool-ui.registry.d.ts.map +0 -1
  339. package/esm/registry/uri-utils.d.ts +0 -56
  340. package/esm/registry/uri-utils.d.ts.map +0 -1
  341. package/esm/render/index.d.ts +0 -8
  342. package/esm/render/index.d.ts.map +0 -1
  343. package/esm/render/prerender.d.ts +0 -57
  344. package/esm/render/prerender.d.ts.map +0 -1
  345. package/esm/renderers/cache.d.ts +0 -145
  346. package/esm/renderers/cache.d.ts.map +0 -1
  347. package/esm/renderers/html.renderer.d.ts +0 -123
  348. package/esm/renderers/html.renderer.d.ts.map +0 -1
  349. package/esm/renderers/index.d.ts +0 -36
  350. package/esm/renderers/index.d.ts.map +0 -1
  351. package/esm/renderers/index.js +0 -1827
  352. package/esm/renderers/mdx.renderer.d.ts +0 -120
  353. package/esm/renderers/mdx.renderer.d.ts.map +0 -1
  354. package/esm/renderers/react.renderer.d.ts +0 -96
  355. package/esm/renderers/react.renderer.d.ts.map +0 -1
  356. package/esm/renderers/registry.d.ts +0 -134
  357. package/esm/renderers/registry.d.ts.map +0 -1
  358. package/esm/renderers/types.d.ts +0 -342
  359. package/esm/renderers/types.d.ts.map +0 -1
  360. package/esm/renderers/utils/detect.d.ts +0 -107
  361. package/esm/renderers/utils/detect.d.ts.map +0 -1
  362. package/esm/renderers/utils/hash.d.ts +0 -40
  363. package/esm/renderers/utils/hash.d.ts.map +0 -1
  364. package/esm/renderers/utils/index.d.ts +0 -9
  365. package/esm/renderers/utils/index.d.ts.map +0 -1
  366. package/esm/renderers/utils/transpiler.d.ts +0 -89
  367. package/esm/renderers/utils/transpiler.d.ts.map +0 -1
  368. package/esm/runtime/adapters/html.adapter.d.ts +0 -59
  369. package/esm/runtime/adapters/html.adapter.d.ts.map +0 -1
  370. package/esm/runtime/adapters/index.d.ts +0 -26
  371. package/esm/runtime/adapters/index.d.ts.map +0 -1
  372. package/esm/runtime/adapters/mdx.adapter.d.ts +0 -73
  373. package/esm/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  374. package/esm/runtime/adapters/react.adapter.d.ts.map +0 -1
  375. package/esm/runtime/adapters/types.d.ts +0 -95
  376. package/esm/runtime/adapters/types.d.ts.map +0 -1
  377. package/esm/runtime/csp.d.ts +0 -48
  378. package/esm/runtime/csp.d.ts.map +0 -1
  379. package/esm/runtime/index.d.ts +0 -17
  380. package/esm/runtime/index.d.ts.map +0 -1
  381. package/esm/runtime/index.js +0 -5186
  382. package/esm/runtime/mcp-bridge.d.ts +0 -101
  383. package/esm/runtime/mcp-bridge.d.ts.map +0 -1
  384. package/esm/runtime/renderer-runtime.d.ts +0 -133
  385. package/esm/runtime/renderer-runtime.d.ts.map +0 -1
  386. package/esm/runtime/sanitizer.d.ts +0 -172
  387. package/esm/runtime/sanitizer.d.ts.map +0 -1
  388. package/esm/runtime/types.d.ts +0 -415
  389. package/esm/runtime/types.d.ts.map +0 -1
  390. package/esm/runtime/wrapper.d.ts +0 -421
  391. package/esm/runtime/wrapper.d.ts.map +0 -1
  392. package/esm/styles/index.d.ts +0 -8
  393. package/esm/styles/index.d.ts.map +0 -1
  394. package/esm/styles/index.js +0 -171
  395. package/esm/styles/variants.d.ts +0 -51
  396. package/esm/styles/variants.d.ts.map +0 -1
  397. package/esm/theme/cdn.d.ts +0 -195
  398. package/esm/theme/cdn.d.ts.map +0 -1
  399. package/esm/theme/index.d.ts +0 -18
  400. package/esm/theme/index.d.ts.map +0 -1
  401. package/esm/theme/index.js +0 -700
  402. package/esm/theme/platforms.d.ts +0 -107
  403. package/esm/theme/platforms.d.ts.map +0 -1
  404. package/esm/theme/presets/github-openai.d.ts +0 -50
  405. package/esm/theme/presets/github-openai.d.ts.map +0 -1
  406. package/esm/theme/presets/index.d.ts +0 -11
  407. package/esm/theme/presets/index.d.ts.map +0 -1
  408. package/esm/theme/theme.d.ts +0 -396
  409. package/esm/theme/theme.d.ts.map +0 -1
  410. package/esm/tool-template/builder.d.ts +0 -213
  411. package/esm/tool-template/builder.d.ts.map +0 -1
  412. package/esm/tool-template/index.d.ts +0 -16
  413. package/esm/tool-template/index.d.ts.map +0 -1
  414. package/esm/tool-template/index.js +0 -3515
  415. package/esm/types/index.d.ts +0 -14
  416. package/esm/types/index.d.ts.map +0 -1
  417. package/esm/types/index.js +0 -75
  418. package/esm/types/ui-config.d.ts +0 -639
  419. package/esm/types/ui-config.d.ts.map +0 -1
  420. package/esm/types/ui-runtime.d.ts +0 -1007
  421. package/esm/types/ui-runtime.d.ts.map +0 -1
  422. package/esm/typings/cache/cache-adapter.d.ts +0 -125
  423. package/esm/typings/cache/cache-adapter.d.ts.map +0 -1
  424. package/esm/typings/cache/index.d.ts +0 -10
  425. package/esm/typings/cache/index.d.ts.map +0 -1
  426. package/esm/typings/cache/memory-cache.d.ts +0 -92
  427. package/esm/typings/cache/memory-cache.d.ts.map +0 -1
  428. package/esm/typings/dts-parser.d.ts +0 -90
  429. package/esm/typings/dts-parser.d.ts.map +0 -1
  430. package/esm/typings/index.d.ts +0 -48
  431. package/esm/typings/index.d.ts.map +0 -1
  432. package/esm/typings/schemas.d.ts +0 -232
  433. package/esm/typings/schemas.d.ts.map +0 -1
  434. package/esm/typings/type-fetcher.d.ts +0 -89
  435. package/esm/typings/type-fetcher.d.ts.map +0 -1
  436. package/esm/typings/types.d.ts +0 -320
  437. package/esm/typings/types.d.ts.map +0 -1
  438. package/esm/universal/UniversalApp.d.ts +0 -108
  439. package/esm/universal/UniversalApp.d.ts.map +0 -1
  440. package/esm/universal/cached-runtime.d.ts +0 -115
  441. package/esm/universal/cached-runtime.d.ts.map +0 -1
  442. package/esm/universal/context.d.ts +0 -122
  443. package/esm/universal/context.d.ts.map +0 -1
  444. package/esm/universal/index.d.ts +0 -57
  445. package/esm/universal/index.d.ts.map +0 -1
  446. package/esm/universal/renderers/html.renderer.d.ts +0 -37
  447. package/esm/universal/renderers/html.renderer.d.ts.map +0 -1
  448. package/esm/universal/renderers/index.d.ts +0 -112
  449. package/esm/universal/renderers/index.d.ts.map +0 -1
  450. package/esm/universal/renderers/markdown.renderer.d.ts +0 -33
  451. package/esm/universal/renderers/markdown.renderer.d.ts.map +0 -1
  452. package/esm/universal/renderers/mdx.renderer.d.ts +0 -38
  453. package/esm/universal/renderers/mdx.renderer.d.ts.map +0 -1
  454. package/esm/universal/renderers/react.renderer.d.ts +0 -46
  455. package/esm/universal/renderers/react.renderer.d.ts.map +0 -1
  456. package/esm/universal/runtime-builder.d.ts +0 -33
  457. package/esm/universal/runtime-builder.d.ts.map +0 -1
  458. package/esm/universal/store.d.ts +0 -135
  459. package/esm/universal/store.d.ts.map +0 -1
  460. package/esm/universal/types.d.ts +0 -199
  461. package/esm/universal/types.d.ts.map +0 -1
  462. package/esm/utils/escape-html.d.ts +0 -58
  463. package/esm/utils/escape-html.d.ts.map +0 -1
  464. package/esm/utils/index.d.ts +0 -10
  465. package/esm/utils/index.d.ts.map +0 -1
  466. package/esm/utils/index.js +0 -40
  467. package/esm/utils/safe-stringify.d.ts +0 -30
  468. package/esm/utils/safe-stringify.d.ts.map +0 -1
  469. package/esm/validation/error-box.d.ts +0 -56
  470. package/esm/validation/error-box.d.ts.map +0 -1
  471. package/esm/validation/index.d.ts +0 -13
  472. package/esm/validation/index.d.ts.map +0 -1
  473. package/esm/validation/index.js +0 -562
  474. package/esm/validation/schema-paths.d.ts +0 -118
  475. package/esm/validation/schema-paths.d.ts.map +0 -1
  476. package/esm/validation/template-validator.d.ts +0 -143
  477. package/esm/validation/template-validator.d.ts.map +0 -1
  478. package/esm/validation/wrapper.d.ts +0 -97
  479. package/esm/validation/wrapper.d.ts.map +0 -1
  480. package/esm/web-components/core/attribute-parser.d.ts +0 -82
  481. package/esm/web-components/core/attribute-parser.d.ts.map +0 -1
  482. package/esm/web-components/core/base-element.d.ts +0 -197
  483. package/esm/web-components/core/base-element.d.ts.map +0 -1
  484. package/esm/web-components/core/index.d.ts +0 -9
  485. package/esm/web-components/core/index.d.ts.map +0 -1
  486. package/esm/web-components/elements/fmcp-alert.d.ts +0 -46
  487. package/esm/web-components/elements/fmcp-alert.d.ts.map +0 -1
  488. package/esm/web-components/elements/fmcp-badge.d.ts +0 -47
  489. package/esm/web-components/elements/fmcp-badge.d.ts.map +0 -1
  490. package/esm/web-components/elements/fmcp-button.d.ts +0 -117
  491. package/esm/web-components/elements/fmcp-button.d.ts.map +0 -1
  492. package/esm/web-components/elements/fmcp-card.d.ts +0 -53
  493. package/esm/web-components/elements/fmcp-card.d.ts.map +0 -1
  494. package/esm/web-components/elements/fmcp-input.d.ts +0 -96
  495. package/esm/web-components/elements/fmcp-input.d.ts.map +0 -1
  496. package/esm/web-components/elements/fmcp-select.d.ts +0 -100
  497. package/esm/web-components/elements/fmcp-select.d.ts.map +0 -1
  498. package/esm/web-components/elements/index.d.ts +0 -13
  499. package/esm/web-components/elements/index.d.ts.map +0 -1
  500. package/esm/web-components/index.d.ts +0 -50
  501. package/esm/web-components/index.d.ts.map +0 -1
  502. package/esm/web-components/register.d.ts +0 -57
  503. package/esm/web-components/register.d.ts.map +0 -1
  504. package/esm/web-components/types.d.ts +0 -122
  505. package/esm/web-components/types.d.ts.map +0 -1
  506. package/esm/widgets/index.d.ts +0 -8
  507. package/esm/widgets/index.d.ts.map +0 -1
  508. package/esm/widgets/index.js +0 -941
  509. package/esm/widgets/progress.d.ts +0 -133
  510. package/esm/widgets/progress.d.ts.map +0 -1
  511. package/esm/widgets/resource.d.ts +0 -163
  512. package/esm/widgets/resource.d.ts.map +0 -1
  513. package/handlebars/expression-extractor.d.ts +0 -147
  514. package/handlebars/expression-extractor.d.ts.map +0 -1
  515. package/handlebars/helpers.d.ts +0 -339
  516. package/handlebars/helpers.d.ts.map +0 -1
  517. package/handlebars/index.d.ts +0 -195
  518. package/handlebars/index.d.ts.map +0 -1
  519. package/handlebars/index.js +0 -666
  520. package/pages/consent.d.ts +0 -117
  521. package/pages/consent.d.ts.map +0 -1
  522. package/pages/error.d.ts +0 -101
  523. package/pages/error.d.ts.map +0 -1
  524. package/pages/index.d.ts +0 -9
  525. package/pages/index.d.ts.map +0 -1
  526. package/pages/index.js +0 -1602
  527. package/react/utils.d.ts +0 -43
  528. package/react/utils.d.ts.map +0 -1
  529. package/registry/index.d.ts +0 -46
  530. package/registry/index.d.ts.map +0 -1
  531. package/registry/index.js +0 -6465
  532. package/registry/render-template.d.ts +0 -91
  533. package/registry/render-template.d.ts.map +0 -1
  534. package/registry/tool-ui.registry.d.ts +0 -294
  535. package/registry/tool-ui.registry.d.ts.map +0 -1
  536. package/registry/uri-utils.d.ts +0 -56
  537. package/registry/uri-utils.d.ts.map +0 -1
  538. package/renderers/cache.d.ts +0 -145
  539. package/renderers/cache.d.ts.map +0 -1
  540. package/renderers/html.renderer.d.ts +0 -123
  541. package/renderers/html.renderer.d.ts.map +0 -1
  542. package/renderers/registry.d.ts +0 -134
  543. package/renderers/registry.d.ts.map +0 -1
  544. package/renderers/types.d.ts +0 -342
  545. package/renderers/types.d.ts.map +0 -1
  546. package/renderers/utils/detect.d.ts +0 -107
  547. package/renderers/utils/detect.d.ts.map +0 -1
  548. package/renderers/utils/hash.d.ts +0 -40
  549. package/renderers/utils/hash.d.ts.map +0 -1
  550. package/renderers/utils/index.d.ts +0 -9
  551. package/renderers/utils/index.d.ts.map +0 -1
  552. package/renderers/utils/transpiler.d.ts +0 -89
  553. package/renderers/utils/transpiler.d.ts.map +0 -1
  554. package/runtime/adapters/html.adapter.d.ts +0 -59
  555. package/runtime/adapters/html.adapter.d.ts.map +0 -1
  556. package/runtime/adapters/index.d.ts +0 -26
  557. package/runtime/adapters/index.d.ts.map +0 -1
  558. package/runtime/adapters/mdx.adapter.d.ts +0 -73
  559. package/runtime/adapters/mdx.adapter.d.ts.map +0 -1
  560. package/runtime/adapters/react.adapter.d.ts +0 -70
  561. package/runtime/adapters/react.adapter.d.ts.map +0 -1
  562. package/runtime/adapters/types.d.ts +0 -95
  563. package/runtime/adapters/types.d.ts.map +0 -1
  564. package/runtime/csp.d.ts +0 -48
  565. package/runtime/csp.d.ts.map +0 -1
  566. package/runtime/index.d.ts +0 -17
  567. package/runtime/index.d.ts.map +0 -1
  568. package/runtime/index.js +0 -5264
  569. package/runtime/mcp-bridge.d.ts +0 -101
  570. package/runtime/mcp-bridge.d.ts.map +0 -1
  571. package/runtime/renderer-runtime.d.ts +0 -133
  572. package/runtime/renderer-runtime.d.ts.map +0 -1
  573. package/runtime/sanitizer.d.ts +0 -172
  574. package/runtime/sanitizer.d.ts.map +0 -1
  575. package/runtime/types.d.ts +0 -415
  576. package/runtime/types.d.ts.map +0 -1
  577. package/runtime/wrapper.d.ts +0 -421
  578. package/runtime/wrapper.d.ts.map +0 -1
  579. package/styles/index.d.ts +0 -8
  580. package/styles/index.d.ts.map +0 -1
  581. package/styles/index.js +0 -222
  582. package/styles/variants.d.ts +0 -51
  583. package/styles/variants.d.ts.map +0 -1
  584. package/theme/cdn.d.ts +0 -195
  585. package/theme/cdn.d.ts.map +0 -1
  586. package/theme/index.d.ts +0 -18
  587. package/theme/index.d.ts.map +0 -1
  588. package/theme/index.js +0 -757
  589. package/theme/platforms.d.ts +0 -107
  590. package/theme/platforms.d.ts.map +0 -1
  591. package/theme/presets/github-openai.d.ts +0 -50
  592. package/theme/presets/github-openai.d.ts.map +0 -1
  593. package/theme/presets/index.d.ts +0 -11
  594. package/theme/presets/index.d.ts.map +0 -1
  595. package/theme/theme.d.ts +0 -396
  596. package/theme/theme.d.ts.map +0 -1
  597. package/tool-template/builder.d.ts +0 -213
  598. package/tool-template/builder.d.ts.map +0 -1
  599. package/tool-template/index.d.ts +0 -16
  600. package/tool-template/index.d.ts.map +0 -1
  601. package/tool-template/index.js +0 -3559
  602. package/types/index.d.ts +0 -14
  603. package/types/index.d.ts.map +0 -1
  604. package/types/index.js +0 -108
  605. package/types/ui-config.d.ts +0 -639
  606. package/types/ui-config.d.ts.map +0 -1
  607. package/types/ui-runtime.d.ts +0 -1007
  608. package/types/ui-runtime.d.ts.map +0 -1
  609. package/typings/cache/cache-adapter.d.ts +0 -125
  610. package/typings/cache/cache-adapter.d.ts.map +0 -1
  611. package/typings/cache/index.d.ts +0 -10
  612. package/typings/cache/index.d.ts.map +0 -1
  613. package/typings/cache/memory-cache.d.ts +0 -92
  614. package/typings/cache/memory-cache.d.ts.map +0 -1
  615. package/typings/dts-parser.d.ts +0 -90
  616. package/typings/dts-parser.d.ts.map +0 -1
  617. package/typings/index.d.ts +0 -48
  618. package/typings/index.d.ts.map +0 -1
  619. package/typings/schemas.d.ts +0 -232
  620. package/typings/schemas.d.ts.map +0 -1
  621. package/typings/type-fetcher.d.ts +0 -89
  622. package/typings/type-fetcher.d.ts.map +0 -1
  623. package/typings/types.d.ts +0 -320
  624. package/typings/types.d.ts.map +0 -1
  625. package/utils/escape-html.d.ts +0 -58
  626. package/utils/escape-html.d.ts.map +0 -1
  627. package/utils/index.d.ts +0 -10
  628. package/utils/index.d.ts.map +0 -1
  629. package/utils/index.js +0 -70
  630. package/utils/safe-stringify.d.ts +0 -30
  631. package/utils/safe-stringify.d.ts.map +0 -1
  632. package/validation/error-box.d.ts +0 -56
  633. package/validation/error-box.d.ts.map +0 -1
  634. package/validation/index.d.ts +0 -13
  635. package/validation/index.d.ts.map +0 -1
  636. package/validation/index.js +0 -603
  637. package/validation/schema-paths.d.ts +0 -118
  638. package/validation/schema-paths.d.ts.map +0 -1
  639. package/validation/template-validator.d.ts +0 -143
  640. package/validation/template-validator.d.ts.map +0 -1
  641. package/validation/wrapper.d.ts +0 -97
  642. package/validation/wrapper.d.ts.map +0 -1
  643. package/widgets/index.d.ts +0 -8
  644. package/widgets/index.d.ts.map +0 -1
  645. package/widgets/index.js +0 -978
  646. package/widgets/progress.d.ts +0 -133
  647. package/widgets/progress.d.ts.map +0 -1
  648. package/widgets/resource.d.ts +0 -163
  649. package/widgets/resource.d.ts.map +0 -1
  650. /package/esm/render/{index.js → index.mjs} +0 -0
@@ -368,50 +368,50 @@ var FrontMcpBridge = class {
368
368
  * Get current theme.
369
369
  */
370
370
  getTheme() {
371
- this._ensureInitialized();
372
- return this._adapter.getTheme();
371
+ const adapter = this._ensureInitialized();
372
+ return adapter.getTheme();
373
373
  }
374
374
  /**
375
375
  * Get current display mode.
376
376
  */
377
377
  getDisplayMode() {
378
- this._ensureInitialized();
379
- return this._adapter.getDisplayMode();
378
+ const adapter = this._ensureInitialized();
379
+ return adapter.getDisplayMode();
380
380
  }
381
381
  /**
382
382
  * Get tool input arguments.
383
383
  */
384
384
  getToolInput() {
385
- this._ensureInitialized();
386
- return this._adapter.getToolInput();
385
+ const adapter = this._ensureInitialized();
386
+ return adapter.getToolInput();
387
387
  }
388
388
  /**
389
389
  * Get tool output/result.
390
390
  */
391
391
  getToolOutput() {
392
- this._ensureInitialized();
393
- return this._adapter.getToolOutput();
392
+ const adapter = this._ensureInitialized();
393
+ return adapter.getToolOutput();
394
394
  }
395
395
  /**
396
396
  * Get structured content (parsed output).
397
397
  */
398
398
  getStructuredContent() {
399
- this._ensureInitialized();
400
- return this._adapter.getStructuredContent();
399
+ const adapter = this._ensureInitialized();
400
+ return adapter.getStructuredContent();
401
401
  }
402
402
  /**
403
403
  * Get persisted widget state.
404
404
  */
405
405
  getWidgetState() {
406
- this._ensureInitialized();
407
- return this._adapter.getWidgetState();
406
+ const adapter = this._ensureInitialized();
407
+ return adapter.getWidgetState();
408
408
  }
409
409
  /**
410
410
  * Get full host context.
411
411
  */
412
412
  getHostContext() {
413
- this._ensureInitialized();
414
- return this._adapter.getHostContext();
413
+ const adapter = this._ensureInitialized();
414
+ return adapter.getHostContext();
415
415
  }
416
416
  // ============================================
417
417
  // Actions (delegate to adapter)
@@ -422,53 +422,53 @@ var FrontMcpBridge = class {
422
422
  * @param args - Tool arguments
423
423
  */
424
424
  async callTool(name, args) {
425
- this._ensureInitialized();
425
+ const adapter = this._ensureInitialized();
426
426
  if (!this.hasCapability("canCallTools")) {
427
427
  throw new Error("Tool calls are not supported by the current adapter");
428
428
  }
429
- return this._adapter.callTool(name, args);
429
+ return adapter.callTool(name, args);
430
430
  }
431
431
  /**
432
432
  * Send a follow-up message to the conversation.
433
433
  * @param content - Message content
434
434
  */
435
435
  async sendMessage(content) {
436
- this._ensureInitialized();
436
+ const adapter = this._ensureInitialized();
437
437
  if (!this.hasCapability("canSendMessages")) {
438
438
  throw new Error("Sending messages is not supported by the current adapter");
439
439
  }
440
- return this._adapter.sendMessage(content);
440
+ return adapter.sendMessage(content);
441
441
  }
442
442
  /**
443
443
  * Open an external link.
444
444
  * @param url - URL to open
445
445
  */
446
446
  async openLink(url) {
447
- this._ensureInitialized();
448
- return this._adapter.openLink(url);
447
+ const adapter = this._ensureInitialized();
448
+ return adapter.openLink(url);
449
449
  }
450
450
  /**
451
451
  * Request a display mode change.
452
452
  * @param mode - Desired display mode
453
453
  */
454
454
  async requestDisplayMode(mode) {
455
- this._ensureInitialized();
456
- return this._adapter.requestDisplayMode(mode);
455
+ const adapter = this._ensureInitialized();
456
+ return adapter.requestDisplayMode(mode);
457
457
  }
458
458
  /**
459
459
  * Request widget close.
460
460
  */
461
461
  async requestClose() {
462
- this._ensureInitialized();
463
- return this._adapter.requestClose();
462
+ const adapter = this._ensureInitialized();
463
+ return adapter.requestClose();
464
464
  }
465
465
  /**
466
466
  * Set widget state (persisted across sessions).
467
467
  * @param state - State object to persist
468
468
  */
469
469
  setWidgetState(state) {
470
- this._ensureInitialized();
471
- this._adapter.setWidgetState(state);
470
+ const adapter = this._ensureInitialized();
471
+ adapter.setWidgetState(state);
472
472
  }
473
473
  // ============================================
474
474
  // Events (delegate to adapter)
@@ -479,8 +479,8 @@ var FrontMcpBridge = class {
479
479
  * @returns Unsubscribe function
480
480
  */
481
481
  onContextChange(callback) {
482
- this._ensureInitialized();
483
- return this._adapter.onContextChange(callback);
482
+ const adapter = this._ensureInitialized();
483
+ return adapter.onContextChange(callback);
484
484
  }
485
485
  /**
486
486
  * Subscribe to tool result updates.
@@ -488,19 +488,21 @@ var FrontMcpBridge = class {
488
488
  * @returns Unsubscribe function
489
489
  */
490
490
  onToolResult(callback) {
491
- this._ensureInitialized();
492
- return this._adapter.onToolResult(callback);
491
+ const adapter = this._ensureInitialized();
492
+ return adapter.onToolResult(callback);
493
493
  }
494
494
  // ============================================
495
495
  // Private Helpers
496
496
  // ============================================
497
497
  /**
498
498
  * Ensure the bridge is initialized before operations.
499
+ * Returns the adapter for type-safe access.
499
500
  */
500
501
  _ensureInitialized() {
501
502
  if (!this._initialized || !this._adapter) {
502
503
  throw new Error("FrontMcpBridge is not initialized. Call initialize() first.");
503
504
  }
505
+ return this._adapter;
504
506
  }
505
507
  /**
506
508
  * Wrap a promise with a timeout.
@@ -1037,7 +1039,7 @@ var ExtAppsAdapter = class extends BaseAdapter {
1037
1039
  window.removeEventListener("message", this._messageListener);
1038
1040
  this._messageListener = void 0;
1039
1041
  }
1040
- for (const [id, pending] of this._pendingRequests) {
1042
+ for (const [_id, pending] of this._pendingRequests) {
1041
1043
  clearTimeout(pending.timeout);
1042
1044
  pending.reject(new Error("Adapter disposed"));
1043
1045
  }
@@ -1610,852 +1612,13 @@ function registerBuiltInAdapters() {
1610
1612
  }
1611
1613
  registerBuiltInAdapters();
1612
1614
 
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
- };
1615
+ // libs/ui/src/bridge/runtime/index.ts
1616
+ import {
1617
+ generateBridgeIIFE,
1618
+ generatePlatformBundle,
1619
+ UNIVERSAL_BRIDGE_SCRIPT,
1620
+ BRIDGE_SCRIPT_TAGS
1621
+ } from "@frontmcp/uipack";
2459
1622
  export {
2460
1623
  AdapterRegistry,
2461
1624
  BRIDGE_SCRIPT_TAGS,