skybridge 0.0.0-dev.d1820df → 0.0.0-dev.d202bad

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 (207) hide show
  1. package/README.md +145 -0
  2. package/bin/run.js +0 -4
  3. package/dist/cli/header.d.ts +4 -0
  4. package/dist/cli/header.js +6 -0
  5. package/dist/cli/header.js.map +1 -0
  6. package/dist/cli/run-command.d.ts +2 -0
  7. package/dist/cli/run-command.js +43 -0
  8. package/dist/cli/run-command.js.map +1 -0
  9. package/dist/cli/telemetry.d.ts +7 -0
  10. package/dist/cli/telemetry.js +123 -0
  11. package/dist/cli/telemetry.js.map +1 -0
  12. package/dist/cli/use-execute-steps.d.ts +11 -0
  13. package/dist/cli/use-execute-steps.js +36 -0
  14. package/dist/cli/use-execute-steps.js.map +1 -0
  15. package/dist/cli/use-nodemon.d.ts +6 -0
  16. package/dist/cli/use-nodemon.js +69 -0
  17. package/dist/cli/use-nodemon.js.map +1 -0
  18. package/dist/cli/use-typescript-check.d.ts +8 -0
  19. package/dist/cli/use-typescript-check.js +59 -0
  20. package/dist/cli/use-typescript-check.js.map +1 -0
  21. package/dist/commands/build.d.ts +9 -0
  22. package/dist/commands/build.js +46 -0
  23. package/dist/commands/build.js.map +1 -0
  24. package/dist/commands/dev.d.ts +3 -1
  25. package/dist/commands/dev.js +22 -21
  26. package/dist/commands/dev.js.map +1 -1
  27. package/dist/commands/start.d.ts +7 -0
  28. package/dist/commands/start.js +33 -0
  29. package/dist/commands/start.js.map +1 -0
  30. package/dist/commands/telemetry/disable.d.ts +5 -0
  31. package/dist/commands/telemetry/disable.js +14 -0
  32. package/dist/commands/telemetry/disable.js.map +1 -0
  33. package/dist/commands/telemetry/enable.d.ts +5 -0
  34. package/dist/commands/telemetry/enable.js +14 -0
  35. package/dist/commands/telemetry/enable.js.map +1 -0
  36. package/dist/commands/telemetry/status.d.ts +5 -0
  37. package/dist/commands/telemetry/status.js +14 -0
  38. package/dist/commands/telemetry/status.js.map +1 -0
  39. package/dist/server/asset-base-url-transform-plugin.d.ts +11 -0
  40. package/dist/server/asset-base-url-transform-plugin.js +34 -0
  41. package/dist/server/asset-base-url-transform-plugin.js.map +1 -0
  42. package/dist/server/asset-base-url-transform-plugin.test.js +56 -0
  43. package/dist/server/asset-base-url-transform-plugin.test.js.map +1 -0
  44. package/dist/server/express.d.ts +9 -0
  45. package/dist/server/express.js +72 -0
  46. package/dist/server/express.js.map +1 -0
  47. package/dist/server/express.test.d.ts +1 -0
  48. package/dist/server/express.test.js +74 -0
  49. package/dist/server/express.test.js.map +1 -0
  50. package/dist/server/server.d.ts +8 -4
  51. package/dist/server/server.js +121 -58
  52. package/dist/server/server.js.map +1 -1
  53. package/dist/server/templateHelper.d.ts +1 -0
  54. package/dist/server/templateHelper.js.map +1 -1
  55. package/dist/server/templates/development.hbs +3 -2
  56. package/dist/server/templates/production.hbs +1 -2
  57. package/dist/server/widgetsDevServer.js +11 -1
  58. package/dist/server/widgetsDevServer.js.map +1 -1
  59. package/dist/test/widget.test.js +43 -16
  60. package/dist/test/widget.test.js.map +1 -1
  61. package/dist/web/bridges/apps-sdk/adaptor.d.ts +22 -0
  62. package/dist/web/bridges/apps-sdk/adaptor.js +80 -0
  63. package/dist/web/bridges/apps-sdk/adaptor.js.map +1 -0
  64. package/dist/web/bridges/apps-sdk/bridge.d.ts +10 -0
  65. package/dist/web/bridges/{apps-sdk-bridge.js → apps-sdk/bridge.js} +2 -2
  66. package/dist/web/bridges/apps-sdk/bridge.js.map +1 -0
  67. package/dist/web/bridges/apps-sdk/index.d.ts +5 -0
  68. package/dist/web/bridges/apps-sdk/index.js +5 -0
  69. package/dist/web/bridges/apps-sdk/index.js.map +1 -0
  70. package/dist/web/bridges/apps-sdk/types.d.ts +118 -0
  71. package/dist/web/bridges/apps-sdk/types.js +10 -0
  72. package/dist/web/bridges/apps-sdk/types.js.map +1 -0
  73. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.d.ts +2 -0
  74. package/dist/web/bridges/{hooks/use-apps-sdk-bridge.js → apps-sdk/use-apps-sdk-context.js} +3 -3
  75. package/dist/web/bridges/apps-sdk/use-apps-sdk-context.js.map +1 -0
  76. package/dist/web/bridges/get-adaptor.d.ts +2 -0
  77. package/dist/web/bridges/get-adaptor.js +8 -0
  78. package/dist/web/bridges/get-adaptor.js.map +1 -0
  79. package/dist/web/bridges/index.d.ts +5 -4
  80. package/dist/web/bridges/index.js +5 -4
  81. package/dist/web/bridges/index.js.map +1 -1
  82. package/dist/web/bridges/mcp-app/adaptor.d.ts +36 -0
  83. package/dist/web/bridges/mcp-app/adaptor.js +190 -0
  84. package/dist/web/bridges/mcp-app/adaptor.js.map +1 -0
  85. package/dist/web/bridges/{mcp-app-bridge.d.ts → mcp-app/bridge.d.ts} +10 -13
  86. package/dist/web/bridges/{mcp-app-bridge.js → mcp-app/bridge.js} +76 -33
  87. package/dist/web/bridges/mcp-app/bridge.js.map +1 -0
  88. package/dist/web/bridges/mcp-app/index.d.ts +4 -0
  89. package/dist/web/bridges/mcp-app/index.js +4 -0
  90. package/dist/web/bridges/mcp-app/index.js.map +1 -0
  91. package/dist/web/bridges/mcp-app/types.d.ts +8 -0
  92. package/dist/web/bridges/mcp-app/types.js +2 -0
  93. package/dist/web/bridges/mcp-app/types.js.map +1 -0
  94. package/dist/web/bridges/mcp-app/use-mcp-app-context.d.ts +5 -0
  95. package/dist/web/bridges/{hooks/use-mcp-app-bridge.js → mcp-app/use-mcp-app-context.js} +3 -3
  96. package/dist/web/bridges/mcp-app/use-mcp-app-context.js.map +1 -0
  97. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.d.ts +1 -0
  98. package/dist/web/bridges/{hooks/use-mcp-app-bridge.test.js → mcp-app/use-mcp-app-context.test.js} +17 -13
  99. package/dist/web/bridges/mcp-app/use-mcp-app-context.test.js.map +1 -0
  100. package/dist/web/bridges/types.d.ts +65 -24
  101. package/dist/web/bridges/use-host-context.d.ts +2 -0
  102. package/dist/web/bridges/use-host-context.js +8 -0
  103. package/dist/web/bridges/use-host-context.js.map +1 -0
  104. package/dist/web/components/modal-provider.d.ts +4 -0
  105. package/dist/web/components/modal-provider.js +47 -0
  106. package/dist/web/components/modal-provider.js.map +1 -0
  107. package/dist/web/create-store.js +6 -7
  108. package/dist/web/create-store.js.map +1 -1
  109. package/dist/web/create-store.test.js +108 -52
  110. package/dist/web/create-store.test.js.map +1 -1
  111. package/dist/web/data-llm.js +5 -3
  112. package/dist/web/data-llm.js.map +1 -1
  113. package/dist/web/data-llm.test.js +130 -65
  114. package/dist/web/data-llm.test.js.map +1 -1
  115. package/dist/web/generate-helpers.d.ts +3 -2
  116. package/dist/web/generate-helpers.js +1 -1
  117. package/dist/web/generate-helpers.js.map +1 -1
  118. package/dist/web/helpers/state.js +13 -8
  119. package/dist/web/helpers/state.js.map +1 -1
  120. package/dist/web/hooks/index.d.ts +1 -1
  121. package/dist/web/hooks/index.js +1 -1
  122. package/dist/web/hooks/index.js.map +1 -1
  123. package/dist/web/hooks/test/utils.d.ts +8 -2
  124. package/dist/web/hooks/test/utils.js +33 -13
  125. package/dist/web/hooks/test/utils.js.map +1 -1
  126. package/dist/web/hooks/use-call-tool.d.ts +3 -2
  127. package/dist/web/hooks/use-call-tool.js +2 -2
  128. package/dist/web/hooks/use-call-tool.js.map +1 -1
  129. package/dist/web/hooks/use-call-tool.test-d.js +1 -1
  130. package/dist/web/hooks/use-call-tool.test-d.js.map +1 -1
  131. package/dist/web/hooks/use-call-tool.test.js +3 -3
  132. package/dist/web/hooks/use-call-tool.test.js.map +1 -1
  133. package/dist/web/hooks/use-display-mode.js +3 -4
  134. package/dist/web/hooks/use-display-mode.js.map +1 -1
  135. package/dist/web/hooks/use-files.d.ts +2 -6
  136. package/dist/web/hooks/use-files.js +4 -2
  137. package/dist/web/hooks/use-files.js.map +1 -1
  138. package/dist/web/hooks/use-files.test.js +6 -1
  139. package/dist/web/hooks/use-files.test.js.map +1 -1
  140. package/dist/web/hooks/use-layout.d.ts +2 -2
  141. package/dist/web/hooks/use-layout.js +4 -4
  142. package/dist/web/hooks/use-layout.js.map +1 -1
  143. package/dist/web/hooks/use-layout.test.js +6 -5
  144. package/dist/web/hooks/use-layout.test.js.map +1 -1
  145. package/dist/web/hooks/use-open-external.js +2 -2
  146. package/dist/web/hooks/use-open-external.test.js +1 -1
  147. package/dist/web/hooks/use-request-modal.d.ts +2 -2
  148. package/dist/web/hooks/use-request-modal.js +9 -7
  149. package/dist/web/hooks/use-request-modal.js.map +1 -1
  150. package/dist/web/hooks/use-send-follow-up-message.js +2 -2
  151. package/dist/web/hooks/use-set-open-in-app-url.d.ts +1 -0
  152. package/dist/web/hooks/use-set-open-in-app-url.js +8 -0
  153. package/dist/web/hooks/use-set-open-in-app-url.js.map +1 -0
  154. package/dist/web/hooks/use-set-open-in-app-url.test.d.ts +1 -0
  155. package/dist/web/hooks/use-set-open-in-app-url.test.js +49 -0
  156. package/dist/web/hooks/use-set-open-in-app-url.test.js.map +1 -0
  157. package/dist/web/hooks/use-tool-info.js +4 -4
  158. package/dist/web/hooks/use-tool-info.js.map +1 -1
  159. package/dist/web/hooks/use-tool-info.test.js +4 -4
  160. package/dist/web/hooks/use-tool-info.test.js.map +1 -1
  161. package/dist/web/hooks/use-user.d.ts +1 -1
  162. package/dist/web/hooks/use-user.js +3 -3
  163. package/dist/web/hooks/use-user.js.map +1 -1
  164. package/dist/web/hooks/use-user.test.js +4 -3
  165. package/dist/web/hooks/use-user.test.js.map +1 -1
  166. package/dist/web/hooks/use-widget-state.js +10 -10
  167. package/dist/web/hooks/use-widget-state.js.map +1 -1
  168. package/dist/web/hooks/use-widget-state.test.js +7 -6
  169. package/dist/web/hooks/use-widget-state.test.js.map +1 -1
  170. package/dist/web/mount-widget.js +9 -1
  171. package/dist/web/mount-widget.js.map +1 -1
  172. package/dist/web/plugin/plugin.js +16 -9
  173. package/dist/web/plugin/plugin.js.map +1 -1
  174. package/dist/web/proxy.js +0 -1
  175. package/dist/web/proxy.js.map +1 -1
  176. package/dist/web/types.d.ts +0 -133
  177. package/dist/web/types.js +0 -9
  178. package/dist/web/types.js.map +1 -1
  179. package/package.json +31 -20
  180. package/tsconfig.base.json +28 -0
  181. package/dist/cli/use-version.d.ts +0 -1
  182. package/dist/cli/use-version.js +0 -33
  183. package/dist/cli/use-version.js.map +0 -1
  184. package/dist/web/bridges/adaptors/apps-sdk-adaptor.d.ts +0 -13
  185. package/dist/web/bridges/adaptors/apps-sdk-adaptor.js +0 -33
  186. package/dist/web/bridges/adaptors/apps-sdk-adaptor.js.map +0 -1
  187. package/dist/web/bridges/adaptors/mcp-app-adaptor.d.ts +0 -16
  188. package/dist/web/bridges/adaptors/mcp-app-adaptor.js +0 -115
  189. package/dist/web/bridges/adaptors/mcp-app-adaptor.js.map +0 -1
  190. package/dist/web/bridges/apps-sdk-bridge.d.ts +0 -10
  191. package/dist/web/bridges/apps-sdk-bridge.js.map +0 -1
  192. package/dist/web/bridges/hooks/use-adaptor.d.ts +0 -2
  193. package/dist/web/bridges/hooks/use-adaptor.js +0 -8
  194. package/dist/web/bridges/hooks/use-adaptor.js.map +0 -1
  195. package/dist/web/bridges/hooks/use-apps-sdk-bridge.d.ts +0 -2
  196. package/dist/web/bridges/hooks/use-apps-sdk-bridge.js.map +0 -1
  197. package/dist/web/bridges/hooks/use-bridge.d.ts +0 -2
  198. package/dist/web/bridges/hooks/use-bridge.js +0 -8
  199. package/dist/web/bridges/hooks/use-bridge.js.map +0 -1
  200. package/dist/web/bridges/hooks/use-mcp-app-bridge.d.ts +0 -5
  201. package/dist/web/bridges/hooks/use-mcp-app-bridge.js.map +0 -1
  202. package/dist/web/bridges/hooks/use-mcp-app-bridge.test.js.map +0 -1
  203. package/dist/web/bridges/mcp-app-bridge.js.map +0 -1
  204. package/dist/web/hooks/use-openai-global.d.ts +0 -3
  205. package/dist/web/hooks/use-openai-global.js +0 -6
  206. package/dist/web/hooks/use-openai-global.js.map +0 -1
  207. /package/dist/{web/bridges/hooks/use-mcp-app-bridge.test.d.ts → server/asset-base-url-transform-plugin.test.d.ts} +0 -0
