sunpeak 0.14.3 → 0.15.4

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 (125) hide show
  1. package/README.md +34 -30
  2. package/bin/commands/build.mjs +2 -1
  3. package/bin/commands/dev.mjs +72 -2
  4. package/dist/chatgpt/{conversation.d.ts → chatgpt-conversation.d.ts} +1 -1
  5. package/dist/chatgpt/chatgpt-host.d.ts +1 -0
  6. package/dist/chatgpt/globals.css +618 -6156
  7. package/dist/chatgpt/index.cjs +11 -8
  8. package/dist/chatgpt/index.cjs.map +1 -1
  9. package/dist/chatgpt/index.d.ts +10 -32
  10. package/dist/chatgpt/index.js +15 -12
  11. package/dist/chatgpt/index.js.map +1 -1
  12. package/dist/claude/claude-conversation.d.ts +23 -0
  13. package/dist/claude/claude-host.d.ts +1 -0
  14. package/dist/claude/index.cjs +5 -0
  15. package/dist/claude/index.cjs.map +1 -0
  16. package/dist/claude/index.d.ts +1 -0
  17. package/dist/claude/index.js +5 -0
  18. package/dist/claude/index.js.map +1 -0
  19. package/dist/{discovery-COZUnY6a.js → discovery-DzV3HLXs.js} +5 -5
  20. package/dist/{discovery-COZUnY6a.js.map → discovery-DzV3HLXs.js.map} +1 -1
  21. package/dist/hooks/index.d.ts +4 -0
  22. package/dist/hooks/use-app-tools.d.ts +44 -0
  23. package/dist/hooks/use-update-model-context.d.ts +29 -0
  24. package/dist/index-B0dxRJvS.cjs +42 -0
  25. package/dist/index-B0dxRJvS.cjs.map +1 -0
  26. package/dist/index-Ce_5ZIdJ.js +512 -0
  27. package/dist/index-Ce_5ZIdJ.js.map +1 -0
  28. package/dist/index-Cngntkp2.cjs +527 -0
  29. package/dist/index-Cngntkp2.cjs.map +1 -0
  30. package/dist/index-CutQgPzR.js +43 -0
  31. package/dist/index-CutQgPzR.js.map +1 -0
  32. package/dist/index.cjs +1705 -1647
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.ts +2 -1
  35. package/dist/index.js +2732 -2675
  36. package/dist/index.js.map +1 -1
  37. package/dist/lib/default-style-variables.d.ts +2 -0
  38. package/dist/lib/discovery-cli.js +1 -1
  39. package/dist/mcp/index.cjs +86 -27
  40. package/dist/mcp/index.cjs.map +1 -1
  41. package/dist/mcp/index.d.ts +3 -1
  42. package/dist/mcp/index.js +85 -26
  43. package/dist/mcp/index.js.map +1 -1
  44. package/dist/mcp/server.d.ts +4 -3
  45. package/dist/mcp/types.d.ts +11 -0
  46. package/dist/platform/chatgpt/index.cjs +1 -1
  47. package/dist/platform/chatgpt/index.js +1 -1
  48. package/dist/platform/index.cjs +3 -0
  49. package/dist/platform/index.cjs.map +1 -1
  50. package/dist/platform/index.d.ts +3 -1
  51. package/dist/platform/index.js +3 -0
  52. package/dist/platform/index.js.map +1 -1
  53. package/dist/{protocol-BQCnIrc9.js → protocol-DFbsCx7E.js} +29 -29
  54. package/dist/{protocol-BQCnIrc9.js.map → protocol-DFbsCx7E.js.map} +1 -1
  55. package/dist/simulator/host-styles.d.ts +5 -0
  56. package/dist/simulator/hosts.d.ts +73 -0
  57. package/dist/{chatgpt → simulator}/iframe-resource.d.ts +27 -3
  58. package/dist/simulator/index.cjs +39 -0
  59. package/dist/simulator/index.cjs.map +1 -0
  60. package/dist/simulator/index.d.ts +18 -0
  61. package/dist/simulator/index.js +39 -0
  62. package/dist/simulator/index.js.map +1 -0
  63. package/dist/{chatgpt → simulator}/mcp-app-host.d.ts +8 -1
  64. package/dist/simulator/mock-openai-runtime.d.ts +20 -0
  65. package/dist/{chatgpt → simulator}/simulator-url.d.ts +8 -1
  66. package/dist/simulator/simulator.d.ts +12 -0
  67. package/dist/{chatgpt → simulator}/theme-provider.d.ts +3 -1
  68. package/dist/simulator/use-simulator-state.d.ts +91 -0
  69. package/dist/simulator-CxrtnguM.js +8764 -0
  70. package/dist/simulator-CxrtnguM.js.map +1 -0
  71. package/dist/simulator-DcfQBRXE.cjs +8779 -0
  72. package/dist/simulator-DcfQBRXE.cjs.map +1 -0
  73. package/dist/simulator-url-CuLqtnSS.js +48 -0
  74. package/dist/simulator-url-CuLqtnSS.js.map +1 -0
  75. package/dist/simulator-url-rgg_KYOg.cjs +47 -0
  76. package/dist/simulator-url-rgg_KYOg.cjs.map +1 -0
  77. package/dist/style.css +558 -6143
  78. package/dist/types/runtime.d.ts +1 -1
  79. package/dist/{use-app-D7kRAPSG.cjs → use-app-BnoSPiUT.cjs} +2 -1
  80. package/dist/{use-app-D7kRAPSG.cjs.map → use-app-BnoSPiUT.cjs.map} +1 -1
  81. package/dist/{use-app-Dvr4LKs2.js → use-app-D_TeaMFG.js} +4 -3
  82. package/dist/{use-app-Dvr4LKs2.js.map → use-app-D_TeaMFG.js.map} +1 -1
  83. package/package.json +18 -3
  84. package/template/.sunpeak/dev.tsx +4 -4
  85. package/template/.sunpeak/resource-loader.html +1 -1
  86. package/template/README.md +1 -1
  87. package/template/node_modules/.bin/nodemon +2 -2
  88. package/template/node_modules/.bin/playwright +2 -2
  89. package/template/node_modules/.bin/sunpeak +2 -2
  90. package/template/node_modules/.bin/tsc +2 -2
  91. package/template/node_modules/.bin/tsserver +2 -2
  92. package/template/node_modules/.bin/tsx +2 -2
  93. package/template/node_modules/.bin/vite +2 -2
  94. package/template/src/components/avatar.tsx +4 -1
  95. package/template/src/components/button.tsx +17 -20
  96. package/template/src/resources/albums/albums-resource.tsx +2 -3
  97. package/template/src/resources/albums/components/album-card.tsx +4 -2
  98. package/template/src/resources/albums/components/film-strip.test.tsx +2 -2
  99. package/template/src/resources/albums/components/film-strip.tsx +2 -2
  100. package/template/src/resources/albums/components/fullscreen-viewer.tsx +7 -5
  101. package/template/src/resources/carousel/carousel-resource.tsx +2 -3
  102. package/template/src/resources/carousel/components/card.test.tsx +3 -2
  103. package/template/src/resources/carousel/components/card.tsx +8 -4
  104. package/template/src/resources/map/components/map-view.tsx +1 -1
  105. package/template/src/resources/map/components/map.tsx +1 -1
  106. package/template/src/resources/map/components/place-card.tsx +8 -4
  107. package/template/src/resources/map/components/place-carousel.tsx +1 -1
  108. package/template/src/resources/map/components/place-inspector.tsx +15 -7
  109. package/template/src/resources/map/components/place-list.tsx +7 -4
  110. package/template/src/resources/map/map-resource.tsx +0 -2
  111. package/template/src/resources/review/review-resource.tsx +61 -27
  112. package/template/tests/e2e/albums.spec.ts +118 -102
  113. package/template/tests/e2e/carousel.spec.ts +103 -100
  114. package/template/tests/e2e/map.spec.ts +220 -181
  115. package/template/tests/e2e/review.spec.ts +224 -198
  116. package/dist/_commonjsHelpers-Bc2YnDe1.cjs +0 -8
  117. package/dist/_commonjsHelpers-Bc2YnDe1.cjs.map +0 -1
  118. package/dist/_commonjsHelpers-DWwsNxpa.js +0 -9
  119. package/dist/_commonjsHelpers-DWwsNxpa.js.map +0 -1
  120. package/dist/index-CJ3jfcjj.js +0 -15131
  121. package/dist/index-CJ3jfcjj.js.map +0 -1
  122. package/dist/index-Cdeg96So.cjs +0 -15147
  123. package/dist/index-Cdeg96So.cjs.map +0 -1
  124. /package/dist/{chatgpt → simulator}/simple-sidebar.d.ts +0 -0
  125. /package/dist/{chatgpt/chatgpt-simulator-types.d.ts → simulator/simulator-types.d.ts} +0 -0
