skybridge 0.0.0-dev.b25e54f → 0.0.0-dev.b275a76

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 (364) hide show
  1. package/LICENSE +21 -674
  2. package/README.md +101 -142
  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.map +1 -0
  61. package/dist/server/inferUtilityTypes.d.ts +64 -0
  62. package/dist/server/inferUtilityTypes.js +2 -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 +5 -4
  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/test/utils.d.ts +135 -0
  83. package/dist/test/utils.js +242 -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/web/bridges/apps-sdk/types.d.ts +121 -0
  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/web/create-store.d.ts +3 -0
  135. package/dist/web/create-store.js +24 -0
  136. package/dist/web/create-store.js.map +1 -0
  137. package/dist/web/create-store.test.js +131 -0
  138. package/dist/web/create-store.test.js.map +1 -0
  139. package/dist/web/data-llm.d.ts +14 -0
  140. package/dist/{src/web/llm-describe.js → web/data-llm.js} +25 -15
  141. package/dist/web/data-llm.js.map +1 -0
  142. package/dist/web/data-llm.test.js +142 -0
  143. package/dist/web/data-llm.test.js.map +1 -0
  144. package/dist/web/generate-helpers.d.ts +116 -0
  145. package/dist/web/generate-helpers.js +111 -0
  146. package/dist/web/generate-helpers.js.map +1 -0
  147. package/dist/web/generate-helpers.test-d.js +209 -0
  148. package/dist/web/generate-helpers.test-d.js.map +1 -0
  149. package/dist/web/generate-helpers.test.js +17 -0
  150. package/dist/web/generate-helpers.test.js.map +1 -0
  151. package/dist/web/helpers/state.d.ts +7 -0
  152. package/dist/web/helpers/state.js +45 -0
  153. package/dist/web/helpers/state.js.map +1 -0
  154. package/dist/web/helpers/state.test.js +53 -0
  155. package/dist/web/helpers/state.test.js.map +1 -0
  156. package/dist/web/hooks/index.d.ts +11 -0
  157. package/dist/web/hooks/index.js +12 -0
  158. package/dist/web/hooks/index.js.map +1 -0
  159. package/dist/web/hooks/test/utils.d.ts +16 -0
  160. package/dist/web/hooks/test/utils.js +64 -0
  161. package/dist/web/hooks/test/utils.js.map +1 -0
  162. package/dist/web/hooks/use-call-tool.d.ts +101 -0
  163. package/dist/{src/web → web}/hooks/use-call-tool.js +19 -19
  164. package/dist/web/hooks/use-call-tool.js.map +1 -0
  165. package/dist/web/hooks/use-call-tool.test-d.js +104 -0
  166. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -0
  167. package/dist/{src/web → web}/hooks/use-call-tool.test.js +40 -13
  168. package/dist/web/hooks/use-call-tool.test.js.map +1 -0
  169. package/dist/web/hooks/use-display-mode.d.ts +4 -0
  170. package/dist/web/hooks/use-display-mode.js +9 -0
  171. package/dist/web/hooks/use-display-mode.js.map +1 -0
  172. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  173. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  174. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  175. package/dist/web/hooks/use-display-mode.test.d.ts +1 -0
  176. package/dist/{src/web → web}/hooks/use-display-mode.test.js +3 -2
  177. package/dist/web/hooks/use-display-mode.test.js.map +1 -0
  178. package/dist/web/hooks/use-files.d.ts +6 -0
  179. package/dist/web/hooks/use-files.js +9 -0
  180. package/dist/web/hooks/use-files.js.map +1 -0
  181. package/dist/web/hooks/use-files.test.d.ts +1 -0
  182. package/dist/web/hooks/use-files.test.js +34 -0
  183. package/dist/web/hooks/use-files.test.js.map +1 -0
  184. package/dist/web/hooks/use-layout.d.ts +22 -0
  185. package/dist/web/hooks/use-layout.js +23 -0
  186. package/dist/web/hooks/use-layout.js.map +1 -0
  187. package/dist/web/hooks/use-layout.test.d.ts +1 -0
  188. package/dist/web/hooks/use-layout.test.js +96 -0
  189. package/dist/web/hooks/use-layout.test.js.map +1 -0
  190. package/dist/web/hooks/use-open-external.d.ts +3 -0
  191. package/dist/web/hooks/use-open-external.js +8 -0
  192. package/dist/web/hooks/use-open-external.js.map +1 -0
  193. package/dist/web/hooks/use-open-external.test.d.ts +1 -0
  194. package/dist/web/hooks/use-open-external.test.js +65 -0
  195. package/dist/web/hooks/use-open-external.test.js.map +1 -0
  196. package/dist/web/hooks/use-request-modal.d.ts +9 -0
  197. package/dist/web/hooks/use-request-modal.js +16 -0
  198. package/dist/web/hooks/use-request-modal.js.map +1 -0
  199. package/dist/web/hooks/use-request-modal.test.d.ts +1 -0
  200. package/dist/web/hooks/use-request-modal.test.js +61 -0
  201. package/dist/web/hooks/use-request-modal.test.js.map +1 -0
  202. package/dist/web/hooks/use-send-follow-up-message.js +8 -0
  203. package/dist/web/hooks/use-send-follow-up-message.js.map +1 -0
  204. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  205. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  206. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  207. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  208. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  209. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  210. package/dist/web/hooks/use-tool-info.d.ts +36 -0
  211. package/dist/web/hooks/use-tool-info.js +26 -0
  212. package/dist/web/hooks/use-tool-info.js.map +1 -0
  213. package/dist/web/hooks/use-tool-info.test-d.d.ts +1 -0
  214. package/dist/{src/web → web}/hooks/use-tool-info.test-d.js +40 -5
  215. package/dist/web/hooks/use-tool-info.test-d.js.map +1 -0
  216. package/dist/web/hooks/use-tool-info.test.d.ts +1 -0
  217. package/dist/web/hooks/use-tool-info.test.js +130 -0
  218. package/dist/web/hooks/use-tool-info.test.js.map +1 -0
  219. package/dist/web/hooks/use-user.d.ts +18 -0
  220. package/dist/web/hooks/use-user.js +35 -0
  221. package/dist/web/hooks/use-user.js.map +1 -0
  222. package/dist/web/hooks/use-user.test.d.ts +1 -0
  223. package/dist/web/hooks/use-user.test.js +122 -0
  224. package/dist/web/hooks/use-user.test.js.map +1 -0
  225. package/dist/web/hooks/use-widget-state.js +32 -0
  226. package/dist/web/hooks/use-widget-state.js.map +1 -0
  227. package/dist/web/hooks/use-widget-state.test.d.ts +1 -0
  228. package/dist/{src/web → web}/hooks/use-widget-state.test.js +12 -8
  229. package/dist/web/hooks/use-widget-state.test.js.map +1 -0
  230. package/dist/web/index.d.ts +8 -0
  231. package/dist/web/index.js +9 -0
  232. package/dist/web/index.js.map +1 -0
  233. package/dist/web/mount-widget.js +27 -0
  234. package/dist/web/mount-widget.js.map +1 -0
  235. package/dist/web/plugin/data-llm.test.d.ts +1 -0
  236. package/dist/{src/web → web}/plugin/data-llm.test.js +10 -10
  237. package/dist/web/plugin/data-llm.test.js.map +1 -0
  238. package/dist/web/plugin/plugin.js +54 -0
  239. package/dist/web/plugin/plugin.js.map +1 -0
  240. package/dist/{src/web/plugin/data-llm.js → web/plugin/transform-data-llm.js} +28 -28
  241. package/dist/web/plugin/transform-data-llm.js.map +1 -0
  242. package/dist/web/plugin/transform-data-llm.test.d.ts +1 -0
  243. package/dist/web/plugin/transform-data-llm.test.js +81 -0
  244. package/dist/web/plugin/transform-data-llm.test.js.map +1 -0
  245. package/dist/web/plugin/validate-widget.d.ts +5 -0
  246. package/dist/web/plugin/validate-widget.js +27 -0
  247. package/dist/web/plugin/validate-widget.js.map +1 -0
  248. package/dist/web/plugin/validate-widget.test.d.ts +1 -0
  249. package/dist/web/plugin/validate-widget.test.js +42 -0
  250. package/dist/web/plugin/validate-widget.test.js.map +1 -0
  251. package/dist/web/proxy.d.ts +1 -0
  252. package/dist/web/proxy.js +52 -0
  253. package/dist/web/proxy.js.map +1 -0
  254. package/dist/web/types.d.ts +16 -0
  255. package/dist/web/types.js +2 -0
  256. package/dist/web/types.js.map +1 -0
  257. package/package.json +70 -37
  258. package/tsconfig.base.json +31 -0
  259. package/dist/src/server/index.d.ts +0 -2
  260. package/dist/src/server/index.js.map +0 -1
  261. package/dist/src/server/server.d.ts +0 -13
  262. package/dist/src/server/server.js +0 -57
  263. package/dist/src/server/server.js.map +0 -1
  264. package/dist/src/server/templateHelper.js.map +0 -1
  265. package/dist/src/server/templates/development.hbs +0 -12
  266. package/dist/src/server/widgetsDevServer.js +0 -39
  267. package/dist/src/server/widgetsDevServer.js.map +0 -1
  268. package/dist/src/test/utils.d.ts +0 -28
  269. package/dist/src/test/utils.js +0 -43
  270. package/dist/src/test/utils.js.map +0 -1
  271. package/dist/src/test/widget.test.js +0 -90
  272. package/dist/src/test/widget.test.js.map +0 -1
  273. package/dist/src/web/hooks/index.d.ts +0 -13
  274. package/dist/src/web/hooks/index.js +0 -14
  275. package/dist/src/web/hooks/index.js.map +0 -1
  276. package/dist/src/web/hooks/use-call-tool.d.ts +0 -62
  277. package/dist/src/web/hooks/use-call-tool.js.map +0 -1
  278. package/dist/src/web/hooks/use-call-tool.test.js.map +0 -1
  279. package/dist/src/web/hooks/use-display-mode.d.ts +0 -4
  280. package/dist/src/web/hooks/use-display-mode.js +0 -7
  281. package/dist/src/web/hooks/use-display-mode.js.map +0 -1
  282. package/dist/src/web/hooks/use-display-mode.test.js.map +0 -1
  283. package/dist/src/web/hooks/use-locale.d.ts +0 -1
  284. package/dist/src/web/hooks/use-locale.js +0 -5
  285. package/dist/src/web/hooks/use-locale.js.map +0 -1
  286. package/dist/src/web/hooks/use-locale.test.js +0 -21
  287. package/dist/src/web/hooks/use-locale.test.js.map +0 -1
  288. package/dist/src/web/hooks/use-open-external.d.ts +0 -1
  289. package/dist/src/web/hooks/use-open-external.js +0 -6
  290. package/dist/src/web/hooks/use-open-external.js.map +0 -1
  291. package/dist/src/web/hooks/use-open-external.test.js +0 -24
  292. package/dist/src/web/hooks/use-open-external.test.js.map +0 -1
  293. package/dist/src/web/hooks/use-openai-global.d.ts +0 -2
  294. package/dist/src/web/hooks/use-openai-global.js +0 -23
  295. package/dist/src/web/hooks/use-openai-global.js.map +0 -1
  296. package/dist/src/web/hooks/use-request-modal.d.ts +0 -5
  297. package/dist/src/web/hooks/use-request-modal.js +0 -9
  298. package/dist/src/web/hooks/use-request-modal.js.map +0 -1
  299. package/dist/src/web/hooks/use-request-modal.test.js +0 -24
  300. package/dist/src/web/hooks/use-request-modal.test.js.map +0 -1
  301. package/dist/src/web/hooks/use-send-follow-up-message.js +0 -11
  302. package/dist/src/web/hooks/use-send-follow-up-message.js.map +0 -1
  303. package/dist/src/web/hooks/use-theme.d.ts +0 -1
  304. package/dist/src/web/hooks/use-theme.js +0 -5
  305. package/dist/src/web/hooks/use-theme.js.map +0 -1
  306. package/dist/src/web/hooks/use-theme.test.js +0 -26
  307. package/dist/src/web/hooks/use-theme.test.js.map +0 -1
  308. package/dist/src/web/hooks/use-tool-info.d.ts +0 -25
  309. package/dist/src/web/hooks/use-tool-info.js +0 -22
  310. package/dist/src/web/hooks/use-tool-info.js.map +0 -1
  311. package/dist/src/web/hooks/use-tool-info.test-d.js.map +0 -1
  312. package/dist/src/web/hooks/use-tool-info.test.js +0 -59
  313. package/dist/src/web/hooks/use-tool-info.test.js.map +0 -1
  314. package/dist/src/web/hooks/use-tool-output.d.ts +0 -4
  315. package/dist/src/web/hooks/use-tool-output.js +0 -9
  316. package/dist/src/web/hooks/use-tool-output.js.map +0 -1
  317. package/dist/src/web/hooks/use-tool-response-metadata.d.ts +0 -4
  318. package/dist/src/web/hooks/use-tool-response-metadata.js +0 -8
  319. package/dist/src/web/hooks/use-tool-response-metadata.js.map +0 -1
  320. package/dist/src/web/hooks/use-user-agent.d.ts +0 -1
  321. package/dist/src/web/hooks/use-user-agent.js +0 -5
  322. package/dist/src/web/hooks/use-user-agent.js.map +0 -1
  323. package/dist/src/web/hooks/use-user-agent.test.js +0 -31
  324. package/dist/src/web/hooks/use-user-agent.test.js.map +0 -1
  325. package/dist/src/web/hooks/use-widget-state.js +0 -54
  326. package/dist/src/web/hooks/use-widget-state.js.map +0 -1
  327. package/dist/src/web/hooks/use-widget-state.test.js.map +0 -1
  328. package/dist/src/web/index.d.ts +0 -5
  329. package/dist/src/web/index.js +0 -6
  330. package/dist/src/web/index.js.map +0 -1
  331. package/dist/src/web/llm-describe.d.ts +0 -13
  332. package/dist/src/web/llm-describe.js.map +0 -1
  333. package/dist/src/web/llm-describe.test.js +0 -76
  334. package/dist/src/web/llm-describe.test.js.map +0 -1
  335. package/dist/src/web/mount-widget.js +0 -14
  336. package/dist/src/web/mount-widget.js.map +0 -1
  337. package/dist/src/web/plugin/data-llm.js.map +0 -1
  338. package/dist/src/web/plugin/data-llm.test.js.map +0 -1
  339. package/dist/src/web/plugin/plugin.js +0 -33
  340. package/dist/src/web/plugin/plugin.js.map +0 -1
  341. package/dist/src/web/types.d.ts +0 -117
  342. package/dist/src/web/types.js.map +0 -1
  343. package/dist/vitest.config.d.ts +0 -2
  344. package/dist/vitest.config.js +0 -8
  345. package/dist/vitest.config.js.map +0 -1
  346. /package/dist/{src/test/widget.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
  347. /package/dist/{src/web/hooks/use-call-tool.test.d.ts → server/express.test.d.ts} +0 -0
  348. /package/dist/{src/server → server}/index.js +0 -0
  349. /package/dist/{src/web/hooks/use-display-mode.test.d.ts → server/middleware.test-d.d.ts} +0 -0
  350. /package/dist/{src/web/hooks/use-locale.test.d.ts → server/middleware.test.d.ts} +0 -0
  351. /package/dist/{src/web/hooks/use-open-external.test.d.ts → test/widget.test.d.ts} +0 -0
  352. /package/dist/{src/web/hooks/use-request-modal.test.d.ts → web/bridges/mcp-app/use-mcp-app-context.test.d.ts} +0 -0
  353. /package/dist/{src/web/hooks/use-theme.test.d.ts → web/create-store.test.d.ts} +0 -0
  354. /package/dist/{src/web/plugin → web}/data-llm.test.d.ts +0 -0
  355. /package/dist/{src/web/hooks/use-tool-info.test-d.d.ts → web/generate-helpers.test-d.d.ts} +0 -0
  356. /package/dist/{src/web/hooks/use-tool-info.test.d.ts → web/generate-helpers.test.d.ts} +0 -0
  357. /package/dist/{src/web/hooks/use-user-agent.test.d.ts → web/helpers/state.test.d.ts} +0 -0
  358. /package/dist/{src/web/hooks/use-widget-state.test.d.ts → web/hooks/use-call-tool.test-d.d.ts} +0 -0
  359. /package/dist/{src/web/llm-describe.test.d.ts → web/hooks/use-call-tool.test.d.ts} +0 -0
  360. /package/dist/{src/web → web}/hooks/use-send-follow-up-message.d.ts +0 -0
  361. /package/dist/{src/web → web}/hooks/use-widget-state.d.ts +0 -0
  362. /package/dist/{src/web → web}/mount-widget.d.ts +0 -0
  363. /package/dist/{src/web → web}/plugin/plugin.d.ts +0 -0
  364. /package/dist/{src/web/plugin/data-llm.d.ts → web/plugin/transform-data-llm.d.ts} +0 -0
package/README.md CHANGED
@@ -1,198 +1,157 @@
1
1
  <div align="center">
2
2
 
3
- # Skybridge
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>
4
8
 
5
- **Skybridge is the TypeScript framework for building ChatGPT apps**
9
+ <br />
6
10
 
7
- [![By Alpic](https://img.shields.io/badge/Made%20by%20Alpic-f6ffed?logo=alpic)](https://alpic.ai)
11
+ **Build ChatGPT & MCP Apps. The Modern TypeScript Way.**
8
12
 
9
- ![NPM Downloads](https://img.shields.io/npm/dm/skybridge?color=e90060)
10
- ![NPM Version](https://img.shields.io/npm/v/skybridge?color=e90060)
11
- ![GitHub License](https://img.shields.io/github/license/alpic-ai/skybridge?color=e90060)
13
+ The fullstack TypeScript framework for AI-embedded widgets.<br />
14
+ **Type-safe. React-powered. Platform-agnostic.**
12
15
 
13
- </div>
16
+ <br />
14
17
 
15
- Skybridge comes with 2 packages:
18
+ [![NPM Version](https://img.shields.io/npm/v/skybridge?color=e90060&style=for-the-badge)](https://www.npmjs.com/package/skybridge)
19
+ [![NPM Downloads](https://img.shields.io/npm/dm/skybridge?color=e90060&style=for-the-badge)](https://www.npmjs.com/package/skybridge)
20
+ [![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)
16
21
 
17
- - `skybridge/server`: A drop-in replacement of the `@modelcontextprotocol/sdk` official `McpServer` class with extra features for widget development.
18
- - `skybridge/web`: A react library with hooks and components to build widgets on the underlying _OpenAI iFrame skybridge_ runtime.
22
+ <br />
19
23
 
20
- ## Quick start
24
+ [Documentation](https://docs.skybridge.tech) · [Quick Start](https://docs.skybridge.tech/quickstart/create-new-app) · [Showcase](https://docs.skybridge.tech/showcase)
21
25
 
22
- To get started in less than a minute, you can [create a new repository](https://github.com/new?template_name=apps-sdk-template&template_owner=alpic-ai) using our [ChatGPT SDK template](https://github.com/alpic-ai/apps-sdk-template). This template includes a basic setup for both the server and the widgets.
26
+ </div>
23
27
 
24
- ## Installation
28
+ <br />
25
29
 
26
- ```bash
27
- pnpm add skybridge
28
- ```
30
+ ## ✨ Why Skybridge?
29
31
 
30
- ## Concepts
32
+ 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
33
 
32
- ### Widgets
34
+ **Skybridge fixes that.**
33
35
 
34
- > A widget is a UI component that turns structured tool results into a human-friendly UI. Those are built using React components. They are rendered inside an iframe inline with the conversation on ChatGPT.
36
+ | | |
37
+ |:--|:--|
38
+ | 🌐 **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. |
39
+ | 🔄 **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. |
40
+ | 👨‍💻 **Full dev environment** — HMR, debug traces, and local devtools. | 📦 **Showcase Examples** — Production-ready examples to learn from and build upon. |
35
41
 
36
- Each widget in your app must have a unique name. The name is used to bridge the tool invocation result with the widget React component.
42
+ <br />
37
43
 
38
- For example, in order to register a new widget named `pokemon` on your ChatGPT app. You should have the following file structure and file contents:
44
+ ## 🚀 Get Started
39
45
 
40
- _Project structure_
46
+ **Create a new app:**
41
47
 
48
+ ```bash
49
+ npm create skybridge@latest
42
50
  ```
43
- server/
44
- └── src/
45
- └── index.ts // Register the widget with McpServer.widget()
46
- web/
47
- └── src/
48
- └── widgets/
49
- └── pokemon.tsx // Use the same widget name as the file name
50
- ```
51
-
52
- _server/src/index.ts_
53
-
54
- ```ts
55
- import { McpServer } from "skybridge/server";
56
51
 
57
- const server = new McpServer();
52
+ **Or add to an existing project:**
58
53
 
59
- server.widget(
60
- "pokemon"
61
- // Remaining arguments...
62
- );
54
+ ```bash
55
+ npm i skybridge
56
+ yarn add skybridge
57
+ pnpm add skybridge
58
+ bun add skybridge
59
+ deno add skybridge
63
60
  ```
64
61
 
65
- _web/src/widgets/pokemon.tsx_
66
-
67
- ```ts
68
- import { mountWidget } from "skybridge/web";
69
-
70
- const Pokemon: React.FunctionComponent = () => {
71
- // Your React component code goes here...
72
- };
73
-
74
- mountWidget(<Pokemon />);
75
- ```
62
+ <div align="center">
76
63
 
77
- ## Packages
64
+ **👉 [Read the Docs](https://docs.skybridge.tech) 👈**
78
65
 
79
- ### skybridge/server
66
+ </div>
80
67
 
81
- The `skybridge/server` package is a drop-in replacement of the `@modelcontextprotocol/sdk` official `McpServer` class with extra features for widget development. If you're already using the `@modelcontextprotocol/sdk`, you can simply replace your `McpServer` import with `skybridge/server` and you're good to go.
68
+ <br />
82
69
 
83
- ### skybridge/web
70
+ ## 📦 Architecture
84
71
 
85
- The `skybridge/web` package is a react library with hooks and components to build widgets on the underlying _OpenAI iFrame skybridge_ runtime.
72
+ Skybridge is a fullstack framework with unified server and client modules:
86
73
 
87
- **Vite plugin**
74
+ - **`skybridge/server`** — Define tools and widgets with full type inference. Extends the MCP SDK.
75
+ - **`skybridge/web`** — React hooks that consume your server types. Works with Apps SDK (ChatGPT) and MCP Apps.
76
+ - **Dev Environment** — Vite plugin with HMR, DevTools emulator, and optimized builds.
88
77
 
89
- The `skybridge/web` package comes with a Vite plugin that allows you to build your widgets as regular Vite apps.
78
+ ### Server
90
79
 
91
80
  ```ts
92
- import { defineConfig } from "vite";
93
- import { skybridge } from "skybridge/web";
81
+ import { McpServer } from "skybridge/server";
94
82
 
95
- export default defineConfig({
96
- plugins: [skybridge()],
83
+ server.registerWidget("flights", {}, {
84
+ inputSchema: { destination: z.string() },
85
+ }, async ({ destination }) => {
86
+ const flights = await searchFlights(destination);
87
+ return { structuredContent: { flights } };
97
88
  });
98
89
  ```
99
90
 
100
- **Hooks**
101
-
102
- The `skybridge/web` package comes with a set of hooks to help you build your widgets :
91
+ ### Widget
103
92
 
104
- - `useOpenAiGlobal`: A generic hook to get any global data from the OpenAI iFrame skybridge runtime (in `window.openai`).
105
- - `useToolOutput`: A hook to get the initial tool `structuredContent` returned when rendering the widget for the first time. The data inside this hook is not updated when the tool is called again.
106
- - `useToolResponseMetadata`: A hook to get the initial tool `meta` returned when rendering the widget for the first time. The data inside this hook is not updated when the tool is called again.
107
- - `useCallTool`: A @tanstack/react-query inspired hook to send make additional tool calls inside a widget.
93
+ ```tsx
94
+ import { useToolInfo } from "skybridge/web";
108
95
 
109
- _useOpenAiGlobal_
96
+ function FlightsWidget() {
97
+ const { output } = useToolInfo();
110
98
 
111
- ```ts
112
- import { useOpenAiGlobal } from "skybridge/web";
113
-
114
- const theme = useOpenAiGlobal("theme");
99
+ return output.structuredContent.flights.map(flight =>
100
+ <FlightCard key={flight.id} flight={flight} />
101
+ );
102
+ }
115
103
  ```
116
104
 
117
- _useToolOutput_
105
+ <br />
118
106
 
119
- ```ts
120
- import { useToolOutput } from "skybridge/web";
107
+ ## 🎯 Features at a Glance
121
108
 
122
- const toolOutput = useToolOutput();
123
- ```
109
+ - **Live Reload** — Vite HMR. See changes instantly without reinstalling.
110
+ - **Typed Hooks** — Full autocomplete for tools, inputs, outputs.
111
+ - **Widget → Tool Calls** — Trigger server actions from UI.
112
+ - **Dual Surface Sync** — Keep model aware of what users see with `data-llm`.
113
+ - **React Query-style API** — `isPending`, `isError`, callbacks.
114
+ - **Platform Agnostic** — Works with ChatGPT (Apps SDK) and MCP Apps clients (Goose, VSCode, etc.).
115
+ - **MCP Compatible** — Extends the official SDK. Works with any MCP client.
124
116
 
125
- _useToolResponseMetadata_
117
+ <br />
126
118
 
127
- ```ts
128
- import { useToolResponseMetadata } from "skybridge/web";
119
+ ## 📖 Showcase
129
120
 
130
- const toolResponseMetadata = useToolResponseMetadata();
131
- ```
121
+ Explore production-ready examples:
132
122
 
133
- _useCallTool_ in synchronous mode
123
+ | Example | Description | Demo | Code |
124
+ |------------------------|----------------------------------------------------------------------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------|
125
+ | **Awaze — Cottage Search** | Holiday cottage search and booking experience — browse properties, filter by location, and explore availability | [Try Demo](https://mcp.cottages.com/try) | — |
126
+ | **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) |
127
+ | **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) |
128
+ | **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) |
129
+ | **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) |
130
+ | **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) |
131
+ | **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) |
132
+ | **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) |
133
+ | **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) |
134
+ | **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) |
135
+ | **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) |
136
+ | **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) |
137
+ | **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) |
138
+ | **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) |
139
+ | **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) |
134
140
 
135
- ```ts
136
- import { useCallTool } from "skybridge/web";
137
-
138
- export const TestTool: React.FunctionComponent = () => {
139
- const { callTool, isPending } = useCallTool("myToolName");
140
-
141
- return (
142
- <div>
143
- <button
144
- disabled={isPending}
145
- onClick={() => {
146
- callTool({ input: "test input" }, {
147
- onSuccess: (data) => {
148
- alert("Tool returned: " + data);
149
- },
150
- });
151
- >
152
- Call Tool inside a widget
153
- </button>
154
- </div>
155
- );
156
- };
157
- ```
141
+ See all examples in the [Showcase](https://docs.skybridge.tech/showcase) or browse the [examples/](examples/) directory.
158
142
 
159
- _useCallTool_ in asynchronous mode
143
+ <br />
160
144
 
161
- ```ts
162
- import { useCallTool } from "skybridge/web";
163
-
164
- export const TestTool: React.FunctionComponent = () => {
165
- const { callToolAsync, isPending } = useCallTool("myToolName");
166
-
167
- return (
168
- <div>
169
- <button
170
- disabled={isPending}
171
- onClick={async () => {
172
- const data = await callToolAsync({ input: "test input" });
173
- alert("Tool returned: " + data);
174
- }}
175
- >
176
- Call Tool inside a widget
177
- </button>
178
- </div>
179
- );
180
- };
181
- ```
145
+ <div align="center">
182
146
 
183
- ## Migrate your existing MCP server to a ChatGPT app
147
+ [![GitHub Discussions](https://img.shields.io/badge/Discussions-Ask%20Questions-blue?style=flat-square&logo=github)](https://github.com/alpic-ai/skybridge/discussions)
148
+ [![GitHub Issues](https://img.shields.io/badge/Issues-Report%20Bugs-red?style=flat-square&logo=github)](https://github.com/alpic-ai/skybridge/issues)
149
+ [![Discord](https://img.shields.io/badge/Discord-Chat-5865F2?style=flat-square&logo=discord&logoColor=white)](https://discord.com/invite/gNAazGueab)
184
150
 
185
- If you're already using the `@modelcontextprotocol/sdk` to build a MCP server, you can migrate to a ChatGPT app by following these steps:
151
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions
186
152
 
187
- 1. Replace your `McpServer` import from `@modelcontextprotocol/sdk` with the same import from `skybridge/server`
188
- 2. Create a new vite project in a folder named `web` and install the `skybridge` package
189
- 3. Replace the `vite.config.ts` file with the following:
153
+ <br />
190
154
 
191
- ```ts
192
- import { defineConfig } from "vite";
193
- import { skybridge } from "skybridge/web";
155
+ **[MIT License](LICENSE)** · Made with ❤️ by **[Alpic](https://alpic.ai)**
194
156
 
195
- export default defineConfig({
196
- plugins: [skybridge()],
197
- });
198
- ```
157
+ </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
+ };