@frontmcp/ui 0.5.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 (393) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +438 -0
  3. package/package.json +147 -0
  4. package/src/adapters/index.d.ts +10 -0
  5. package/src/adapters/index.js +18 -0
  6. package/src/adapters/index.js.map +1 -0
  7. package/src/adapters/platform-meta.d.ts +165 -0
  8. package/src/adapters/platform-meta.js +310 -0
  9. package/src/adapters/platform-meta.js.map +1 -0
  10. package/src/base-template/bridge.d.ts +89 -0
  11. package/src/base-template/bridge.js +452 -0
  12. package/src/base-template/bridge.js.map +1 -0
  13. package/src/base-template/default-base-template.d.ts +91 -0
  14. package/src/base-template/default-base-template.js +435 -0
  15. package/src/base-template/default-base-template.js.map +1 -0
  16. package/src/base-template/index.d.ts +14 -0
  17. package/src/base-template/index.js +30 -0
  18. package/src/base-template/index.js.map +1 -0
  19. package/src/base-template/polyfills.d.ts +30 -0
  20. package/src/base-template/polyfills.js +190 -0
  21. package/src/base-template/polyfills.js.map +1 -0
  22. package/src/base-template/theme-styles.d.ts +73 -0
  23. package/src/base-template/theme-styles.js +95 -0
  24. package/src/base-template/theme-styles.js.map +1 -0
  25. package/src/bridge/adapters/base-adapter.d.ts +103 -0
  26. package/src/bridge/adapters/base-adapter.js +314 -0
  27. package/src/bridge/adapters/base-adapter.js.map +1 -0
  28. package/src/bridge/adapters/claude.adapter.d.ts +66 -0
  29. package/src/bridge/adapters/claude.adapter.js +145 -0
  30. package/src/bridge/adapters/claude.adapter.js.map +1 -0
  31. package/src/bridge/adapters/ext-apps.adapter.d.ts +142 -0
  32. package/src/bridge/adapters/ext-apps.adapter.js +416 -0
  33. package/src/bridge/adapters/ext-apps.adapter.js.map +1 -0
  34. package/src/bridge/adapters/gemini.adapter.d.ts +63 -0
  35. package/src/bridge/adapters/gemini.adapter.js +160 -0
  36. package/src/bridge/adapters/gemini.adapter.js.map +1 -0
  37. package/src/bridge/adapters/generic.adapter.d.ts +55 -0
  38. package/src/bridge/adapters/generic.adapter.js +108 -0
  39. package/src/bridge/adapters/generic.adapter.js.map +1 -0
  40. package/src/bridge/adapters/index.d.ts +25 -0
  41. package/src/bridge/adapters/index.js +65 -0
  42. package/src/bridge/adapters/index.js.map +1 -0
  43. package/src/bridge/adapters/openai.adapter.d.ts +64 -0
  44. package/src/bridge/adapters/openai.adapter.js +194 -0
  45. package/src/bridge/adapters/openai.adapter.js.map +1 -0
  46. package/src/bridge/core/adapter-registry.d.ts +121 -0
  47. package/src/bridge/core/adapter-registry.js +271 -0
  48. package/src/bridge/core/adapter-registry.js.map +1 -0
  49. package/src/bridge/core/bridge-factory.d.ts +198 -0
  50. package/src/bridge/core/bridge-factory.js +428 -0
  51. package/src/bridge/core/bridge-factory.js.map +1 -0
  52. package/src/bridge/core/index.d.ts +9 -0
  53. package/src/bridge/core/index.js +22 -0
  54. package/src/bridge/core/index.js.map +1 -0
  55. package/src/bridge/index.d.ts +61 -0
  56. package/src/bridge/index.js +94 -0
  57. package/src/bridge/index.js.map +1 -0
  58. package/src/bridge/runtime/iife-generator.d.ts +61 -0
  59. package/src/bridge/runtime/iife-generator.js +940 -0
  60. package/src/bridge/runtime/iife-generator.js.map +1 -0
  61. package/src/bridge/runtime/index.d.ts +8 -0
  62. package/src/bridge/runtime/index.js +16 -0
  63. package/src/bridge/runtime/index.js.map +1 -0
  64. package/src/bridge/types.d.ts +385 -0
  65. package/src/bridge/types.js +11 -0
  66. package/src/bridge/types.js.map +1 -0
  67. package/src/build/cdn-resources.d.ts +140 -0
  68. package/src/build/cdn-resources.js +314 -0
  69. package/src/build/cdn-resources.js.map +1 -0
  70. package/src/build/index.d.ts +294 -0
  71. package/src/build/index.js +325 -0
  72. package/src/build/index.js.map +1 -0
  73. package/src/build/widget-manifest.d.ts +212 -0
  74. package/src/build/widget-manifest.js +652 -0
  75. package/src/build/widget-manifest.js.map +1 -0
  76. package/src/bundler/bundler.d.ts +110 -0
  77. package/src/bundler/bundler.js +432 -0
  78. package/src/bundler/bundler.js.map +1 -0
  79. package/src/bundler/cache.d.ts +172 -0
  80. package/src/bundler/cache.js +250 -0
  81. package/src/bundler/cache.js.map +1 -0
  82. package/src/bundler/index.d.ts +41 -0
  83. package/src/bundler/index.js +73 -0
  84. package/src/bundler/index.js.map +1 -0
  85. package/src/bundler/sandbox/enclave-adapter.d.ts +120 -0
  86. package/src/bundler/sandbox/enclave-adapter.js +339 -0
  87. package/src/bundler/sandbox/enclave-adapter.js.map +1 -0
  88. package/src/bundler/sandbox/executor.d.ts +13 -0
  89. package/src/bundler/sandbox/executor.js +22 -0
  90. package/src/bundler/sandbox/executor.js.map +1 -0
  91. package/src/bundler/sandbox/policy.d.ts +61 -0
  92. package/src/bundler/sandbox/policy.js +238 -0
  93. package/src/bundler/sandbox/policy.js.map +1 -0
  94. package/src/bundler/types.d.ts +347 -0
  95. package/src/bundler/types.js +132 -0
  96. package/src/bundler/types.js.map +1 -0
  97. package/src/components/alert.d.ts +71 -0
  98. package/src/components/alert.js +189 -0
  99. package/src/components/alert.js.map +1 -0
  100. package/src/components/alert.schema.d.ts +114 -0
  101. package/src/components/alert.schema.js +105 -0
  102. package/src/components/alert.schema.js.map +1 -0
  103. package/src/components/avatar.d.ts +76 -0
  104. package/src/components/avatar.js +176 -0
  105. package/src/components/avatar.js.map +1 -0
  106. package/src/components/avatar.schema.d.ts +169 -0
  107. package/src/components/avatar.schema.js +103 -0
  108. package/src/components/avatar.schema.js.map +1 -0
  109. package/src/components/badge.d.ts +70 -0
  110. package/src/components/badge.js +149 -0
  111. package/src/components/badge.js.map +1 -0
  112. package/src/components/badge.schema.d.ts +109 -0
  113. package/src/components/badge.schema.js +96 -0
  114. package/src/components/badge.schema.js.map +1 -0
  115. package/src/components/button.d.ts +111 -0
  116. package/src/components/button.js +336 -0
  117. package/src/components/button.js.map +1 -0
  118. package/src/components/button.schema.d.ts +148 -0
  119. package/src/components/button.schema.js +121 -0
  120. package/src/components/button.schema.js.map +1 -0
  121. package/src/components/card.d.ts +60 -0
  122. package/src/components/card.js +117 -0
  123. package/src/components/card.js.map +1 -0
  124. package/src/components/card.schema.d.ts +113 -0
  125. package/src/components/card.schema.js +98 -0
  126. package/src/components/card.schema.js.map +1 -0
  127. package/src/components/form.d.ts +239 -0
  128. package/src/components/form.js +420 -0
  129. package/src/components/form.js.map +1 -0
  130. package/src/components/form.schema.d.ts +441 -0
  131. package/src/components/form.schema.js +406 -0
  132. package/src/components/form.schema.js.map +1 -0
  133. package/src/components/index.d.ts +29 -0
  134. package/src/components/index.js +98 -0
  135. package/src/components/index.js.map +1 -0
  136. package/src/components/list.d.ts +127 -0
  137. package/src/components/list.js +279 -0
  138. package/src/components/list.js.map +1 -0
  139. package/src/components/list.schema.d.ts +134 -0
  140. package/src/components/list.schema.js +168 -0
  141. package/src/components/list.schema.js.map +1 -0
  142. package/src/components/modal.d.ts +111 -0
  143. package/src/components/modal.js +260 -0
  144. package/src/components/modal.js.map +1 -0
  145. package/src/components/modal.schema.d.ts +186 -0
  146. package/src/components/modal.schema.js +167 -0
  147. package/src/components/modal.schema.js.map +1 -0
  148. package/src/components/table.d.ts +105 -0
  149. package/src/components/table.js +283 -0
  150. package/src/components/table.js.map +1 -0
  151. package/src/components/table.schema.d.ts +159 -0
  152. package/src/components/table.schema.js +173 -0
  153. package/src/components/table.schema.js.map +1 -0
  154. package/src/handlebars/helpers.d.ts +348 -0
  155. package/src/handlebars/helpers.js +605 -0
  156. package/src/handlebars/helpers.js.map +1 -0
  157. package/src/handlebars/index.d.ts +193 -0
  158. package/src/handlebars/index.js +350 -0
  159. package/src/handlebars/index.js.map +1 -0
  160. package/src/index.d.ts +50 -0
  161. package/src/index.js +192 -0
  162. package/src/index.js.map +1 -0
  163. package/src/layouts/base.d.ts +88 -0
  164. package/src/layouts/base.js +227 -0
  165. package/src/layouts/base.js.map +1 -0
  166. package/src/layouts/index.d.ts +7 -0
  167. package/src/layouts/index.js +25 -0
  168. package/src/layouts/index.js.map +1 -0
  169. package/src/layouts/presets.d.ts +133 -0
  170. package/src/layouts/presets.js +277 -0
  171. package/src/layouts/presets.js.map +1 -0
  172. package/src/pages/consent.d.ts +116 -0
  173. package/src/pages/consent.js +218 -0
  174. package/src/pages/consent.js.map +1 -0
  175. package/src/pages/error.d.ts +100 -0
  176. package/src/pages/error.js +263 -0
  177. package/src/pages/error.js.map +1 -0
  178. package/src/pages/index.d.ts +8 -0
  179. package/src/pages/index.js +27 -0
  180. package/src/pages/index.js.map +1 -0
  181. package/src/react/Alert.d.ts +101 -0
  182. package/src/react/Alert.js +51 -0
  183. package/src/react/Alert.js.map +1 -0
  184. package/src/react/Badge.d.ts +100 -0
  185. package/src/react/Badge.js +55 -0
  186. package/src/react/Badge.js.map +1 -0
  187. package/src/react/Button.d.ts +108 -0
  188. package/src/react/Button.js +52 -0
  189. package/src/react/Button.js.map +1 -0
  190. package/src/react/Card.d.ts +103 -0
  191. package/src/react/Card.js +55 -0
  192. package/src/react/Card.js.map +1 -0
  193. package/src/react/hooks/context.d.ts +178 -0
  194. package/src/react/hooks/context.js +287 -0
  195. package/src/react/hooks/context.js.map +1 -0
  196. package/src/react/hooks/index.d.ts +41 -0
  197. package/src/react/hooks/index.js +61 -0
  198. package/src/react/hooks/index.js.map +1 -0
  199. package/src/react/hooks/tools.d.ts +283 -0
  200. package/src/react/hooks/tools.js +465 -0
  201. package/src/react/hooks/tools.js.map +1 -0
  202. package/src/react/index.d.ts +80 -0
  203. package/src/react/index.js +113 -0
  204. package/src/react/index.js.map +1 -0
  205. package/src/react/types.d.ts +105 -0
  206. package/src/react/types.js +12 -0
  207. package/src/react/types.js.map +1 -0
  208. package/src/react/utils.d.ts +42 -0
  209. package/src/react/utils.js +99 -0
  210. package/src/react/utils.js.map +1 -0
  211. package/src/registry/index.d.ts +45 -0
  212. package/src/registry/index.js +67 -0
  213. package/src/registry/index.js.map +1 -0
  214. package/src/registry/render-template.d.ts +86 -0
  215. package/src/registry/render-template.js +239 -0
  216. package/src/registry/render-template.js.map +1 -0
  217. package/src/registry/tool-ui.registry.d.ts +260 -0
  218. package/src/registry/tool-ui.registry.js +438 -0
  219. package/src/registry/tool-ui.registry.js.map +1 -0
  220. package/src/registry/uri-utils.d.ts +55 -0
  221. package/src/registry/uri-utils.js +97 -0
  222. package/src/registry/uri-utils.js.map +1 -0
  223. package/src/render/index.d.ts +7 -0
  224. package/src/render/index.js +14 -0
  225. package/src/render/index.js.map +1 -0
  226. package/src/render/prerender.d.ts +56 -0
  227. package/src/render/prerender.js +98 -0
  228. package/src/render/prerender.js.map +1 -0
  229. package/src/renderers/cache.d.ts +144 -0
  230. package/src/renderers/cache.js +240 -0
  231. package/src/renderers/cache.js.map +1 -0
  232. package/src/renderers/html.renderer.d.ts +122 -0
  233. package/src/renderers/html.renderer.js +204 -0
  234. package/src/renderers/html.renderer.js.map +1 -0
  235. package/src/renderers/index.d.ts +35 -0
  236. package/src/renderers/index.js +70 -0
  237. package/src/renderers/index.js.map +1 -0
  238. package/src/renderers/mdx.renderer.d.ts +119 -0
  239. package/src/renderers/mdx.renderer.js +305 -0
  240. package/src/renderers/mdx.renderer.js.map +1 -0
  241. package/src/renderers/react.renderer.d.ts +95 -0
  242. package/src/renderers/react.renderer.js +260 -0
  243. package/src/renderers/react.renderer.js.map +1 -0
  244. package/src/renderers/registry.d.ts +133 -0
  245. package/src/renderers/registry.js +232 -0
  246. package/src/renderers/registry.js.map +1 -0
  247. package/src/renderers/types.d.ts +341 -0
  248. package/src/renderers/types.js +9 -0
  249. package/src/renderers/types.js.map +1 -0
  250. package/src/renderers/utils/detect.d.ts +106 -0
  251. package/src/renderers/utils/detect.js +267 -0
  252. package/src/renderers/utils/detect.js.map +1 -0
  253. package/src/renderers/utils/hash.d.ts +39 -0
  254. package/src/renderers/utils/hash.js +75 -0
  255. package/src/renderers/utils/hash.js.map +1 -0
  256. package/src/renderers/utils/index.d.ts +8 -0
  257. package/src/renderers/utils/index.js +28 -0
  258. package/src/renderers/utils/index.js.map +1 -0
  259. package/src/renderers/utils/transpiler.d.ts +88 -0
  260. package/src/renderers/utils/transpiler.js +215 -0
  261. package/src/renderers/utils/transpiler.js.map +1 -0
  262. package/src/runtime/adapters/html.adapter.d.ts +58 -0
  263. package/src/runtime/adapters/html.adapter.js +131 -0
  264. package/src/runtime/adapters/html.adapter.js.map +1 -0
  265. package/src/runtime/adapters/index.d.ts +25 -0
  266. package/src/runtime/adapters/index.js +54 -0
  267. package/src/runtime/adapters/index.js.map +1 -0
  268. package/src/runtime/adapters/mdx.adapter.d.ts +72 -0
  269. package/src/runtime/adapters/mdx.adapter.js +241 -0
  270. package/src/runtime/adapters/mdx.adapter.js.map +1 -0
  271. package/src/runtime/adapters/react.adapter.d.ts +69 -0
  272. package/src/runtime/adapters/react.adapter.js +245 -0
  273. package/src/runtime/adapters/react.adapter.js.map +1 -0
  274. package/src/runtime/adapters/types.d.ts +94 -0
  275. package/src/runtime/adapters/types.js +11 -0
  276. package/src/runtime/adapters/types.js.map +1 -0
  277. package/src/runtime/csp.d.ts +37 -0
  278. package/src/runtime/csp.js +140 -0
  279. package/src/runtime/csp.js.map +1 -0
  280. package/src/runtime/index.d.ts +16 -0
  281. package/src/runtime/index.js +72 -0
  282. package/src/runtime/index.js.map +1 -0
  283. package/src/runtime/mcp-bridge.d.ts +100 -0
  284. package/src/runtime/mcp-bridge.js +581 -0
  285. package/src/runtime/mcp-bridge.js.map +1 -0
  286. package/src/runtime/renderer-runtime.d.ts +132 -0
  287. package/src/runtime/renderer-runtime.js +389 -0
  288. package/src/runtime/renderer-runtime.js.map +1 -0
  289. package/src/runtime/sanitizer.d.ts +171 -0
  290. package/src/runtime/sanitizer.js +318 -0
  291. package/src/runtime/sanitizer.js.map +1 -0
  292. package/src/runtime/types.d.ts +414 -0
  293. package/src/runtime/types.js +12 -0
  294. package/src/runtime/types.js.map +1 -0
  295. package/src/runtime/wrapper.d.ts +375 -0
  296. package/src/runtime/wrapper.js +1793 -0
  297. package/src/runtime/wrapper.js.map +1 -0
  298. package/src/styles/index.d.ts +7 -0
  299. package/src/styles/index.js +11 -0
  300. package/src/styles/index.js.map +1 -0
  301. package/src/styles/variants.d.ts +50 -0
  302. package/src/styles/variants.js +175 -0
  303. package/src/styles/variants.js.map +1 -0
  304. package/src/theme/cdn.d.ts +194 -0
  305. package/src/theme/cdn.js +375 -0
  306. package/src/theme/cdn.js.map +1 -0
  307. package/src/theme/index.d.ts +17 -0
  308. package/src/theme/index.js +57 -0
  309. package/src/theme/index.js.map +1 -0
  310. package/src/theme/platforms.d.ts +106 -0
  311. package/src/theme/platforms.js +161 -0
  312. package/src/theme/platforms.js.map +1 -0
  313. package/src/theme/presets/github-openai.d.ts +49 -0
  314. package/src/theme/presets/github-openai.js +189 -0
  315. package/src/theme/presets/github-openai.js.map +1 -0
  316. package/src/theme/presets/index.d.ts +10 -0
  317. package/src/theme/presets/index.js +17 -0
  318. package/src/theme/presets/index.js.map +1 -0
  319. package/src/theme/theme.d.ts +395 -0
  320. package/src/theme/theme.js +332 -0
  321. package/src/theme/theme.js.map +1 -0
  322. package/src/tool-template/builder.d.ts +212 -0
  323. package/src/tool-template/builder.js +397 -0
  324. package/src/tool-template/builder.js.map +1 -0
  325. package/src/tool-template/index.d.ts +15 -0
  326. package/src/tool-template/index.js +38 -0
  327. package/src/tool-template/index.js.map +1 -0
  328. package/src/types/index.d.ts +13 -0
  329. package/src/types/index.js +26 -0
  330. package/src/types/index.js.map +1 -0
  331. package/src/types/ui-config.d.ts +357 -0
  332. package/src/types/ui-config.js +12 -0
  333. package/src/types/ui-config.js.map +1 -0
  334. package/src/types/ui-runtime.d.ts +965 -0
  335. package/src/types/ui-runtime.js +117 -0
  336. package/src/types/ui-runtime.js.map +1 -0
  337. package/src/validation/error-box.d.ts +55 -0
  338. package/src/validation/error-box.js +75 -0
  339. package/src/validation/error-box.js.map +1 -0
  340. package/src/validation/index.d.ts +12 -0
  341. package/src/validation/index.js +21 -0
  342. package/src/validation/index.js.map +1 -0
  343. package/src/validation/wrapper.d.ts +96 -0
  344. package/src/validation/wrapper.js +117 -0
  345. package/src/validation/wrapper.js.map +1 -0
  346. package/src/web-components/core/attribute-parser.d.ts +85 -0
  347. package/src/web-components/core/attribute-parser.js +189 -0
  348. package/src/web-components/core/attribute-parser.js.map +1 -0
  349. package/src/web-components/core/base-element.d.ts +197 -0
  350. package/src/web-components/core/base-element.js +289 -0
  351. package/src/web-components/core/base-element.js.map +1 -0
  352. package/src/web-components/core/index.d.ts +8 -0
  353. package/src/web-components/core/index.js +18 -0
  354. package/src/web-components/core/index.js.map +1 -0
  355. package/src/web-components/elements/fmcp-alert.d.ts +45 -0
  356. package/src/web-components/elements/fmcp-alert.js +93 -0
  357. package/src/web-components/elements/fmcp-alert.js.map +1 -0
  358. package/src/web-components/elements/fmcp-badge.d.ts +46 -0
  359. package/src/web-components/elements/fmcp-badge.js +99 -0
  360. package/src/web-components/elements/fmcp-badge.js.map +1 -0
  361. package/src/web-components/elements/fmcp-button.d.ts +124 -0
  362. package/src/web-components/elements/fmcp-button.js +233 -0
  363. package/src/web-components/elements/fmcp-button.js.map +1 -0
  364. package/src/web-components/elements/fmcp-card.d.ts +52 -0
  365. package/src/web-components/elements/fmcp-card.js +115 -0
  366. package/src/web-components/elements/fmcp-card.js.map +1 -0
  367. package/src/web-components/elements/fmcp-input.d.ts +95 -0
  368. package/src/web-components/elements/fmcp-input.js +248 -0
  369. package/src/web-components/elements/fmcp-input.js.map +1 -0
  370. package/src/web-components/elements/fmcp-select.d.ts +99 -0
  371. package/src/web-components/elements/fmcp-select.js +243 -0
  372. package/src/web-components/elements/fmcp-select.js.map +1 -0
  373. package/src/web-components/elements/index.d.ts +12 -0
  374. package/src/web-components/elements/index.js +34 -0
  375. package/src/web-components/elements/index.js.map +1 -0
  376. package/src/web-components/index.d.ts +49 -0
  377. package/src/web-components/index.js +75 -0
  378. package/src/web-components/index.js.map +1 -0
  379. package/src/web-components/register.d.ts +56 -0
  380. package/src/web-components/register.js +80 -0
  381. package/src/web-components/register.js.map +1 -0
  382. package/src/web-components/types.d.ts +121 -0
  383. package/src/web-components/types.js +25 -0
  384. package/src/web-components/types.js.map +1 -0
  385. package/src/widgets/index.d.ts +7 -0
  386. package/src/widgets/index.js +24 -0
  387. package/src/widgets/index.js.map +1 -0
  388. package/src/widgets/progress.d.ts +132 -0
  389. package/src/widgets/progress.js +303 -0
  390. package/src/widgets/progress.js.map +1 -0
  391. package/src/widgets/resource.d.ts +162 -0
  392. package/src/widgets/resource.js +340 -0
  393. package/src/widgets/resource.js.map +1 -0
