skybridge 0.0.0-dev.bfca583 → 0.0.0-dev.bfd7070

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 (360) hide show
  1. package/README.md +145 -0
  2. package/bin/run.js +5 -0
  3. package/dist/cli/detect-port.d.ts +18 -0
  4. package/dist/cli/detect-port.js +61 -0
  5. package/dist/cli/detect-port.js.map +1 -0
  6. package/dist/cli/header.d.ts +4 -0
  7. package/dist/cli/header.js +6 -0
  8. package/dist/cli/header.js.map +1 -0
  9. package/dist/cli/run-command.d.ts +2 -0
  10. package/dist/cli/run-command.js +43 -0
  11. package/dist/cli/run-command.js.map +1 -0
  12. package/dist/cli/telemetry.d.ts +7 -0
  13. package/dist/cli/telemetry.js +123 -0
  14. package/dist/cli/telemetry.js.map +1 -0
  15. package/dist/cli/use-execute-steps.d.ts +11 -0
  16. package/dist/cli/use-execute-steps.js +36 -0
  17. package/dist/cli/use-execute-steps.js.map +1 -0
  18. package/dist/cli/use-nodemon.d.ts +6 -0
  19. package/dist/cli/use-nodemon.js +69 -0
  20. package/dist/cli/use-nodemon.js.map +1 -0
  21. package/dist/cli/use-typescript-check.d.ts +8 -0
  22. package/dist/cli/use-typescript-check.js +59 -0
  23. package/dist/cli/use-typescript-check.js.map +1 -0
  24. package/dist/commands/build.d.ts +9 -0
  25. package/dist/commands/build.js +46 -0
  26. package/dist/commands/build.js.map +1 -0
  27. package/dist/commands/dev.d.ts +10 -0
  28. package/dist/commands/dev.js +42 -0
  29. package/dist/commands/dev.js.map +1 -0
  30. package/dist/commands/start.d.ts +9 -0
  31. package/dist/commands/start.js +52 -0
  32. package/dist/commands/start.js.map +1 -0
  33. package/dist/commands/telemetry/disable.d.ts +5 -0
  34. package/dist/commands/telemetry/disable.js +14 -0
  35. package/dist/commands/telemetry/disable.js.map +1 -0
  36. package/dist/commands/telemetry/enable.d.ts +5 -0
  37. package/dist/commands/telemetry/enable.js +14 -0
  38. package/dist/commands/telemetry/enable.js.map +1 -0
  39. package/dist/commands/telemetry/status.d.ts +5 -0
  40. package/dist/commands/telemetry/status.js +14 -0
  41. package/dist/commands/telemetry/status.js.map +1 -0
  42. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  43. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  44. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  45. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  46. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  47. package/dist/server/const.d.ts +1 -0
  48. package/dist/server/const.js +2 -0
  49. package/dist/server/const.js.map +1 -0
  50. package/dist/server/express.d.ts +9 -0
  51. package/dist/server/express.js +72 -0
  52. package/dist/server/express.js.map +1 -0
  53. package/dist/server/express.test.js +74 -0
  54. package/dist/server/express.test.js.map +1 -0
  55. package/dist/{src/server → server}/index.d.ts +0 -1
  56. package/dist/{src/server → server}/index.js +0 -1
  57. package/dist/server/index.js.map +1 -0
  58. package/dist/server/inferUtilityTypes.js.map +1 -0
  59. package/dist/{src/server → server}/server.d.ts +32 -1
  60. package/dist/server/server.js +206 -0
  61. package/dist/server/server.js.map +1 -0
  62. package/dist/{src/server → server}/templateHelper.d.ts +1 -0
  63. package/dist/server/templateHelper.js.map +1 -0
  64. package/dist/server/templates/development.hbs +67 -0
  65. package/dist/{src/server → server}/templates/production.hbs +1 -2
  66. package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
  67. package/dist/server/widgetsDevServer.js +63 -0
  68. package/dist/server/widgetsDevServer.js.map +1 -0
  69. package/dist/test/utils.js.map +1 -0
  70. package/dist/{src/test → test}/widget.test.js +125 -7
  71. package/dist/test/widget.test.js.map +1 -0
  72. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  73. package/dist/web/bridges/apps-sdk/adaptor.js +71 -0
  74. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  75. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  76. package/dist/{src/web/bridges/apps-sdk-bridge.js → web/bridges/apps-sdk/bridge.js} +2 -2
  77. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  78. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  79. package/dist/web/bridges/apps-sdk/index.js +5 -0
  80. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  81. package/dist/{src/web → web/bridges/apps-sdk}/types.d.ts +31 -60
  82. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  83. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  84. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  85. package/dist/{src/web/bridges/hooks/use-apps-sdk-bridge.js → web/bridges/apps-sdk/use-apps-sdk-context.js} +3 -3
  86. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  87. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  88. package/dist/web/bridges/get-adaptor.js +8 -0
  89. package/dist/web/bridges/get-adaptor.js.map +1 -0
  90. package/dist/web/bridges/index.d.ts +5 -0
  91. package/dist/web/bridges/index.js +6 -0
  92. package/dist/web/bridges/index.js.map +1 -0
  93. package/dist/web/bridges/mcp-app/adaptor.d.ts +36 -0
  94. package/dist/web/bridges/mcp-app/adaptor.js +190 -0
  95. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  96. package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
  97. package/dist/web/bridges/mcp-app/bridge.js +260 -0
  98. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  99. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  100. package/dist/web/bridges/mcp-app/index.js +4 -0
  101. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  102. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  103. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  104. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
  105. package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.js → web/bridges/mcp-app/use-mcp-app-context.js} +3 -3
  106. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  107. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +66 -0
  108. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  109. package/dist/web/bridges/types.d.ts +102 -0
  110. package/dist/web/bridges/types.js +2 -0
  111. package/dist/{src/web → web}/bridges/types.js.map +1 -1
  112. package/dist/web/bridges/use-host-context.d.ts +2 -0
  113. package/dist/web/bridges/use-host-context.js +8 -0
  114. package/dist/web/bridges/use-host-context.js.map +1 -0
  115. package/dist/web/components/modal-provider.d.ts +4 -0
  116. package/dist/web/components/modal-provider.js +47 -0
  117. package/dist/web/components/modal-provider.js.map +1 -0
  118. package/dist/{src/web → web}/create-store.js +6 -7
  119. package/dist/web/create-store.js.map +1 -0
  120. package/dist/web/create-store.test.js +126 -0
  121. package/dist/web/create-store.test.js.map +1 -0
  122. package/dist/{src/web → web}/data-llm.js +5 -3
  123. package/dist/web/data-llm.js.map +1 -0
  124. package/dist/web/data-llm.test.js +141 -0
  125. package/dist/web/data-llm.test.js.map +1 -0
  126. package/dist/{src/web → web}/generate-helpers.d.ts +3 -2
  127. package/dist/{src/web → web}/generate-helpers.js +1 -1
  128. package/dist/web/generate-helpers.js.map +1 -0
  129. package/dist/web/generate-helpers.test-d.js.map +1 -0
  130. package/dist/web/generate-helpers.test.js.map +1 -0
  131. package/dist/{src/web → web}/helpers/state.js +13 -8
  132. package/dist/web/helpers/state.js.map +1 -0
  133. package/dist/web/helpers/state.test.js.map +1 -0
  134. package/dist/{src/web → web}/hooks/index.d.ts +2 -2
  135. package/dist/{src/web → web}/hooks/index.js +1 -1
  136. package/dist/web/hooks/index.js.map +1 -0
  137. package/dist/{src/web → web}/hooks/test/utils.d.ts +8 -2
  138. package/dist/web/hooks/test/utils.js +60 -0
  139. package/dist/web/hooks/test/utils.js.map +1 -0
  140. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +2 -1
  141. package/dist/{src/web → web}/hooks/use-call-tool.js +2 -2
  142. package/dist/web/hooks/use-call-tool.js.map +1 -0
  143. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  144. package/dist/{src/web → web}/hooks/use-call-tool.test.js +0 -1
  145. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  146. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  147. package/dist/web/hooks/use-display-mode.js +9 -0
  148. package/dist/web/hooks/use-display-mode.js.map +1 -0
  149. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  150. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  151. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  152. package/dist/web/hooks/use-files.d.ts +6 -0
  153. package/dist/web/hooks/use-files.js +9 -0
  154. package/dist/web/hooks/use-files.js.map +1 -0
  155. package/dist/{src/web → web}/hooks/use-files.test.js +10 -5
  156. package/dist/web/hooks/use-files.test.js.map +1 -0
  157. package/dist/{src/web → web}/hooks/use-layout.d.ts +2 -2
  158. package/dist/{src/web → web}/hooks/use-layout.js +4 -4
  159. package/dist/web/hooks/use-layout.js.map +1 -0
  160. package/dist/{src/web → web}/hooks/use-layout.test.js +6 -5
  161. package/dist/web/hooks/use-layout.test.js.map +1 -0
  162. package/dist/web/hooks/use-open-external.d.ts +3 -0
  163. package/dist/web/hooks/use-open-external.js +8 -0
  164. package/dist/web/hooks/use-open-external.js.map +1 -0
  165. package/dist/{src/web → web}/hooks/use-open-external.test.js +12 -2
  166. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  167. package/dist/{src/web → web}/hooks/use-request-modal.d.ts +2 -2
  168. package/dist/web/hooks/use-request-modal.js +16 -0
  169. package/dist/web/hooks/use-request-modal.js.map +1 -0
  170. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  171. package/dist/{src/web → web}/hooks/use-send-follow-up-message.js +2 -2
  172. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  173. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  174. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  175. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  176. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  177. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  178. package/dist/{src/web → web}/hooks/use-tool-info.js +4 -4
  179. package/dist/web/hooks/use-tool-info.js.map +1 -0
  180. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  181. package/dist/{src/web → web}/hooks/use-tool-info.test.js +4 -4
  182. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  183. package/dist/{src/web → web}/hooks/use-user.d.ts +1 -1
  184. package/dist/{src/web → web}/hooks/use-user.js +3 -3
  185. package/dist/web/hooks/use-user.js.map +1 -0
  186. package/dist/web/hooks/use-user.test.d.ts +1 -0
  187. package/dist/{src/web → web}/hooks/use-user.test.js +4 -3
  188. package/dist/web/hooks/use-user.test.js.map +1 -0
  189. package/dist/{src/web → web}/hooks/use-widget-state.js +10 -10
  190. package/dist/web/hooks/use-widget-state.js.map +1 -0
  191. package/dist/web/hooks/use-widget-state.test.d.ts +1 -0
  192. package/dist/{src/web → web}/hooks/use-widget-state.test.js +7 -6
  193. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  194. package/dist/web/index.js.map +1 -0
  195. package/dist/{src/web → web}/mount-widget.js +9 -1
  196. package/dist/web/mount-widget.js.map +1 -0
  197. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  198. package/dist/web/plugin/data-llm.test.js.map +1 -0
  199. package/dist/{src/web → web}/plugin/plugin.js +24 -9
  200. package/dist/web/plugin/plugin.js.map +1 -0
  201. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  202. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  203. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  204. package/dist/web/plugin/validate-widget.d.ts +5 -0
  205. package/dist/web/plugin/validate-widget.js +27 -0
  206. package/dist/web/plugin/validate-widget.js.map +1 -0
  207. package/dist/web/plugin/validate-widget.test.d.ts +1 -0
  208. package/dist/web/plugin/validate-widget.test.js +42 -0
  209. package/dist/web/plugin/validate-widget.test.js.map +1 -0
  210. package/dist/{src/web → web}/proxy.js +0 -1
  211. package/dist/web/proxy.js.map +1 -0
  212. package/dist/web/types.d.ts +16 -0
  213. package/dist/web/types.js +2 -0
  214. package/dist/web/types.js.map +1 -0
  215. package/package.json +50 -23
  216. package/tsconfig.base.json +28 -0
  217. package/dist/src/server/devtoolsStaticServer.d.ts +0 -19
  218. package/dist/src/server/devtoolsStaticServer.js +0 -48
  219. package/dist/src/server/devtoolsStaticServer.js.map +0 -1
  220. package/dist/src/server/index.js.map +0 -1
  221. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  222. package/dist/src/server/server.js +0 -82
  223. package/dist/src/server/server.js.map +0 -1
  224. package/dist/src/server/templateHelper.js.map +0 -1
  225. package/dist/src/server/templates/development.hbs +0 -13
  226. package/dist/src/server/widgetsDevServer.js +0 -38
  227. package/dist/src/server/widgetsDevServer.js.map +0 -1
  228. package/dist/src/test/utils.js.map +0 -1
  229. package/dist/src/test/widget.test.js.map +0 -1
  230. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.d.ts +0 -13
  231. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js +0 -33
  232. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js.map +0 -1
  233. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.d.ts +0 -16
  234. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js +0 -115
  235. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js.map +0 -1
  236. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +0 -10
  237. package/dist/src/web/bridges/apps-sdk-bridge.js.map +0 -1
  238. package/dist/src/web/bridges/hooks/use-adaptor.d.ts +0 -2
  239. package/dist/src/web/bridges/hooks/use-adaptor.js +0 -8
  240. package/dist/src/web/bridges/hooks/use-adaptor.js.map +0 -1
  241. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
  242. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
  243. package/dist/src/web/bridges/hooks/use-bridge.d.ts +0 -2
  244. package/dist/src/web/bridges/hooks/use-bridge.js +0 -8
  245. package/dist/src/web/bridges/hooks/use-bridge.js.map +0 -1
  246. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -5
  247. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
  248. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +0 -41
  249. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
  250. package/dist/src/web/bridges/index.d.ts +0 -4
  251. package/dist/src/web/bridges/index.js +0 -5
  252. package/dist/src/web/bridges/index.js.map +0 -1
  253. package/dist/src/web/bridges/mcp-app-bridge.d.ts +0 -38
  254. package/dist/src/web/bridges/mcp-app-bridge.js +0 -162
  255. package/dist/src/web/bridges/mcp-app-bridge.js.map +0 -1
  256. package/dist/src/web/bridges/types.d.ts +0 -57
  257. package/dist/src/web/create-store.js.map +0 -1
  258. package/dist/src/web/create-store.test.js +0 -70
  259. package/dist/src/web/create-store.test.js.map +0 -1
  260. package/dist/src/web/data-llm.js.map +0 -1
  261. package/dist/src/web/data-llm.test.js +0 -76
  262. package/dist/src/web/data-llm.test.js.map +0 -1
  263. package/dist/src/web/generate-helpers.js.map +0 -1
  264. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  265. package/dist/src/web/generate-helpers.test.js.map +0 -1
  266. package/dist/src/web/helpers/state.js.map +0 -1
  267. package/dist/src/web/helpers/state.test.js.map +0 -1
  268. package/dist/src/web/hooks/index.js.map +0 -1
  269. package/dist/src/web/hooks/test/utils.js +0 -40
  270. package/dist/src/web/hooks/test/utils.js.map +0 -1
  271. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  272. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  273. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  274. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  275. package/dist/src/web/hooks/use-display-mode.js +0 -10
  276. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  277. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  278. package/dist/src/web/hooks/use-files.d.ts +0 -10
  279. package/dist/src/web/hooks/use-files.js +0 -7
  280. package/dist/src/web/hooks/use-files.js.map +0 -1
  281. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  282. package/dist/src/web/hooks/use-layout.js.map +0 -1
  283. package/dist/src/web/hooks/use-layout.test.js.map +0 -1
  284. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  285. package/dist/src/web/hooks/use-open-external.js +0 -8
  286. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  287. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  288. package/dist/src/web/hooks/use-openai-global.d.ts +0 -3
  289. package/dist/src/web/hooks/use-openai-global.js +0 -6
  290. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  291. package/dist/src/web/hooks/use-request-modal.js +0 -14
  292. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  293. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  294. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  295. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  296. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  297. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  298. package/dist/src/web/hooks/use-user.js.map +0 -1
  299. package/dist/src/web/hooks/use-user.test.js.map +0 -1
  300. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  301. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  302. package/dist/src/web/index.js.map +0 -1
  303. package/dist/src/web/mount-widget.js.map +0 -1
  304. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  305. package/dist/src/web/plugin/plugin.js.map +0 -1
  306. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  307. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  308. package/dist/src/web/proxy.js.map +0 -1
  309. package/dist/src/web/types.js.map +0 -1
  310. package/dist/vitest.config.d.ts +0 -2
  311. package/dist/vitest.config.js +0 -8
  312. package/dist/vitest.config.js.map +0 -1
  313. /package/dist/{src/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  314. /package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.test.d.ts → server/express.test.d.ts} +0 -0
  315. /package/dist/{src/server → server}/inferUtilityTypes.d.ts +0 -0
  316. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  317. /package/dist/{src/server → server}/templateHelper.js +0 -0
  318. /package/dist/{src/test → test}/utils.d.ts +0 -0
  319. /package/dist/{src/test → test}/utils.js +0 -0
  320. /package/dist/{src/web/create-store.test.d.ts → test/widget.test.d.ts} +0 -0
  321. /package/dist/{src/web/bridges → web/bridges/mcp-app}/types.js +0 -0
  322. /package/dist/{src/web/data-llm.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  323. /package/dist/{src/web → web}/create-store.d.ts +0 -0
  324. /package/dist/{src/web/generate-helpers.test-d.d.ts → web/create-store.test.d.ts} +0 -0
  325. /package/dist/{src/web → web}/data-llm.d.ts +0 -0
  326. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  327. /package/dist/{src/web/generate-helpers.test.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  328. /package/dist/{src/web → web}/generate-helpers.test-d.js +0 -0
  329. /package/dist/{src/web/helpers/state.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  330. /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
  331. /package/dist/{src/web → web}/helpers/state.d.ts +0 -0
  332. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → web/helpers/state.test.d.ts} +0 -0
  333. /package/dist/{src/web → web}/helpers/state.test.js +0 -0
  334. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  335. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  336. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  337. /package/dist/{src/web/hooks/use-files.test.d.ts → web/hooks/use-display-mode.test-d.d.ts} +0 -0
  338. /package/dist/{src/web/hooks/use-layout.test.d.ts → web/hooks/use-display-mode.test.d.ts} +0 -0
  339. /package/dist/{src/web → web}/hooks/use-display-mode.test.js +0 -0
  340. /package/dist/{src/web/hooks/use-open-external.test.d.ts → web/hooks/use-files.test.d.ts} +0 -0
  341. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/hooks/use-layout.test.d.ts} +0 -0
  342. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/hooks/use-open-external.test.d.ts} +0 -0
  343. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-request-modal.test.d.ts} +0 -0
  344. /package/dist/{src/web → web}/hooks/use-request-modal.test.js +0 -0
  345. /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
  346. /package/dist/{src/web/hooks/use-user.test.d.ts → web/hooks/use-set-open-in-app-url.test.d.ts} +0 -0
  347. /package/dist/{src/web → web}/hooks/use-tool-info.d.ts +0 -0
  348. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-tool-info.test-d.d.ts} +0 -0
  349. /package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +0 -0
  350. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-tool-info.test.d.ts} +0 -0
  351. /package/dist/{src/web → web}/hooks/use-widget-state.d.ts +0 -0
  352. /package/dist/{src/web → web}/index.d.ts +0 -0
  353. /package/dist/{src/web → web}/index.js +0 -0
  354. /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
  355. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  356. /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
  357. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  358. /package/dist/{src/web → web}/plugin/transform-data-llm.js +0 -0
  359. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  360. /package/dist/{src/web → web}/proxy.d.ts +0 -0
