skybridge 0.0.0-dev.e55cd21 → 0.0.0-dev.e62cd20

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 (333) hide show
  1. package/README.md +144 -0
  2. package/bin/run.js +5 -0
  3. package/dist/cli/header.d.ts +4 -0
  4. package/dist/cli/header.js +6 -0
  5. package/dist/cli/header.js.map +1 -0
  6. package/dist/cli/run-command.d.ts +2 -0
  7. package/dist/cli/run-command.js +43 -0
  8. package/dist/cli/run-command.js.map +1 -0
  9. package/dist/cli/telemetry.d.ts +7 -0
  10. package/dist/cli/telemetry.js +123 -0
  11. package/dist/cli/telemetry.js.map +1 -0
  12. package/dist/cli/use-execute-steps.d.ts +11 -0
  13. package/dist/cli/use-execute-steps.js +36 -0
  14. package/dist/cli/use-execute-steps.js.map +1 -0
  15. package/dist/cli/use-nodemon.d.ts +6 -0
  16. package/dist/cli/use-nodemon.js +61 -0
  17. package/dist/cli/use-nodemon.js.map +1 -0
  18. package/dist/cli/use-typescript-check.d.ts +8 -0
  19. package/dist/cli/use-typescript-check.js +59 -0
  20. package/dist/cli/use-typescript-check.js.map +1 -0
  21. package/dist/commands/build.d.ts +9 -0
  22. package/dist/commands/build.js +46 -0
  23. package/dist/commands/build.js.map +1 -0
  24. package/dist/commands/dev.d.ts +9 -0
  25. package/dist/commands/dev.js +31 -0
  26. package/dist/commands/dev.js.map +1 -0
  27. package/dist/commands/start.d.ts +7 -0
  28. package/dist/commands/start.js +28 -0
  29. package/dist/commands/start.js.map +1 -0
  30. package/dist/commands/telemetry/disable.d.ts +5 -0
  31. package/dist/commands/telemetry/disable.js +14 -0
  32. package/dist/commands/telemetry/disable.js.map +1 -0
  33. package/dist/commands/telemetry/enable.d.ts +5 -0
  34. package/dist/commands/telemetry/enable.js +14 -0
  35. package/dist/commands/telemetry/enable.js.map +1 -0
  36. package/dist/commands/telemetry/status.d.ts +5 -0
  37. package/dist/commands/telemetry/status.js +14 -0
  38. package/dist/commands/telemetry/status.js.map +1 -0
  39. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  40. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  41. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  42. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  43. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  44. package/dist/{src/server → server}/index.d.ts +0 -1
  45. package/dist/{src/server → server}/index.js +0 -1
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/server/inferUtilityTypes.js.map +1 -0
  48. package/dist/{src/server → server}/server.d.ts +26 -1
  49. package/dist/server/server.js +153 -0
  50. package/dist/server/server.js.map +1 -0
  51. package/dist/{src/server → server}/templateHelper.d.ts +1 -0
  52. package/dist/server/templateHelper.js.map +1 -0
  53. package/dist/{src/server → server}/templates/development.hbs +18 -2
  54. package/dist/{src/server → server}/templates/production.hbs +1 -2
  55. package/dist/{src/server → server}/widgetsDevServer.d.ts +2 -2
  56. package/dist/server/widgetsDevServer.js +57 -0
  57. package/dist/server/widgetsDevServer.js.map +1 -0
  58. package/dist/test/utils.js.map +1 -0
  59. package/dist/{src/test → test}/widget.test.js +121 -12
  60. package/dist/test/widget.test.js.map +1 -0
  61. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  62. package/dist/web/bridges/apps-sdk/adaptor.js +64 -0
  63. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  64. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  65. package/dist/{src/web/bridges/apps-sdk-bridge.js → web/bridges/apps-sdk/bridge.js} +2 -2
  66. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  67. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  68. package/dist/web/bridges/apps-sdk/index.js +5 -0
  69. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  70. package/dist/{src/web → web/bridges/apps-sdk}/types.d.ts +22 -56
  71. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  72. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  73. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  74. package/dist/{src/web/bridges/hooks/use-apps-sdk-bridge.js → web/bridges/apps-sdk/use-apps-sdk-context.js} +3 -3
  75. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  76. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  77. package/dist/web/bridges/get-adaptor.js +8 -0
  78. package/dist/web/bridges/get-adaptor.js.map +1 -0
  79. package/dist/web/bridges/index.d.ts +5 -0
  80. package/dist/web/bridges/index.js +6 -0
  81. package/dist/web/bridges/index.js.map +1 -0
  82. package/dist/web/bridges/mcp-app/adaptor.d.ts +36 -0
  83. package/dist/web/bridges/mcp-app/adaptor.js +185 -0
  84. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  85. package/dist/web/bridges/mcp-app/bridge.d.ts +43 -0
  86. package/dist/{src/web/bridges/mcp-app-bridge.js → web/bridges/mcp-app/bridge.js} +109 -16
  87. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  88. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  89. package/dist/web/bridges/mcp-app/index.js +4 -0
  90. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  91. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  92. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  93. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
  94. package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.js → web/bridges/mcp-app/use-mcp-app-context.js} +3 -3
  95. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  96. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +66 -0
  97. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  98. package/dist/web/bridges/types.d.ts +98 -0
  99. package/dist/web/bridges/types.js +2 -0
  100. package/dist/{src/web → web}/bridges/types.js.map +1 -1
  101. package/dist/web/bridges/use-host-context.d.ts +2 -0
  102. package/dist/web/bridges/use-host-context.js +8 -0
  103. package/dist/web/bridges/use-host-context.js.map +1 -0
  104. package/dist/web/components/modal-provider.d.ts +4 -0
  105. package/dist/web/components/modal-provider.js +47 -0
  106. package/dist/web/components/modal-provider.js.map +1 -0
  107. package/dist/{src/web → web}/create-store.js +6 -7
  108. package/dist/web/create-store.js.map +1 -0
  109. package/dist/web/create-store.test.js +126 -0
  110. package/dist/web/create-store.test.js.map +1 -0
  111. package/dist/{src/web → web}/data-llm.js +5 -3
  112. package/dist/web/data-llm.js.map +1 -0
  113. package/dist/web/data-llm.test.js +139 -0
  114. package/dist/web/data-llm.test.js.map +1 -0
  115. package/dist/{src/web → web}/generate-helpers.d.ts +3 -2
  116. package/dist/{src/web → web}/generate-helpers.js +1 -1
  117. package/dist/web/generate-helpers.js.map +1 -0
  118. package/dist/web/generate-helpers.test-d.js.map +1 -0
  119. package/dist/web/generate-helpers.test.js.map +1 -0
  120. package/dist/{src/web → web}/helpers/state.js +13 -8
  121. package/dist/web/helpers/state.js.map +1 -0
  122. package/dist/web/helpers/state.test.js.map +1 -0
  123. package/dist/{src/web → web}/hooks/index.d.ts +1 -1
  124. package/dist/{src/web → web}/hooks/index.js +1 -1
  125. package/dist/web/hooks/index.js.map +1 -0
  126. package/dist/{src/web → web}/hooks/test/utils.d.ts +8 -2
  127. package/dist/web/hooks/test/utils.js +60 -0
  128. package/dist/web/hooks/test/utils.js.map +1 -0
  129. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +2 -1
  130. package/dist/{src/web → web}/hooks/use-call-tool.js +2 -2
  131. package/dist/web/hooks/use-call-tool.js.map +1 -0
  132. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  133. package/dist/{src/web → web}/hooks/use-call-tool.test.js +0 -1
  134. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  135. package/dist/web/hooks/use-display-mode.js +9 -0
  136. package/dist/web/hooks/use-display-mode.js.map +1 -0
  137. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  138. package/dist/web/hooks/use-files.d.ts +6 -0
  139. package/dist/web/hooks/use-files.js +9 -0
  140. package/dist/web/hooks/use-files.js.map +1 -0
  141. package/dist/{src/web → web}/hooks/use-files.test.js +5 -4
  142. package/dist/web/hooks/use-files.test.js.map +1 -0
  143. package/dist/{src/web → web}/hooks/use-layout.d.ts +2 -2
  144. package/dist/{src/web → web}/hooks/use-layout.js +4 -4
  145. package/dist/web/hooks/use-layout.js.map +1 -0
  146. package/dist/{src/web → web}/hooks/use-layout.test.js +6 -5
  147. package/dist/web/hooks/use-layout.test.js.map +1 -0
  148. package/dist/{src/web → web}/hooks/use-open-external.js +2 -2
  149. package/dist/web/hooks/use-open-external.js.map +1 -0
  150. package/dist/{src/web → web}/hooks/use-open-external.test.js +1 -1
  151. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  152. package/dist/{src/web → web}/hooks/use-request-modal.d.ts +2 -2
  153. package/dist/web/hooks/use-request-modal.js +16 -0
  154. package/dist/web/hooks/use-request-modal.js.map +1 -0
  155. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  156. package/dist/{src/web → web}/hooks/use-send-follow-up-message.js +2 -2
  157. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  158. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  159. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  160. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  161. package/dist/web/hooks/use-set-open-in-app-url.test.js +49 -0
  162. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  163. package/dist/{src/web → web}/hooks/use-tool-info.js +4 -4
  164. package/dist/web/hooks/use-tool-info.js.map +1 -0
  165. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  166. package/dist/{src/web → web}/hooks/use-tool-info.test.js +4 -4
  167. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  168. package/dist/{src/web → web}/hooks/use-user.d.ts +1 -1
  169. package/dist/{src/web → web}/hooks/use-user.js +3 -3
  170. package/dist/web/hooks/use-user.js.map +1 -0
  171. package/dist/{src/web → web}/hooks/use-user.test.js +4 -3
  172. package/dist/web/hooks/use-user.test.js.map +1 -0
  173. package/dist/{src/web → web}/hooks/use-widget-state.js +10 -10
  174. package/dist/web/hooks/use-widget-state.js.map +1 -0
  175. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  176. package/dist/web/index.js.map +1 -0
  177. package/dist/{src/web → web}/mount-widget.js +9 -1
  178. package/dist/web/mount-widget.js.map +1 -0
  179. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  180. package/dist/web/plugin/data-llm.test.js.map +1 -0
  181. package/dist/{src/web → web}/plugin/plugin.js +16 -9
  182. package/dist/web/plugin/plugin.js.map +1 -0
  183. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  184. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  185. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  186. package/dist/{src/web → web}/proxy.js +0 -1
  187. package/dist/web/proxy.js.map +1 -0
  188. package/dist/web/types.d.ts +16 -0
  189. package/dist/web/types.js +2 -0
  190. package/dist/web/types.js.map +1 -0
  191. package/package.json +47 -25
  192. package/dist/src/server/devtoolsStaticServer.d.ts +0 -19
  193. package/dist/src/server/devtoolsStaticServer.js +0 -48
  194. package/dist/src/server/devtoolsStaticServer.js.map +0 -1
  195. package/dist/src/server/index.js.map +0 -1
  196. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  197. package/dist/src/server/server.js +0 -82
  198. package/dist/src/server/server.js.map +0 -1
  199. package/dist/src/server/templateHelper.js.map +0 -1
  200. package/dist/src/server/widgetsDevServer.js +0 -38
  201. package/dist/src/server/widgetsDevServer.js.map +0 -1
  202. package/dist/src/test/utils.js.map +0 -1
  203. package/dist/src/test/widget.test.js.map +0 -1
  204. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.d.ts +0 -13
  205. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js +0 -33
  206. package/dist/src/web/bridges/adaptors/apps-sdk-adaptor.js.map +0 -1
  207. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.d.ts +0 -16
  208. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js +0 -115
  209. package/dist/src/web/bridges/adaptors/mcp-app-adaptor.js.map +0 -1
  210. package/dist/src/web/bridges/apps-sdk-bridge.d.ts +0 -10
  211. package/dist/src/web/bridges/apps-sdk-bridge.js.map +0 -1
  212. package/dist/src/web/bridges/hooks/use-adaptor.d.ts +0 -2
  213. package/dist/src/web/bridges/hooks/use-adaptor.js +0 -8
  214. package/dist/src/web/bridges/hooks/use-adaptor.js.map +0 -1
  215. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
  216. package/dist/src/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
  217. package/dist/src/web/bridges/hooks/use-bridge.d.ts +0 -2
  218. package/dist/src/web/bridges/hooks/use-bridge.js +0 -8
  219. package/dist/src/web/bridges/hooks/use-bridge.js.map +0 -1
  220. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -5
  221. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
  222. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js +0 -41
  223. package/dist/src/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
  224. package/dist/src/web/bridges/index.d.ts +0 -4
  225. package/dist/src/web/bridges/index.js +0 -5
  226. package/dist/src/web/bridges/index.js.map +0 -1
  227. package/dist/src/web/bridges/mcp-app-bridge.d.ts +0 -38
  228. package/dist/src/web/bridges/mcp-app-bridge.js.map +0 -1
  229. package/dist/src/web/bridges/types.d.ts +0 -57
  230. package/dist/src/web/create-store.js.map +0 -1
  231. package/dist/src/web/create-store.test.js +0 -70
  232. package/dist/src/web/create-store.test.js.map +0 -1
  233. package/dist/src/web/data-llm.js.map +0 -1
  234. package/dist/src/web/data-llm.test.js +0 -76
  235. package/dist/src/web/data-llm.test.js.map +0 -1
  236. package/dist/src/web/generate-helpers.js.map +0 -1
  237. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  238. package/dist/src/web/generate-helpers.test.js.map +0 -1
  239. package/dist/src/web/helpers/state.js.map +0 -1
  240. package/dist/src/web/helpers/state.test.js.map +0 -1
  241. package/dist/src/web/hooks/index.js.map +0 -1
  242. package/dist/src/web/hooks/test/utils.js +0 -40
  243. package/dist/src/web/hooks/test/utils.js.map +0 -1
  244. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  245. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  246. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  247. package/dist/src/web/hooks/use-display-mode.js +0 -10
  248. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  249. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  250. package/dist/src/web/hooks/use-files.d.ts +0 -10
  251. package/dist/src/web/hooks/use-files.js +0 -7
  252. package/dist/src/web/hooks/use-files.js.map +0 -1
  253. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  254. package/dist/src/web/hooks/use-layout.js.map +0 -1
  255. package/dist/src/web/hooks/use-layout.test.js.map +0 -1
  256. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  257. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  258. package/dist/src/web/hooks/use-openai-global.d.ts +0 -3
  259. package/dist/src/web/hooks/use-openai-global.js +0 -6
  260. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  261. package/dist/src/web/hooks/use-request-modal.js +0 -14
  262. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  263. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  264. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  265. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  266. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  267. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  268. package/dist/src/web/hooks/use-user.js.map +0 -1
  269. package/dist/src/web/hooks/use-user.test.js.map +0 -1
  270. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  271. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  272. package/dist/src/web/index.js.map +0 -1
  273. package/dist/src/web/mount-widget.js.map +0 -1
  274. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  275. package/dist/src/web/plugin/plugin.js.map +0 -1
  276. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  277. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  278. package/dist/src/web/proxy.js.map +0 -1
  279. package/dist/src/web/types.js.map +0 -1
  280. package/dist/vitest.config.d.ts +0 -2
  281. package/dist/vitest.config.js +0 -8
  282. package/dist/vitest.config.js.map +0 -1
  283. /package/dist/{src/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  284. /package/dist/{src/server → server}/inferUtilityTypes.d.ts +0 -0
  285. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  286. /package/dist/{src/server → server}/templateHelper.js +0 -0
  287. /package/dist/{src/test → test}/utils.d.ts +0 -0
  288. /package/dist/{src/test → test}/utils.js +0 -0
  289. /package/dist/{src/web/bridges/hooks/use-mcp-app-bridge.test.d.ts → test/widget.test.d.ts} +0 -0
  290. /package/dist/{src/web/bridges → web/bridges/mcp-app}/types.js +0 -0
  291. /package/dist/{src/web/create-store.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  292. /package/dist/{src/web → web}/create-store.d.ts +0 -0
  293. /package/dist/{src/web/data-llm.test.d.ts → web/create-store.test.d.ts} +0 -0
  294. /package/dist/{src/web → web}/data-llm.d.ts +0 -0
  295. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  296. /package/dist/{src/web → web}/generate-helpers.test-d.d.ts +0 -0
  297. /package/dist/{src/web → web}/generate-helpers.test-d.js +0 -0
  298. /package/dist/{src/web → web}/generate-helpers.test.d.ts +0 -0
  299. /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
  300. /package/dist/{src/web → web}/helpers/state.d.ts +0 -0
  301. /package/dist/{src/web → web}/helpers/state.test.d.ts +0 -0
  302. /package/dist/{src/web → web}/helpers/state.test.js +0 -0
  303. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.d.ts +0 -0
  304. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  305. /package/dist/{src/web → web}/hooks/use-call-tool.test.d.ts +0 -0
  306. /package/dist/{src/web → web}/hooks/use-display-mode.d.ts +0 -0
  307. /package/dist/{src/web → web}/hooks/use-display-mode.test.d.ts +0 -0
  308. /package/dist/{src/web → web}/hooks/use-display-mode.test.js +0 -0
  309. /package/dist/{src/web → web}/hooks/use-files.test.d.ts +0 -0
  310. /package/dist/{src/web → web}/hooks/use-layout.test.d.ts +0 -0
  311. /package/dist/{src/web → web}/hooks/use-open-external.d.ts +0 -0
  312. /package/dist/{src/web → web}/hooks/use-open-external.test.d.ts +0 -0
  313. /package/dist/{src/web → web}/hooks/use-request-modal.test.d.ts +0 -0
  314. /package/dist/{src/web → web}/hooks/use-request-modal.test.js +0 -0
  315. /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
  316. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/hooks/use-set-open-in-app-url.test.d.ts} +0 -0
  317. /package/dist/{src/web → web}/hooks/use-tool-info.d.ts +0 -0
  318. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-tool-info.test-d.d.ts} +0 -0
  319. /package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +0 -0
  320. /package/dist/{src/web/hooks/use-user.test.d.ts → web/hooks/use-tool-info.test.d.ts} +0 -0
  321. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-user.test.d.ts} +0 -0
  322. /package/dist/{src/web → web}/hooks/use-widget-state.d.ts +0 -0
  323. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-widget-state.test.d.ts} +0 -0
  324. /package/dist/{src/web → web}/hooks/use-widget-state.test.js +0 -0
  325. /package/dist/{src/web → web}/index.d.ts +0 -0
  326. /package/dist/{src/web → web}/index.js +0 -0
  327. /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
  328. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  329. /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
  330. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  331. /package/dist/{src/web → web}/plugin/transform-data-llm.js +0 -0
  332. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  333. /package/dist/{src/web → web}/proxy.d.ts +0 -0
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ <div align="center">
2
+
3
+ <img alt="Skybridge" src="https://raw.githubusercontent.com/alpic-ai/skybridge/main/docs/images/github-banner.png" width="100%">
4
+
5
+ <br />
6
+
7
+ # Skybridge
8
+
9
+ **Build ChatGPT & MCP Apps. The Modern TypeScript Way.**
10
+
11
+ The fullstack TypeScript framework for AI-embedded widgets.<br />
12
+ **Type-safe. React-powered. Platform-agnostic.**
13
+
14
+ <br />
15
+
16
+ [![NPM Version](https://img.shields.io/npm/v/skybridge?color=e90060&style=for-the-badge)](https://www.npmjs.com/package/skybridge)
17
+ [![NPM Downloads](https://img.shields.io/npm/dm/skybridge?color=e90060&style=for-the-badge)](https://www.npmjs.com/package/skybridge)
18
+ [![GitHub License](https://img.shields.io/github/license/alpic-ai/skybridge?color=e90060&style=for-the-badge)](https://github.com/alpic-ai/skybridge/blob/main/LICENSE)
19
+
20
+ <br />
21
+
22
+ [Documentation](https://docs.skybridge.tech) · [Quick Start](https://docs.skybridge.tech/quickstart/create-new-app) · [Showcase](https://docs.skybridge.tech/showcase)
23
+
24
+ </div>
25
+
26
+ <br />
27
+
28
+ ## ✨ Why Skybridge?
29
+
30
+ ChatGPT Apps and MCP Apps let you embed **rich, interactive UIs** directly in AI conversations. But the raw SDKs are low-level—no hooks, no type safety, no dev tools, and no HMR.
31
+
32
+ **Skybridge fixes that.**
33
+
34
+ | | |
35
+ |:--|:--|
36
+ | 👨‍💻 **Full Dev Environment** — HMR, debug traces, and local devtools. No more refresh loops. | ✅ **End-to-End Type Safety** — tRPC-style inference from server to widget. Autocomplete everywhere. |
37
+ | 🔄 **Widget-to-Model Sync** — Keep the model aware of UI state with `data-llm`. Dual surfaces, one source of truth. | ⚒️ **React Query-style Hooks** — `isPending`, `isError`, callbacks. State management you already know. |
38
+ | 🌐 **Platform Agnostic** — Write once, run anywhere. Works with ChatGPT (Apps SDK) and MCP-compatible clients. | 📦 **Showcase Examples** — Production-ready examples to learn from and build upon. |
39
+
40
+ <br />
41
+
42
+ ## 🚀 Get Started
43
+
44
+ **Create a new app:**
45
+
46
+ ```bash
47
+ npm create skybridge@latest
48
+ ```
49
+
50
+ **Or add to an existing project:**
51
+
52
+ ```bash
53
+ npm i skybridge
54
+ yarn add skybridge
55
+ pnpm add skybridge
56
+ bun add skybridge
57
+ deno add skybridge
58
+ ```
59
+
60
+ <div align="center">
61
+
62
+ **👉 [Read the Docs](https://docs.skybridge.tech) 👈**
63
+
64
+ </div>
65
+
66
+ <br />
67
+
68
+ ## 📦 Architecture
69
+
70
+ Skybridge is a fullstack framework with unified server and client modules:
71
+
72
+ - **`skybridge/server`** — Define tools and widgets with full type inference. Extends the MCP SDK.
73
+ - **`skybridge/web`** — React hooks that consume your server types. Works with Apps SDK (ChatGPT) and MCP Apps.
74
+ - **Dev Environment** — Vite plugin with HMR, DevTools emulator, and optimized builds.
75
+
76
+ ### Server
77
+
78
+ ```ts
79
+ import { McpServer } from "skybridge/server";
80
+
81
+ server.registerWidget("flights", {}, {
82
+ inputSchema: { destination: z.string() },
83
+ }, async ({ destination }) => {
84
+ const flights = await searchFlights(destination);
85
+ return { structuredContent: { flights } };
86
+ });
87
+ ```
88
+
89
+ ### Widget
90
+
91
+ ```tsx
92
+ import { useToolInfo } from "skybridge/web";
93
+
94
+ function FlightsWidget() {
95
+ const { output } = useToolInfo();
96
+
97
+ return output.structuredContent.flights.map(flight =>
98
+ <FlightCard key={flight.id} flight={flight} />
99
+ );
100
+ }
101
+ ```
102
+
103
+ <br />
104
+
105
+ ## 🎯 Features at a Glance
106
+
107
+ - **Live Reload** — Vite HMR. See changes instantly without reinstalling.
108
+ - **Typed Hooks** — Full autocomplete for tools, inputs, outputs.
109
+ - **Widget → Tool Calls** — Trigger server actions from UI.
110
+ - **Dual Surface Sync** — Keep model aware of what users see with `data-llm`.
111
+ - **React Query-style API** — `isPending`, `isError`, callbacks.
112
+ - **Platform Agnostic** — Works with ChatGPT (Apps SDK) and MCP Apps clients (Goose, VSCode, etc.).
113
+ - **MCP Compatible** — Extends the official SDK. Works with any MCP client.
114
+
115
+ <br />
116
+
117
+ ## 📖 Showcase
118
+
119
+ Explore production-ready examples:
120
+
121
+ | Example | Description | Demo | Code |
122
+ |------------------------|----------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------|
123
+ | **Capitals Explorer** | Interactive world map with geolocation and Wikipedia integration | [Try Demo](https://capitals.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/capitals) |
124
+ | **Ecommerce Carousel** | Product carousel with cart, localization, and modals | [Try Demo](https://ecommerce.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/ecom-carousel) |
125
+ | **Everything** | Comprehensive playground showcasing all hooks and features | [Try Demo](https://everything.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/everything) |
126
+ | **Productivity** | Data visualization dashboard demonstrating Skybridge capabilities for MCP Apps | [Try Demo](https://productivity.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/productivity) |
127
+
128
+ See all examples in the [Showcase](https://docs.skybridge.tech/showcase) or browse the [examples/](examples/) directory.
129
+
130
+ <br />
131
+
132
+ <div align="center">
133
+
134
+ [![GitHub Discussions](https://img.shields.io/badge/Discussions-Ask%20Questions-blue?style=flat-square&logo=github)](https://github.com/alpic-ai/skybridge/discussions)
135
+ [![GitHub Issues](https://img.shields.io/badge/Issues-Report%20Bugs-red?style=flat-square&logo=github)](https://github.com/alpic-ai/skybridge/issues)
136
+ [![Discord](https://img.shields.io/badge/Discord-Chat-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.com/invite/gNAazGueab)
137
+
138
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions
139
+
140
+ <br />
141
+
142
+ **[MIT License](LICENSE)** · Made with ❤️ by **[Alpic](https://alpic.ai)**
143
+
144
+ </div>
package/bin/run.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { execute } from "@oclif/core";
4
+
5
+ await execute({ dir: import.meta.url });
@@ -0,0 +1,4 @@
1
+ export declare const Header: ({ version, children, }: {
2
+ version: string;
3
+ children?: React.ReactNode;
4
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from "ink";
3
+ export const Header = ({ version, children, }) => {
4
+ return (_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\u26F0", " ", "Welcome to Skybridge"] }), _jsxs(Text, { color: "cyan", children: [" v", version] }), children] }));
5
+ };
6
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/cli/header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EACrB,OAAO,EACP,QAAQ,GAIT,EAAE,EAAE;IACH,OAAO,CACL,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,aAClB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,6BACnB,IAAI,4BACD,EACP,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,mBAAI,OAAO,IAAQ,EACpC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { type SpawnOptions } from "node:child_process";
2
+ export declare function runCommand(command: string, options?: SpawnOptions): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import { spawn } from "node:child_process";
2
+ export function runCommand(command, options = {
3
+ stdio: ["ignore", "inherit", "inherit"],
4
+ }) {
5
+ return new Promise((resolve, reject) => {
6
+ const stdoutChunks = [];
7
+ const stderrChunks = [];
8
+ const proc = spawn(command, {
9
+ ...options,
10
+ shell: true,
11
+ });
12
+ if (proc.stdout) {
13
+ proc.stdout.on("data", (chunk) => {
14
+ stdoutChunks.push(chunk);
15
+ });
16
+ }
17
+ if (proc.stderr) {
18
+ proc.stderr.on("data", (chunk) => {
19
+ stderrChunks.push(chunk);
20
+ });
21
+ }
22
+ proc.on("close", (code) => {
23
+ if (code === 0) {
24
+ resolve();
25
+ }
26
+ else {
27
+ const stdoutOutput = Buffer.concat(stdoutChunks).toString();
28
+ const stderrOutput = Buffer.concat(stderrChunks).toString();
29
+ const allOutput = [stdoutOutput, stderrOutput]
30
+ .filter((output) => output.trim())
31
+ .join("\n");
32
+ const errorMessage = allOutput
33
+ ? `Command failed with exit code ${code}\n${allOutput}`
34
+ : `Command failed with exit code ${code}`;
35
+ reject(new Error(errorMessage));
36
+ }
37
+ });
38
+ proc.on("error", (error) => {
39
+ reject(error);
40
+ });
41
+ });
42
+ }
43
+ //# sourceMappingURL=run-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-command.js","sourceRoot":"","sources":["../../src/cli/run-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,UAAwB;IACtB,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;CACxC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE;YAC1B,GAAG,OAAO;YACV,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC/B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC/B,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC5D,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;qBAC3C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;qBACjC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,YAAY,GAAG,SAAS;oBAC5B,CAAC,CAAC,iCAAiC,IAAI,KAAK,SAAS,EAAE;oBACvD,CAAC,CAAC,iCAAiC,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Hook } from "@oclif/core";
2
+ export declare function isEnabled(): boolean;
3
+ export declare function isDebugMode(): boolean;
4
+ export declare function setEnabled(enabled: boolean): void;
5
+ export declare function getMachineId(): string;
6
+ declare const hook: Hook<"finally">;
7
+ export default hook;
@@ -0,0 +1,123 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import ci from "ci-info";
5
+ import { PostHog } from "posthog-node";
6
+ const POSTHOG_API_KEY = "phc_rQdkCYr0DO4NcZBQXZnUwsHAbau9zuNwKIpil9FQP6v";
7
+ const POSTHOG_HOST = "https://us.i.posthog.com";
8
+ const ENV_TELEMETRY_DISABLED = "SKYBRIDGE_TELEMETRY_DISABLED";
9
+ const ENV_TELEMETRY_DEBUG = "SKYBRIDGE_TELEMETRY_DEBUG";
10
+ const ENV_DO_NOT_TRACK = "DO_NOT_TRACK";
11
+ const GLOBAL_CONFIG_DIR = join(homedir(), ".skybridge");
12
+ const GLOBAL_CONFIG_FILE = join(GLOBAL_CONFIG_DIR, "config.json");
13
+ let posthogClient = null;
14
+ function getPostHogClient() {
15
+ if (!posthogClient) {
16
+ posthogClient = new PostHog(POSTHOG_API_KEY, {
17
+ host: POSTHOG_HOST,
18
+ flushAt: 1,
19
+ flushInterval: 0,
20
+ });
21
+ }
22
+ return posthogClient;
23
+ }
24
+ function readJsonFile(filePath) {
25
+ try {
26
+ if (existsSync(filePath)) {
27
+ const content = readFileSync(filePath, "utf-8");
28
+ return JSON.parse(content);
29
+ }
30
+ }
31
+ catch {
32
+ // Ignore errors reading config
33
+ }
34
+ return null;
35
+ }
36
+ function writeJsonFile(filePath, data) {
37
+ try {
38
+ const dir = join(filePath, "..");
39
+ if (!existsSync(dir)) {
40
+ mkdirSync(dir, { recursive: true });
41
+ }
42
+ writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
43
+ }
44
+ catch {
45
+ // Ignore errors writing config
46
+ }
47
+ }
48
+ function getGlobalConfig() {
49
+ const existing = readJsonFile(GLOBAL_CONFIG_FILE);
50
+ if (existing?.machineId && existing?.telemetry !== undefined) {
51
+ return existing;
52
+ }
53
+ const config = {
54
+ machineId: existing?.machineId || crypto.randomUUID(),
55
+ telemetry: {
56
+ enabled: existing?.telemetry?.enabled ?? true,
57
+ },
58
+ };
59
+ writeJsonFile(GLOBAL_CONFIG_FILE, config);
60
+ return config;
61
+ }
62
+ export function isEnabled() {
63
+ if (process.env[ENV_TELEMETRY_DISABLED] === "1" ||
64
+ process.env[ENV_TELEMETRY_DISABLED]?.toLowerCase() === "true") {
65
+ return false;
66
+ }
67
+ if (process.env[ENV_DO_NOT_TRACK] === "1" ||
68
+ process.env[ENV_DO_NOT_TRACK]?.toLowerCase() === "true") {
69
+ return false;
70
+ }
71
+ if (ci.isCI) {
72
+ return true;
73
+ }
74
+ const config = getGlobalConfig();
75
+ return config.telemetry.enabled;
76
+ }
77
+ export function isDebugMode() {
78
+ return (process.env[ENV_TELEMETRY_DEBUG] === "1" ||
79
+ process.env[ENV_TELEMETRY_DEBUG]?.toLowerCase() === "true");
80
+ }
81
+ export function setEnabled(enabled) {
82
+ const config = getGlobalConfig();
83
+ config.telemetry.enabled = enabled;
84
+ writeJsonFile(GLOBAL_CONFIG_FILE, config);
85
+ }
86
+ export function getMachineId() {
87
+ if (ci.isCI) {
88
+ return ci.name ?? "unknown-ci";
89
+ }
90
+ return getGlobalConfig().machineId;
91
+ }
92
+ const hook = async ({ id: command, config: { version }, error, }) => {
93
+ if (!isEnabled()) {
94
+ return;
95
+ }
96
+ const event = {
97
+ version,
98
+ machineId: getMachineId(),
99
+ sessionId: crypto.randomUUID(),
100
+ isCI: ci.isCI,
101
+ nodeVersion: process.version,
102
+ platform: process.platform,
103
+ outcome: error ? "failure" : "success",
104
+ error: error?.message,
105
+ };
106
+ if (isDebugMode()) {
107
+ console.error("[Telemetry Debug] Would send event:", JSON.stringify(event, null, 2));
108
+ return;
109
+ }
110
+ try {
111
+ const client = getPostHogClient();
112
+ client.capture({
113
+ distinctId: event.machineId,
114
+ event: command,
115
+ properties: event,
116
+ });
117
+ }
118
+ catch {
119
+ // Silently ignore telemetry errors - never block CLI operation
120
+ }
121
+ };
122
+ export default hook;
123
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/cli/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface CommandStep {
2
+ label: string;
3
+ command?: string;
4
+ run?: () => void | Promise<void>;
5
+ }
6
+ export declare const useExecuteSteps: (steps: CommandStep[]) => {
7
+ currentStep: number;
8
+ status: "error" | "success" | "running";
9
+ error: string | null;
10
+ execute: () => Promise<void>;
11
+ };
@@ -0,0 +1,36 @@
1
+ import { useCallback, useState } from "react";
2
+ import { runCommand } from "./run-command.js";
3
+ export const useExecuteSteps = (steps) => {
4
+ const [currentStep, setCurrentStep] = useState(0);
5
+ const [status, setStatus] = useState("running");
6
+ const [error, setError] = useState(null);
7
+ const execute = useCallback(async () => {
8
+ try {
9
+ for (let i = 0; i < steps.length; i++) {
10
+ const step = steps[i];
11
+ if (step) {
12
+ setCurrentStep(i);
13
+ if (step.run) {
14
+ await step.run();
15
+ }
16
+ if (step.command) {
17
+ await runCommand(step.command);
18
+ }
19
+ }
20
+ }
21
+ setStatus("success");
22
+ setImmediate(() => {
23
+ process.exit(0);
24
+ });
25
+ }
26
+ catch (err) {
27
+ setStatus("error");
28
+ setError(err instanceof Error ? err.message : String(err));
29
+ setImmediate(() => {
30
+ process.exit(1);
31
+ });
32
+ }
33
+ }, [steps]);
34
+ return { currentStep, status, error, execute };
35
+ };
36
+ //# sourceMappingURL=use-execute-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-execute-steps.js","sourceRoot":"","sources":["../../src/cli/use-execute-steps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQ9C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAoB,EAAE,EAAE;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAClC,SAAS,CACV,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,IAAI,EAAE,CAAC;oBACT,cAAc,CAAC,CAAC,CAAC,CAAC;oBAClB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;wBACb,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;oBACnB,CAAC;oBACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,YAAY,CAAC,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ type Message = {
2
+ text: string;
3
+ type: "log" | "restart" | "error";
4
+ };
5
+ export declare function useNodemon(env: NodeJS.ProcessEnv): Array<Message>;
6
+ export {};
@@ -0,0 +1,61 @@
1
+ import nodemonOriginal, {} from "nodemon";
2
+ import { useEffect, useState } from "react";
3
+ const nodemon = nodemonOriginal;
4
+ export function useNodemon(env) {
5
+ const [messages, setMessages] = useState([]);
6
+ useEffect(() => {
7
+ nodemon({
8
+ env,
9
+ configFile: "nodemon.json",
10
+ stdout: false,
11
+ });
12
+ const handleStdoutData = (chunk) => {
13
+ const message = chunk.toString().trim();
14
+ if (message) {
15
+ setMessages((prev) => [...prev, { text: message, type: "log" }]);
16
+ }
17
+ };
18
+ const handleStderrData = (chunk) => {
19
+ const message = chunk.toString().trim();
20
+ if (message) {
21
+ setMessages((prev) => [...prev, { text: message, type: "error" }]);
22
+ }
23
+ };
24
+ const setupStdoutListener = () => {
25
+ if (nodemon.stdout) {
26
+ nodemon.stdout.off("data", handleStdoutData);
27
+ nodemon.stdout.on("data", handleStdoutData);
28
+ }
29
+ };
30
+ const setupStderrListener = () => {
31
+ if (nodemon.stderr) {
32
+ nodemon.stderr.off("data", handleStderrData);
33
+ nodemon.stderr.on("data", handleStderrData);
34
+ }
35
+ };
36
+ nodemon.on("readable", () => {
37
+ setupStdoutListener();
38
+ setupStderrListener();
39
+ });
40
+ nodemon.on("restart", (files) => {
41
+ const restartMessage = `Server restarted due to file changes: ${files.join(", ")}`;
42
+ setMessages((prev) => [
43
+ ...prev,
44
+ { text: restartMessage, type: "restart" },
45
+ ]);
46
+ setupStdoutListener();
47
+ setupStderrListener();
48
+ });
49
+ return () => {
50
+ if (nodemon.stdout) {
51
+ nodemon.stdout.off("data", handleStdoutData);
52
+ }
53
+ if (nodemon.stderr) {
54
+ nodemon.stderr.off("data", handleStderrData);
55
+ }
56
+ nodemon.emit("quit");
57
+ };
58
+ }, [env]);
59
+ return messages;
60
+ }
61
+ //# sourceMappingURL=use-nodemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-nodemon.js","sourceRoot":"","sources":["../../src/cli/use-nodemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ type TsError = {
2
+ file: string;
3
+ line: number;
4
+ col: number;
5
+ message: string;
6
+ };
7
+ export declare function useTypeScriptCheck(): Array<TsError>;
8
+ export {};
@@ -0,0 +1,59 @@
1
+ import { spawn } from "node:child_process";
2
+ import { isAbsolute, relative } from "node:path";
3
+ import { useEffect, useRef, useState } from "react";
4
+ export function useTypeScriptCheck() {
5
+ const tsProcessRef = useRef(null);
6
+ const [tsErrors, setTsErrors] = useState([]);
7
+ useEffect(() => {
8
+ const tsProcess = spawn("npx", ["tsc", "--noEmit", "--watch", "--pretty", "false"], {
9
+ stdio: ["ignore", "pipe", "pipe"],
10
+ shell: true,
11
+ });
12
+ tsProcessRef.current = tsProcess;
13
+ let outputBuffer = "";
14
+ let currentErrors = [];
15
+ const processOutput = (data) => {
16
+ outputBuffer += data.toString();
17
+ const lines = outputBuffer.split("\n");
18
+ outputBuffer = lines.pop() || ""; // Keep incomplete line in buffer
19
+ for (const line of lines) {
20
+ const trimmed = line.trim();
21
+ // Parse TypeScript error format: file.ts(10,5): error TS2322: message
22
+ // Match pattern: filename(line,col): error code: message
23
+ const errorMatch = trimmed.match(/^(.+?)\((\d+),(\d+)\):\s+error\s+(TS\d+)?\s*:?\s*(.+)$/);
24
+ if (errorMatch) {
25
+ const [, file, lineStr, colStr, , message] = errorMatch;
26
+ if (file && lineStr && colStr && message) {
27
+ let cleanFile = file.trim();
28
+ if (isAbsolute(cleanFile)) {
29
+ cleanFile = relative(process.cwd(), cleanFile);
30
+ }
31
+ currentErrors.push({
32
+ file: cleanFile,
33
+ line: Number.parseInt(lineStr, 10),
34
+ col: Number.parseInt(colStr, 10),
35
+ message: message.trim(),
36
+ });
37
+ }
38
+ }
39
+ if (trimmed.includes("Found") && trimmed.includes("error")) {
40
+ setTsErrors(trimmed.match(/Found 0 error/) ? [] : [...currentErrors]);
41
+ currentErrors = [];
42
+ }
43
+ }
44
+ };
45
+ if (tsProcess.stdout) {
46
+ tsProcess.stdout.on("data", processOutput);
47
+ }
48
+ if (tsProcess.stderr) {
49
+ tsProcess.stderr.on("data", processOutput);
50
+ }
51
+ return () => {
52
+ if (tsProcessRef.current) {
53
+ tsProcessRef.current.kill();
54
+ }
55
+ };
56
+ }, []);
57
+ return tsErrors;
58
+ }
59
+ //# sourceMappingURL=use-typescript-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-typescript-check.js","sourceRoot":"","sources":["../../src/cli/use-typescript-check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ import { type CommandStep } from "../cli/use-execute-steps.js";
3
+ export declare const commandSteps: CommandStep[];
4
+ export default class Build extends Command {
5
+ static description: string;
6
+ static examples: string[];
7
+ static flags: {};
8
+ run(): Promise<void>;
9
+ }
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cpSync, rmSync } from "node:fs";
3
+ import { Command } from "@oclif/core";
4
+ import { Box, render, Text } from "ink";
5
+ import { useEffect } from "react";
6
+ import { Header } from "../cli/header.js";
7
+ import { useExecuteSteps } from "../cli/use-execute-steps.js";
8
+ export const commandSteps = [
9
+ {
10
+ label: "Building widgets",
11
+ command: "vite build -c web/vite.config.ts",
12
+ },
13
+ {
14
+ label: "Compiling server",
15
+ run: () => rmSync("dist", { recursive: true, force: true }),
16
+ command: "tsc -p tsconfig.server.json",
17
+ },
18
+ {
19
+ label: "Copying static assets",
20
+ run: () => cpSync("web/dist", "dist/assets", { recursive: true }),
21
+ },
22
+ ];
23
+ export default class Build extends Command {
24
+ static description = "Build the widgets and MCP server";
25
+ static examples = ["skybridge build"];
26
+ static flags = {};
27
+ async run() {
28
+ const App = () => {
29
+ const { currentStep, status, error, execute } = useExecuteSteps(commandSteps);
30
+ useEffect(() => {
31
+ execute();
32
+ }, [execute]);
33
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Header, { version: this.config.version, children: _jsx(Text, { color: "green", children: " \u2192 building for production\u2026" }) }), commandSteps.map((step, index) => {
34
+ const isCurrent = index === currentStep && status === "running";
35
+ const isCompleted = index < currentStep || status === "success";
36
+ const isError = status === "error" && index === currentStep;
37
+ return (_jsx(Box, { marginBottom: 0, children: _jsxs(Text, { color: isError ? "red" : isCompleted ? "green" : "grey", children: [isError ? "✗" : isCompleted ? "✓" : isCurrent ? "⟳" : "○", " ", step.label] }) }, step.label));
38
+ }), status === "success" && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "green", bold: true, children: "\u2713 Build completed successfully!" }) })), status === "error" && error && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "red", bold: true, children: "\u2717 Build failed" }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: error.split("\n").map((line) => (_jsx(Text, { color: "red", children: line }, line))) })] }))] }));
39
+ };
40
+ render(_jsx(App, {}), {
41
+ exitOnCtrlC: true,
42
+ patchConsole: false,
43
+ });
44
+ }
45
+ }
46
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Dev extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ "use-forwarded-host": import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
8
+ run(): Promise<void>;
9
+ }