@@ -0,0 +1,375 @@
1
+ /**
2
+ * Tool UI Wrapper
3
+ *
4
+ * Wraps tool UI templates with the MCP Bridge runtime and
5
+ * integrates with the existing layout system for consistent styling.
6
+ */
7
+ import type { WrapToolUIOptions, HostContext } from './types';
8
+ import { type ThemeConfig, type PlatformCapabilities, type DeepPartial } from '../theme';
9
+ import { escapeHtml } from '../layouts/base';
10
+ import { type SanitizerFn } from './sanitizer';
11
+ /**
12
+ * Extended options for wrapToolUI that include theme and platform
13
+ */
14
+ export interface WrapToolUIFullOptions extends WrapToolUIOptions {
15
+ /** Theme configuration */
16
+ theme?: DeepPartial<ThemeConfig>;
17
+ /** Target platform capabilities */
18
+ platform?: PlatformCapabilities;
19
+ /** Initial host context */
20
+ hostContext?: Partial<HostContext>;
21
+ /**
22
+ * Sanitize input before exposing to widget.
23
+ * This protects sensitive data from being exposed in client-side widgets.
24
+ *
25
+ * - `true`: Auto-detect and redact PII patterns (email, phone, SSN, credit card)
26
+ * - `string[]`: Redact values in fields with these names
27
+ * - `SanitizerFn`: Custom sanitizer function
28
+ * - `false` or `undefined`: No sanitization (default)
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // Auto-detect PII
33
+ * wrapToolUI({ sanitizeInput: true, ... });
34
+ *
35
+ * // Redact specific fields
36
+ * wrapToolUI({ sanitizeInput: ['password', 'token', 'api_key'], ... });
37
+ *
38
+ * // Custom sanitizer
39
+ * wrapToolUI({
40
+ * sanitizeInput: (key, value) => key === 'secret' ? '[HIDDEN]' : value,
41
+ * ...
42
+ * });
43
+ * ```
44
+ */
45
+ sanitizeInput?: boolean | string[] | SanitizerFn;
46
+ /**
47
+ * The type of renderer used (for framework runtime injection).
48
+ * Auto-detected by renderToolTemplateAsync.
49
+ */
50
+ rendererType?: string;
51
+ /**
52
+ * Enable client-side hydration for React/MDX components.
53
+ */
54
+ hydrate?: boolean;
55
+ /**
56
+ * Skip CSP meta tag generation.
57
+ *
58
+ * OpenAI handles CSP through `_meta['openai/widgetCSP']` in the MCP response,
59
+ * not through HTML meta tags. When true, the CSP meta tag is omitted from the
60
+ * HTML output to avoid browser warnings about CSP meta tags outside <head>.
61
+ *
62
+ * @default false
63
+ */
64
+ skipCspMeta?: boolean;
65
+ }
66
+ /**
67
+ * Create template helpers for use in template builder functions
68
+ */
69
+ export declare function createTemplateHelpers(): {
70
+ /**
71
+ * Escape HTML special characters to prevent XSS
72
+ */
73
+ escapeHtml: typeof escapeHtml;
74
+ /**
75
+ * Format a date for display
76
+ */
77
+ formatDate: (date: Date | string, format?: string) => string;
78
+ /**
79
+ * Format a number as currency
80
+ */
81
+ formatCurrency: (amount: number, currency?: string) => string;
82
+ /**
83
+ * Generate a unique ID for DOM elements
84
+ */
85
+ uniqueId: (prefix?: string) => string;
86
+ /**
87
+ * Safely embed JSON data in HTML
88
+ * Escapes characters that could break out of script tags or HTML
89
+ */
90
+ jsonEmbed: (data: unknown) => string;
91
+ };
92
+ /**
93
+ * Wrap tool UI content in a complete HTML document with MCP Bridge runtime.
94
+ *
95
+ * This function creates a standalone HTML document that:
96
+ * - Includes the MCP Bridge runtime for cross-platform compatibility
97
+ * - Applies Content Security Policy meta tags
98
+ * - Injects tool input/output data
99
+ * - Uses the FrontMCP theme system for consistent styling
100
+ *
101
+ * @param options - Options for wrapping the template
102
+ * @returns Complete HTML document string
103
+ *
104
+ * @example
105
+ * ```typescript
106
+ * const html = wrapToolUI({
107
+ * content: '<div class="p-4">Weather: 72°F</div>',
108
+ * toolName: 'get_weather',
109
+ * input: { location: 'San Francisco' },
110
+ * output: { temperature: 72, conditions: 'sunny' },
111
+ * csp: { connectDomains: ['https://api.weather.com'] },
112
+ * });
113
+ * ```
114
+ */
115
+ export declare function wrapToolUI(options: WrapToolUIFullOptions): string;
116
+ /**
117
+ * Resource loading mode for widget scripts.
118
+ * - 'cdn': Load React/MDX from CDN URLs (lightweight HTML, requires network)
119
+ * - 'inline': Embed all scripts in HTML (larger, works offline)
120
+ */
121
+ export type ResourceMode = 'cdn' | 'inline';
122
+ /**
123
+ * Options for the universal wrapper.
124
+ */
125
+ export interface WrapToolUIUniversalOptions {
126
+ /** Rendered template content (HTML) */
127
+ content: string;
128
+ /** Tool name */
129
+ toolName: string;
130
+ /** Tool input arguments */
131
+ input?: Record<string, unknown>;
132
+ /** Tool output/result */
133
+ output?: unknown;
134
+ /** Structured content */
135
+ structuredContent?: unknown;
136
+ /** CSP configuration */
137
+ csp?: WrapToolUIOptions['csp'];
138
+ /** Widget accessibility flag */
139
+ widgetAccessible?: boolean;
140
+ /** Page title */
141
+ title?: string;
142
+ /** Theme configuration */
143
+ theme?: DeepPartial<ThemeConfig>;
144
+ /** Whether to include the FrontMCP Bridge */
145
+ includeBridge?: boolean;
146
+ /** Whether to inline all scripts (for blocked-network environments) */
147
+ inlineScripts?: boolean;
148
+ /** Renderer type used */
149
+ rendererType?: string;
150
+ /** Enable hydration */
151
+ hydrate?: boolean;
152
+ /**
153
+ * Skip CSP meta tag generation.
154
+ *
155
+ * OpenAI handles CSP through `_meta['openai/widgetCSP']` in the MCP response,
156
+ * not through HTML meta tags. When true, the CSP meta tag is omitted from the
157
+ * HTML output to avoid browser warnings about CSP meta tags outside <head>.
158
+ *
159
+ * @default false
160
+ */
161
+ skipCspMeta?: boolean;
162
+ /**
163
+ * Resource loading mode for widget scripts.
164
+ *
165
+ * - 'cdn': Load React, MDX, Handlebars from CDN URLs (smaller HTML, requires network)
166
+ * - 'inline': Embed all scripts directly in HTML (larger, works in blocked-network environments)
167
+ *
168
+ * When `inlineScripts` is true, this is automatically set to 'inline'.
169
+ *
170
+ * @default 'cdn'
171
+ */
172
+ resourceMode?: ResourceMode;
173
+ }
174
+ /**
175
+ * Wrap tool UI content in a universal HTML document.
176
+ *
177
+ * This wrapper produces HTML that works on ALL platforms:
178
+ * - OpenAI ChatGPT (Apps SDK)
179
+ * - Anthropic Claude
180
+ * - MCP Apps (ext-apps / SEP-1865)
181
+ * - Google Gemini
182
+ * - Any MCP-compatible host
183
+ *
184
+ * The FrontMCP Bridge auto-detects the host at runtime and adapts
185
+ * its communication protocol accordingly.
186
+ *
187
+ * @param options - Universal wrapper options
188
+ * @returns Complete HTML document string
189
+ *
190
+ * @example
191
+ * ```typescript
192
+ * const html = wrapToolUIUniversal({
193
+ * content: '<div class="p-4">Weather: 72°F</div>',
194
+ * toolName: 'get_weather',
195
+ * output: { temperature: 72 },
196
+ * });
197
+ * ```
198
+ */
199
+ export declare function wrapToolUIUniversal(options: WrapToolUIUniversalOptions): string;
200
+ /**
201
+ * Wrap tool UI content with minimal boilerplate.
202
+ * Use this when you need to control all styling yourself.
203
+ *
204
+ * @param options - Minimal wrapper options
205
+ * @returns HTML document string
206
+ */
207
+ export declare function wrapToolUIMinimal(options: Pick<WrapToolUIOptions, 'content' | 'toolName' | 'input' | 'output' | 'structuredContent' | 'csp' | 'widgetAccessible' | 'title'> & {
208
+ skipCspMeta?: boolean;
209
+ }): string;
210
+ /**
211
+ * Options for wrapping a static widget.
212
+ */
213
+ export interface WrapStaticWidgetOptions {
214
+ /** Tool name */
215
+ toolName: string;
216
+ /** SSR'd template content (rendered WITHOUT data) */
217
+ ssrContent: string;
218
+ /** Tool UI configuration */
219
+ uiConfig: {
220
+ csp?: WrapToolUIOptions['csp'];
221
+ widgetAccessible?: boolean;
222
+ };
223
+ /** Page title */
224
+ title?: string;
225
+ /** Theme configuration */
226
+ theme?: DeepPartial<ThemeConfig>;
227
+ /**
228
+ * Renderer type (react, mdx, html, etc).
229
+ * When 'react' or 'mdx', includes React runtime for client-side rendering.
230
+ */
231
+ rendererType?: string;
232
+ /**
233
+ * Transpiled component code to include for client-side rendering.
234
+ * Required for React components to re-render with actual data.
235
+ */
236
+ componentCode?: string;
237
+ /**
238
+ * Embedded data for inline mode (servingMode: 'inline').
239
+ * When provided, the data is embedded in the HTML and the component renders immediately
240
+ * instead of waiting for window.openai.toolOutput.
241
+ *
242
+ * This enables inline mode to use the same React renderer as static mode,
243
+ * but with data embedded in each response.
244
+ */
245
+ embeddedData?: {
246
+ input?: Record<string, unknown>;
247
+ output?: unknown;
248
+ structuredContent?: unknown;
249
+ };
250
+ /**
251
+ * Self-contained mode for inline serving.
252
+ * When true:
253
+ * - Skips the FrontMCP Bridge entirely (no wrapper interference)
254
+ * - Renders React immediately with embedded data
255
+ * - React component manages its own state via hooks
256
+ * - No global state updates that could trigger platform wrappers
257
+ *
258
+ * This is used for `servingMode: 'inline'` to prevent OpenAI's wrapper
259
+ * from overwriting the React component on data changes.
260
+ */
261
+ selfContained?: boolean;
262
+ }
263
+ /**
264
+ * Options for lean widget shell (inline mode resourceTemplate).
265
+ */
266
+ export interface WrapLeanWidgetShellOptions {
267
+ /** Tool name */
268
+ toolName: string;
269
+ /** UI configuration */
270
+ uiConfig: {
271
+ widgetAccessible?: boolean;
272
+ };
273
+ /** Optional page title */
274
+ title?: string;
275
+ /** Optional theme overrides */
276
+ theme?: Partial<ThemeConfig>;
277
+ }
278
+ /**
279
+ * Create a lean widget shell for inline mode resourceTemplate.
280
+ *
281
+ * This is a minimal HTML document with:
282
+ * - HTML structure with theme CSS and fonts
283
+ * - A placeholder/loading message while waiting for tool response
284
+ * - FrontMCP Bridge for platform-agnostic communication
285
+ * - Injector script that detects ui/html in tool response and replaces the document
286
+ *
287
+ * NO React runtime, NO component code - the actual React widget comes
288
+ * in each tool response via _meta['ui/html'] and is injected by this shell.
289
+ *
290
+ * OpenAI caches this at discovery time. When a tool executes:
291
+ * 1. Tool returns full widget HTML in _meta['ui/html']
292
+ * 2. OpenAI injects this into window.openai.toolResponseMetadata['ui/html']
293
+ * 3. The bridge detects this and calls the injector callback
294
+ * 4. Injector replaces the entire document with the full React widget
295
+ *
296
+ * @param options - Lean widget options
297
+ * @returns Minimal HTML document string with bridge and injector
298
+ */
299
+ export declare function wrapLeanWidgetShell(options: WrapLeanWidgetShellOptions): string;
300
+ /**
301
+ * Options for hybrid widget shell (hybrid mode resourceTemplate).
302
+ */
303
+ export interface WrapHybridWidgetShellOptions {
304
+ /** Tool name */
305
+ toolName: string;
306
+ /** UI configuration */
307
+ uiConfig: {
308
+ widgetAccessible?: boolean;
309
+ csp?: WrapToolUIOptions['csp'];
310
+ };
311
+ /** Optional page title */
312
+ title?: string;
313
+ /** Optional theme overrides */
314
+ theme?: Partial<ThemeConfig>;
315
+ }
316
+ /**
317
+ * Create a hybrid widget shell for hybrid serving mode.
318
+ *
319
+ * This shell contains:
320
+ * - React 19 runtime from esm.sh CDN
321
+ * - FrontMCP Bridge for platform-agnostic communication
322
+ * - All FrontMCP hooks (useMcpBridgeContext, useToolOutput, useCallTool, etc.)
323
+ * - All FrontMCP UI components (Card, Badge, Button)
324
+ * - Dynamic renderer that imports and renders component code at runtime
325
+ *
326
+ * NO component code is included - it comes in the tool response via `_meta['ui/component']`.
327
+ *
328
+ * Flow:
329
+ * 1. Shell is cached at tools/list (OpenAI caches outputTemplate)
330
+ * 2. Tool response contains component code + structured data
331
+ * 3. Shell imports component via blob URL and renders with data
332
+ * 4. Re-renders on data updates via bridge notifications
333
+ *
334
+ * @param options - Hybrid widget shell options
335
+ * @returns Complete HTML document string with dynamic renderer
336
+ */
337
+ export declare function wrapHybridWidgetShell(options: WrapHybridWidgetShellOptions): string;
338
+ /**
339
+ * Wrap a static widget template for MCP resource mode.
340
+ *
341
+ * Unlike `wrapToolUIUniversal`, this function creates a widget that:
342
+ * - Does NOT embed data (input/output/structuredContent)
343
+ * - Reads data at runtime from the FrontMCP Bridge (window.openai.toolOutput)
344
+ * - Is cached at server startup and returned for all requests
345
+ *
346
+ * This is used for `servingMode: 'static'` where OpenAI caches the
347
+ * outputTemplate HTML and injects data via window.openai.toolOutput.
348
+ *
349
+ * @param options - Static widget options
350
+ * @returns Complete HTML document string
351
+ *
352
+ * @example
353
+ * ```typescript
354
+ * const html = wrapStaticWidgetUniversal({
355
+ * toolName: 'get_weather',
356
+ * ssrContent: '<div class="weather-card"><!-- Template without data --></div>',
357
+ * uiConfig: { widgetAccessible: true },
358
+ * });
359
+ * ```
360
+ */
361
+ export declare function wrapStaticWidgetUniversal(options: WrapStaticWidgetOptions): string;
362
+ /**
363
+ * Build OpenAI Apps SDK specific meta annotations.
364
+ * These are placed in _meta field of the tool response.
365
+ */
366
+ export declare function buildOpenAIMeta(options: {
367
+ csp?: WrapToolUIOptions['csp'];
368
+ widgetAccessible?: boolean;
369
+ widgetDescription?: string;
370
+ displayMode?: 'inline' | 'fullscreen' | 'pip';
371
+ }): Record<string, unknown>;
372
+ /**
373
+ * Get the MIME type for tool UI responses based on target platform
374
+ */
375
+ export declare function getToolUIMimeType(platform?: 'openai' | 'ext-apps' | 'generic'): string;