@@ -2,6 +2,8 @@ import { Command } from "@oclif/core";
2
2
  export default class Dev extends Command {
3
3
  static description: string;
4
4
  static examples: string[];
5
- static flags: {};
5
+ static flags: {
6
+ "use-forwarded-host": import("@oclif/core/interfaces").BooleanFlag<boolean>;
7
+ };
6
8
  run(): Promise<void>;
7
9
  }
@@ -1,30 +1,31 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { spawn } from "node:child_process";
3
- import { Command } from "@oclif/core";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Command, Flags } from "@oclif/core";
4
3
  import { Box, render, Text } from "ink";
5
- import { useEffect } from "react";
6
- import { useVersion } from "../cli/use-version.js";
4
+ import { Header } from "../cli/header.js";
5
+ import { useNodemon } from "../cli/use-nodemon.js";
6
+ import { useTypeScriptCheck } from "../cli/use-typescript-check.js";
7
7
  export default class Dev extends Command {
8
8
  static description = "Start development server";
9
- static examples = ["skybridge dev"];
10
- static flags = {};
9
+ static examples = ["skybridge"];
10
+ static flags = {
11
+ "use-forwarded-host": Flags.boolean({
12
+ description: "Uses the forwarded host header to construct widget URLs instead of localhost, useful when accessing the dev server through a tunnel (e.g., ngrok)",
13
+ }),
14
+ };
11
15
  async run() {
12
- console.clear();
16
+ const { flags } = await this.parse(Dev);
17
+ const env = {
18
+ ...process.env,
19
+ ...(flags["use-forwarded-host"]
20
+ ? { SKYBRIDGE_USE_FORWARDED_HOST: "true" }
21
+ : {}),
22
+ };
13
23
  const App = () => {
14
- const version = useVersion();
15
- useEffect(() => {
16
- const nodemon = spawn("nodemon", ["--quiet"], {
17
- stdio: ["ignore", "ignore", "inherit"],
18
- });
19
- return () => {
20
- if (nodemon && !nodemon.killed) {
21
- nodemon.kill();
22
- }
23
- };
24
- }, []);
25
- return (_jsxs(Box, { flexDirection: "column", padding: 1, marginLeft: 1, children: [_jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\u26F0", " ", "Welcome to Skybridge"] }), _jsxs(Text, { color: "cyan", children: [" v", version] })] }), _jsxs(Box, { children: [_jsxs(Text, { color: "green", children: ["\u2192", " "] }), _jsxs(Text, { color: "white", bold: true, children: ["Open DevTools to test your app locally:", " "] }), _jsx(Text, { color: "green", children: "http://localhost:3000/" })] }), _jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsxs(Text, { children: ["MCP server running at:", " "] }), _jsx(Text, { color: "white", bold: true, children: "http://localhost:3000/mcp" })] }), _jsx(Text, { color: "white", underline: true, children: "To test on ChatGPT:" }), _jsxs(Box, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { color: "grey", children: "Make your local server accessible with " }), _jsx(Text, { color: "white", bold: true, children: "ngrok http 3000" })] }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { color: "grey", children: "Connect to ChatGPT with URL " }), _jsx(Text, { color: "white", bold: true, children: "https://xxxxxx.ngrok-free.app/mcp" })] }) }), _jsx(Box, { children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { children: "Documentation: " }), _jsx(Text, { color: "white", bold: true, children: "https://skybridge.tech/" })] }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { children: "If you like Skybridge, please " }), _jsxs(Text, { color: "white", bold: true, children: ["give it a star", " "] }), _jsx(Text, { children: "on GitHub: " }), _jsx(Text, { color: "white", underline: true, children: "https://github.com/alpic-ai/skybridge" }), _jsx(Text, { color: "grey", children: " \uD83D\uDE4F" })] }) })] }));
24
+ const tsErrors = useTypeScriptCheck();
25
+ const messages = useNodemon(env);
26
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, marginLeft: 1, children: [_jsx(Header, { version: this.config.version }), _jsxs(Box, { children: [_jsxs(Text, { color: "green", children: ["\u2192", " "] }), _jsxs(Text, { color: "white", bold: true, children: ["Open DevTools to test your app locally:", " "] }), _jsx(Text, { color: "green", children: "http://localhost:3000/" })] }), _jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsxs(Text, { children: ["MCP server running at:", " "] }), _jsx(Text, { color: "white", bold: true, children: "http://localhost:3000/mcp" })] }), _jsx(Text, { color: "white", underline: true, children: "To test on ChatGPT:" }), _jsxs(Box, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { color: "grey", children: "Make your local server accessible with " }), _jsx(Text, { color: "white", bold: true, children: "ngrok http 3000" })] }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { color: "grey", children: "Connect to ChatGPT with URL " }), _jsx(Text, { color: "white", bold: true, children: "https://xxxxxx.ngrok-free.app/mcp" })] }) }), _jsx(Box, { children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { children: "Documentation: " }), _jsx(Text, { color: "white", bold: true, children: "https://docs.skybridge.tech/" })] }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: [_jsxs(Text, { color: "#20a832", children: ["\u2192", " "] }), _jsx(Text, { children: "If you like Skybridge, please " }), _jsxs(Text, { color: "white", bold: true, children: ["give it a star", " "] }), _jsx(Text, { children: "on GitHub: " }), _jsx(Text, { color: "white", underline: true, children: "https://github.com/alpic-ai/skybridge" }), _jsx(Text, { color: "grey", children: " \uD83D\uDE4F" })] }) }), tsErrors.length > 0 && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "red", bold: true, children: "\u26A0\uFE0F TypeScript errors found:" }), tsErrors.map((error) => (_jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "white", children: error.file }), _jsxs(Text, { color: "grey", children: ["(", error.line, ",", error.col, "):", " "] })] }), _jsx(Box, { marginLeft: 2, children: _jsx(Text, { color: "red", children: error.message }) })] }, `${error.file}:${error.line}:${error.col}`)))] })), messages.length > 0 && (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: "white", bold: true, children: "Logs:" }), messages.map((message, index) => (_jsx(Box, { marginLeft: 2, children: message.type === "restart" ? (_jsxs(_Fragment, { children: [_jsxs(Text, { color: "green", children: ["\u2713", " "] }), _jsx(Text, { color: "white", children: message.text })] })) : message.type === "error" ? (_jsx(Text, { color: "red", children: message.text })) : (_jsx(Text, { children: message.text })) }, `${message.type}-${index}-${message.text.slice(0, 20)}`)))] }))] }));
26
27
  };
