skybridge 0.0.0-dev.d347d93 → 0.0.0-dev.d39c413

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 (325) hide show
  1. package/README.md +153 -0
  2. package/dist/cli/detect-port.d.ts +18 -0
  3. package/dist/cli/detect-port.js +61 -0
  4. package/dist/cli/detect-port.js.map +1 -0
  5. package/dist/cli/header.d.ts +4 -0
  6. package/dist/cli/header.js +6 -0
  7. package/dist/cli/header.js.map +1 -0
  8. package/dist/cli/run-command.d.ts +2 -0
  9. package/dist/cli/run-command.js +43 -0
  10. package/dist/cli/run-command.js.map +1 -0
  11. package/dist/cli/telemetry.d.ts +7 -0
  12. package/dist/cli/telemetry.js +123 -0
  13. package/dist/cli/telemetry.js.map +1 -0
  14. package/dist/cli/tunnel-control-server.d.ts +9 -0
  15. package/dist/cli/tunnel-control-server.js +31 -0
  16. package/dist/cli/tunnel-control-server.js.map +1 -0
  17. package/dist/cli/tunnel-control-server.test.js +39 -0
  18. package/dist/cli/tunnel-control-server.test.js.map +1 -0
  19. package/dist/cli/tunnel-handler.d.ts +3 -0
  20. package/dist/cli/tunnel-handler.js +48 -0
  21. package/dist/cli/tunnel-handler.js.map +1 -0
  22. package/dist/cli/tunnel-handler.test.js +105 -0
  23. package/dist/cli/tunnel-handler.test.js.map +1 -0
  24. package/dist/cli/tunnel.d.ts +57 -0
  25. package/dist/cli/tunnel.js +154 -0
  26. package/dist/cli/tunnel.js.map +1 -0
  27. package/dist/cli/tunnel.test.js +190 -0
  28. package/dist/cli/tunnel.test.js.map +1 -0
  29. package/dist/cli/types.d.ts +5 -0
  30. package/dist/cli/types.js +2 -0
  31. package/dist/cli/types.js.map +1 -0
  32. package/dist/cli/use-execute-steps.d.ts +11 -0
  33. package/dist/cli/use-execute-steps.js +36 -0
  34. package/dist/cli/use-execute-steps.js.map +1 -0
  35. package/dist/cli/use-messages.d.ts +3 -0
  36. package/dist/cli/use-messages.js +11 -0
  37. package/dist/cli/use-messages.js.map +1 -0
  38. package/dist/cli/use-nodemon.d.ts +2 -0
  39. package/dist/cli/use-nodemon.js +64 -0
  40. package/dist/cli/use-nodemon.js.map +1 -0
  41. package/dist/cli/use-tunnel.d.ts +14 -0
  42. package/dist/cli/use-tunnel.js +131 -0
  43. package/dist/cli/use-tunnel.js.map +1 -0
  44. package/dist/cli/use-typescript-check.d.ts +9 -0
  45. package/dist/cli/use-typescript-check.js +94 -0
  46. package/dist/cli/use-typescript-check.js.map +1 -0
  47. package/dist/commands/build.d.ts +9 -0
  48. package/dist/commands/build.js +108 -0
  49. package/dist/commands/build.js.map +1 -0
  50. package/dist/commands/dev.d.ts +11 -0
  51. package/dist/commands/dev.js +73 -0
  52. package/dist/commands/dev.js.map +1 -0
  53. package/dist/commands/start.d.ts +9 -0
  54. package/dist/commands/start.js +49 -0
  55. package/dist/commands/start.js.map +1 -0
  56. package/dist/commands/telemetry/disable.d.ts +5 -0
  57. package/dist/commands/telemetry/disable.js +14 -0
  58. package/dist/commands/telemetry/disable.js.map +1 -0
  59. package/dist/commands/telemetry/enable.d.ts +5 -0
  60. package/dist/commands/telemetry/enable.js +14 -0
  61. package/dist/commands/telemetry/enable.js.map +1 -0
  62. package/dist/commands/telemetry/status.d.ts +5 -0
  63. package/dist/commands/telemetry/status.js +14 -0
  64. package/dist/commands/telemetry/status.js.map +1 -0
  65. package/dist/server/asset-base-url-transform-plugin.d.ts +10 -0
  66. package/dist/server/asset-base-url-transform-plugin.js +33 -0
  67. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  68. package/dist/server/asset-base-url-transform-plugin.test.d.ts +1 -0
  69. package/dist/server/asset-base-url-transform-plugin.test.js +84 -0
  70. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  71. package/dist/server/content-helpers.d.ts +27 -0
  72. package/dist/server/content-helpers.js +46 -0
  73. package/dist/server/content-helpers.js.map +1 -0
  74. package/dist/server/content-helpers.test.d.ts +1 -0
  75. package/dist/server/content-helpers.test.js +70 -0
  76. package/dist/server/content-helpers.test.js.map +1 -0
  77. package/dist/server/express.d.ts +15 -0
  78. package/dist/server/express.js +103 -0
  79. package/dist/server/express.js.map +1 -0
  80. package/dist/server/express.test.d.ts +1 -0
  81. package/dist/server/express.test.js +348 -0
  82. package/dist/server/express.test.js.map +1 -0
  83. package/dist/server/index.d.ts +5 -3
  84. package/dist/server/index.js +3 -2
  85. package/dist/server/index.js.map +1 -1
  86. package/dist/server/inferUtilityTypes.d.ts +6 -6
  87. package/dist/server/metric.d.ts +14 -0
  88. package/dist/server/metric.js +62 -0
  89. package/dist/server/metric.js.map +1 -0
  90. package/dist/server/middleware.d.ts +124 -0
  91. package/dist/server/middleware.js +93 -0
  92. package/dist/server/middleware.js.map +1 -0
  93. package/dist/server/middleware.test-d.d.ts +1 -0
  94. package/dist/server/middleware.test-d.js +75 -0
  95. package/dist/server/middleware.test-d.js.map +1 -0
  96. package/dist/server/middleware.test.d.ts +1 -0
  97. package/dist/server/middleware.test.js +493 -0
  98. package/dist/server/middleware.test.js.map +1 -0
  99. package/dist/server/server.d.ts +149 -65
  100. package/dist/server/server.js +413 -85
  101. package/dist/server/server.js.map +1 -1
  102. package/dist/server/templateHelper.d.ts +5 -7
  103. package/dist/server/templateHelper.js +3 -22
  104. package/dist/server/templateHelper.js.map +1 -1
  105. package/dist/server/templates.generated.d.ts +2 -0
  106. package/dist/server/templates.generated.js +46 -0
  107. package/dist/server/templates.generated.js.map +1 -0
  108. package/dist/server/tunnel-proxy-router.d.ts +7 -0
  109. package/dist/server/tunnel-proxy-router.js +110 -0
  110. package/dist/server/tunnel-proxy-router.js.map +1 -0
  111. package/dist/server/tunnel-proxy-router.test.d.ts +1 -0
  112. package/dist/server/tunnel-proxy-router.test.js +229 -0
  113. package/dist/server/tunnel-proxy-router.test.js.map +1 -0
  114. package/dist/server/viewsDevServer.d.ts +14 -0
  115. package/dist/server/viewsDevServer.js +45 -0
  116. package/dist/server/viewsDevServer.js.map +1 -0
  117. package/dist/test/utils.d.ts +13 -21
  118. package/dist/test/utils.js +42 -37
  119. package/dist/test/utils.js.map +1 -1
  120. package/dist/test/view.test.d.ts +1 -0
  121. package/dist/test/view.test.js +523 -0
  122. package/dist/test/view.test.js.map +1 -0
  123. package/dist/version.d.ts +1 -0
  124. package/dist/version.js +3 -0
  125. package/dist/version.js.map +1 -0
  126. package/dist/web/bridges/apps-sdk/adaptor.d.ts +24 -0
  127. package/dist/web/bridges/apps-sdk/adaptor.js +93 -0
  128. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  129. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  130. package/dist/web/bridges/{apps-sdk-bridge.js → apps-sdk/bridge.js} +2 -2
  131. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  132. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  133. package/dist/web/bridges/apps-sdk/index.js +5 -0
  134. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  135. package/dist/web/bridges/apps-sdk/types.d.ts +126 -0
  136. package/dist/web/bridges/apps-sdk/types.js +10 -0
  137. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  138. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  139. package/dist/web/bridges/{hooks/use-apps-sdk-bridge.js → apps-sdk/use-apps-sdk-context.js} +3 -3
  140. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  141. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  142. package/dist/web/bridges/get-adaptor.js +8 -0
  143. package/dist/web/bridges/get-adaptor.js.map +1 -0
  144. package/dist/web/bridges/index.d.ts +5 -4
  145. package/dist/web/bridges/index.js +5 -4
  146. package/dist/web/bridges/index.js.map +1 -1
  147. package/dist/web/bridges/mcp-app/adaptor.d.ts +48 -0
  148. package/dist/web/bridges/mcp-app/adaptor.js +268 -0
  149. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  150. package/dist/web/bridges/mcp-app/bridge.d.ts +26 -0
  151. package/dist/web/bridges/mcp-app/bridge.js +102 -0
  152. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  153. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  154. package/dist/web/bridges/mcp-app/index.js +4 -0
  155. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  156. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  157. package/dist/web/bridges/mcp-app/types.js +2 -0
  158. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  159. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +7 -0
  160. package/dist/web/bridges/mcp-app/use-mcp-app-context.js +7 -0
  161. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  162. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  163. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js +26 -0
  164. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  165. package/dist/web/bridges/types.d.ts +79 -27
  166. package/dist/web/bridges/use-host-context.d.ts +2 -0
  167. package/dist/web/bridges/use-host-context.js +8 -0
  168. package/dist/web/bridges/use-host-context.js.map +1 -0
  169. package/dist/web/components/modal-provider.d.ts +4 -0
  170. package/dist/web/components/modal-provider.js +45 -0
  171. package/dist/web/components/modal-provider.js.map +1 -0
  172. package/dist/web/create-store.js +21 -8
  173. package/dist/web/create-store.js.map +1 -1
  174. package/dist/web/create-store.test.js +112 -53
  175. package/dist/web/create-store.test.js.map +1 -1
  176. package/dist/web/data-llm.d.ts +1 -1
  177. package/dist/web/data-llm.js +7 -5
  178. package/dist/web/data-llm.js.map +1 -1
  179. package/dist/web/data-llm.test.js +131 -65
  180. package/dist/web/data-llm.test.js.map +1 -1
  181. package/dist/web/generate-helpers.d.ts +22 -19
  182. package/dist/web/generate-helpers.js +20 -18
  183. package/dist/web/generate-helpers.js.map +1 -1
  184. package/dist/web/generate-helpers.test-d.js +26 -26
  185. package/dist/web/generate-helpers.test-d.js.map +1 -1
  186. package/dist/web/helpers/state.d.ts +2 -2
  187. package/dist/web/helpers/state.js +17 -12
  188. package/dist/web/helpers/state.js.map +1 -1
  189. package/dist/web/helpers/state.test.js +9 -9
  190. package/dist/web/helpers/state.test.js.map +1 -1
  191. package/dist/web/hooks/index.d.ts +3 -3
  192. package/dist/web/hooks/index.js +2 -2
  193. package/dist/web/hooks/index.js.map +1 -1
  194. package/dist/web/hooks/test/utils.d.ts +8 -2
  195. package/dist/web/hooks/test/utils.js +37 -13
  196. package/dist/web/hooks/test/utils.js.map +1 -1
  197. package/dist/web/hooks/use-call-tool.d.ts +3 -2
  198. package/dist/web/hooks/use-call-tool.js +2 -2
  199. package/dist/web/hooks/use-call-tool.js.map +1 -1
  200. package/dist/web/hooks/use-call-tool.test-d.js +1 -1
  201. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  202. package/dist/web/hooks/use-call-tool.test.js +3 -3
  203. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  204. package/dist/web/hooks/use-display-mode.d.ts +3 -3
  205. package/dist/web/hooks/use-display-mode.js +3 -4
  206. package/dist/web/hooks/use-display-mode.js.map +1 -1
  207. package/dist/web/hooks/use-display-mode.test-d.d.ts +1 -0
  208. package/dist/web/hooks/use-display-mode.test-d.js +8 -0
  209. package/dist/web/hooks/use-display-mode.test-d.js.map +1 -0
  210. package/dist/web/hooks/use-files.d.ts +3 -6
  211. package/dist/web/hooks/use-files.js +5 -2
  212. package/dist/web/hooks/use-files.js.map +1 -1
  213. package/dist/web/hooks/use-files.test.js +32 -7
  214. package/dist/web/hooks/use-files.test.js.map +1 -1
  215. package/dist/web/hooks/use-layout.d.ts +2 -2
  216. package/dist/web/hooks/use-layout.js +4 -4
  217. package/dist/web/hooks/use-layout.js.map +1 -1
  218. package/dist/web/hooks/use-layout.test.js +7 -6
  219. package/dist/web/hooks/use-layout.test.js.map +1 -1
  220. package/dist/web/hooks/use-open-external.d.ts +3 -1
  221. package/dist/web/hooks/use-open-external.js +3 -3
  222. package/dist/web/hooks/use-open-external.js.map +1 -1
  223. package/dist/web/hooks/use-open-external.test.js +27 -12
  224. package/dist/web/hooks/use-open-external.test.js.map +1 -1
  225. package/dist/web/hooks/use-request-modal.d.ts +3 -3
  226. package/dist/web/hooks/use-request-modal.js +10 -8
  227. package/dist/web/hooks/use-request-modal.js.map +1 -1
  228. package/dist/web/hooks/use-request-modal.test.js +5 -1
  229. package/dist/web/hooks/use-request-modal.test.js.map +1 -1
  230. package/dist/web/hooks/use-send-follow-up-message.js +2 -2
  231. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  232. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  233. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  234. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  235. package/dist/web/hooks/use-set-open-in-app-url.test.js +43 -0
  236. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  237. package/dist/web/hooks/use-tool-info.js +4 -4
  238. package/dist/web/hooks/use-tool-info.js.map +1 -1
  239. package/dist/web/hooks/use-tool-info.test.js +5 -5
  240. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  241. package/dist/web/hooks/use-user.d.ts +1 -1
  242. package/dist/web/hooks/use-user.js +20 -4
  243. package/dist/web/hooks/use-user.js.map +1 -1
  244. package/dist/web/hooks/use-user.test.js +33 -4
  245. package/dist/web/hooks/use-user.test.js.map +1 -1
  246. package/dist/web/hooks/use-view-state.d.ts +4 -0
  247. package/dist/web/hooks/use-view-state.js +32 -0
  248. package/dist/web/hooks/use-view-state.js.map +1 -0
  249. package/dist/web/hooks/use-view-state.test.d.ts +1 -0
  250. package/dist/web/hooks/use-view-state.test.js +177 -0
  251. package/dist/web/hooks/use-view-state.test.js.map +1 -0
  252. package/dist/web/index.d.ts +1 -2
  253. package/dist/web/index.js +1 -2
  254. package/dist/web/index.js.map +1 -1
  255. package/dist/web/mount-view.d.ts +1 -0
  256. package/dist/web/{mount-widget.js → mount-view.js} +11 -3
  257. package/dist/web/mount-view.js.map +1 -0
  258. package/dist/web/plugin/plugin.d.ts +4 -1
  259. package/dist/web/plugin/plugin.js +142 -18
  260. package/dist/web/plugin/plugin.js.map +1 -1
  261. package/dist/web/plugin/scan-views.d.ts +16 -0
  262. package/dist/web/plugin/scan-views.js +88 -0
  263. package/dist/web/plugin/scan-views.js.map +1 -0
  264. package/dist/web/plugin/scan-views.test.d.ts +1 -0
  265. package/dist/web/plugin/scan-views.test.js +99 -0
  266. package/dist/web/plugin/scan-views.test.js.map +1 -0
  267. package/dist/web/plugin/transform-data-llm.js +1 -1
  268. package/dist/web/plugin/transform-data-llm.js.map +1 -1
  269. package/dist/web/plugin/validate-view.d.ts +1 -0
  270. package/dist/web/plugin/validate-view.js +9 -0
  271. package/dist/web/plugin/validate-view.js.map +1 -0
  272. package/dist/web/plugin/validate-view.test.d.ts +1 -0
  273. package/dist/web/plugin/validate-view.test.js +24 -0
  274. package/dist/web/plugin/validate-view.test.js.map +1 -0
  275. package/dist/web/proxy.js +0 -1
  276. package/dist/web/proxy.js.map +1 -1
  277. package/dist/web/types.d.ts +0 -133
  278. package/dist/web/types.js +0 -9
  279. package/dist/web/types.js.map +1 -1
  280. package/package.json +49 -30
  281. package/tsconfig.base.json +33 -0
  282. package/dist/server/templates/development.hbs +0 -66
  283. package/dist/server/templates/production.hbs +0 -7
  284. package/dist/server/widgetsDevServer.d.ts +0 -12
  285. package/dist/server/widgetsDevServer.js +0 -47
  286. package/dist/server/widgetsDevServer.js.map +0 -1
  287. package/dist/test/widget.test.js +0 -234
  288. package/dist/test/widget.test.js.map +0 -1
  289. package/dist/web/bridges/adaptors/apps-sdk-adaptor.d.ts +0 -13
  290. package/dist/web/bridges/adaptors/apps-sdk-adaptor.js +0 -33
  291. package/dist/web/bridges/adaptors/apps-sdk-adaptor.js.map +0 -1
  292. package/dist/web/bridges/adaptors/mcp-app-adaptor.d.ts +0 -16
  293. package/dist/web/bridges/adaptors/mcp-app-adaptor.js +0 -115
  294. package/dist/web/bridges/adaptors/mcp-app-adaptor.js.map +0 -1
  295. package/dist/web/bridges/apps-sdk-bridge.d.ts +0 -10
  296. package/dist/web/bridges/apps-sdk-bridge.js.map +0 -1
  297. package/dist/web/bridges/hooks/use-adaptor.d.ts +0 -2
  298. package/dist/web/bridges/hooks/use-adaptor.js +0 -8
  299. package/dist/web/bridges/hooks/use-adaptor.js.map +0 -1
  300. package/dist/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
  301. package/dist/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
  302. package/dist/web/bridges/hooks/use-bridge.d.ts +0 -2
  303. package/dist/web/bridges/hooks/use-bridge.js +0 -8
  304. package/dist/web/bridges/hooks/use-bridge.js.map +0 -1
  305. package/dist/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -5
  306. package/dist/web/bridges/hooks/use-mcp-app-bridge.js +0 -7
  307. package/dist/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
  308. package/dist/web/bridges/hooks/use-mcp-app-bridge.test.js +0 -62
  309. package/dist/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
  310. package/dist/web/bridges/mcp-app-bridge.d.ts +0 -46
  311. package/dist/web/bridges/mcp-app-bridge.js +0 -217
  312. package/dist/web/bridges/mcp-app-bridge.js.map +0 -1
  313. package/dist/web/hooks/use-openai-global.d.ts +0 -3
  314. package/dist/web/hooks/use-openai-global.js +0 -6
  315. package/dist/web/hooks/use-openai-global.js.map +0 -1
  316. package/dist/web/hooks/use-widget-state.d.ts +0 -4
  317. package/dist/web/hooks/use-widget-state.js +0 -32
  318. package/dist/web/hooks/use-widget-state.js.map +0 -1
  319. package/dist/web/hooks/use-widget-state.test.js +0 -61
  320. package/dist/web/hooks/use-widget-state.test.js.map +0 -1
  321. package/dist/web/mount-widget.d.ts +0 -1
  322. package/dist/web/mount-widget.js.map +0 -1
  323. /package/dist/{test/widget.test.d.ts → cli/tunnel-control-server.test.d.ts} +0 -0
  324. /package/dist/{web/bridges/hooks/use-mcp-app-bridge.test.d.ts → cli/tunnel-handler.test.d.ts} +0 -0
  325. /package/dist/{web/hooks/use-widget-state.test.d.ts → cli/tunnel.test.d.ts} +0 -0
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryDisable extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Command } from "@oclif/core";
3
+ import { Box, render, Text } from "ink";
4
+ import { setEnabled } from "../../cli/telemetry.js";
5
+ export default class TelemetryDisable extends Command {
6
+ static description = "Disable Skybridge telemetry on this machine";
7
+ async run() {
8
+ await this.parse(TelemetryDisable);
9
+ setEnabled(false);
10
+ const App = () => (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: "\u2713" }), _jsx(Text, { children: " Telemetry has been " }), _jsx(Text, { color: "yellow", bold: true, children: "disabled" })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Config saved to ~/.skybridge/config.json" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Skybridge never collects Personally Identifiable Information (PII). If you'd like to help us improve Skybridge by allowing anonymous CLI usage data, please reenable telemetry with: skybridge telemetry enable" }) })] }));
11
+ render(_jsx(App, {}));
12
+ }
13
+ }
14
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/disable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,OAAO;IACnD,MAAM,CAAU,WAAW,GAAG,6CAA6C,CAAC;IAErE,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnC,UAAU,CAAC,KAAK,CAAC,CAAC;QAElB,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,CAChB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,uBAAS,EAC7B,KAAC,IAAI,uCAA4B,EACjC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,+BAElB,IACH,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yDAAgD,GAC9D,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,gOAKX,GACH,IACF,CACP,CAAC;QAEF,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;IAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryEnable extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Command } from "@oclif/core";
3
+ import { Box, render, Text } from "ink";
4
+ import { setEnabled } from "../../cli/telemetry.js";
5
+ export default class TelemetryEnable extends Command {
6
+ static description = "Enable Skybridge telemetry on this machine";
7
+ async run() {
8
+ await this.parse(TelemetryEnable);
9
+ setEnabled(true);
10
+ const App = () => (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "\u2713" }), _jsx(Text, { children: " Telemetry has been " }), _jsx(Text, { color: "green", bold: true, children: "enabled" })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Config saved to ~/.skybridge/config.json" }) })] }));
11
+ render(_jsx(App, {}));
12
+ }
13
+ }
14
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/commands/telemetry/enable.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GAAG,4CAA4C,CAAC;IAEpE,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEjB,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,CAChB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,uBAAS,EAC5B,KAAC,IAAI,uCAA4B,EACjC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,8BAEjB,IACH,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,yDAAgD,GAC9D,IACF,CACP,CAAC;QAEF,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;IAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class TelemetryStatus extends Command {
3
+ static description: string;
4
+ run(): Promise<void>;
5
+ }
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Command } from "@oclif/core";
3
+ import { Box, render, Text } from "ink";
4
+ import { getMachineId, isEnabled } from "../../cli/telemetry.js";
5
+ export default class TelemetryStatus extends Command {
6
+ static description = "Get Skybridge current telemetry settings for this machine";
7
+ async run() {
8
+ await this.parse(TelemetryStatus);
9
+ const enabled = isEnabled();
10
+ const App = () => (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, underline: true, children: "Skybridge Telemetry" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { children: "Status: " }), enabled ? (_jsx(Text, { color: "green", bold: true, children: "Enabled" })) : (_jsx(Text, { color: "yellow", bold: true, children: "Disabled" }))] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: "gray", children: "Machine ID: " }), _jsx(Text, { children: getMachineId() })] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "gray", children: "To opt out, run: skybridge telemetry disable" }), _jsx(Text, { color: "gray", children: "Or set: SKYBRIDGE_TELEMETRY_DISABLED=1" }), _jsx(Text, { color: "gray", children: "Debug mode: SKYBRIDGE_TELEMETRY_DEBUG=1" })] })] }));
11
+ render(_jsx(App, {}));
12
+ }
13
+ }
14
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/telemetry/status.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAAO;IAClD,MAAM,CAAU,WAAW,GACzB,2DAA2D,CAAC;IAEvD,KAAK,CAAC,GAAG;QACd,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;QAE5B,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,CAChB,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,aACpC,KAAC,IAAI,IAAC,IAAI,QAAC,SAAS,0CAEb,EAEP,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,MAAC,GAAG,eACF,KAAC,IAAI,2BAAgB,EACpB,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,8BAEjB,CACR,CAAC,CAAC,CAAC,CACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,+BAElB,CACR,IACG,EAEN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6BAAoB,EACtC,KAAC,IAAI,cAAE,YAAY,EAAE,GAAQ,IACzB,IACF,EAEN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6DAAoD,EACtE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uDAA8C,EAChE,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,wDAA+C,IAC7D,IACF,CACP,CAAC;QAEF,MAAM,CAAC,KAAC,GAAG,KAAG,CAAC,CAAC;IAClB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Plugin } from "vite";
2
+ /**
3
+ * Transforms asset import paths to resolve at runtime via `window.skybridge.serverUrl`,
4
+ * so they work both locally and behind tunnels.
5
+ */
6
+ export declare function assetBaseUrlTransform(code: string): string;
7
+ /**
8
+ * Vite plugin that transforms asset import paths to resolve at runtime via `window.skybridge.serverUrl`.
9
+ */
10
+ export declare function assetBaseUrlTransformPlugin(): Plugin;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Transforms asset import paths to resolve at runtime via `window.skybridge.serverUrl`,
3
+ * so they work both locally and behind tunnels.
4
+ */
5
+ export function assetBaseUrlTransform(code) {
6
+ const assetStringPattern = /(?<!\bfrom\s)(?<!https?:\/\/)(["'`])(\/[^"'`]+\.(svg|png|jpeg|jpg|gif|webp|mp3|mp4|woff|woff2|ttf|eot))\1/g;
7
+ code = code.replace(assetStringPattern, (_match, _quote, assetPath) => {
8
+ return `(window.skybridge?.serverUrl ?? "") + "${assetPath}"`;
9
+ });
10
+ return code;
11
+ }
12
+ /**
13
+ * Vite plugin that transforms asset import paths to resolve at runtime via `window.skybridge.serverUrl`.
14
+ */
15
+ export function assetBaseUrlTransformPlugin() {
16
+ return {
17
+ name: "asset-base-url-transform",
18
+ transform(code) {
19
+ if (!code) {
20
+ return null;
21
+ }
22
+ const transformedCode = assetBaseUrlTransform(code);
23
+ if (transformedCode === code) {
24
+ return null;
25
+ }
26
+ return {
27
+ code: transformedCode,
28
+ map: null,
29
+ };
30
+ },
31
+ };
32
+ }
33
+ //# sourceMappingURL=asset-base-url-transform-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-base-url-transform-plugin.js","sourceRoot":"","sources":["../../src/server/asset-base-url-transform-plugin.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,kBAAkB,GACtB,4GAA4G,CAAC;IAE/G,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;QACpE,OAAO,0CAA0C,SAAS,GAAG,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,SAAS,CAAC,IAAI;YACZ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAEpD,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,GAAG,EAAE,IAAI;aACV,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assetBaseUrlTransform } from "./asset-base-url-transform-plugin.js";
3
+ describe("assetBaseUrlTransform", () => {
4
+ it("should transform asset paths to use window.skybridge.serverUrl", () => {
5
+ const cases = [
6
+ {
7
+ desc: "single-quoted",
8
+ code: `const image = '/assets/logo.png';`,
9
+ expected: `const image = (window.skybridge?.serverUrl ?? "") + "/assets/logo.png";`,
10
+ },
11
+ {
12
+ desc: "double-quoted",
13
+ code: `const image = "/assets/logo.png";`,
14
+ expected: `const image = (window.skybridge?.serverUrl ?? "") + "/assets/logo.png";`,
15
+ },
16
+ {
17
+ desc: "backtick-quoted",
18
+ code: "const image = `/assets/logo.png`;",
19
+ expected: `const image = (window.skybridge?.serverUrl ?? "") + "/assets/logo.png";`,
20
+ },
21
+ ];
22
+ for (const { code, expected } of cases) {
23
+ const result = assetBaseUrlTransform(code);
24
+ expect(result).toBe(expected);
25
+ }
26
+ });
27
+ it("should transform multiple asset paths", () => {
28
+ const code = `
29
+ const logo = '/assets/logo.png';
30
+ const icon = '/assets/icon.svg';
31
+ const font = '/assets/font.woff2';
32
+ `;
33
+ const result = assetBaseUrlTransform(code);
34
+ expect(result).toContain(`(window.skybridge?.serverUrl ?? "") + "/assets/logo.png"`);
35
+ expect(result).toContain(`(window.skybridge?.serverUrl ?? "") + "/assets/icon.svg"`);
36
+ expect(result).toContain(`(window.skybridge?.serverUrl ?? "") + "/assets/font.woff2"`);
37
+ });
38
+ it("should not transform already absolute URLs", () => {
39
+ const code = `
40
+ const local = '/assets/logo.png';
41
+ const http = 'http://example.com/image.png';
42
+ const https = 'https://example.com/image.png';
43
+ `;
44
+ const result = assetBaseUrlTransform(code);
45
+ expect(result).toContain(`(window.skybridge?.serverUrl ?? "") + "/assets/logo.png"`);
46
+ expect(result).toContain("http://example.com/image.png");
47
+ expect(result).toContain("https://example.com/image.png");
48
+ });
49
+ it("should not transform code without asset paths", () => {
50
+ const code = `const text = "Hello World";`;
51
+ const result = assetBaseUrlTransform(code);
52
+ expect(result).toBe(code);
53
+ });
54
+ it("should not transform asset paths inside static `import ... from` clauses", () => {
55
+ // Reproducer for #713: a dep does `import * as sprite from './icons.svg'`,
56
+ // Vite resolves the relative path to absolute, then this transform used
57
+ // to rewrite the resolved string — producing invalid JS like
58
+ // `import * as sprite from (expr) + "..."` that crashes vite:import-analysis.
59
+ const cases = [
60
+ `import * as sprite from "/Users/me/proj/node_modules/pkg/icons.svg";`,
61
+ `import sprite from '/assets/icons.svg';`,
62
+ `import sprite from "/assets/icons.svg";`,
63
+ `export { default } from "/assets/icons.svg";`,
64
+ `export * from '/assets/sprites.svg';`,
65
+ ];
66
+ for (const code of cases) {
67
+ expect(assetBaseUrlTransform(code)).toBe(code);
68
+ }
69
+ });
70
+ it("should still transform value-position asset paths in files that also have unrelated imports", () => {
71
+ const code = [
72
+ `import { foo } from "./foo.js";`,
73
+ `import * as sprite from "/assets/sprite.svg";`,
74
+ `const logo = "/assets/logo.png";`,
75
+ ].join("\n");
76
+ const result = assetBaseUrlTransform(code);
77
+ // Imports untouched
78
+ expect(result).toContain(`from "./foo.js"`);
79
+ expect(result).toContain(`from "/assets/sprite.svg"`);
80
+ // Value-position rewritten
81
+ expect(result).toContain(`const logo = (window.skybridge?.serverUrl ?? "") + "/assets/logo.png";`);
82
+ });
83
+ });
84
+ //# sourceMappingURL=asset-base-url-transform-plugin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-base-url-transform-plugin.test.js","sourceRoot":"","sources":["../../src/server/asset-base-url-transform-plugin.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { AudioContent, EmbeddedResource, ImageContent, ResourceLink, TextContent } from "@modelcontextprotocol/sdk/types.js";
2
+ type ContentAnnotations = {
3
+ audience?: ("user" | "assistant")[];
4
+ priority?: number;
5
+ lastModified?: string;
6
+ };
7
+ export declare function text(value: string, annotations?: ContentAnnotations): TextContent;
8
+ export declare function image(data: string | Uint8Array, mimeType: string, annotations?: ContentAnnotations): ImageContent;
9
+ export declare function audio(data: string | Uint8Array, mimeType: string, annotations?: ContentAnnotations): AudioContent;
10
+ export declare function embeddedResource(resource: {
11
+ uri: string;
12
+ mimeType?: string;
13
+ text: string;
14
+ } | {
15
+ uri: string;
16
+ mimeType?: string;
17
+ blob: string;
18
+ }, annotations?: ContentAnnotations): EmbeddedResource;
19
+ export declare function resourceLink(link: {
20
+ uri: string;
21
+ name: string;
22
+ title?: string;
23
+ description?: string;
24
+ mimeType?: string;
25
+ size?: number;
26
+ }, annotations?: ContentAnnotations): ResourceLink;
27
+ export {};
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Returns a base64-encoded string.
3
+ * - `Uint8Array` input is encoded via `Buffer.toString("base64")`.
4
+ * - `string` input is assumed to be **already base64-encoded** and is returned
5
+ * as-is. Passing raw/unencoded string bytes will produce invalid MCP content.
6
+ */
7
+ function toBase64(data) {
8
+ if (typeof data === "string") {
9
+ return data;
10
+ }
11
+ return Buffer.from(data).toString("base64");
12
+ }
13
+ export function text(value, annotations) {
14
+ return { type: "text", text: value, ...(annotations && { annotations }) };
15
+ }
16
+ export function image(data, mimeType, annotations) {
17
+ return {
18
+ type: "image",
19
+ data: toBase64(data),
20
+ mimeType,
21
+ ...(annotations && { annotations }),
22
+ };
23
+ }
24
+ export function audio(data, mimeType, annotations) {
25
+ return {
26
+ type: "audio",
27
+ data: toBase64(data),
28
+ mimeType,
29
+ ...(annotations && { annotations }),
30
+ };
31
+ }
32
+ export function embeddedResource(resource, annotations) {
33
+ return {
34
+ type: "resource",
35
+ resource,
36
+ ...(annotations && { annotations }),
37
+ };
38
+ }
39
+ export function resourceLink(link, annotations) {
40
+ return {
41
+ type: "resource_link",
42
+ ...link,
43
+ ...(annotations && { annotations }),
44
+ };
45
+ }
46
+ //# sourceMappingURL=content-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-helpers.js","sourceRoot":"","sources":["../../src/server/content-helpers.ts"],"names":[],"mappings":"AAcA;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,IAAyB;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,KAAa,EACb,WAAgC;IAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAyB,EACzB,QAAgB,EAChB,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,IAAyB,EACzB,QAAgB,EAChB,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;QACpB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAEoD,EACpD,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ;QACR,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAOC,EACD,WAAgC;IAEhC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,GAAG,IAAI;QACP,GAAG,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { audio, embeddedResource, image, resourceLink, text, } from "./content-helpers.js";
3
+ describe("text", () => {
4
+ it("returns a TextContent without annotations when none given", () => {
5
+ expect(text("hello")).toEqual({ type: "text", text: "hello" });
6
+ });
7
+ it("includes annotations when provided", () => {
8
+ expect(text("hi", { priority: 1 })).toEqual({
9
+ type: "text",
10
+ text: "hi",
11
+ annotations: { priority: 1 },
12
+ });
13
+ });
14
+ });
15
+ describe("image", () => {
16
+ it("base64-encodes Uint8Array data", () => {
17
+ const bytes = new Uint8Array([104, 105]);
18
+ expect(image(bytes, "image/png")).toEqual({
19
+ type: "image",
20
+ data: "aGk=",
21
+ mimeType: "image/png",
22
+ });
23
+ });
24
+ it("passes string data through unchanged (caller is responsible for base64)", () => {
25
+ expect(image("YWxyZWFkeS1iNjQ=", "image/png")).toEqual({
26
+ type: "image",
27
+ data: "YWxyZWFkeS1iNjQ=",
28
+ mimeType: "image/png",
29
+ });
30
+ });
31
+ });
32
+ describe("audio", () => {
33
+ it("base64-encodes Uint8Array data", () => {
34
+ const bytes = new Uint8Array([104, 105]);
35
+ expect(audio(bytes, "audio/mpeg")).toMatchObject({
36
+ type: "audio",
37
+ data: "aGk=",
38
+ mimeType: "audio/mpeg",
39
+ });
40
+ });
41
+ });
42
+ describe("embeddedResource", () => {
43
+ it("wraps a text resource with a type tag", () => {
44
+ expect(embeddedResource({
45
+ uri: "file:///a.txt",
46
+ mimeType: "text/plain",
47
+ text: "x",
48
+ })).toEqual({
49
+ type: "resource",
50
+ resource: { uri: "file:///a.txt", mimeType: "text/plain", text: "x" },
51
+ });
52
+ });
53
+ it("wraps a blob resource with a type tag", () => {
54
+ expect(embeddedResource({ uri: "file:///a.bin", blob: "YmFy" })).toEqual({
55
+ type: "resource",
56
+ resource: { uri: "file:///a.bin", blob: "YmFy" },
57
+ });
58
+ });
59
+ });
60
+ describe("resourceLink", () => {
61
+ it("spreads link fields alongside the type tag", () => {
62
+ expect(resourceLink({ uri: "file:///a", name: "a", title: "A" })).toEqual({
63
+ type: "resource_link",
64
+ uri: "file:///a",
65
+ name: "a",
66
+ title: "A",
67
+ });
68
+ });
69
+ });
70
+ //# sourceMappingURL=content-helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-helpers.test.js","sourceRoot":"","sources":["../../src/server/content-helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,KAAK,EACL,gBAAgB,EAChB,KAAK,EACL,YAAY,EACZ,IAAI,GACL,MAAM,sBAAsB,CAAC;AAE9B,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC1C,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YACxC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAC/C,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,YAAY;SACvB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CACJ,gBAAgB,CAAC;YACf,GAAG,EAAE,eAAe;YACpB,QAAQ,EAAE,YAAY;YACtB,IAAI,EAAE,GAAG;SACV,CAAC,CACH,CAAC,OAAO,CAAC;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE;SACtE,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACvE,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,WAAW;YAChB,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type http from "node:http";
2
+ import express from "express";
3
+ import type { McpServer } from "./server.js";
4
+ export declare function createApp({ mcpServer, httpServer, customMiddleware, errorMiddleware, }: {
5
+ mcpServer: McpServer;
6
+ httpServer: http.Server;
7
+ customMiddleware?: {
8
+ path?: string;
9
+ handlers: express.RequestHandler[];
10
+ }[];
11
+ errorMiddleware?: {
12
+ path?: string;
13
+ handlers: express.ErrorRequestHandler[];
14
+ }[];
15
+ }): Promise<express.Express>;
@@ -0,0 +1,103 @@
1
+ import path from "node:path";
2
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
3
+ import cors from "cors";
4
+ import express from "express";
5
+ function parseControlPort(raw) {
6
+ if (raw === undefined) {
7
+ return null;
8
+ }
9
+ const n = Number.parseInt(raw, 10);
10
+ if (!Number.isFinite(n) || n <= 0 || n >= 65536) {
11
+ return null;
12
+ }
13
+ return n;
14
+ }
15
+ function applyMiddlewares(app, middlewares) {
16
+ for (const middleware of middlewares) {
17
+ if (middleware.path) {
18
+ app.use(middleware.path, ...middleware.handlers);
19
+ }
20
+ else {
21
+ app.use(...middleware.handlers);
22
+ }
23
+ }
24
+ }
25
+ function defaultErrorHandler(err, _req, res, _next) {
26
+ console.error("Error handling MCP request:", err);
27
+ if (!res.headersSent) {
28
+ res.status(500).json({
29
+ jsonrpc: "2.0",
30
+ error: { code: -32603, message: "Internal server error" },
31
+ id: null,
32
+ });
33
+ }
34
+ }
35
+ export async function createApp({ mcpServer, httpServer, customMiddleware = [], errorMiddleware = [], }) {
36
+ const app = express();
37
+ app.use(express.json());
38
+ applyMiddlewares(app, customMiddleware);
39
+ // Read `process.env.NODE_ENV` inline: wrangler/esbuild only substitute the literal expression,
40
+ // so a local const would defeat dead-code elimination of the dev-only imports below.
41
+ if (process.env.NODE_ENV !== "production") {
42
+ const { devtoolsStaticServer } = await import("@skybridge/devtools");
43
+ app.use(await devtoolsStaticServer());
44
+ const { viewsDevServer } = await import("./viewsDevServer.js");
45
+ app.use(await viewsDevServer(httpServer));
46
+ const controlPort = parseControlPort(process.env.__TUNNEL_CONTROL_PORT);
47
+ if (controlPort !== null) {
48
+ const { createTunnelProxyRouter } = await import("./tunnel-proxy-router.js");
49
+ app.use(createTunnelProxyRouter(controlPort));
50
+ }
51
+ else if (process.env.__TUNNEL_CONTROL_PORT !== undefined) {
52
+ console.warn(`Ignoring invalid __TUNNEL_CONTROL_PORT=${process.env.__TUNNEL_CONTROL_PORT}`);
53
+ }
54
+ }
55
+ else {
56
+ const assetsPath = path.join(process.cwd(), "dist", "assets");
57
+ app.use("/assets", cors());
58
+ app.use("/assets", express.static(assetsPath));
59
+ }
60
+ app.use("/mcp", mcpMiddleware(mcpServer));
61
+ applyMiddlewares(app, errorMiddleware);
62
+ app.use("/mcp", defaultErrorHandler);
63
+ return app;
64
+ }
65
+ const mcpMiddleware = (server) => {
66
+ return async (req, res, next) => {
67
+ if (req.method !== "POST") {
68
+ res.writeHead(405).end(JSON.stringify({
69
+ jsonrpc: "2.0",
70
+ error: {
71
+ code: -32000,
72
+ message: "Method not allowed.",
73
+ },
74
+ id: null,
75
+ }));
76
+ return;
77
+ }
78
+ try {
79
+ const transport = new StreamableHTTPServerTransport({
80
+ sessionIdGenerator: undefined,
81
+ // Respond with a single JSON body instead of SSE. Skybridge's stateless
82
+ // transport never streams server-initiated messages, so SSE adds no
83
+ // capability — and on workerd specifically, `cloudflare:node`'s http
84
+ // bridge silently drops chunked writes that happen after the request
85
+ // handler awaits, which manifests as a 200 with empty body for any
86
+ // async tools/call.
87
+ enableJsonResponse: true,
88
+ });
89
+ res.on("close", () => {
90
+ transport.close();
91
+ });
92
+ await server.connectStatelessTransport(transport);
93
+ // Express strips the mount path from req.url (e.g. "/mcp" becomes "/").
94
+ // Restore it so the SDK builds the correct requestInfo.url.
95
+ req.url = req.originalUrl;
96
+ await transport.handleRequest(req, res, req.body);
97
+ }
98
+ catch (error) {
99
+ next(error);
100
+ }
101
+ };
102
+ };
103
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};