skybridge 0.0.0-dev.f615683 → 0.0.0-dev.f621de8

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 (371) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +53 -17
  3. package/bin/run.js +5 -0
  4. package/dist/cli/detect-port.d.ts +18 -0
  5. package/dist/cli/detect-port.js +61 -0
  6. package/dist/cli/detect-port.js.map +1 -0
  7. package/dist/cli/header.d.ts +4 -0
  8. package/dist/cli/header.js +6 -0
  9. package/dist/cli/header.js.map +1 -0
  10. package/dist/cli/run-command.d.ts +2 -0
  11. package/dist/cli/run-command.js +43 -0
  12. package/dist/cli/run-command.js.map +1 -0
  13. package/dist/cli/telemetry.d.ts +7 -0
  14. package/dist/cli/telemetry.js +123 -0
  15. package/dist/cli/telemetry.js.map +1 -0
  16. package/dist/cli/types.d.ts +5 -0
  17. package/dist/cli/types.js +2 -0
  18. package/dist/cli/types.js.map +1 -0
  19. package/dist/cli/use-execute-steps.d.ts +11 -0
  20. package/dist/cli/use-execute-steps.js +36 -0
  21. package/dist/cli/use-execute-steps.js.map +1 -0
  22. package/dist/cli/use-nodemon.d.ts +2 -0
  23. package/dist/cli/use-nodemon.js +80 -0
  24. package/dist/cli/use-nodemon.js.map +1 -0
  25. package/dist/cli/use-tunnel.d.ts +8 -0
  26. package/dist/cli/use-tunnel.js +101 -0
  27. package/dist/cli/use-tunnel.js.map +1 -0
  28. package/dist/cli/use-typescript-check.d.ts +8 -0
  29. package/dist/cli/use-typescript-check.js +59 -0
  30. package/dist/cli/use-typescript-check.js.map +1 -0
  31. package/dist/commands/build.d.ts +9 -0
  32. package/dist/commands/build.js +46 -0
  33. package/dist/commands/build.js.map +1 -0
  34. package/dist/commands/dev.d.ts +10 -0
  35. package/dist/commands/dev.js +44 -0
  36. package/dist/commands/dev.js.map +1 -0
  37. package/dist/commands/start.d.ts +9 -0
  38. package/dist/commands/start.js +52 -0
  39. package/dist/commands/start.js.map +1 -0
  40. package/dist/commands/telemetry/disable.d.ts +5 -0
  41. package/dist/commands/telemetry/disable.js +14 -0
  42. package/dist/commands/telemetry/disable.js.map +1 -0
  43. package/dist/commands/telemetry/enable.d.ts +5 -0
  44. package/dist/commands/telemetry/enable.js +14 -0
  45. package/dist/commands/telemetry/enable.js.map +1 -0
  46. package/dist/commands/telemetry/status.d.ts +5 -0
  47. package/dist/commands/telemetry/status.js +14 -0
  48. package/dist/commands/telemetry/status.js.map +1 -0
  49. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  50. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  51. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  52. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  53. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  54. package/dist/server/express.d.ts +15 -0
  55. package/dist/server/express.js +77 -0
  56. package/dist/server/express.js.map +1 -0
  57. package/dist/server/express.test.js +252 -0
  58. package/dist/server/express.test.js.map +1 -0
  59. package/dist/server/index.d.ts +5 -0
  60. package/dist/server/index.js +3 -0
  61. package/dist/server/index.js.map +1 -0
  62. package/dist/{src/server → server}/inferUtilityTypes.d.ts +10 -0
  63. package/dist/server/inferUtilityTypes.js.map +1 -0
  64. package/dist/server/middleware.d.ts +124 -0
  65. package/dist/server/middleware.js +93 -0
  66. package/dist/server/middleware.js.map +1 -0
  67. package/dist/server/middleware.test-d.js +75 -0
  68. package/dist/server/middleware.test-d.js.map +1 -0
  69. package/dist/server/middleware.test.js +490 -0
  70. package/dist/server/middleware.test.js.map +1 -0
  71. package/dist/server/server.d.ts +150 -0
  72. package/dist/server/server.js +288 -0
  73. package/dist/server/server.js.map +1 -0
  74. package/dist/{src/server → server}/templateHelper.d.ts +3 -0
  75. package/dist/{src/server → server}/templateHelper.js +3 -2
  76. package/dist/server/templateHelper.js.map +1 -0
  77. package/dist/server/templates/development.hbs +12 -0
  78. package/dist/{src/server → server}/templates/production.hbs +1 -1
  79. package/dist/{src/server → server}/widgetsDevServer.d.ts +3 -2
  80. package/dist/server/widgetsDevServer.js +57 -0
  81. package/dist/server/widgetsDevServer.js.map +1 -0
  82. package/dist/{src/test → test}/utils.d.ts +53 -7
  83. package/dist/{src/test → test}/utils.js +78 -0
  84. package/dist/test/utils.js.map +1 -0
  85. package/dist/test/widget.test.js +263 -0
  86. package/dist/test/widget.test.js.map +1 -0
  87. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  88. package/dist/web/bridges/apps-sdk/adaptor.js +75 -0
  89. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  90. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  91. package/dist/web/bridges/apps-sdk/bridge.js +46 -0
  92. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  93. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  94. package/dist/web/bridges/apps-sdk/index.js +5 -0
  95. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  96. package/dist/{src/web → web/bridges/apps-sdk}/types.d.ts +37 -49
  97. package/dist/{src/web → web/bridges/apps-sdk}/types.js +0 -1
  98. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  99. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  100. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js +7 -0
  101. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  102. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  103. package/dist/web/bridges/get-adaptor.js +8 -0
  104. package/dist/web/bridges/get-adaptor.js.map +1 -0
  105. package/dist/web/bridges/index.d.ts +5 -0
  106. package/dist/web/bridges/index.js +6 -0
  107. package/dist/web/bridges/index.js.map +1 -0
  108. package/dist/web/bridges/mcp-app/adaptor.d.ts +38 -0
  109. package/dist/web/bridges/mcp-app/adaptor.js +184 -0
  110. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  111. package/dist/web/bridges/mcp-app/bridge.d.ts +26 -0
  112. package/dist/web/bridges/mcp-app/bridge.js +102 -0
  113. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  114. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  115. package/dist/web/bridges/mcp-app/index.js +4 -0
  116. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  117. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  118. package/dist/web/bridges/mcp-app/types.js +2 -0
  119. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  120. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +7 -0
  121. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  122. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  123. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  124. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  125. package/dist/web/bridges/types.d.ts +103 -0
  126. package/dist/web/bridges/types.js +2 -0
  127. package/dist/web/bridges/types.js.map +1 -0
  128. package/dist/web/bridges/use-host-context.d.ts +2 -0
  129. package/dist/web/bridges/use-host-context.js +8 -0
  130. package/dist/web/bridges/use-host-context.js.map +1 -0
  131. package/dist/web/components/modal-provider.d.ts +4 -0
  132. package/dist/web/components/modal-provider.js +45 -0
  133. package/dist/web/components/modal-provider.js.map +1 -0
  134. package/dist/{src/web → web}/create-store.js +6 -7
  135. package/dist/web/create-store.js.map +1 -0
  136. package/dist/web/create-store.test.js +131 -0
  137. package/dist/web/create-store.test.js.map +1 -0
  138. package/dist/{src/web → web}/data-llm.js +9 -5
  139. package/dist/web/data-llm.js.map +1 -0
  140. package/dist/web/data-llm.test.js +142 -0
  141. package/dist/web/data-llm.test.js.map +1 -0
  142. package/dist/{src/web → web}/generate-helpers.d.ts +10 -7
  143. package/dist/{src/web → web}/generate-helpers.js +5 -3
  144. package/dist/web/generate-helpers.js.map +1 -0
  145. package/dist/{src/web → web}/generate-helpers.test-d.js +57 -2
  146. package/dist/web/generate-helpers.test-d.js.map +1 -0
  147. package/dist/web/generate-helpers.test.js.map +1 -0
  148. package/dist/{src/web → web}/helpers/state.js +13 -8
  149. package/dist/web/helpers/state.js.map +1 -0
  150. package/dist/web/helpers/state.test.js.map +1 -0
  151. package/dist/{src/web → web}/hooks/index.d.ts +4 -5
  152. package/dist/{src/web → web}/hooks/index.js +3 -4
  153. package/dist/web/hooks/index.js.map +1 -0
  154. package/dist/web/hooks/test/utils.d.ts +16 -0
  155. package/dist/web/hooks/test/utils.js +64 -0
  156. package/dist/web/hooks/test/utils.js.map +1 -0
  157. package/dist/{src/web → web}/hooks/use-call-tool.d.ts +3 -2
  158. package/dist/{src/web → web}/hooks/use-call-tool.js +12 -4
  159. package/dist/web/hooks/use-call-tool.js.map +1 -0
  160. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  161. package/dist/{src/web → web}/hooks/use-call-tool.test.js +34 -15
  162. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  163. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  164. package/dist/web/hooks/use-display-mode.js +9 -0
  165. package/dist/web/hooks/use-display-mode.js.map +1 -0
  166. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  167. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  168. package/dist/{src/web → web}/hooks/use-display-mode.test.js +1 -0
  169. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  170. package/dist/web/hooks/use-files.d.ts +6 -0
  171. package/dist/web/hooks/use-files.js +9 -0
  172. package/dist/web/hooks/use-files.js.map +1 -0
  173. package/dist/{src/web → web}/hooks/use-files.test.js +10 -5
  174. package/dist/web/hooks/use-files.test.js.map +1 -0
  175. package/dist/web/hooks/use-layout.d.ts +22 -0
  176. package/dist/web/hooks/use-layout.js +23 -0
  177. package/dist/web/hooks/use-layout.js.map +1 -0
  178. package/dist/web/hooks/use-layout.test.js +96 -0
  179. package/dist/web/hooks/use-layout.test.js.map +1 -0
  180. package/dist/web/hooks/use-open-external.d.ts +3 -0
  181. package/dist/web/hooks/use-open-external.js +8 -0
  182. package/dist/web/hooks/use-open-external.js.map +1 -0
  183. package/dist/web/hooks/use-open-external.test.js +65 -0
  184. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  185. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  186. package/dist/web/hooks/use-request-modal.js +16 -0
  187. package/dist/web/hooks/use-request-modal.js.map +1 -0
  188. package/dist/web/hooks/use-request-modal.test.js +61 -0
  189. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  190. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  191. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  192. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  193. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  194. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  195. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  196. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  197. package/dist/{src/web → web}/hooks/use-tool-info.d.ts +13 -2
  198. package/dist/web/hooks/use-tool-info.js +26 -0
  199. package/dist/web/hooks/use-tool-info.js.map +1 -0
  200. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  201. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -4
  202. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  203. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  204. package/dist/web/hooks/use-tool-info.test.js +130 -0
  205. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  206. package/dist/web/hooks/use-user.d.ts +18 -0
  207. package/dist/web/hooks/use-user.js +35 -0
  208. package/dist/web/hooks/use-user.js.map +1 -0
  209. package/dist/web/hooks/use-user.test.d.ts +1 -0
  210. package/dist/web/hooks/use-user.test.js +122 -0
  211. package/dist/web/hooks/use-user.test.js.map +1 -0
  212. package/dist/{src/web → web}/hooks/use-widget-state.js +10 -10
  213. package/dist/web/hooks/use-widget-state.js.map +1 -0
  214. package/dist/web/hooks/use-widget-state.test.d.ts +1 -0
  215. package/dist/{src/web → web}/hooks/use-widget-state.test.js +10 -6
  216. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  217. package/dist/{src/web → web}/index.d.ts +1 -0
  218. package/dist/{src/web → web}/index.js +1 -0
  219. package/dist/web/index.js.map +1 -0
  220. package/dist/{src/web → web}/mount-widget.d.ts +1 -1
  221. package/dist/web/mount-widget.js +27 -0
  222. package/dist/web/mount-widget.js.map +1 -0
  223. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  224. package/dist/web/plugin/data-llm.test.js.map +1 -0
  225. package/dist/web/plugin/plugin.js +54 -0
  226. package/dist/web/plugin/plugin.js.map +1 -0
  227. package/dist/{src/web → web}/plugin/transform-data-llm.js +6 -3
  228. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  229. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  230. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  231. package/dist/web/plugin/validate-widget.d.ts +5 -0
  232. package/dist/web/plugin/validate-widget.js +27 -0
  233. package/dist/web/plugin/validate-widget.js.map +1 -0
  234. package/dist/web/plugin/validate-widget.test.d.ts +1 -0
  235. package/dist/web/plugin/validate-widget.test.js +42 -0
  236. package/dist/web/plugin/validate-widget.test.js.map +1 -0
  237. package/dist/{src/web → web}/proxy.js +5 -1
  238. package/dist/web/proxy.js.map +1 -0
  239. package/dist/web/types.d.ts +16 -0
  240. package/dist/web/types.js +2 -0
  241. package/dist/web/types.js.map +1 -0
  242. package/package.json +68 -42
  243. package/tsconfig.base.json +31 -0
  244. package/dist/src/emulator/assets/index-BjyctK8j.js +0 -133
  245. package/dist/src/emulator/assets/index-BlZAHQDQ.css +0 -1
  246. package/dist/src/emulator/favicon.ico +0 -0
  247. package/dist/src/emulator/index.html +0 -14
  248. package/dist/src/server/emulatorStaticServer.d.ts +0 -15
  249. package/dist/src/server/emulatorStaticServer.js +0 -38
  250. package/dist/src/server/emulatorStaticServer.js.map +0 -1
  251. package/dist/src/server/index.d.ts +0 -1
  252. package/dist/src/server/index.js +0 -2
  253. package/dist/src/server/index.js.map +0 -1
  254. package/dist/src/server/inferUtilityTypes.js.map +0 -1
  255. package/dist/src/server/server.d.ts +0 -56
  256. package/dist/src/server/server.js +0 -62
  257. package/dist/src/server/server.js.map +0 -1
  258. package/dist/src/server/templateHelper.js.map +0 -1
  259. package/dist/src/server/templates/development.hbs +0 -12
  260. package/dist/src/server/widgetsDevServer.js +0 -39
  261. package/dist/src/server/widgetsDevServer.js.map +0 -1
  262. package/dist/src/test/utils.js.map +0 -1
  263. package/dist/src/test/widget.test.js +0 -89
  264. package/dist/src/test/widget.test.js.map +0 -1
  265. package/dist/src/web/create-store.js.map +0 -1
  266. package/dist/src/web/create-store.test.js +0 -70
  267. package/dist/src/web/create-store.test.js.map +0 -1
  268. package/dist/src/web/data-llm.js.map +0 -1
  269. package/dist/src/web/data-llm.test.js +0 -76
  270. package/dist/src/web/data-llm.test.js.map +0 -1
  271. package/dist/src/web/generate-helpers.js.map +0 -1
  272. package/dist/src/web/generate-helpers.test-d.js.map +0 -1
  273. package/dist/src/web/generate-helpers.test.js.map +0 -1
  274. package/dist/src/web/helpers/state.js.map +0 -1
  275. package/dist/src/web/helpers/state.test.js.map +0 -1
  276. package/dist/src/web/hooks/index.js.map +0 -1
  277. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  278. package/dist/src/web/hooks/use-call-tool.test-d.js.map +0 -1
  279. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  280. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  281. package/dist/src/web/hooks/use-display-mode.js +0 -7
  282. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  283. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  284. package/dist/src/web/hooks/use-files.d.ts +0 -10
  285. package/dist/src/web/hooks/use-files.js +0 -7
  286. package/dist/src/web/hooks/use-files.js.map +0 -1
  287. package/dist/src/web/hooks/use-files.test.js.map +0 -1
  288. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  289. package/dist/src/web/hooks/use-locale.js +0 -5
  290. package/dist/src/web/hooks/use-locale.js.map +0 -1
  291. package/dist/src/web/hooks/use-locale.test.js +0 -21
  292. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  293. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  294. package/dist/src/web/hooks/use-open-external.js +0 -6
  295. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  296. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  297. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  298. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  299. package/dist/src/web/hooks/use-openai-global.js +0 -23
  300. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  301. package/dist/src/web/hooks/use-request-modal.d.ts +0 -6
  302. package/dist/src/web/hooks/use-request-modal.js +0 -9
  303. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  304. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  305. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  306. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  307. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  308. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  309. package/dist/src/web/hooks/use-theme.js +0 -5
  310. package/dist/src/web/hooks/use-theme.js.map +0 -1
  311. package/dist/src/web/hooks/use-theme.test.js +0 -26
  312. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  313. package/dist/src/web/hooks/use-tool-info.js +0 -22
  314. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  315. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  316. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  317. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  318. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  319. package/dist/src/web/hooks/use-user-agent.js +0 -5
  320. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  321. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  322. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  323. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  324. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  325. package/dist/src/web/index.js.map +0 -1
  326. package/dist/src/web/mount-widget.js +0 -48
  327. package/dist/src/web/mount-widget.js.map +0 -1
  328. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  329. package/dist/src/web/plugin/plugin.js +0 -33
  330. package/dist/src/web/plugin/plugin.js.map +0 -1
  331. package/dist/src/web/plugin/transform-data-llm.js.map +0 -1
  332. package/dist/src/web/plugin/transform-data-llm.test.js.map +0 -1
  333. package/dist/src/web/proxy.js.map +0 -1
  334. package/dist/src/web/types.js.map +0 -1
  335. package/dist/vitest.config.d.ts +0 -2
  336. package/dist/vitest.config.js +0 -8
  337. package/dist/vitest.config.js.map +0 -1
  338. /package/dist/{src/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  339. /package/dist/{src/web/create-store.test.d.ts → server/express.test.d.ts} +0 -0
  340. /package/dist/{src/server → server}/inferUtilityTypes.js +0 -0
  341. /package/dist/{src/web/data-llm.test.d.ts → server/middleware.test-d.d.ts} +0 -0
  342. /package/dist/{src/web/generate-helpers.test-d.d.ts → server/middleware.test.d.ts} +0 -0
  343. /package/dist/{src/web/generate-helpers.test.d.ts → test/widget.test.d.ts} +0 -0
  344. /package/dist/{src/web/helpers/state.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  345. /package/dist/{src/web → web}/create-store.d.ts +0 -0
  346. /package/dist/{src/web/hooks/use-call-tool.test-d.d.ts → web/create-store.test.d.ts} +0 -0
  347. /package/dist/{src/web → web}/data-llm.d.ts +0 -0
  348. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  349. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  350. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  351. /package/dist/{src/web → web}/generate-helpers.test.js +0 -0
  352. /package/dist/{src/web → web}/helpers/state.d.ts +0 -0
  353. /package/dist/{src/web/hooks/use-files.test.d.ts → web/helpers/state.test.d.ts} +0 -0
  354. /package/dist/{src/web → web}/helpers/state.test.js +0 -0
  355. /package/dist/{src/web/hooks/use-locale.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  356. /package/dist/{src/web → web}/hooks/use-call-tool.test-d.js +0 -0
  357. /package/dist/{src/web/hooks/use-open-external.test.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  358. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/hooks/use-display-mode.test-d.d.ts} +0 -0
  359. /package/dist/{src/web/hooks/use-theme.test.d.ts → web/hooks/use-display-mode.test.d.ts} +0 -0
  360. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/hooks/use-files.test.d.ts} +0 -0
  361. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/hooks/use-layout.test.d.ts} +0 -0
  362. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → web/hooks/use-open-external.test.d.ts} +0 -0
  363. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-request-modal.test.d.ts} +0 -0
  364. /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
  365. /package/dist/{src/web/plugin/transform-data-llm.test.d.ts → web/hooks/use-set-open-in-app-url.test.d.ts} +0 -0
  366. /package/dist/{src/web → web}/hooks/use-widget-state.d.ts +0 -0
  367. /package/dist/{src/web → web}/plugin/data-llm.test.js +0 -0
  368. /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
  369. /package/dist/{src/web → web}/plugin/transform-data-llm.d.ts +0 -0
  370. /package/dist/{src/web → web}/plugin/transform-data-llm.test.js +0 -0
  371. /package/dist/{src/web → web}/proxy.d.ts +0 -0