@@ -0,0 +1,2 @@
1
+ import { McpUiStyles } from '@modelcontextprotocol/ext-apps';
2
+ export declare const DEFAULT_STYLE_VARIABLES: McpUiStyles;
@@ -1,4 +1,4 @@
1
- import { e, f, g, h, i, j, k, l, t } from "../discovery-COZUnY6a.js";
1
+ import { e, f, g, h, i, j, k, l, t } from "../discovery-DzV3HLXs.js";
2
2
  import path from "path";
3
3
  async function extractResourceExport(tsxPath) {
4
4
  const esbuild = await import("esbuild");
@@ -5,11 +5,13 @@ const node_url = require("node:url");
5
5
  const fs = require("node:fs");
6
6
  const path = require("node:path");
7
7
  const protocol = require("../protocol-CL4_Npj5.cjs");
8
- const _commonjsHelpers = require("../_commonjsHelpers-Bc2YnDe1.cjs");
9
8
  const zod = require("zod");
10
9
  const sse_js = require("@modelcontextprotocol/sdk/server/sse.js");
11
10
  const FAVICON_BASE64 = "iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAiLSURBVHgB7Z1NbBNHGIZfJ4GWJIAjfhKBKDYglaolGBAqUAncqNAbTTijErhUaiVIqFROJIWeeiiEnsoFEokzGE4VVJDmAFSU4oRDW/Fji6qIIFAMJKD84X7fOg5pEnt3s/Z6x/M9MPbYXhOy37vz887sjA+W2OwDZvuBl/VAyVbgdQhIBgCfH4IHSCYoFlHKxCl1AeURoJ/eu5k0+6Yv+8cceA706H56bpSAK0U7UHoUeDsOdGYUQhYBhKuAgRbKNEFQGN+RVPptWhFkEMCHQSrmL1MmAKEYiFPVXUciiE3+YBoBSPCLlPh0IpgkAAl+kROfLIIJAghTfuA+iiz4vikZiySNv8VIHBheD0T7+EXZm/f7W+ksBaAwvrEHf8UoAjWDCAVfYXn1oJH8lSMILB6i51HjWH72V4wY+cRAGRL9pak0kErxR2/hweO3EO+l9Hg2ovfKUz9EfWEEgFncuG/mF2PXxSYq+kfvQzHSAQ9QgMNr+rG19jnCtS+M17mGRRK9N8cQQtfteejsmWsIJamsGkop5tfjYwLYeJoeGqEA6aBzoHdu6kP9lkReAm4FFsGFa1XovD3XEIZiYjgB3GiiUxkic2dWHzyOb0LQG3c8HS++vQJXFT9GqhEhQcR7Z6sgBnIKh4N0Wjc20ovT8ChcnzfueILPNvdhGwlABc5f86Pj4iISg+eN070+Lxf/6eDzs4pwSdB+aSG8S0k7C+AW5UIQdCRaAjF9dCbAApARPn3xl0DQmjIUiGBNYfruXiTRX4Y+ciELgesC4P78gfpeHP/iAYQU7CHsOxZEZ/dc121m7gW49jOryH8/23LHMHSEqRw5s4TSUldFQOXO0m/hAsGaIVw9/idCK19CmB6+MObTRXLx5ny4hSslwLpVr3D28J2CefaqweMKdYdWu9IuyLsAWNVnW+96zrv3OtwuqPtmteEm5pO8C6Bx+1MIM4ODzyOO+cTVRqDgPcQI0hwRgOaIADQnZ04gT9UKrxWDJ9/wPMRbd8uRK3ImgNbdDyn9CyH/cPfwSo56BzmpAvZufyLBd5FTX8cMWz0XOBZAsHoILXT1C+7BjiqPqeQCxwJooStfLF73YYe1ueERnOLICGqkov/UwRiEwsANwvVffeDILnYkgNCKl+O3WgmFgYPP4wYzRaxgzREjSHNEAJojAtAc205gw0cJ+Mul4edFovfLceveHFvfsdUIZNPnfkc3BG/CAlj35fu2vmOrCmgRu9fTcLf8Y5szri0LIEBXPxs/grexe5FaFkC49jkE78MWsZ3b6S3fF3DqYBw1VcMQvM/gsA+dPfMsHWu5ESgDPmph1R4WK1hzxAjSHBGA5ogANMfUCm7YklB2lS7d4YmjZpNFTBuBsY4e6QEoyolz1Wg6+U7WY7JWATzbR4KvLmstrMWQVQDsLQvqEnIsAFnNQ2mMZfNNSvCsjcCta14ovBy6wIRWvsrqCooTqDniA2iOCEBzRACak7URaHejLcF7mDXwMgpApoAVB88GSnGcHMFMZBHAoNzzXwQkTAQgbYAix2wgTwSgOSIAzTGdFCp2sNrM2Apm2ApWZcNmYXpORKqNLWgykVUAPJtExgPUpsNk8+qsbYBsyhHUwGzLmZLsX66EoC68ZIwZWQXAkwl5NElQEysluGkvIHK1CssXD0FQj/NXzTeGFytYc8QI0hwRgOaIADTH8lKxPvGElcHO7XyWBcB71MhCEWpw/pofbedqLB1rWQDd9ypklrAiHDmz1PKxltsAEQt9SqHwxMi8s7PjuGUBsK14xeLqk0LhOHpmia3jbfUC7P7jgruwdc/OrR1sbRjBRctpk+FFoXD0UCltd+xGrGDNESNIc0QAmiMC0Bzbu4ZNRiziwuJ0FTdHAmiq78WBhl4IhaPh6CpHczcdCaD9l4XYTwIIynKyBYG75E4n7jpqA/AdxPt+CEJwH75z++BPy+AUx41ANofaItZGnoTcwNX+ru9WkenjuAmXm15AMynx1t1y4z8mKf+JLflc3bORMyeQF5Vq3P4UQn5hq7cty6JPdhErWHPECNIcEYDmiAA0x3k/wgTf+INgFzc268i7AFp3PzS2NBcN2KOvvwwHTy5De54n4FjePXymsFHkoz+80oiIwBoc/LpD7+Ln3+cj3+RdAAyL4Bn9Up9ueCajhyawxbul+T389c8cuIGrPgDvQnb28F0Ea2TwaDqudM/DvmMBy1u/5wLXjSB2DC9//3dqOzMpDVIkU4s5NZvs8pkPCuYE1suexOPwer52bubIJWIFa44YQZrDAkhA0JUECyAOQVfi5AT6uqkZGoIH4Uaiv3JESTs5beO62aWbAVESQLKTMnvgQXjyQ/2WPnz+yVOEa58rYSJx3BNmenVcWoDz16q8LoBf6ZSG/MCsGL3w9AIAqW3sHmLbmhdG3ktiSI49dPbMw4XrfrRfXJCT+Xr5Z7hq7DRubKOHA1CEMI0r7OGVzMfEwNWD27qYGPSu27ONfnyh+vIz5DRwY9/YedsUAEZjUBC2l1kQOzcljLy/YiT1QQ5FkRx/SNXpnRTwLgp85Op8Ra706SgNAtfjE87RhuPUK2yC4rAIeNvb0IqXqOX8oiEEaOxhXBgWMdZJpro8Gptj3HdvBL67UuGA/w8q8W80c2aCALgtMPsPknrR3unB1YW/cjSjBZ3eYs3jDTeH+KikL19PlZfh/0wqJbkqeH25mEWgNxz8kjou+tPvTLKC+YPkrtSBQnHBMeXYvgm+8e70B0tJUFxMvfLTZBgM4gOHqJ54zd1DGS1UF45dW6rOnxp8xkJPyegituKNWyjTOLyNYUZSilBX72imwKexEcww9RIG6imzjdJaSgF43D3UCA54nAr0KJXaXUBFJN3KN+M/cngKDJvF2pMAAAAASUVORK5CYII=";
12
11
  const FAVICON_BUFFER = Buffer.from(FAVICON_BASE64, "base64");
12
+ function getDefaultExportFromCjs(x2) {
13
+ return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2;
14
+ }
13
15
  var ajv = { exports: {} };
14
16
  var core$1 = {};
15
17
  var validate = {};
@@ -6320,7 +6322,7 @@ function requireAjv() {
6320
6322
  return ajv.exports;
6321
6323
  }
6322
6324
  var ajvExports = requireAjv();
6323
- const Ajv = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(ajvExports);
6325
+ const Ajv = /* @__PURE__ */ getDefaultExportFromCjs(ajvExports);
6324
6326
  var dist = { exports: {} };
6325
6327
  var formats = {};
6326
6328
  var hasRequiredFormats;
@@ -6645,7 +6647,7 @@ function requireDist() {
6645
6647
  return dist.exports;
6646
6648
  }
6647
6649
  var distExports = requireDist();
6648
- const _addFormats = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(distExports);
6650
+ const _addFormats = /* @__PURE__ */ getDefaultExportFromCjs(distExports);
6649
6651
  function createDefaultAjvInstance() {
6650
6652
  const ajv2 = new Ajv({
6651
6653
  strict: false,
@@ -14201,6 +14203,18 @@ function hk(r, i, o, t) {
14201
14203
  function ak(r, i, o, t, n) {
14202
14204
  r.registerResource(i, o, { mimeType: EI, ...t }, n);
14203
14205
  }
14206
+ var C6 = "io.modelcontextprotocol/ui";
14207
+ function pk(r) {
14208
+ if (!r) return;
14209
+ return r.extensions?.[C6];
14210
+ }
14211
+ const LOCAL_DEV_SERVER_URL = "http://localhost:8000";
14212
+ const LOCAL_HMR_WS_URL = "ws://localhost:24678";
14213
+ function needsProdBuild(headers) {
14214
+ const ua = headers["user-agent"];
14215
+ const userAgent = typeof ua === "string" ? ua : Array.isArray(ua) ? ua[0] : "";
14216
+ return /claude/i.test(userAgent ?? "");
14217
+ }
14204
14218
  function readResourceHtmlProd(distPath) {
14205
14219
  const htmlPath = path.resolve(distPath);
14206
14220
  if (!fs.existsSync(htmlPath)) {
@@ -14213,7 +14227,7 @@ function readResourceHtmlProd(distPath) {
14213
14227
  function getViteResourceHtml(srcPath) {
14214
14228
  const fileName = srcPath.split("/").pop()?.replace(/-resource\.tsx$/, "") ?? "";
14215
14229
  const componentName = fileName.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("") + "Resource";
14216
- const devServerUrl = "http://localhost:8000";
14230
+ const devServerUrl = LOCAL_DEV_SERVER_URL;
14217
14231
  const entryParams = new URLSearchParams({ src: srcPath, component: componentName });
14218
14232
  const virtualModuleUrl = `${devServerUrl}/@id/virtual:sunpeak-entry?${entryParams.toString()}`;
14219
14233
  return `<!DOCTYPE html>
@@ -14252,38 +14266,44 @@ function getViteResourceHtml(srcPath) {
14252
14266
  </body>
14253
14267
  </html>`;
14254
14268
  }
14255
- function getResourceHtml(simulation, viteMode) {
14256
- if (viteMode && simulation.srcPath) {
14269
+ function getResourceHtml(simulation, viteMode, prodBuild) {
14270
+ if (viteMode && simulation.srcPath && !prodBuild) {
14257
14271
  return getViteResourceHtml(simulation.srcPath);
14258
14272
  }
14259
14273
  return readResourceHtmlProd(simulation.distPath);
14260
14274
  }
14261
- const DEV_SERVER_URL = "http://localhost:8000";
14262
- const HMR_WS_URL = "ws://localhost:24678";
14263
14275
  function injectViteCSP(existingMeta) {
14264
14276
  const meta = existingMeta ?? {};
14265
14277
  const ui2 = meta.ui ?? {};
14266
14278
  const csp = ui2.csp ?? {};
14267
14279
  const existingResourceDomains = csp.resourceDomains ?? [];
14268
- const resourceDomains = existingResourceDomains.includes(DEV_SERVER_URL) ? existingResourceDomains : [...existingResourceDomains, DEV_SERVER_URL];
14280
+ const resourceDomains = existingResourceDomains.includes(LOCAL_DEV_SERVER_URL) ? existingResourceDomains : [...existingResourceDomains, LOCAL_DEV_SERVER_URL];
14269
14281
  const existingConnectDomains = csp.connectDomains ?? [];
14270
- const connectDomains = existingConnectDomains.includes(HMR_WS_URL) ? existingConnectDomains : [...existingConnectDomains, HMR_WS_URL];
14282
+ const connectDomains = [...existingConnectDomains];
14283
+ if (!connectDomains.includes(LOCAL_DEV_SERVER_URL)) connectDomains.push(LOCAL_DEV_SERVER_URL);
14284
+ if (!connectDomains.includes(LOCAL_HMR_WS_URL)) connectDomains.push(LOCAL_HMR_WS_URL);
14271
14285
  return {
14272
14286
  ...meta,
14273
14287
  ui: {
14274
14288
  ...ui2,
14275
- csp: {
14276
- ...csp,
14277
- resourceDomains,
14278
- connectDomains
14279
- }
14289
+ csp: { ...csp, resourceDomains, connectDomains }
14280
14290
  }
14281
14291
  };
14282
14292
  }
14283
14293
  function createAppServer(config, simulations, viteMode) {
14284
14294
  const { name = "sunpeak-app", version = "0.1.0" } = config;
14285
14295
  const mcpServer = new McpServer(
14286
- { name, version },
14296
+ {
14297
+ name,
14298
+ version,
14299
+ icons: [
14300
+ {
14301
+ src: `data:image/png;base64,${FAVICON_BASE64}`,
14302
+ mimeType: "image/png",
14303
+ sizes: ["128x128"]
14304
+ }
14305
+ ]
14306
+ },
14287
14307
  { capabilities: { resources: {}, tools: {} } }
14288
14308
  );
14289
14309
  const registeredResources = /* @__PURE__ */ new Set();
@@ -14296,32 +14316,39 @@ function createAppServer(config, simulations, viteMode) {
14296
14316
  const toolMeta = tool._meta ?? {};
14297
14317
  if (!registeredResources.has(uri2)) {
14298
14318
  registeredResources.add(uri2);
14319
+ const listMeta = viteMode ? injectViteCSP(resourceMeta) : resourceMeta;
14320
+ console.log(`[MCP] RegisterResource: ${uri2}`);
14299
14321
  ak(
14300
14322
  mcpServer,
14301
14323
  resource.name,
14302
14324
  uri2,
14303
14325
  {
14304
14326
  description: resource.description,
14305
- _meta: viteMode ? { ui: injectViteCSP(resourceMeta)?.ui } : resourceMeta
14327
+ _meta: listMeta
14306
14328
  },
14307
- async () => {
14308
- console.log(`[MCP] ReadResource: ${uri2}${viteMode ? " (vite)" : ""}`);
14329
+ async (_uri, extra) => {
14330
+ const prodBuild = needsProdBuild(
14331
+ extra?.requestInfo?.headers ?? {}
14332
+ );
14333
+ const readMeta = viteMode && !prodBuild ? injectViteCSP(resourceMeta) : resourceMeta;
14309
14334
  let content;
14310
14335
  try {
14311
- content = getResourceHtml(simulation, viteMode);
14336
+ content = getResourceHtml(simulation, viteMode, prodBuild);
14312
14337
  } catch (error) {
14313
14338
  console.error(`[MCP] ReadResource error for ${uri2}:`, error);
14314
14339
  throw error;
14315
14340
  }
14316
14341
  const sizeKB = (content.length / 1024).toFixed(1);
14317
- console.log(`[MCP] ReadResource: ${uri2} → ${sizeKB}KB`);
14342
+ console.log(
14343
+ `[MCP] ReadResource: ${uri2} → ${sizeKB}KB${prodBuild ? " (prod build)" : " (vite)"}`
14344
+ );
14318
14345
  return {
14319
14346
  contents: [
14320
14347
  {
14321
14348
  uri: uri2,
14322
14349
  mimeType: EI,
14323
14350
  text: content,
14324
- _meta: viteMode ? injectViteCSP(resourceMeta) : resourceMeta
14351
+ _meta: readMeta
14325
14352
  }
14326
14353
  ]
14327
14354
  };
@@ -14335,7 +14362,11 @@ function createAppServer(config, simulations, viteMode) {
14335
14362
  description: tool.description,
14336
14363
  _meta: {
14337
14364
  ...toolMeta,
14338
- ui: { resourceUri: uri2 }
14365
+ ui: {
14366
+ resourceUri: uri2,
14367
+ // Preserve tool visibility from simulation metadata if declared
14368
+ ...toolMeta.ui?.visibility ? { visibility: toolMeta.ui.visibility } : {}
14369
+ }
14339
14370
  }
14340
14371
  },
14341
14372
  async (extra) => {
@@ -14364,16 +14395,24 @@ function createAppServer(config, simulations, viteMode) {
14364
14395
  );
14365
14396
  return mcpServer;
14366
14397
  }
14398
+ function isLocalConnection(req) {
14399
+ const addr = req.socket.remoteAddress;
14400
+ return addr === "127.0.0.1" || addr === "::1" || addr === "::ffff:127.0.0.1";
14401
+ }
14367
14402
  const sessions = /* @__PURE__ */ new Map();
14368
14403
  const ssePath = "/mcp";
14369
14404
  const postPath = "/mcp/messages";
14370
- async function handleSseRequest(res, config, simulations, viteMode) {
14405
+ async function handleSseRequest(req, res, config, simulations, viteMode) {
14371
14406
  res.setHeader("Access-Control-Allow-Origin", "*");
14372
14407
  const server = createAppServer(config, simulations, viteMode);
14373
14408
  const transport = new sse_js.SSEServerTransport(postPath, res);
14374
14409
  const sessionId = transport.sessionId;
14375
- sessions.set(sessionId, { server, transport });
14376
- console.log(`[MCP] Session started: ${sessionId.substring(0, 8)}... (${sessions.size} active)`);
14410
+ const isLocal = isLocalConnection(req);
14411
+ sessions.set(sessionId, { server, transport, isLocal });
14412
+ const origin = isLocal ? "local" : "tunnel";
14413
+ console.log(
14414
+ `[MCP] Session started: ${sessionId.substring(0, 8)}... (${origin}, ${sessions.size} active)`
14415
+ );
14377
14416
  transport.onclose = async () => {
14378
14417
  if (!sessions.has(sessionId)) return;
14379
14418
  sessions.delete(sessionId);
@@ -14481,7 +14520,7 @@ function runMCPServer(config) {
14481
14520
  }
14482
14521
  if (req.method === "GET" && url.pathname === ssePath) {
14483
14522
  console.log(`[HTTP] ${req.method} ${url.pathname}`);
14484
- await handleSseRequest(res, config, simulations, viteMode);
14523
+ await handleSseRequest(req, res, config, simulations, viteMode);
14485
14524
  return;
14486
14525
  }
14487
14526
  if (req.method === "POST" && url.pathname === postPath) {
@@ -14527,8 +14566,28 @@ function runMCPServer(config) {
14527
14566
  };
14528
14567
  process.on("SIGTERM", () => void shutdown());
14529
14568
  process.on("SIGINT", () => void shutdown());
14569
+ return {
14570
+ invalidateResources() {
14571
+ let notified = 0;
14572
+ for (const [, session] of sessions) {
14573
+ if (!session.isLocal) {
14574
+ session.server.sendResourceListChanged();
14575
+ notified++;
14576
+ }
14577
+ }
14578
+ if (notified > 0) {
14579
+ console.log(`[MCP] Notified ${notified} session(s) of resource changes`);
14580
+ }
14581
+ }
14582
+ };
14530
14583
  }
14584
+ exports.EXTENSION_ID = C6;
14531
14585
  exports.FAVICON_BASE64 = FAVICON_BASE64;
14532
14586
  exports.FAVICON_BUFFER = FAVICON_BUFFER;
14587
+ exports.RESOURCE_MIME_TYPE = EI;
14588
+ exports.RESOURCE_URI_META_KEY = je;
14589
+ exports.getUiCapability = pk;
14590
+ exports.registerAppResource = ak;
14591
+ exports.registerAppTool = hk;
14533
14592
  exports.runMCPServer = runMCPServer;
14534
14593
  //# sourceMappingURL=index.cjs.map