27
- render(_jsx(App, {}), { exitOnCtrlC: true, patchConsole: false });
28
+ render(_jsx(App, {}), { exitOnCtrlC: true, patchConsole: true });
28
29
  }
29
30
  }
30
31
  //# sourceMappingURL=dev.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Command } from "@oclif/core";
2
+ export default class Start extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {};
6
+ run(): Promise<void>;
7
+ }
@@ -0,0 +1,33 @@
1
+ import { existsSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { Command } from "@oclif/core";
4
+ import { runCommand } from "../cli/run-command.js";
5
+ export default class Start extends Command {
6
+ static description = "Start production server";
7
+ static examples = ["skybridge start"];
8
+ static flags = {};
9
+ async run() {
10
+ console.clear();
11
+ const candidates = [
12
+ resolve(process.cwd(), "dist/server/src/index.js"),
13
+ resolve(process.cwd(), "dist/index.js"),
14
+ ];
15
+ const indexPath = candidates.find(existsSync);
16
+ if (!indexPath) {
17
+ console.error("❌ Error: No build output found");
18
+ console.error("");
19
+ console.error("Please build your project first:");
20
+ console.error(" skybridge build");
21
+ console.error("");
22
+ process.exit(1);
23
+ return;
24
+ }
25
+ console.log(`\x1b[36m\x1b[1m⛰ Welcome to Skybridge\x1b[0m \x1b[36mv${this.config.version}\x1b[0m`);
26
+ console.log(`Server running at: \x1b[32m\x1b[1mhttp://localhost:3000/mcp\x1b[0m`);
27
+ await runCommand(`node ${indexPath}`, {
28
+ stdio: ["ignore", "inherit", "inherit"],
29
+ env: { ...process.env, NODE_ENV: "production" },
30
+ });
31
+ }
32
+ }
33
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,WAAW,GAAG,yBAAyB,CAAC;IACxD,MAAM,CAAU,QAAQ,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,CAAU,KAAK,GAAG,EAAE,CAAC;IAEpB,KAAK,CAAC,GAAG;QACd,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,MAAM,UAAU,GAAG;YACjB,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC;YAClD,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC;SACxC,CAAC;QAEF,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,0DAA0D,IAAI,CAAC,MAAM,CAAC,OAAO,SAAS,CACvF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,oEAAoE,CACrE,CAAC;QAEF,MAAM,UAAU,CAAC,QAAQ,SAAS,EAAE,EAAE;YACpC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;YACvC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE;SAChD,CAAC,CAAC;IACL,CAAC"}
@@ -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,11 @@
1
+ import type { Plugin } from "vite";
2
+ /**
3
+ * Transforms asset import paths to use the development server base URL.
4
+ */
5
+ export declare function assetBaseUrlTransform(code: string, devServerOrigin: string): string;
6
+ /**
7
+ * Vite plugin that transforms asset import paths to use the development server base URL.
8
+ */
9
+ export declare function assetBaseUrlTransformPlugin(options: {
10
+ devServerOrigin: string;
11
+ }): Plugin;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transforms asset import paths to use the development server base URL.
3
+ */
4
+ export function assetBaseUrlTransform(code, devServerOrigin) {
5
+ const assetStringPattern = /(?<!https?:\/\/)(["'`])(\/[^"'`]+\.(svg|png|jpeg|jpg|gif|webp|mp3|mp4|woff|woff2|ttf|eot))\1/g;
6
+ code = code.replace(assetStringPattern, (_match, quote, assetPath) => {
7
+ return `${quote}${devServerOrigin}${assetPath}${quote}`;
8
+ });
9
+ return code;
10
+ }
11
+ /**
12
+ * Vite plugin that transforms asset import paths to use the development server base URL.
13
+ */
14
+ export function assetBaseUrlTransformPlugin(options) {
15
+ const { devServerOrigin } = options;
16
+ return {
17
+ name: "asset-base-url-transform",
18
+ enforce: "pre",
19
+ transform(code) {
20
+ if (!code) {
21
+ return null;
22
+ }
23
+ const transformedCode = assetBaseUrlTransform(code, devServerOrigin);
24
+ if (transformedCode === code) {
25
+ return null;
26
+ }
27
+ return {
28
+ code: transformedCode,
29
+ map: null,
30
+ };
31
+ },
32
+ };
33
+ }
34
+ //# 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;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,eAAuB;IAEvB,MAAM,kBAAkB,GACtB,+FAA+F,CAAC;IAElG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACnE,OAAO,GAAG,KAAK,GAAG,eAAe,GAAG,SAAS,GAAG,KAAK,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAE3C;IACC,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAEpC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QACd,SAAS,CAAC,IAAI;YACZ,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAErE,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,56 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { assetBaseUrlTransform } from "./asset-base-url-transform-plugin.js";
3
+ describe("assetBaseUrlTransform", () => {
4
+ const devServerOrigin = "http://localhost:3000";
5
+ it("should transform asset paths in single, double, and backtick quotes", () => {
6
+ const cases = [
7
+ {
8
+ desc: "single-quoted",
9
+ code: `const image = '/assets/logo.png';`,
10
+ expected: `const image = '${devServerOrigin}/assets/logo.png';`,
11
+ },
12
+ {
13
+ desc: "double-quoted",
14
+ code: `const image = "/assets/logo.png";`,
15
+ expected: `const image = "${devServerOrigin}/assets/logo.png";`,
16
+ },
17
+ {
18
+ desc: "backtick-quoted",
19
+ code: "const image = `/assets/logo.png`;",
20
+ expected: `const image = \`${devServerOrigin}/assets/logo.png\`;`,
21
+ },
22
+ ];
23
+ for (const { code, expected } of cases) {
24
+ const result = assetBaseUrlTransform(code, devServerOrigin);
25
+ expect(result).toBe(expected);
26
+ }
27
+ });
28
+ it("should transform multiple asset paths", () => {
29
+ const code = `
30
+ const logo = '/assets/logo.png';
31
+ const icon = '/assets/icon.svg';
32
+ const font = '/assets/font.woff2';
33
+ `;
34
+ const result = assetBaseUrlTransform(code, devServerOrigin);
35
+ expect(result).toContain(`${devServerOrigin}/assets/logo.png`);
36
+ expect(result).toContain(`${devServerOrigin}/assets/icon.svg`);
37
+ expect(result).toContain(`${devServerOrigin}/assets/font.woff2`);
38
+ });
39
+ it("should not transform already absolute URLs", () => {
40
+ const code = `
41
+ const local = '/assets/logo.png';
42
+ const http = 'http://example.com/image.png';
43
+ const https = 'https://example.com/image.png';
44
+ `;
45
+ const result = assetBaseUrlTransform(code, devServerOrigin);
46
+ expect(result).toContain(`${devServerOrigin}/assets/logo.png`);
47
+ expect(result).toContain("http://example.com/image.png");
48
+ expect(result).toContain("https://example.com/image.png");
49
+ });
50
+ it("should not transform code without asset paths", () => {
51
+ const code = `const text = "Hello World";`;
52
+ const result = assetBaseUrlTransform(code, devServerOrigin);
53
+ expect(result).toBe(code);
54
+ });
55
+ });
56
+ //# 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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAE7E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,eAAe,GAAG,uBAAuB,CAAC;IAEhD,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG;YACZ;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,kBAAkB,eAAe,oBAAoB;aAChE;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,kBAAkB,eAAe,oBAAoB;aAChE;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,mBAAmB,eAAe,qBAAqB;aAClE;SACF,CAAC;QAEF,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,oBAAoB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG;;;;KAIZ,CAAC;QACF,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,eAAe,kBAAkB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,6BAA6B,CAAC;QAC3C,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import express from "express";
2
+ import type { McpServer } from "./server";
3
+ export declare function createServer({ server, customMiddleware, }: {
4
+ server: McpServer;
5
+ customMiddleware?: {
6
+ path?: string;
7
+ handlers: express.RequestHandler[];
8
+ }[];
9
+ }): Promise<express.Express>;
@@ -0,0 +1,72 @@
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
+ export async function createServer({ server, customMiddleware = [], }) {
6
+ const app = express();
7
+ app.use(express.json());
8
+ const env = process.env.NODE_ENV || "development";
9
+ for (const middleware of customMiddleware) {
10
+ if (middleware.path) {
11
+ app.use(middleware.path, ...middleware.handlers);
12
+ }
13
+ else {
14
+ app.use(...middleware.handlers);
15
+ }
16
+ }
17
+ if (env !== "production") {
18
+ const { devtoolsStaticServer } = await import("@skybridge/devtools");
19
+ app.use(await devtoolsStaticServer());
20
+ const { widgetsDevServer } = await import("./widgetsDevServer.js");
21
+ app.use(await widgetsDevServer());
22
+ }
23
+ if (env === "production") {
24
+ const assetsPath = path.join(process.cwd(), "dist", "assets");
25
+ app.use("/assets", cors());
26
+ app.use("/assets", express.static(assetsPath));
27
+ }
28
+ app.use("/mcp", mcpMiddleware(server));
29
+ return app;
30
+ }
31
+ const mcpMiddleware = (server) => {
32
+ return async (req, res, _next) => {
33
+ if (req.method !== "POST") {
34
+ res.writeHead(405).end(JSON.stringify({
35
+ jsonrpc: "2.0",
36
+ error: {
37
+ code: -32000,
38
+ message: "Method not allowed.",
39
+ },
40
+ id: null,
41
+ }));
42
+ return;
43
+ }
44
+ try {
45
+ const transport = new StreamableHTTPServerTransport({
46
+ sessionIdGenerator: undefined,
47
+ });
48
+ res.on("close", () => {
49
+ transport.close();
50
+ });
51
+ await server.connect(transport);
52
+ // Express strips the mount path from req.url (e.g. "/mcp" becomes "/").
53
+ // Restore it so the SDK builds the correct requestInfo.url.
54
+ req.url = req.originalUrl;
55
+ await transport.handleRequest(req, res, req.body);
56
+ }
57
+ catch (error) {
58
+ console.error("Error handling MCP request:", error);
59
+ if (!res.headersSent) {
60
+ res.status(500).json({
61
+ jsonrpc: "2.0",
62
+ error: {
63
+ code: -32603,
64
+ message: "Internal server error",
65
+ },
66
+ id: null,
67
+ });
68
+ }
69
+ }
70
+ };
71
+ };
72
+ //# 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 {};
@@ -0,0 +1,74 @@
1
+ import http from "node:http";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
+ vi.mock("@skybridge/devtools", () => ({
4
+ devtoolsStaticServer: () => ((_req, _res, next) => next()),
5
+ }));
6
+ vi.mock("./widgetsDevServer.js", () => ({
7
+ widgetsDevServer: () => ((_req, _res, next) => next()),
8
+ }));
9
+ const fakeServer = {};
10
+ async function listen(app) {
11
+ const server = http.createServer(app);
12
+ await new Promise((resolve) => server.listen(0, resolve));
13
+ const port = server.address().port;
14
+ return { port, server };
15
+ }
16
+ let openServer;
17
+ afterEach(() => openServer?.close());
18
+ async function postMcp(port) {
19
+ return fetch(`http://localhost:${port}/mcp`, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({ jsonrpc: "2.0", method: "initialize", id: 1 }),
23
+ });
24
+ }
25
+ describe("createServer", () => {
26
+ it("runs global custom middleware before the /mcp handler", async () => {
27
+ const { createServer } = await import("./express.js");
28
+ const calls = [];
29
+ const mw = (_req, _res, next) => {
30
+ calls.push("custom");
31
+ next();
32
+ };
33
+ const app = await createServer({
34
+ server: fakeServer,
35
+ customMiddleware: [{ handlers: [mw] }],
36
+ });
37
+ const { port, server } = await listen(app);
38
+ openServer = server;
39
+ await postMcp(port);
40
+ expect(calls).toEqual(["custom"]);
41
+ });
42
+ it("runs path-scoped middleware on /mcp", async () => {
43
+ const { createServer } = await import("./express.js");
44
+ const calls = [];
45
+ const mw = (_req, _res, next) => {
46
+ calls.push("auth");
47
+ next();
48
+ };
49
+ const app = await createServer({
50
+ server: fakeServer,
51
+ customMiddleware: [{ path: "/mcp", handlers: [mw] }],
52
+ });
53
+ const { port, server } = await listen(app);
54
+ openServer = server;
55
+ await postMcp(port);
56
+ expect(calls).toEqual(["auth"]);
57
+ });
58
+ it("allows middleware to short-circuit with 401", async () => {
59
+ const { createServer } = await import("./express.js");
60
+ const reject = (_req, res) => {
61
+ res.status(401).json({ error: "Unauthorized" });
62
+ };
63
+ const app = await createServer({
64
+ server: fakeServer,
65
+ customMiddleware: [{ path: "/mcp", handlers: [reject] }],
66
+ });
67
+ const { port, server } = await listen(app);
68
+ openServer = server;
69
+ const res = await postMcp(port);
70
+ expect(res.status).toBe(401);
71
+ expect(await res.json()).toEqual({ error: "Unauthorized" });
72
+ });
73
+ });
74
+ //# sourceMappingURL=express.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.test.js","sourceRoot":"","sources":["../../src/server/express.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { McpServer as McpServerBase, type RegisteredTool } from "@modelcontextpr
3
3
  import type { AnySchema, SchemaOutput, ZodRawShapeCompat } from "@modelcontextprotocol/sdk/server/zod-compat.js";
4
4
  import type { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
5
5
  import type { CallToolResult, Resource, ServerNotification, ServerRequest, ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
6
+ import type { RequestHandler } from "express";
6
7
  export type ToolDef<TInput = unknown, TOutput = unknown, TResponseMetadata = unknown> = {
7
8
  input: TInput;
8
9
  output: TOutput;
@@ -14,10 +15,6 @@ export type ToolDef<TInput = unknown, TOutput = unknown, TResponseMetadata = unk
14
15
  * @see https://github.com/modelcontextprotocol/ext-apps/pull/158
15
16
  */
16
17
  type ExtendedMcpUiResourceCsp = McpUiResourceMeta["csp"] & {
17
- /** Origins allowed for nested iframe embeds */
18
- frameDomains?: string[];
19
- /** Origins permitted for the <base> tag URI directive */
20
- baseUriDomains?: string[];
21
18
  /**
22
19
  * Origins that can receive openExternal redirects without safe-link modal (OpenAI-specific)
23
20
  * @see https://developers.openai.com/apps-sdk/reference#component-resource-_meta-fields
@@ -35,6 +32,8 @@ export type WidgetResourceMeta = {
35
32
  export type WidgetHostType = "apps-sdk" | "mcp-app";
36
33
  type McpServerOriginalResourceConfig = Omit<Resource, "uri" | "name" | "mimeType" | "_meta"> & {
37
34
  _meta?: WidgetResourceMeta;
35
+ /** Restrict host types to a specific subset */
36
+ hosts?: WidgetHostType[];
38
37
  };
39
38
  type McpServerOriginalToolConfig = Omit<Parameters<typeof McpServerBase.prototype.registerTool<ZodRawShapeCompat, ZodRawShapeCompat>>[1], "inputSchema" | "outputSchema">;
40
39
  type Simplify<T> = {
@@ -83,6 +82,11 @@ type ToolHandler<TInput extends ZodRawShapeCompat, TReturn extends {
83
82
  } = CallToolResult> = (args: ShapeOutput<TInput>, extra: RequestHandlerExtra<ServerRequest, ServerNotification>) => TReturn | Promise<TReturn>;
84
83
  export declare class McpServer<TTools extends Record<string, ToolDef> = Record<never, ToolDef>> extends McpServerBase {
85
84
  readonly $types: McpServerTypes<TTools>;
85
+ private express?;
86
+ private customMiddleware;
87
+ use(...handlers: RequestHandler[]): this;
88
+ use(path: string, ...handlers: RequestHandler[]): this;
89
+ run(): Promise<void>;
86
90
  registerWidget<TName extends string, TInput extends ZodRawShapeCompat, TReturn extends {
87
91
  content: CallToolResult["content"];
88
92
  }>(name: TName, resourceConfig: McpServerOriginalResourceConfig, toolConfig: McpServerOriginalToolConfig & {