@@ -1,14 +1,40 @@
1
+ import type { McpUiResourceMeta } from "@modelcontextprotocol/ext-apps";
1
2
  import { McpServer as McpServerBase, type RegisteredTool } from "@modelcontextprotocol/sdk/server/mcp.js";
2
3
  import type { AnySchema, SchemaOutput, ZodRawShapeCompat } from "@modelcontextprotocol/sdk/server/zod-compat.js";
3
4
  import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
4
5
  import type { CallToolResult, Resource, ServerNotification, ServerRequest, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
6
+ import type { RequestHandler } from "express";
5
7
  export type ToolDef<TInput = unknown, TOutput = unknown, TResponseMetadata = unknown> = {
6
8
  input: TInput;
7
9
  output: TOutput;
8
10
  responseMetadata: TResponseMetadata;
9
11
  };
12
+ /**
13
+ * Extended MCP Apps CSP with upcoming fields from ext-apps PR #158
14
+ * and Skybridge-specific fields for OpenAI compatibility
15
+ * @see https://github.com/modelcontextprotocol/ext-apps/pull/158
16
+ */
17
+ type ExtendedMcpUiResourceCsp = McpUiResourceMeta["csp"] & {
18
+ /**
19
+ * Origins that can receive openExternal redirects without safe-link modal (OpenAI-specific)
20
+ * @see https://developers.openai.com/apps-sdk/reference#component-resource-_meta-fields
21
+ */
22
+ redirectDomains?: string[];
23
+ };
24
+ /** Extended MCP Apps resource metadata with upcoming CSP fields */
25
+ type ExtendedMcpUiResourceMeta = Omit<McpUiResourceMeta, "csp"> & {
26
+ csp?: ExtendedMcpUiResourceCsp;
27
+ };
28
+ /** User-provided resource configuration with optional CSP override */
29
+ export type WidgetResourceMeta = {
30
+ ui?: ExtendedMcpUiResourceMeta;
31
+ } & Resource["_meta"];
10
32
  export type WidgetHostType = "apps-sdk" | "mcp-app";
11
- type McpServerOriginalResourceConfig = Omit<Resource, "uri" | "name" | "mimeType">;
33
+ type McpServerOriginalResourceConfig = Omit<Resource, "uri" | "name" | "mimeType" | "_meta"> & {
34
+ _meta?: WidgetResourceMeta;
35
+ /** Restrict host types to a specific subset */
36
+ hosts?: WidgetHostType[];
37
+ };
12
38
  type McpServerOriginalToolConfig = Omit<Parameters<typeof McpServerBase.prototype.registerTool<ZodRawShapeCompat, ZodRawShapeCompat>>[1], "inputSchema" | "outputSchema">;
13
39
  type Simplify<T> = {
14
40
  [K in keyof T]: T[K];
@@ -56,6 +82,11 @@ type ToolHandler<TInput extends ZodRawShapeCompat, TReturn extends {
56
82
  } = CallToolResult> = (args: ShapeOutput<TInput>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => TReturn | Promise<TReturn>;
57
83
  export declare class McpServer<TTools extends Record<string, ToolDef> = Record<never, ToolDef>> extends McpServerBase {
58
84
  readonly $types: McpServerTypes<TTools>;
85
+ private express?;
86
+ private customMiddleware;
87
+ use(...handlers: RequestHandler[]): this;
88
+ use(path: string, ...handlers: RequestHandler[]): this;
89
+ run(): Promise<void>;
59
90
  registerWidget<TName extends string, TInput extends ZodRawShapeCompat, TReturn extends {
60
91
  content: CallToolResult["content"];
61
92
  }>(name: TName, resourceConfig: McpServerOriginalResourceConfig, toolConfig: McpServerOriginalToolConfig & {
@@ -0,0 +1,206 @@
1
+ import crypto from "node:crypto";
2
+ import { readFileSync } from "node:fs";
3
+ import http from "node:http";
4
+ import path from "node:path";
5
+ import { McpServer as McpServerBase, } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { mergeWith, union } from "es-toolkit";
7
+ import { DEFAULT_HMR_PORT } from "./const.js";
8
+ import { createServer } from "./express.js";
9
+ import { templateHelper } from "./templateHelper.js";
10
+ const mergeWithUnion = (target, source) => {
11
+ return mergeWith(target, source, (targetVal, sourceVal) => {
12
+ if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {
13
+ return union(targetVal, sourceVal);
14
+ }
15
+ });
16
+ };
17
+ export class McpServer extends McpServerBase {
18
+ express;
19
+ customMiddleware = [];
20
+ use(pathOrHandler, ...handlers) {
21
+ if (typeof pathOrHandler === "string") {
22
+ this.customMiddleware.push({
23
+ path: pathOrHandler,
24
+ handlers,
25
+ });
26
+ }
27
+ else {
28
+ this.customMiddleware.push({
29
+ handlers: [pathOrHandler, ...handlers],
30
+ });
31
+ }
32
+ return this;
33
+ }
34
+ async run() {
35
+ if (!this.express) {
36
+ this.express = await createServer({
37
+ server: this,
38
+ customMiddleware: this.customMiddleware,
39
+ });
40
+ }
41
+ const express = this.express;
42
+ return new Promise((resolve, reject) => {
43
+ const server = http.createServer(express);
44
+ server.on("error", (error) => {
45
+ console.error("Failed to start server:", error);
46
+ reject(error);
47
+ });
48
+ const port = parseInt(process.env.__PORT ?? "3000", 10);
49
+ server.listen(port, () => {
50
+ resolve();
51
+ });
52
+ });
53
+ }
54
+ registerWidget(name, resourceConfig, toolConfig, toolCallback) {
55
+ const userMeta = resourceConfig._meta;
56
+ const toolMeta = {
57
+ ...toolConfig._meta,
58
+ };
59
+ if (!resourceConfig.hosts || resourceConfig.hosts.includes("apps-sdk")) {
60
+ const widgetConfig = {
61
+ hostType: "apps-sdk",
62
+ uri: `ui://widgets/apps-sdk/${name}.html`,
63
+ mimeType: "text/html+skybridge",
64
+ buildContentMeta: ({ resourceDomains, connectDomains, domain }, overrides) => {
65
+ const userUi = userMeta?.ui;
66
+ const userCsp = userUi?.csp;
67
+ const defaults = {
68
+ "openai/widgetCSP": {
69
+ resource_domains: resourceDomains,
70
+ connect_domains: connectDomains,
71
+ },
72
+ "openai/widgetDomain": domain,
73
+ "openai/widgetDescription": resourceConfig.description,
74
+ };
75
+ const fromUi = {
76
+ "openai/widgetCSP": {
77
+ resource_domains: userCsp?.resourceDomains,
78
+ connect_domains: userCsp?.connectDomains,
79
+ frame_domains: userCsp?.frameDomains,
80
+ redirect_domains: userCsp?.redirectDomains,
81
+ },
82
+ "openai/widgetDomain": userUi?.domain,
83
+ "openai/widgetPrefersBorder": userUi?.prefersBorder,
84
+ };
85
+ const directOpenaiKeys = Object.fromEntries(Object.entries(userMeta ?? {}).filter(([key]) => key.startsWith("openai/")));
86
+ return mergeWithUnion(mergeWithUnion(mergeWithUnion(defaults, fromUi), directOpenaiKeys), { "openai/widgetDomain": overrides.domain });
87
+ },
88
+ };
89
+ this.registerWidgetResource({
90
+ name,
91
+ widgetConfig,
92
+ resourceConfig,
93
+ });
94
+ toolMeta["openai/outputTemplate"] = widgetConfig.uri;
95
+ }
96
+ if (!resourceConfig.hosts || resourceConfig.hosts.includes("mcp-app")) {
97
+ const widgetConfig = {
98
+ hostType: "mcp-app",
99
+ uri: `ui://widgets/ext-apps/${name}.html`,
100
+ mimeType: "text/html;profile=mcp-app",
101
+ buildContentMeta: ({ resourceDomains, connectDomains, domain }, overrides) => {
102
+ const defaults = {
103
+ ui: {
104
+ csp: {
105
+ resourceDomains,
106
+ connectDomains,
107
+ },
108
+ domain,
109
+ },
110
+ };
111
+ return mergeWithUnion(defaults, {
112
+ ui: { ...userMeta?.ui, ...overrides },
113
+ });
114
+ },
115
+ };
116
+ this.registerWidgetResource({
117
+ name,
118
+ widgetConfig,
119
+ resourceConfig,
120
+ });
121
+ // @ts-expect-error - For backwards compatibility with Claude current implementation of the specs
122
+ toolMeta["ui/resourceUri"] = widgetConfig.uri;
123
+ toolMeta.ui = { resourceUri: widgetConfig.uri };
124
+ }
125
+ this.registerTool(name, {
126
+ ...toolConfig,
127
+ _meta: toolMeta,
128
+ }, toolCallback);
129
+ return this;
130
+ }
131
+ registerTool(name, config, cb) {
132
+ super.registerTool(name, config, cb);
133
+ return this;
134
+ }
135
+ registerWidgetResource({ name, widgetConfig, resourceConfig, }) {
136
+ const { hostType, uri: widgetUri, mimeType, buildContentMeta, } = widgetConfig;
137
+ this.registerResource(name, widgetUri, { ...resourceConfig, _meta: resourceConfig._meta }, async (uri, extra) => {
138
+ const isProduction = process.env.NODE_ENV === "production";
139
+ const useForwardedHost = process.env.SKYBRIDGE_USE_FORWARDED_HOST === "true";
140
+ const isClaude = extra?.requestInfo?.headers?.["user-agent"] === "Claude-User";
141
+ const hostFromHeaders = extra?.requestInfo?.headers?.["x-forwarded-host"] ??
142
+ extra?.requestInfo?.headers?.host;
143
+ const useExternalHost = isProduction || useForwardedHost || isClaude;
144
+ const devPort = process.env.__PORT || "3000";
145
+ const serverUrl = useExternalHost
146
+ ? `https://${hostFromHeaders}`
147
+ : `http://localhost:${devPort}`;
148
+ const html = isProduction
149
+ ? templateHelper.renderProduction({
150
+ hostType,
151
+ serverUrl,
152
+ widgetFile: this.lookupDistFileWithIndexFallback(`src/widgets/${name}`),
153
+ styleFile: this.lookupDistFile("style.css"),
154
+ })
155
+ : templateHelper.renderDevelopment({
156
+ hostType,
157
+ serverUrl,
158
+ useLocalNetworkAccess: !useExternalHost,
159
+ widgetName: name,
160
+ });
161
+ const connectDomains = [serverUrl];
162
+ if (!isProduction) {
163
+ const hmrPort = process.env.__SKYBRIDGE_HMR_PORT ?? DEFAULT_HMR_PORT;
164
+ const VITE_HMR_WEBSOCKET_DEFAULT_URL = `ws://localhost:${hmrPort}`;
165
+ connectDomains.push(VITE_HMR_WEBSOCKET_DEFAULT_URL);
166
+ }
167
+ const pathname = extra?.requestInfo?.url?.pathname ?? "";
168
+ const url = `https://${hostFromHeaders}${pathname}`;
169
+ const hash = crypto
170
+ .createHash("sha256")
171
+ .update(url)
172
+ .digest("hex")
173
+ .slice(0, 32);
174
+ const contentMetaOverrides = isClaude
175
+ ? {
176
+ domain: `${hash}.claudemcpcontent.com`,
177
+ }
178
+ : {};
179
+ const contentMeta = buildContentMeta({
180
+ resourceDomains: [serverUrl],
181
+ connectDomains,
182
+ domain: serverUrl,
183
+ baseUriDomains: [serverUrl],
184
+ }, contentMetaOverrides);
185
+ return {
186
+ contents: [
187
+ { uri: uri.href, mimeType, text: html, _meta: contentMeta },
188
+ ],
189
+ };
190
+ });
191
+ }
192
+ lookupDistFile(key) {
193
+ const manifest = this.readManifest();
194
+ return manifest[key]?.file;
195
+ }
196
+ lookupDistFileWithIndexFallback(basePath) {
197
+ const manifest = this.readManifest();
198
+ const flatFileKey = `${basePath}.tsx`;
199
+ const indexFileKey = `${basePath}/index.tsx`;
200
+ return manifest[flatFileKey]?.file ?? manifest[indexFileKey]?.file;
201
+ }
202
+ readManifest() {
203
+ return JSON.parse(readFileSync(path.join(process.cwd(), "dist", "assets", ".vite", "manifest.json"), "utf-8"));
204
+ }
205
+ }
206
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ declare class TemplateHelper {
11
11
  renderDevelopment(data: {
12
12
  hostType: WidgetHostType;
13
13
  serverUrl: string;
14
+ useLocalNetworkAccess: boolean;
14
15
  widgetName: string;
15
16
  }): string;
16
17
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateHelper.js","sourceRoot":"","sources":["../../src/server/templateHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,cAAc;IACV,aAAa,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE9D,YAAY,CAAC,YAAoB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CAAC;QACzE,MAAM,cAAc,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gBAAgB,CAAC,IAKhB;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,iBAAiB,CAAC,IAKjB;QACC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC"}
@@ -0,0 +1,67 @@
1
+ <script type="module">window.skybridge = { hostType: "{{hostType}}", serverUrl: "{{serverUrl}}" };</script>
2
+ <script type="module">
3
+ import { injectIntoGlobalHook } from "{{serverUrl}}/assets/@react-refresh";
4
+ injectIntoGlobalHook(window); window.$RefreshReg$ = () => {};
5
+ window.$RefreshSig$ = () => (type) => type;
6
+ window.__vite_plugin_react_preamble_installed__ = true;
7
+ </script>
8
+ <script type="module" src="{{serverUrl}}/@vite/client"></script>
9
+ {{#if useLocalNetworkAccess}}
10
+ <script type="module">
11
+ // Checks for browser support and shows error if local network access is denied
12
+ (async () => {
13
+ if (!navigator.permissions?.query) {
14
+ return;
15
+ }
16
+
17
+ // Skip for non-http(s) protocols (file://, custom protocols in Electron, etc.)
18
+ const protocol = window.location.protocol;
19
+ const isNonHttpProtocol = protocol !== 'http:' && protocol !== 'https:'
20
+ if (isNonHttpProtocol) {
21
+ return;
22
+ }
23
+
24
+ const host = window.location.hostname;
25
+ const isLoopback = host === 'localhost'
26
+ || /^127\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.test(host)
27
+ || host === '::1';
28
+ if (isLoopback) {
29
+ return;
30
+ }
31
+
32
+ try {
33
+ const status = await navigator.permissions.query({ name: "local-network-access" });
34
+ if (status.state === "denied") {
35
+ const errorDiv = document.createElement("div");
36
+ errorDiv.style.cssText = "background: #fef2f2; border: 2px solid #ef4444; border-radius: 8px; padding: 16px; text-align: center; z-index: 10000; font-family: system-ui, sans-serif;";
37
+
38
+ const errorTitle = document.createElement("div");
39
+ errorTitle.style.cssText = "color: #ef4444; font-size: 18px; font-weight: 600; margin-bottom: 8px;";
40
+ errorTitle.textContent = "Error: Local network access permission is denied.";
41
+
42
+ const errorMessage = document.createElement("div");
43
+ errorMessage.style.cssText = "color: #ef4444; font-size: 14px;";
44
+ errorMessage.textContent = "Local network access is required for your widget to connect to the local dev server. Please enable it in your browser settings. ";
45
+
46
+ const link = document.createElement("a");
47
+ link.href = "https://developer.chrome.com/blog/local-network-access";
48
+ link.target = "_blank";
49
+ link.rel = "noopener noreferrer";
50
+ link.style.cssText = "color: #ef4444; text-decoration: underline;";
51
+ link.textContent = "Learn more";
52
+ errorMessage.appendChild(link);
53
+
54
+ errorDiv.appendChild(errorTitle);
55
+ errorDiv.appendChild(errorMessage);
56
+ document.body.appendChild(errorDiv);
57
+ }
58
+ } catch (e) {
59
+ // Permission API doesn't support local-network-access, ignore silently
60
+ }
61
+ })();
62
+ </script>
63
+ {{/if}}
64
+ <div id="root"></div>
65
+ <script type="module" id="dev-widget-entry">
66
+ import('{{serverUrl}}/src/widgets/{{widgetName}}');
67
+ </script>
@@ -1,5 +1,4 @@
1
- <base href="{{serverUrl}}" />
2
- <script type="module">window.skybridge = { hostType: "{{hostType}}" };</script>
1
+ <script type="module">window.skybridge = { hostType: "{{hostType}}", serverUrl: "{{serverUrl}}" };</script>
3
2
  <div id="root"></div>
4
3
  <script type="module">
5
4
  import('{{serverUrl}}/assets/{{widgetFile}}');
@@ -1,4 +1,4 @@
1
- import { type RequestHandler } from "express";
1
+ import { type Router } from "express";
2
2
  /**
3
3
  * Install Vite dev server
4
4
  * This router MUST be installed at the application root, like so:
@@ -9,4 +9,4 @@ import { type RequestHandler } from "express";
9
9
  * app.use(await widgetsRouter());
10
10
  * }
11
11
  */
12
- export declare const widgetsDevServer: () => Promise<RequestHandler>;
12
+ export declare const widgetsDevServer: () => Promise<Router>;
@@ -0,0 +1,63 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import cors from "cors";
4
+ import express, {} from "express";
5
+ import { detectAvailablePort } from "../cli/detect-port.js";
6
+ import { assetBaseUrlTransformPlugin } from "./asset-base-url-transform-plugin.js";
7
+ import { DEFAULT_HMR_PORT } from "./const.js";
8
+ /**
9
+ * Install Vite dev server
10
+ * This router MUST be installed at the application root, like so:
11
+ *
12
+ * const app = express();
13
+ *
14
+ * if (env.NODE_ENV !== "production") {
15
+ * app.use(await widgetsRouter());
16
+ * }
17
+ */
18
+ export const widgetsDevServer = async () => {
19
+ const router = express.Router();
20
+ const { createServer, searchForWorkspaceRoot, loadConfigFromFile } = await import("vite");
21
+ // Since 0.16.0, the template is a single package that does not rely on workspace.
22
+ // It means that, when starting the server, the working dir is the template root
23
+ // hence we don't need to walk up the tree to find the workspace, which does not exist anymore.
24
+ let webAppRoot = path.join(process.cwd(), "web");
25
+ // fallback to the old behavior for backward compatibility
26
+ const hasWebAppRoot = existsSync(webAppRoot);
27
+ if (!hasWebAppRoot) {
28
+ const workspaceRoot = searchForWorkspaceRoot(process.cwd());
29
+ webAppRoot = path.join(workspaceRoot, "web");
30
+ }
31
+ const configResult = await loadConfigFromFile({ command: "serve", mode: "development" }, path.join(webAppRoot, "vite.config.ts"), webAppRoot);
32
+ const { build, preview, plugins: userPlugins = [], ...devConfig } = configResult?.config || {};
33
+ const hmrPort = await detectAvailablePort(DEFAULT_HMR_PORT, "localhost");
34
+ process.env.__SKYBRIDGE_HMR_PORT = String(hmrPort);
35
+ const vite = await createServer({
36
+ ...devConfig,
37
+ configFile: false, // Keep this to prevent vite from trying to resolve path in the target config file
38
+ appType: "custom",
39
+ server: {
40
+ allowedHosts: true,
41
+ middlewareMode: true,
42
+ hmr: {
43
+ protocol: "ws",
44
+ host: "localhost",
45
+ port: hmrPort,
46
+ },
47
+ },
48
+ root: webAppRoot,
49
+ optimizeDeps: {
50
+ include: ["react", "react-dom/client"],
51
+ },
52
+ plugins: [
53
+ ...userPlugins,
54
+ assetBaseUrlTransformPlugin({
55
+ devServerOrigin: `http://localhost:${process.env.__PORT ?? "3000"}`,
56
+ }),
57
+ ],
58
+ });
59
+ router.use(cors());
60
+ router.use("/", vite.middlewares);
61
+ return router;
62
+ };
63
+ //# sourceMappingURL=widgetsDevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetsDevServer.js","sourceRoot":"","sources":["../../src/server/widgetsDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAO,EAAE,EAAe,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,IAAqB,EAAE;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,GAChE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAEvB,kFAAkF;IAClF,gFAAgF;IAChF,+FAA+F;IAC/F,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;IAEjD,0DAA0D;IAC1D,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5D,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EACzC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EACvC,UAAU,CACX,CAAC;IAEF,MAAM,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EAAE,WAAW,GAAG,EAAE,EACzB,GAAG,SAAS,EACb,GAAG,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;IAE/B,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;QAC9B,GAAG,SAAS;QACZ,UAAU,EAAE,KAAK,EAAE,kFAAkF;QACrG,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE;YACN,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;YACpB,GAAG,EAAE;gBACH,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,OAAO;aACd;SACF;QACD,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE;YACZ,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC;SACvC;QACD,OAAO,EAAE;YACP,GAAG,WAAW;YACd,2BAA2B,CAAC;gBAC1B,eAAe,EAAE,oBAAoB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,EAAE;aACpE,CAAC;SACH;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/test/utils.ts"],"names":[],"mappings":"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"}
@@ -53,6 +53,14 @@ describe("McpServer.registerWidget", () => {
53
53
  uri: "ui://widgets/apps-sdk/my-widget.html",
54
54
  mimeType: "text/html+skybridge",
55
55
  text: expect.stringContaining('<div id="root"></div>'),
56
+ _meta: {
57
+ "openai/widgetCSP": {
58
+ resource_domains: [serverUrl],
59
+ connect_domains: [serverUrl, "ws://localhost:24678"],
60
+ },
61
+ "openai/widgetDomain": serverUrl,
62
+ "openai/widgetDescription": "Test widget",
63
+ },
56
64
  },
57
65
  ],
58
66
  });
@@ -72,8 +80,9 @@ describe("McpServer.registerWidget", () => {
72
80
  const appsSdkResourceCallback = mockRegisterResource.mock
73
81
  .calls[0]?.[3];
74
82
  expect(appsSdkResourceCallback).toBeDefined();
75
- const serverUrl = "https://myapp.com";
76
- const mockExtra = createMockExtra(serverUrl);
83
+ const host = "myapp.com";
84
+ const serverUrl = `https://${host}`;
85
+ const mockExtra = createMockExtra(host);
77
86
  const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), mockExtra);
78
87
  expect(result).toEqual({
79
88
  contents: [
@@ -81,6 +90,14 @@ describe("McpServer.registerWidget", () => {
81
90
  uri: "ui://widgets/apps-sdk/my-widget.html",
82
91
  mimeType: "text/html+skybridge",
83
92
  text: expect.stringContaining('<div id="root"></div>'),
93
+ _meta: {
94
+ "openai/widgetCSP": {
95
+ resource_domains: [serverUrl],
96
+ connect_domains: [serverUrl],
97
+ },
98
+ "openai/widgetDomain": serverUrl,
99
+ "openai/widgetDescription": "Test widget",
100
+ },
84
101
  },
85
102
  ],
86
103
  });
@@ -99,31 +116,45 @@ describe("McpServer.registerWidget", () => {
99
116
  const appsSdkResourceCallback = mockRegisterResource.mock
100
117
  .calls[0]?.[3];
101
118
  expect(appsSdkResourceCallback).toBeDefined();
102
- const serverUrl = "https://myapp.com";
103
- const mockExtra = createMockExtra(serverUrl);
119
+ const host = "myapp.com";
120
+ const serverUrl = `https://${host}`;
121
+ const mockExtra = createMockExtra(host);
104
122
  const result = await appsSdkResourceCallback(new URL("ui://widgets/apps-sdk/folder-widget.html"), mockExtra);
105
123
  // Should resolve to folder-widget.js from the manifest entry "src/widgets/folder-widget/index.tsx"
106
124
  expect(result.contents[0]?.text).toContain(`${serverUrl}/assets/folder-widget.js`);
107
125
  });
108
126
  it("should register resources with correct hostType for both apps-sdk and ext-apps formats", async () => {
109
127
  const mockToolCallback = vi.fn();
110
- const mockRegisterResourceConfig = { description: "Test widget" };
128
+ const mockRegisterResourceConfig = {
129
+ description: "Test widget",
130
+ _meta: { "openai/widgetPrefersBorder": true },
131
+ };
111
132
  const mockToolConfig = { description: "Test tool" };
112
133
  server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
113
134
  expect(mockRegisterResource).toHaveBeenCalledTimes(2);
114
135
  const appsSdkCallback = mockRegisterResource.mock
115
136
  .calls[0]?.[3];
116
137
  const appsSdkResult = await appsSdkCallback(new URL("ui://widgets/apps-sdk/my-widget.html"), createMockExtra("__not_used__"));
138
+ const serverUrl = "http://localhost:3000";
117
139
  expect(appsSdkResult).toEqual({
118
140
  contents: [
119
141
  {
120
142
  uri: "ui://widgets/apps-sdk/my-widget.html",
121
143
  mimeType: "text/html+skybridge",
122
144
  text: expect.stringContaining('<div id="root"></div>'),
145
+ _meta: {
146
+ "openai/widgetCSP": {
147
+ resource_domains: [serverUrl],
148
+ connect_domains: [serverUrl, "ws://localhost:24678"],
149
+ },
150
+ "openai/widgetDomain": serverUrl,
151
+ "openai/widgetDescription": "Test widget",
152
+ "openai/widgetPrefersBorder": true,
153
+ },
123
154
  },
124
155
  ],
125
156
  });
126
- expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk" }');
157
+ expect(appsSdkResult.contents[0]?.text).toContain('window.skybridge = { hostType: "apps-sdk", serverUrl: "http://localhost:3000" };');
127
158
  const extAppsResourceCallback = mockRegisterResource.mock
128
159
  .calls[1]?.[3];
129
160
  expect(extAppsResourceCallback).toBeDefined();
@@ -134,10 +165,97 @@ describe("McpServer.registerWidget", () => {
134
165
  uri: "ui://widgets/ext-apps/my-widget.html",
135
166
  mimeType: "text/html;profile=mcp-app",
136
167
  text: expect.stringContaining('<div id="root"></div>'),
168
+ _meta: {
169
+ ui: {
170
+ csp: {
171
+ resourceDomains: [serverUrl],
172
+ connectDomains: [serverUrl, "ws://localhost:24678"],
173
+ },
174
+ domain: serverUrl,
175
+ },
176
+ },
177
+ },
178
+ ],
179
+ });
180
+ expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app", serverUrl: "http://localhost:3000" };');
181
+ });
182
+ it("should register tool with ui.resourceUri metadata (not deprecated ui/resourceUri)", async () => {
183
+ const mockToolCallback = vi.fn();
184
+ const mockRegisterResourceConfig = { description: "Test widget" };
185
+ const mockToolConfig = { description: "Test tool" };
186
+ server.registerWidget("my-widget", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
187
+ expect(mockRegisterTool).toHaveBeenCalledTimes(1);
188
+ const toolCallArgs = mockRegisterTool.mock.calls[0];
189
+ const toolConfig = toolCallArgs?.[1];
190
+ expect(toolConfig._meta).toHaveProperty("ui");
191
+ expect(toolConfig._meta?.ui).toEqual({
192
+ resourceUri: "ui://widgets/ext-apps/my-widget.html",
193
+ });
194
+ });
195
+ it("should apply meta overrides in correct priority: defaults < ui.* < direct openai/* keys", async () => {
196
+ const mockToolCallback = vi.fn();
197
+ const mockRegisterResourceConfig = {
198
+ description: "Test widget",
199
+ _meta: {
200
+ // ui.csp overrides (middle priority)
201
+ ui: {
202
+ csp: {
203
+ resourceDomains: ["https://from-ui-csp.com"],
204
+ connectDomains: ["https://from-ui-csp.com"],
205
+ },
206
+ domain: "https://from-ui-domain.com",
207
+ prefersBorder: false,
137
208
  },
209
+ // Direct openai/* keys (highest priority) - should override ui.*
210
+ "openai/widgetDomain": "https://direct-override.com",
211
+ "openai/widgetPrefersBorder": true,
212
+ },
213
+ };
214
+ const mockToolConfig = { description: "Test tool" };
215
+ server.registerWidget("override-test", mockRegisterResourceConfig, mockToolConfig, mockToolCallback);
216
+ const appsSdkCallback = mockRegisterResource.mock
217
+ .calls[0]?.[3];
218
+ const serverUrl = "http://localhost:3000";
219
+ const result = await appsSdkCallback(new URL("ui://widgets/apps-sdk/override-test.html"), createMockExtra("__not_used__"));
220
+ const meta = result.contents[0]?._meta;
221
+ // CSP arrays are merged with union - all unique domains from defaults and user config are preserved
222
+ expect(meta["openai/widgetCSP"]).toEqual({
223
+ resource_domains: [serverUrl, "https://from-ui-csp.com"],
224
+ connect_domains: [
225
+ serverUrl,
226
+ "ws://localhost:24678",
227
+ "https://from-ui-csp.com",
138
228
  ],
229
+ frame_domains: undefined,
230
+ redirect_domains: undefined,
139
231
  });
140
- expect(extAppsResult.contents[0]?.text).toContain('window.skybridge = { hostType: "mcp-app" }');
232
+ // Domain should be overridden by direct openai/* key (highest priority)
233
+ expect(meta["openai/widgetDomain"]).toBe("https://direct-override.com");
234
+ // PrefersBorder should be overridden by direct openai/* key (highest priority)
235
+ expect(meta["openai/widgetPrefersBorder"]).toBe(true);
236
+ // Description should be from defaults (toolConfig.description)
237
+ expect(meta["openai/widgetDescription"]).toBe("Test widget");
238
+ });
239
+ it("should register tool with ui.resourceUri metadata only", async () => {
240
+ const mockToolCallback = vi.fn();
241
+ server.registerWidget("my-widget", { description: "Test widget", hosts: ["mcp-app"] }, { description: "Test tool" }, mockToolCallback);
242
+ expect(mockRegisterTool).toHaveBeenCalledTimes(1);
243
+ const toolCallArgs = mockRegisterTool.mock.calls[0];
244
+ const toolConfig = toolCallArgs?.[1];
245
+ expect(toolConfig._meta).toHaveProperty("ui");
246
+ expect(toolConfig._meta?.ui).toEqual({
247
+ resourceUri: "ui://widgets/ext-apps/my-widget.html",
248
+ });
249
+ expect(toolConfig._meta?.["openai/outputTemplate"]).to.be.undefined;
250
+ });
251
+ it("should register tool with uopenai/outputTemplate metadata only", async () => {
252
+ const mockToolCallback = vi.fn();
253
+ server.registerWidget("my-widget", { description: "Test widget", hosts: ["apps-sdk"] }, { description: "Test tool" }, mockToolCallback);
254
+ expect(mockRegisterTool).toHaveBeenCalledTimes(1);
255
+ const toolCallArgs = mockRegisterTool.mock.calls[0];
256
+ const toolConfig = toolCallArgs?.[1];
257
+ expect(toolConfig._meta).not.toHaveProperty("ui");
258
+ expect(toolConfig._meta?.["openai/outputTemplate"]).to.eq("ui://widgets/apps-sdk/my-widget.html");
141
259
  });
142
260
  });
143
261
  //# sourceMappingURL=widget.test.js.map