@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,198 @@
1
+ /**
2
+ * FrontMcpBridge Factory
3
+ *
4
+ * Main entry point for the unified multi-platform adapter system.
5
+ * Provides automatic platform detection and a consistent API across
6
+ * OpenAI, Claude, ext-apps, Gemini, and custom adapters.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { PlatformAdapter, AdapterCapabilities, BridgeConfig, DisplayMode, HostContext, FrontMcpBridgeInterface } from '../types';
11
+ import { AdapterRegistry } from './adapter-registry';
12
+ /**
13
+ * FrontMcpBridge - Unified multi-platform bridge for MCP tool widgets.
14
+ *
15
+ * @example Basic usage with auto-detection
16
+ * ```typescript
17
+ * const bridge = new FrontMcpBridge();
18
+ * await bridge.initialize();
19
+ *
20
+ * const theme = bridge.getTheme();
21
+ * const toolInput = bridge.getToolInput();
22
+ * ```
23
+ *
24
+ * @example Force specific adapter
25
+ * ```typescript
26
+ * const bridge = new FrontMcpBridge({
27
+ * forceAdapter: 'openai',
28
+ * debug: true,
29
+ * });
30
+ * await bridge.initialize();
31
+ * ```
32
+ *
33
+ * @example With custom registry
34
+ * ```typescript
35
+ * const registry = new AdapterRegistry();
36
+ * registry.register('custom', createCustomAdapter);
37
+ *
38
+ * const bridge = new FrontMcpBridge({ forceAdapter: 'custom' }, registry);
39
+ * await bridge.initialize();
40
+ * ```
41
+ */
42
+ export declare class FrontMcpBridge implements FrontMcpBridgeInterface {
43
+ private _config;
44
+ private _registry;
45
+ private _adapter;
46
+ private _initialized;
47
+ private _initPromise;
48
+ /**
49
+ * Create a new FrontMcpBridge instance.
50
+ * @param config - Bridge configuration
51
+ * @param registry - Optional custom adapter registry (uses default if not provided)
52
+ */
53
+ constructor(config?: BridgeConfig, registry?: AdapterRegistry);
54
+ /**
55
+ * Whether the bridge has been initialized.
56
+ */
57
+ get initialized(): boolean;
58
+ /**
59
+ * Current adapter ID, or undefined if not initialized.
60
+ */
61
+ get adapterId(): string | undefined;
62
+ /**
63
+ * Current adapter capabilities, or undefined if not initialized.
64
+ */
65
+ get capabilities(): AdapterCapabilities | undefined;
66
+ /**
67
+ * Initialize the bridge.
68
+ * Auto-detects the best adapter for the current platform unless
69
+ * `forceAdapter` is specified in the config.
70
+ *
71
+ * @throws Error if no suitable adapter is found
72
+ */
73
+ initialize(): Promise<void>;
74
+ /**
75
+ * Internal initialization logic.
76
+ */
77
+ private _doInitialize;
78
+ /**
79
+ * Dispose the bridge and release resources.
80
+ */
81
+ dispose(): void;
82
+ /**
83
+ * Get the active adapter instance.
84
+ */
85
+ getAdapter(): PlatformAdapter | undefined;
86
+ /**
87
+ * Check if a specific capability is available.
88
+ * @param cap - Capability key to check
89
+ */
90
+ hasCapability(cap: keyof AdapterCapabilities): boolean;
91
+ /**
92
+ * Get current theme.
93
+ */
94
+ getTheme(): 'light' | 'dark';
95
+ /**
96
+ * Get current display mode.
97
+ */
98
+ getDisplayMode(): DisplayMode;
99
+ /**
100
+ * Get tool input arguments.
101
+ */
102
+ getToolInput(): Record<string, unknown>;
103
+ /**
104
+ * Get tool output/result.
105
+ */
106
+ getToolOutput(): unknown;
107
+ /**
108
+ * Get structured content (parsed output).
109
+ */
110
+ getStructuredContent(): unknown;
111
+ /**
112
+ * Get persisted widget state.
113
+ */
114
+ getWidgetState(): Record<string, unknown>;
115
+ /**
116
+ * Get full host context.
117
+ */
118
+ getHostContext(): HostContext;
119
+ /**
120
+ * Call a tool on the MCP server.
121
+ * @param name - Tool name
122
+ * @param args - Tool arguments
123
+ */
124
+ callTool(name: string, args: Record<string, unknown>): Promise<unknown>;
125
+ /**
126
+ * Send a follow-up message to the conversation.
127
+ * @param content - Message content
128
+ */
129
+ sendMessage(content: string): Promise<void>;
130
+ /**
131
+ * Open an external link.
132
+ * @param url - URL to open
133
+ */
134
+ openLink(url: string): Promise<void>;
135
+ /**
136
+ * Request a display mode change.
137
+ * @param mode - Desired display mode
138
+ */
139
+ requestDisplayMode(mode: DisplayMode): Promise<void>;
140
+ /**
141
+ * Request widget close.
142
+ */
143
+ requestClose(): Promise<void>;
144
+ /**
145
+ * Set widget state (persisted across sessions).
146
+ * @param state - State object to persist
147
+ */
148
+ setWidgetState(state: Record<string, unknown>): void;
149
+ /**
150
+ * Subscribe to host context changes.
151
+ * @param callback - Called when context changes
152
+ * @returns Unsubscribe function
153
+ */
154
+ onContextChange(callback: (changes: Partial<HostContext>) => void): () => void;
155
+ /**
156
+ * Subscribe to tool result updates.
157
+ * @param callback - Called when tool result is received
158
+ * @returns Unsubscribe function
159
+ */
160
+ onToolResult(callback: (result: unknown) => void): () => void;
161
+ /**
162
+ * Ensure the bridge is initialized before operations.
163
+ */
164
+ private _ensureInitialized;
165
+ /**
166
+ * Wrap a promise with a timeout.
167
+ */
168
+ private _withTimeout;
169
+ /**
170
+ * Emit a bridge event via CustomEvent.
171
+ */
172
+ private _emitEvent;
173
+ /**
174
+ * Log debug message if debugging is enabled.
175
+ */
176
+ private _log;
177
+ }
178
+ /**
179
+ * Create and initialize a bridge instance.
180
+ * Convenience function for one-liner initialization.
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * const bridge = await createBridge({ debug: true });
185
+ * const theme = bridge.getTheme();
186
+ * ```
187
+ */
188
+ export declare function createBridge(config?: BridgeConfig, registry?: AdapterRegistry): Promise<FrontMcpBridge>;
189
+ /**
190
+ * Get or create the global bridge instance.
191
+ * Initializes automatically on first call.
192
+ */
193
+ export declare function getGlobalBridge(config?: BridgeConfig): Promise<FrontMcpBridge>;
194
+ /**
195
+ * Reset the global bridge instance.
196
+ * Useful for testing or when switching configurations.
197
+ */
198
+ export declare function resetGlobalBridge(): void;
@@ -0,0 +1,428 @@
1
+ "use strict";
2
+ /**
3
+ * FrontMcpBridge Factory
4
+ *
5
+ * Main entry point for the unified multi-platform adapter system.
6
+ * Provides automatic platform detection and a consistent API across
7
+ * OpenAI, Claude, ext-apps, Gemini, and custom adapters.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.FrontMcpBridge = void 0;
13
+ exports.createBridge = createBridge;
14
+ exports.getGlobalBridge = getGlobalBridge;
15
+ exports.resetGlobalBridge = resetGlobalBridge;
16
+ const adapter_registry_1 = require("./adapter-registry");
17
+ /**
18
+ * Default bridge configuration.
19
+ */
20
+ const DEFAULT_CONFIG = {
21
+ debug: false,
22
+ initTimeout: 5000,
23
+ };
24
+ /**
25
+ * Empty capabilities returned when no adapter is active.
26
+ */
27
+ const EMPTY_CAPABILITIES = {
28
+ canCallTools: false,
29
+ canSendMessages: false,
30
+ canOpenLinks: false,
31
+ canPersistState: false,
32
+ hasNetworkAccess: false,
33
+ supportsDisplayModes: false,
34
+ supportsTheme: false,
35
+ };
36
+ /**
37
+ * FrontMcpBridge - Unified multi-platform bridge for MCP tool widgets.
38
+ *
39
+ * @example Basic usage with auto-detection
40
+ * ```typescript
41
+ * const bridge = new FrontMcpBridge();
42
+ * await bridge.initialize();
43
+ *
44
+ * const theme = bridge.getTheme();
45
+ * const toolInput = bridge.getToolInput();
46
+ * ```
47
+ *
48
+ * @example Force specific adapter
49
+ * ```typescript
50
+ * const bridge = new FrontMcpBridge({
51
+ * forceAdapter: 'openai',
52
+ * debug: true,
53
+ * });
54
+ * await bridge.initialize();
55
+ * ```
56
+ *
57
+ * @example With custom registry
58
+ * ```typescript
59
+ * const registry = new AdapterRegistry();
60
+ * registry.register('custom', createCustomAdapter);
61
+ *
62
+ * const bridge = new FrontMcpBridge({ forceAdapter: 'custom' }, registry);
63
+ * await bridge.initialize();
64
+ * ```
65
+ */
66
+ class FrontMcpBridge {
67
+ _config;
68
+ _registry;
69
+ _adapter;
70
+ _initialized = false;
71
+ _initPromise;
72
+ /**
73
+ * Create a new FrontMcpBridge instance.
74
+ * @param config - Bridge configuration
75
+ * @param registry - Optional custom adapter registry (uses default if not provided)
76
+ */
77
+ constructor(config = {}, registry) {
78
+ this._config = { ...DEFAULT_CONFIG, ...config };
79
+ this._registry = registry || adapter_registry_1.defaultRegistry;
80
+ if (this._config.debug) {
81
+ this._registry.setDebug(true);
82
+ }
83
+ // Apply disabled adapters
84
+ if (this._config.disabledAdapters) {
85
+ this._registry.disable(...this._config.disabledAdapters);
86
+ }
87
+ // Apply adapter configs
88
+ if (this._config.adapterConfigs) {
89
+ for (const [id, adapterConfig] of Object.entries(this._config.adapterConfigs)) {
90
+ this._registry.configure(id, adapterConfig);
91
+ }
92
+ }
93
+ }
94
+ // ============================================
95
+ // Public Properties
96
+ // ============================================
97
+ /**
98
+ * Whether the bridge has been initialized.
99
+ */
100
+ get initialized() {
101
+ return this._initialized;
102
+ }
103
+ /**
104
+ * Current adapter ID, or undefined if not initialized.
105
+ */
106
+ get adapterId() {
107
+ return this._adapter?.id;
108
+ }
109
+ /**
110
+ * Current adapter capabilities, or undefined if not initialized.
111
+ */
112
+ get capabilities() {
113
+ return this._adapter?.capabilities;
114
+ }
115
+ // ============================================
116
+ // Lifecycle
117
+ // ============================================
118
+ /**
119
+ * Initialize the bridge.
120
+ * Auto-detects the best adapter for the current platform unless
121
+ * `forceAdapter` is specified in the config.
122
+ *
123
+ * @throws Error if no suitable adapter is found
124
+ */
125
+ async initialize() {
126
+ // Ensure only one initialization runs at a time
127
+ if (this._initPromise) {
128
+ return this._initPromise;
129
+ }
130
+ if (this._initialized) {
131
+ return;
132
+ }
133
+ this._initPromise = this._doInitialize();
134
+ try {
135
+ await this._initPromise;
136
+ }
137
+ finally {
138
+ this._initPromise = undefined;
139
+ }
140
+ }
141
+ /**
142
+ * Internal initialization logic.
143
+ */
144
+ async _doInitialize() {
145
+ this._log('Initializing FrontMcpBridge...');
146
+ // Select adapter
147
+ if (this._config.forceAdapter) {
148
+ this._adapter = this._registry.get(this._config.forceAdapter);
149
+ if (!this._adapter) {
150
+ throw new Error(`Forced adapter "${this._config.forceAdapter}" not found or disabled`);
151
+ }
152
+ this._log(`Using forced adapter: ${this._config.forceAdapter}`);
153
+ }
154
+ else {
155
+ this._adapter = this._registry.detect();
156
+ if (!this._adapter) {
157
+ throw new Error('No suitable adapter detected for current environment');
158
+ }
159
+ this._log(`Auto-detected adapter: ${this._adapter.id}`);
160
+ }
161
+ // Initialize adapter with timeout
162
+ try {
163
+ await this._withTimeout(this._adapter.initialize(), this._config.initTimeout || 5000);
164
+ this._initialized = true;
165
+ this._log(`Bridge initialized with adapter: ${this._adapter.id}`);
166
+ this._emitEvent('bridge:ready', { adapter: this._adapter.id });
167
+ }
168
+ catch (error) {
169
+ this._emitEvent('bridge:error', {
170
+ error: error instanceof Error ? error : new Error(String(error)),
171
+ adapter: this._adapter?.id,
172
+ });
173
+ throw error;
174
+ }
175
+ }
176
+ /**
177
+ * Dispose the bridge and release resources.
178
+ */
179
+ dispose() {
180
+ if (this._adapter) {
181
+ this._adapter.dispose();
182
+ this._log(`Disposed adapter: ${this._adapter.id}`);
183
+ }
184
+ this._adapter = undefined;
185
+ this._initialized = false;
186
+ }
187
+ // ============================================
188
+ // Adapter Access
189
+ // ============================================
190
+ /**
191
+ * Get the active adapter instance.
192
+ */
193
+ getAdapter() {
194
+ return this._adapter;
195
+ }
196
+ /**
197
+ * Check if a specific capability is available.
198
+ * @param cap - Capability key to check
199
+ */
200
+ hasCapability(cap) {
201
+ return this._adapter?.capabilities[cap] === true;
202
+ }
203
+ // ============================================
204
+ // Data Access (delegate to adapter)
205
+ // ============================================
206
+ /**
207
+ * Get current theme.
208
+ */
209
+ getTheme() {
210
+ this._ensureInitialized();
211
+ return this._adapter.getTheme();
212
+ }
213
+ /**
214
+ * Get current display mode.
215
+ */
216
+ getDisplayMode() {
217
+ this._ensureInitialized();
218
+ return this._adapter.getDisplayMode();
219
+ }
220
+ /**
221
+ * Get tool input arguments.
222
+ */
223
+ getToolInput() {
224
+ this._ensureInitialized();
225
+ return this._adapter.getToolInput();
226
+ }
227
+ /**
228
+ * Get tool output/result.
229
+ */
230
+ getToolOutput() {
231
+ this._ensureInitialized();
232
+ return this._adapter.getToolOutput();
233
+ }
234
+ /**
235
+ * Get structured content (parsed output).
236
+ */
237
+ getStructuredContent() {
238
+ this._ensureInitialized();
239
+ return this._adapter.getStructuredContent();
240
+ }
241
+ /**
242
+ * Get persisted widget state.
243
+ */
244
+ getWidgetState() {
245
+ this._ensureInitialized();
246
+ return this._adapter.getWidgetState();
247
+ }
248
+ /**
249
+ * Get full host context.
250
+ */
251
+ getHostContext() {
252
+ this._ensureInitialized();
253
+ return this._adapter.getHostContext();
254
+ }
255
+ // ============================================
256
+ // Actions (delegate to adapter)
257
+ // ============================================
258
+ /**
259
+ * Call a tool on the MCP server.
260
+ * @param name - Tool name
261
+ * @param args - Tool arguments
262
+ */
263
+ async callTool(name, args) {
264
+ this._ensureInitialized();
265
+ if (!this.hasCapability('canCallTools')) {
266
+ throw new Error('Tool calls are not supported by the current adapter');
267
+ }
268
+ return this._adapter.callTool(name, args);
269
+ }
270
+ /**
271
+ * Send a follow-up message to the conversation.
272
+ * @param content - Message content
273
+ */
274
+ async sendMessage(content) {
275
+ this._ensureInitialized();
276
+ if (!this.hasCapability('canSendMessages')) {
277
+ throw new Error('Sending messages is not supported by the current adapter');
278
+ }
279
+ return this._adapter.sendMessage(content);
280
+ }
281
+ /**
282
+ * Open an external link.
283
+ * @param url - URL to open
284
+ */
285
+ async openLink(url) {
286
+ this._ensureInitialized();
287
+ return this._adapter.openLink(url);
288
+ }
289
+ /**
290
+ * Request a display mode change.
291
+ * @param mode - Desired display mode
292
+ */
293
+ async requestDisplayMode(mode) {
294
+ this._ensureInitialized();
295
+ return this._adapter.requestDisplayMode(mode);
296
+ }
297
+ /**
298
+ * Request widget close.
299
+ */
300
+ async requestClose() {
301
+ this._ensureInitialized();
302
+ return this._adapter.requestClose();
303
+ }
304
+ /**
305
+ * Set widget state (persisted across sessions).
306
+ * @param state - State object to persist
307
+ */
308
+ setWidgetState(state) {
309
+ this._ensureInitialized();
310
+ this._adapter.setWidgetState(state);
311
+ }
312
+ // ============================================
313
+ // Events (delegate to adapter)
314
+ // ============================================
315
+ /**
316
+ * Subscribe to host context changes.
317
+ * @param callback - Called when context changes
318
+ * @returns Unsubscribe function
319
+ */
320
+ onContextChange(callback) {
321
+ this._ensureInitialized();
322
+ return this._adapter.onContextChange(callback);
323
+ }
324
+ /**
325
+ * Subscribe to tool result updates.
326
+ * @param callback - Called when tool result is received
327
+ * @returns Unsubscribe function
328
+ */
329
+ onToolResult(callback) {
330
+ this._ensureInitialized();
331
+ return this._adapter.onToolResult(callback);
332
+ }
333
+ // ============================================
334
+ // Private Helpers
335
+ // ============================================
336
+ /**
337
+ * Ensure the bridge is initialized before operations.
338
+ */
339
+ _ensureInitialized() {
340
+ if (!this._initialized || !this._adapter) {
341
+ throw new Error('FrontMcpBridge is not initialized. Call initialize() first.');
342
+ }
343
+ }
344
+ /**
345
+ * Wrap a promise with a timeout.
346
+ */
347
+ _withTimeout(promise, ms) {
348
+ return new Promise((resolve, reject) => {
349
+ const timer = setTimeout(() => {
350
+ reject(new Error(`Operation timed out after ${ms}ms`));
351
+ }, ms);
352
+ promise
353
+ .then((result) => {
354
+ clearTimeout(timer);
355
+ resolve(result);
356
+ })
357
+ .catch((error) => {
358
+ clearTimeout(timer);
359
+ reject(error);
360
+ });
361
+ });
362
+ }
363
+ /**
364
+ * Emit a bridge event via CustomEvent.
365
+ */
366
+ _emitEvent(type, payload) {
367
+ if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {
368
+ try {
369
+ const event = new CustomEvent(type, { detail: payload });
370
+ window.dispatchEvent(event);
371
+ }
372
+ catch {
373
+ // Ignore event dispatch errors
374
+ }
375
+ }
376
+ }
377
+ /**
378
+ * Log debug message if debugging is enabled.
379
+ */
380
+ _log(message) {
381
+ if (this._config.debug) {
382
+ console.log(`[FrontMcpBridge] ${message}`);
383
+ }
384
+ }
385
+ }
386
+ exports.FrontMcpBridge = FrontMcpBridge;
387
+ /**
388
+ * Create and initialize a bridge instance.
389
+ * Convenience function for one-liner initialization.
390
+ *
391
+ * @example
392
+ * ```typescript
393
+ * const bridge = await createBridge({ debug: true });
394
+ * const theme = bridge.getTheme();
395
+ * ```
396
+ */
397
+ async function createBridge(config, registry) {
398
+ const bridge = new FrontMcpBridge(config, registry);
399
+ await bridge.initialize();
400
+ return bridge;
401
+ }
402
+ /**
403
+ * Global bridge instance for singleton pattern.
404
+ * Use with caution - prefer creating instances when possible.
405
+ */
406
+ let _globalBridge;
407
+ /**
408
+ * Get or create the global bridge instance.
409
+ * Initializes automatically on first call.
410
+ */
411
+ async function getGlobalBridge(config) {
412
+ if (!_globalBridge) {
413
+ _globalBridge = new FrontMcpBridge(config);
414
+ await _globalBridge.initialize();
415
+ }
416
+ return _globalBridge;
417
+ }
418
+ /**
419
+ * Reset the global bridge instance.
420
+ * Useful for testing or when switching configurations.
421
+ */
422
+ function resetGlobalBridge() {
423
+ if (_globalBridge) {
424
+ _globalBridge.dispose();
425
+ _globalBridge = undefined;
426
+ }
427
+ }
428
+ //# sourceMappingURL=bridge-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-factory.js","sourceRoot":"","sources":["../../../../src/bridge/core/bridge-factory.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * FrontMcpBridge Factory\n *\n * Main entry point for the unified multi-platform adapter system.\n * Provides automatic platform detection and a consistent API across\n * OpenAI, Claude, ext-apps, Gemini, and custom adapters.\n *\n * @packageDocumentation\n */\n\nimport type {\n PlatformAdapter,\n AdapterCapabilities,\n BridgeConfig,\n DisplayMode,\n HostContext,\n FrontMcpBridgeInterface,\n BridgeEventType,\n BridgeEventPayloads,\n} from '../types';\nimport { AdapterRegistry, defaultRegistry } from './adapter-registry';\n\n/**\n * Default bridge configuration.\n */\nconst DEFAULT_CONFIG: BridgeConfig = {\n debug: false,\n initTimeout: 5000,\n};\n\n/**\n * Empty capabilities returned when no adapter is active.\n */\nconst EMPTY_CAPABILITIES: AdapterCapabilities = {\n canCallTools: false,\n canSendMessages: false,\n canOpenLinks: false,\n canPersistState: false,\n hasNetworkAccess: false,\n supportsDisplayModes: false,\n supportsTheme: false,\n};\n\n/**\n * FrontMcpBridge - Unified multi-platform bridge for MCP tool widgets.\n *\n * @example Basic usage with auto-detection\n * ```typescript\n * const bridge = new FrontMcpBridge();\n * await bridge.initialize();\n *\n * const theme = bridge.getTheme();\n * const toolInput = bridge.getToolInput();\n * ```\n *\n * @example Force specific adapter\n * ```typescript\n * const bridge = new FrontMcpBridge({\n * forceAdapter: 'openai',\n * debug: true,\n * });\n * await bridge.initialize();\n * ```\n *\n * @example With custom registry\n * ```typescript\n * const registry = new AdapterRegistry();\n * registry.register('custom', createCustomAdapter);\n *\n * const bridge = new FrontMcpBridge({ forceAdapter: 'custom' }, registry);\n * await bridge.initialize();\n * ```\n */\nexport class FrontMcpBridge implements FrontMcpBridgeInterface {\n private _config: BridgeConfig;\n private _registry: AdapterRegistry;\n private _adapter: PlatformAdapter | undefined;\n private _initialized = false;\n private _initPromise: Promise<void> | undefined;\n\n /**\n * Create a new FrontMcpBridge instance.\n * @param config - Bridge configuration\n * @param registry - Optional custom adapter registry (uses default if not provided)\n */\n constructor(config: BridgeConfig = {}, registry?: AdapterRegistry) {\n this._config = { ...DEFAULT_CONFIG, ...config };\n this._registry = registry || defaultRegistry;\n\n if (this._config.debug) {\n this._registry.setDebug(true);\n }\n\n // Apply disabled adapters\n if (this._config.disabledAdapters) {\n this._registry.disable(...this._config.disabledAdapters);\n }\n\n // Apply adapter configs\n if (this._config.adapterConfigs) {\n for (const [id, adapterConfig] of Object.entries(this._config.adapterConfigs)) {\n this._registry.configure(id, adapterConfig);\n }\n }\n }\n\n // ============================================\n // Public Properties\n // ============================================\n\n /**\n * Whether the bridge has been initialized.\n */\n get initialized(): boolean {\n return this._initialized;\n }\n\n /**\n * Current adapter ID, or undefined if not initialized.\n */\n get adapterId(): string | undefined {\n return this._adapter?.id;\n }\n\n /**\n * Current adapter capabilities, or undefined if not initialized.\n */\n get capabilities(): AdapterCapabilities | undefined {\n return this._adapter?.capabilities;\n }\n\n // ============================================\n // Lifecycle\n // ============================================\n\n /**\n * Initialize the bridge.\n * Auto-detects the best adapter for the current platform unless\n * `forceAdapter` is specified in the config.\n *\n * @throws Error if no suitable adapter is found\n */\n async initialize(): Promise<void> {\n // Ensure only one initialization runs at a time\n if (this._initPromise) {\n return this._initPromise;\n }\n\n if (this._initialized) {\n return;\n }\n\n this._initPromise = this._doInitialize();\n try {\n await this._initPromise;\n } finally {\n this._initPromise = undefined;\n }\n }\n\n /**\n * Internal initialization logic.\n */\n private async _doInitialize(): Promise<void> {\n this._log('Initializing FrontMcpBridge...');\n\n // Select adapter\n if (this._config.forceAdapter) {\n this._adapter = this._registry.get(this._config.forceAdapter);\n if (!this._adapter) {\n throw new Error(`Forced adapter \"${this._config.forceAdapter}\" not found or disabled`);\n }\n this._log(`Using forced adapter: ${this._config.forceAdapter}`);\n } else {\n this._adapter = this._registry.detect();\n if (!this._adapter) {\n throw new Error('No suitable adapter detected for current environment');\n }\n this._log(`Auto-detected adapter: ${this._adapter.id}`);\n }\n\n // Initialize adapter with timeout\n try {\n await this._withTimeout(this._adapter.initialize(), this._config.initTimeout || 5000);\n this._initialized = true;\n this._log(`Bridge initialized with adapter: ${this._adapter.id}`);\n this._emitEvent('bridge:ready', { adapter: this._adapter.id });\n } catch (error) {\n this._emitEvent('bridge:error', {\n error: error instanceof Error ? error : new Error(String(error)),\n adapter: this._adapter?.id,\n });\n throw error;\n }\n }\n\n /**\n * Dispose the bridge and release resources.\n */\n dispose(): void {\n if (this._adapter) {\n this._adapter.dispose();\n this._log(`Disposed adapter: ${this._adapter.id}`);\n }\n this._adapter = undefined;\n this._initialized = false;\n }\n\n // ============================================\n // Adapter Access\n // ============================================\n\n /**\n * Get the active adapter instance.\n */\n getAdapter(): PlatformAdapter | undefined {\n return this._adapter;\n }\n\n /**\n * Check if a specific capability is available.\n * @param cap - Capability key to check\n */\n hasCapability(cap: keyof AdapterCapabilities): boolean {\n return this._adapter?.capabilities[cap] === true;\n }\n\n // ============================================\n // Data Access (delegate to adapter)\n // ============================================\n\n /**\n * Get current theme.\n */\n getTheme(): 'light' | 'dark' {\n this._ensureInitialized();\n return this._adapter!.getTheme();\n }\n\n /**\n * Get current display mode.\n */\n getDisplayMode(): DisplayMode {\n this._ensureInitialized();\n return this._adapter!.getDisplayMode();\n }\n\n /**\n * Get tool input arguments.\n */\n getToolInput(): Record<string, unknown> {\n this._ensureInitialized();\n return this._adapter!.getToolInput();\n }\n\n /**\n * Get tool output/result.\n */\n getToolOutput(): unknown {\n this._ensureInitialized();\n return this._adapter!.getToolOutput();\n }\n\n /**\n * Get structured content (parsed output).\n */\n getStructuredContent(): unknown {\n this._ensureInitialized();\n return this._adapter!.getStructuredContent();\n }\n\n /**\n * Get persisted widget state.\n */\n getWidgetState(): Record<string, unknown> {\n this._ensureInitialized();\n return this._adapter!.getWidgetState();\n }\n\n /**\n * Get full host context.\n */\n getHostContext(): HostContext {\n this._ensureInitialized();\n return this._adapter!.getHostContext();\n }\n\n // ============================================\n // Actions (delegate to adapter)\n // ============================================\n\n /**\n * Call a tool on the MCP server.\n * @param name - Tool name\n * @param args - Tool arguments\n */\n async callTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n this._ensureInitialized();\n if (!this.hasCapability('canCallTools')) {\n throw new Error('Tool calls are not supported by the current adapter');\n }\n return this._adapter!.callTool(name, args);\n }\n\n /**\n * Send a follow-up message to the conversation.\n * @param content - Message content\n */\n async sendMessage(content: string): Promise<void> {\n this._ensureInitialized();\n if (!this.hasCapability('canSendMessages')) {\n throw new Error('Sending messages is not supported by the current adapter');\n }\n return this._adapter!.sendMessage(content);\n }\n\n /**\n * Open an external link.\n * @param url - URL to open\n */\n async openLink(url: string): Promise<void> {\n this._ensureInitialized();\n return this._adapter!.openLink(url);\n }\n\n /**\n * Request a display mode change.\n * @param mode - Desired display mode\n */\n async requestDisplayMode(mode: DisplayMode): Promise<void> {\n this._ensureInitialized();\n return this._adapter!.requestDisplayMode(mode);\n }\n\n /**\n * Request widget close.\n */\n async requestClose(): Promise<void> {\n this._ensureInitialized();\n return this._adapter!.requestClose();\n }\n\n /**\n * Set widget state (persisted across sessions).\n * @param state - State object to persist\n */\n setWidgetState(state: Record<string, unknown>): void {\n this._ensureInitialized();\n this._adapter!.setWidgetState(state);\n }\n\n // ============================================\n // Events (delegate to adapter)\n // ============================================\n\n /**\n * Subscribe to host context changes.\n * @param callback - Called when context changes\n * @returns Unsubscribe function\n */\n onContextChange(callback: (changes: Partial<HostContext>) => void): () => void {\n this._ensureInitialized();\n return this._adapter!.onContextChange(callback);\n }\n\n /**\n * Subscribe to tool result updates.\n * @param callback - Called when tool result is received\n * @returns Unsubscribe function\n */\n onToolResult(callback: (result: unknown) => void): () => void {\n this._ensureInitialized();\n return this._adapter!.onToolResult(callback);\n }\n\n // ============================================\n // Private Helpers\n // ============================================\n\n /**\n * Ensure the bridge is initialized before operations.\n */\n private _ensureInitialized(): void {\n if (!this._initialized || !this._adapter) {\n throw new Error('FrontMcpBridge is not initialized. Call initialize() first.');\n }\n }\n\n /**\n * Wrap a promise with a timeout.\n */\n private _withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`Operation timed out after ${ms}ms`));\n }, ms);\n\n promise\n .then((result) => {\n clearTimeout(timer);\n resolve(result);\n })\n .catch((error) => {\n clearTimeout(timer);\n reject(error);\n });\n });\n }\n\n /**\n * Emit a bridge event via CustomEvent.\n */\n private _emitEvent<T extends BridgeEventType>(type: T, payload: BridgeEventPayloads[T]): void {\n if (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n try {\n const event = new CustomEvent(type, { detail: payload });\n window.dispatchEvent(event);\n } catch {\n // Ignore event dispatch errors\n }\n }\n }\n\n /**\n * Log debug message if debugging is enabled.\n */\n private _log(message: string): void {\n if (this._config.debug) {\n console.log(`[FrontMcpBridge] ${message}`);\n }\n }\n}\n\n/**\n * Create and initialize a bridge instance.\n * Convenience function for one-liner initialization.\n *\n * @example\n * ```typescript\n * const bridge = await createBridge({ debug: true });\n * const theme = bridge.getTheme();\n * ```\n */\nexport async function createBridge(config?: BridgeConfig, registry?: AdapterRegistry): Promise<FrontMcpBridge> {\n const bridge = new FrontMcpBridge(config, registry);\n await bridge.initialize();\n return bridge;\n}\n\n/**\n * Global bridge instance for singleton pattern.\n * Use with caution - prefer creating instances when possible.\n */\nlet _globalBridge: FrontMcpBridge | undefined;\n\n/**\n * Get or create the global bridge instance.\n * Initializes automatically on first call.\n */\nexport async function getGlobalBridge(config?: BridgeConfig): Promise<FrontMcpBridge> {\n if (!_globalBridge) {\n _globalBridge = new FrontMcpBridge(config);\n await _globalBridge.initialize();\n }\n return _globalBridge;\n}\n\n/**\n * Reset the global bridge instance.\n * Useful for testing or when switching configurations.\n */\nexport function resetGlobalBridge(): void {\n if (_globalBridge) {\n _globalBridge.dispose();\n _globalBridge = undefined;\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Bridge Core Module
3
+ *
4
+ * Core infrastructure for the FrontMcpBridge system.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { AdapterRegistry, defaultRegistry, registerAdapter, getAdapter, detectAdapter } from './adapter-registry';
9
+ export { FrontMcpBridge, createBridge, getGlobalBridge, resetGlobalBridge } from './bridge-factory';