package/README.md CHANGED
@@ -1,13 +1,19 @@
1
1
  <div align="center">
2
2
 
3
- <img alt="Skybridge" src="docs/static/img/logo.png" width="220">
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="docs/images/Skybridgewhite(1).svg">
5
+ <source media="(prefers-color-scheme: light)" srcset="docs/images/Skybridgemidnight.svg">
6
+ <img alt="Skybridge" src="docs/images/Skybridgemidnight.svg" width="100%">
7
+ </picture>
8
+
9
+ <br />
4
10
 
5
11
  # Skybridge
6
12
 
7
- **Build ChatGPT Apps. The Modern TypeScript Way.**
13
+ **Build ChatGPT & MCP Apps. The Modern TypeScript Way.**
8
14
 
9
- The fullstack TypeScript framework for ChatGPT Apps.<br />
10
- **Type-safe. React-powered. Zero config.**
15
+ The fullstack TypeScript framework for AI-embedded widgets.<br />
16
+ **Type-safe. React-powered. Platform-agnostic.**
11
17
 
12
18
  <br />
13
19
 
@@ -17,7 +23,7 @@ The fullstack TypeScript framework for ChatGPT Apps.<br />
17
23
 
18
24
  <br />
19
25
 
20
- [Documentation](https://skybridge.tech) · [Quick Start](https://github.com/new?template_name=apps-sdk-template&template_owner=alpic-ai) · [Examples](https://github.com/alpic-ai/apps-sdk-template)
26
+ [Documentation](https://docs.skybridge.tech) · [Quick Start](https://docs.skybridge.tech/quickstart/create-new-app) · [Showcase](https://docs.skybridge.tech/showcase)
21
27
 
22
28
  </div>
23
29
 
@@ -25,24 +31,24 @@ The fullstack TypeScript framework for ChatGPT Apps.<br />
25
31
 
26
32
  ## ✨ Why Skybridge?
27
33
 
28
- ChatGPT Apps let you embed **rich, interactive UIs** directly in conversations. But the raw SDK is low-level—no hooks, no type safety, no dev tools, and no HMR.
34
+ 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.
29
35
 
30
36
  **Skybridge fixes that.**
31
37
 
32
38
  | | |
33
39
  |:--|:--|
34
- | 👨‍💻 **Full Dev Environment** — HMR, debug traces, and local emulator. No more refresh loops. | ✅ **End-to-End Type Safety** — tRPC-style inference from server to widget. Autocomplete everywhere. |
40
+ | 🌐 **Write once, run everywhere** — Skybridge works seamlessly with ChatGPT (Apps SDK) and MCP-compatible clients. | ✅ **End-to-End Type Safety** — tRPC-style inference from server to widget. Autocomplete everywhere. |
35
41
  | 🔄 **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. |
42
+ | 👨‍💻 **Full dev environment** — HMR, debug traces, and local devtools. | 📦 **Showcase Examples** — Production-ready examples to learn from and build upon. |
36
43
 
37
44
  <br />
38
45
 
39
46
  ## 🚀 Get Started
40
47
 
41
- **Create a new ChatGPT app:**
48
+ **Create a new app:**
42
49
 
43
50
  ```bash
44
- gh repo create my-app --template alpic-ai/apps-sdk-template --clone
45
- cd my-app && pnpm install
51
+ npm create skybridge@latest
46
52
  ```
47
53
 
48
54
  **Or add to an existing project:**
@@ -57,16 +63,19 @@ deno add skybridge
57
63
 
58
64
  <div align="center">
59
65
 
60
- **👉 [Read the Docs](https://skybridge.tech) 👈**
66
+ **👉 [Read the Docs](https://docs.skybridge.tech) 👈**
61
67
 
62
68
  </div>
63
69
 
64
70
  <br />
65
71
 
66
- ## 📦 The Stack
72
+ ## 📦 Architecture
73
+
74
+ Skybridge is a fullstack framework with unified server and client modules:
67
75
 
68
- - **`skybridge/server`** — Drop-in MCP SDK replacement with widget registration and type inference.
69
- - **`skybridge/web`** — React hooks and components for ChatGPT's runtime.
76
+ - **`skybridge/server`** — Define tools and widgets with full type inference. Extends the MCP SDK.
77
+ - **`skybridge/web`** — React hooks that consume your server types. Works with Apps SDK (ChatGPT) and MCP Apps.
78
+ - **Dev Environment** — Vite plugin with HMR, DevTools emulator, and optimized builds.
70
79
 
71
80
  ### Server
72
81
 
@@ -89,8 +98,8 @@ import { useToolInfo } from "skybridge/web";
89
98
  function FlightsWidget() {
90
99
  const { output } = useToolInfo();
91
100
 
92
- return output.structuredContent.flights.map(f =>
93
- <FlightCard key={f.id} flight={f} />
101
+ return output.structuredContent.flights.map(flight =>
102
+ <FlightCard key={flight.id} flight={flight} />
94
103
  );
95
104
  }
96
105
  ```
@@ -104,10 +113,37 @@ function FlightsWidget() {
104
113
  - **Widget → Tool Calls** — Trigger server actions from UI.
105
114
  - **Dual Surface Sync** — Keep model aware of what users see with `data-llm`.
106
115
  - **React Query-style API** — `isPending`, `isError`, callbacks.
116
+ - **Platform Agnostic** — Works with ChatGPT (Apps SDK) and MCP Apps clients (Goose, VSCode, etc.).
107
117
  - **MCP Compatible** — Extends the official SDK. Works with any MCP client.
108
118
 
109
119
  <br />
110
120
 
121
+ ## 📖 Showcase
122
+
123
+ Explore production-ready examples:
124
+
125
+ | Example | Description | Demo | Code |
126
+ |------------------------|----------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------|
127
+ | **Awaze — Cottage Search** | Holiday cottage search and booking experience — browse properties, filter by location, and explore availability | [Try Demo](https://mcp.cottages.com/try) | — |
128
+ | **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) |
129
+ | **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) |
130
+ | **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) |
131
+ | **Investigation Game** | Interactive murder mystery game with multi-screen gameplay and dynamic story progression | [Try Demo](https://investigation-game.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/investigation-game) |
132
+ | **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) |
133
+ | **Time's Up** | Word-guessing party game where the user gives hints and the AI tries to guess the secret word | [Try Demo](https://times-up.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/times-up) |
134
+ | **Lumo — Interactive AI Tutor** | Adaptive educational tutor with Mermaid.js diagrams, mind maps, quizzes, and fill-in-the-blank exercises | [Try Demo](https://lumo-mcp-app-39519fdd.alpic.live/try) | [View Code](https://github.com/connorads/lumo-mcp-app) |
135
+ | **Auth — Auth0** | Full OAuth authentication with Auth0 and personalized coffee shop search | — | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/auth-auth0) |
136
+ | **Auth — Clerk** | Full OAuth authentication with Clerk and personalized coffee shop search | — | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/auth-clerk) |
137
+ | **Auth — Stytch** | Full OAuth authentication with Stytch and personalized coffee shop search | — | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/auth-stytch) |
138
+ | **Auth — WorkOS AuthKit** | Full OAuth authentication with WorkOS AuthKit and personalized coffee shop search | — | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/auth-workos) |
139
+ | **Flight Booking** | Flight booking carousel with dynamic search and booking flow | [Try Demo](https://flight-booking.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/flight-booking) |
140
+ | **Generative UI** | Dynamic UI generation using json-render and Skybridge | [Try Demo](https://generative-ui.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/generative-ui) |
141
+ | **Manifest Starter** | Starter app with Manifest UI agentic components out-of-the-box | [Try Demo](https://manifest-ui.skybridge.tech/try) | [View Code](https://github.com/alpic-ai/skybridge/tree/main/examples/manifest-ui) |
142
+
143
+ See all examples in the [Showcase](https://docs.skybridge.tech/showcase) or browse the [examples/](examples/) directory.
144
+
145
+ <br />
146
+
111
147
  <div align="center">
112
148
 
113
149
  [![GitHub Discussions](https://img.shields.io/badge/Discussions-Ask%20Questions-blue?style=flat-square&logo=github)](https://github.com/alpic-ai/skybridge/discussions)
@@ -118,6 +154,6 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions
118
154
 
119
155
  <br />
120
156
 
121
- **[GPL-3.0 License](LICENSE)** · Made with ❤️ by **[Alpic](https://alpic.ai)**
157
+ **[MIT License](LICENSE)** · Made with ❤️ by **[Alpic](https://alpic.ai)**
122
158
 
123
159
  </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,18 @@
1
+ export declare function resolvePort(flagPort?: number): Promise<{
2
+ port: number;
3
+ fallback: boolean;
4
+ envWarning?: undefined;
5
+ } | {
6
+ port: number;
7
+ fallback: boolean;
8
+ envWarning: string;
9
+ }>;
10
+ /**
11
+ * Returns the given port if available, otherwise lets the OS
12
+ * pick a free port via `listen(0)`.
13
+ *
14
+ * @param host - Bind address for the check. Pass `"localhost"` for
15
+ * services that bind to 127.0.0.1 (e.g. Vite HMR). Omit for
16
+ * services that bind to all interfaces (e.g. the HTTP server).
17
+ */
18
+ export declare function detectAvailablePort(startPort: number, host?: string): Promise<number>;
@@ -0,0 +1,61 @@
1
+ import net from "node:net";
2
+ const DEFAULT_PORT = 3000;
3
+ export async function resolvePort(flagPort) {
4
+ if (flagPort && flagPort > 1) {
5
+ return { port: flagPort, fallback: false };
6
+ }
7
+ const rawEnv = process.env.PORT;
8
+ if (rawEnv) {
9
+ const parsed = Number(rawEnv);
10
+ if (Number.isInteger(parsed) && parsed > 0) {
11
+ return { port: parsed, fallback: false };
12
+ }
13
+ return {
14
+ port: await detectAvailablePort(DEFAULT_PORT),
15
+ fallback: false,
16
+ envWarning: `Invalid PORT="${rawEnv}", ignoring and using default`,
17
+ };
18
+ }
19
+ const port = await detectAvailablePort(DEFAULT_PORT);
20
+ return { port, fallback: port !== DEFAULT_PORT };
21
+ }
22
+ /**
23
+ * Returns the given port if available, otherwise lets the OS
24
+ * pick a free port via `listen(0)`.
25
+ *
26
+ * @param host - Bind address for the check. Pass `"localhost"` for
27
+ * services that bind to 127.0.0.1 (e.g. Vite HMR). Omit for
28
+ * services that bind to all interfaces (e.g. the HTTP server).
29
+ */
30
+ export async function detectAvailablePort(startPort, host) {
31
+ const available = await isPortAvailable(startPort, host);
32
+ if (available) {
33
+ return startPort;
34
+ }
35
+ return new Promise((resolve, reject) => {
36
+ const server = net.createServer();
37
+ server.once("error", reject);
38
+ server.once("listening", () => {
39
+ const addr = server.address();
40
+ if (addr && typeof addr === "object") {
41
+ const { port } = addr;
42
+ server.close(() => resolve(port));
43
+ }
44
+ else {
45
+ server.close(() => reject(new Error("Failed to detect available port")));
46
+ }
47
+ });
48
+ server.listen(0, host);
49
+ });
50
+ }
51
+ function isPortAvailable(port, host) {
52
+ return new Promise((resolve) => {
53
+ const server = net.createServer();
54
+ server.once("error", () => resolve(false));
55
+ server.once("listening", () => {
56
+ server.close(() => resolve(true));
57
+ });
58
+ server.listen(port, host);
59
+ });
60
+ }
61
+ //# sourceMappingURL=detect-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-port.js","sourceRoot":"","sources":["../../src/cli/detect-port.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAiB;IACjD,IAAI,QAAQ,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO;YACL,IAAI,EAAE,MAAM,mBAAmB,CAAC,YAAY,CAAC;YAC7C,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,iBAAiB,MAAM,+BAA+B;SACnE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;AACnD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,IAAa;IAEb,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAChB,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CACrD,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,IAAa;IAClD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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,5 @@
1
+ export type Message = {
2
+ id: string;
3
+ text: string;
4
+ type: "log" | "restart" | "error";
5
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -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,2 @@
1
+ import type { Message } from "./types.js";
2
+ export declare function useNodemon(env: NodeJS.ProcessEnv): Array<Message>;
@@ -0,0 +1,80 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import nodemonOriginal from "nodemon";
5
+ import { useEffect, useState } from "react";
6
+ const nodemon = nodemonOriginal;
7
+ export function useNodemon(env) {
8
+ const [messages, setMessages] = useState([]);
9
+ useEffect(() => {
10
+ const configFile = resolve(process.cwd(), "nodemon.json");
11
+ const config = existsSync(configFile)
12
+ ? {
13
+ configFile,
14
+ }
15
+ : {
16
+ watch: ["server/src"],
17
+ ext: "ts,json",
18
+ exec: "tsx server/src/index.ts",
19
+ };
20
+ nodemon({ ...config, env, stdout: false });
21
+ const handleStdoutData = (chunk) => {
22
+ const message = chunk.toString().trim();
23
+ if (message) {
24
+ setMessages((prev) => [
25
+ ...prev,
26
+ { id: randomUUID(), text: message, type: "log" },
27
+ ].slice(-10));
28
+ }
29
+ };
30
+ const handleStderrData = (chunk) => {
31
+ const message = chunk.toString().trim();
32
+ if (message) {
33
+ setMessages((prev) => [
34
+ ...prev,
35
+ {
36
+ id: randomUUID(),
37
+ text: message,
38
+ type: "error",
39
+ },
40
+ ].slice(-10));
41
+ }
42
+ };
43
+ const setupStdoutListener = () => {
44
+ if (nodemon.stdout) {
45
+ nodemon.stdout.off("data", handleStdoutData);
46
+ nodemon.stdout.on("data", handleStdoutData);
47
+ }
48
+ };
49
+ const setupStderrListener = () => {
50
+ if (nodemon.stderr) {
51
+ nodemon.stderr.off("data", handleStderrData);
52
+ nodemon.stderr.on("data", handleStderrData);
53
+ }
54
+ };
55
+ nodemon.on("readable", () => {
56
+ setupStdoutListener();
57
+ setupStderrListener();
58
+ });
59
+ nodemon.on("restart", (files) => {
60
+ const restartMessage = `Server restarted due to file changes: ${files.join(", ")}`;
61
+ setMessages((prev) => [
62
+ ...prev,
63
+ { id: randomUUID(), text: restartMessage, type: "restart" },
64
+ ]);
65
+ setupStdoutListener();
66
+ setupStderrListener();
67
+ });
68
+ return () => {
69
+ if (nodemon.stdout) {
70
+ nodemon.stdout.off("data", handleStdoutData);
71
+ }
72
+ if (nodemon.stderr) {
73
+ nodemon.stderr.off("data", handleStderrData);
74
+ }
75
+ nodemon.emit("quit");
76
+ };
77
+ }, [env]);
78
+ return messages;
79
+ }
80
+ //# 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
+ import type { Message } from "./types.js";
2
+ type TunnelState = {
3
+ label: string;
4
+ labelColor: "yellow" | "white" | "red";
5
+ logs: Message[];
6
+ };
7
+ export declare function useTunnel(port: number | null): TunnelState;
8
+ export {};