sunpeak 0.16.4 → 0.16.5

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.
@@ -15520,27 +15520,30 @@ function createAppServer(config, simulations, viteMode) {
15520
15520
  },
15521
15521
  { capabilities: { resources: {}, tools: {} } }
15522
15522
  );
15523
- const registeredResources = /* @__PURE__ */ new Set();
15523
+ const registeredUriSet = /* @__PURE__ */ new Set();
15524
+ const resourceHandles = /* @__PURE__ */ new Map();
15525
+ const toolHandles = [];
15524
15526
  for (const simulation of simulations) {
15525
15527
  const resource = simulation.resource;
15526
15528
  const tool = simulation.tool;
15527
15529
  const toolResult = simulation.toolResult ?? { structuredContent: null };
15528
15530
  const uri2 = resource.uri ?? `ui://${resource.name}`;
15531
+ const resourceName = resource.name;
15529
15532
  const resourceMeta = resource._meta ?? {};
15530
15533
  const toolMeta = tool._meta ?? {};
15531
- if (!registeredResources.has(uri2)) {
15532
- registeredResources.add(uri2);
15534
+ if (!registeredUriSet.has(uri2)) {
15535
+ registeredUriSet.add(uri2);
15533
15536
  const listMeta = viteMode ? injectViteCSP(resourceMeta) : resourceMeta;
15534
15537
  console.log(`[MCP] RegisterResource: ${uri2}`);
15535
- ak(
15536
- mcpServer,
15537
- resource.name,
15538
+ const handle = mcpServer.registerResource(
15539
+ resourceName,
15538
15540
  uri2,
15539
15541
  {
15542
+ mimeType: EI,
15540
15543
  description: resource.description,
15541
15544
  _meta: listMeta
15542
15545
  },
15543
- async (_uri, extra) => {
15546
+ async (readUri, extra) => {
15544
15547
  const prodBuild = needsProdBuild(
15545
15548
  extra?.requestInfo?.headers ?? {}
15546
15549
  );
@@ -15549,17 +15552,18 @@ function createAppServer(config, simulations, viteMode) {
15549
15552
  try {
15550
15553
  content = getResourceHtml(simulation, viteMode, prodBuild);
15551
15554
  } catch (error) {
15552
- console.error(`[MCP] ReadResource error for ${uri2}:`, error);
15555
+ console.error(`[MCP] ReadResource error for ${readUri.href}:`, error);
15553
15556
  throw error;
15554
15557
  }
15555
15558
  const sizeKB = (content.length / 1024).toFixed(1);
15556
15559
  console.log(
15557
- `[MCP] ReadResource: ${uri2} → ${sizeKB}KB${prodBuild ? " (prod build)" : " (vite)"}`
15560
+ `[MCP] ReadResource: ${readUri.href} → ${sizeKB}KB${prodBuild ? " (prod build)" : " (vite)"}`
15558
15561
  );
15559
15562
  return {
15560
15563
  contents: [
15561
15564
  {
15562
- uri: uri2,
15565
+ // Use readUri (not closure variable) so the response URI matches after updates
15566
+ uri: readUri.href,
15563
15567
  mimeType: EI,
15564
15568
  text: content,
15565
15569
  _meta: readMeta
@@ -15568,20 +15572,22 @@ function createAppServer(config, simulations, viteMode) {
15568
15572
  };
15569
15573
  }
15570
15574
  );
15575
+ resourceHandles.set(resourceName, handle);
15571
15576
  }
15572
- hk(
15577
+ const fullToolMeta = {
15578
+ ...toolMeta,
15579
+ ui: {
15580
+ resourceUri: uri2,
15581
+ // Preserve tool visibility from simulation metadata if declared
15582
+ ...toolMeta.ui?.visibility ? { visibility: toolMeta.ui.visibility } : {}
15583
+ }
15584
+ };
15585
+ const toolHandle = hk(
15573
15586
  mcpServer,
15574
15587
  tool.name,
15575
15588
  {
15576
15589
  description: tool.description,
15577
- _meta: {
15578
- ...toolMeta,
15579
- ui: {
15580
- resourceUri: uri2,
15581
- // Preserve tool visibility from simulation metadata if declared
15582
- ...toolMeta.ui?.visibility ? { visibility: toolMeta.ui.visibility } : {}
15583
- }
15584
- }
15590
+ _meta: fullToolMeta
15585
15591
  },
15586
15592
  async (extra) => {
15587
15593
  const args = extra.request?.params?.arguments ?? {};
@@ -15602,12 +15608,13 @@ function createAppServer(config, simulations, viteMode) {
15602
15608
  };
15603
15609
  }
15604
15610
  );
15611
+ toolHandles.push({ handle: toolHandle, resourceName, toolMeta: fullToolMeta });
15605
15612
  }
15606
- const registeredUris = Array.from(registeredResources).join(", ");
15613
+ const registeredUris = Array.from(registeredUriSet).join(", ");
15607
15614
  console.log(
15608
15615
  `[MCP] Registered ${simulations.length} tool(s) and resource(s)${viteMode ? " (vite mode)" : ""}: ${registeredUris}`
15609
15616
  );
15610
- return mcpServer;
15617
+ return { server: mcpServer, resourceHandles, toolHandles };
15611
15618
  }
15612
15619
  const SESSION_IDLE_TIMEOUT_MS$1 = 5 * 60 * 1e3;
15613
15620
  function isLocalConnection(req) {
@@ -15674,11 +15681,18 @@ async function handleMcpRequest(req, res, config, simulations, viteMode) {
15674
15681
  }
15675
15682
  if (req.method === "POST") {
15676
15683
  const isLocal = isLocalConnection(req);
15677
- const server = createAppServer(config, simulations, viteMode);
15684
+ const { server, resourceHandles, toolHandles } = createAppServer(config, simulations, viteMode);
15678
15685
  const transport = new StreamableHTTPServerTransport({
15679
15686
  sessionIdGenerator: () => node_crypto.randomUUID(),
15680
15687
  onsessioninitialized: (id2) => {
15681
- sessions.set(id2, { server, transport, isLocal, lastActivity: Date.now() });
15688
+ sessions.set(id2, {
15689
+ server,
15690
+ transport,
15691
+ isLocal,
15692
+ lastActivity: Date.now(),
15693
+ resourceHandles,
15694
+ toolHandles
15695
+ });
15682
15696
  const origin = isLocal ? "local" : "tunnel";
15683
15697
  console.log(
15684
15698
  `[MCP] Session started: ${id2.substring(0, 8)}... (${origin}, ${sessions.size} active)`
@@ -15793,16 +15807,24 @@ function runMCPServer(config) {
15793
15807
  process.on("SIGINT", () => void shutdown());
15794
15808
  return {
15795
15809
  invalidateResources() {
15796
- let notified = 0;
15810
+ if (sessions.size === 0) return;
15811
+ const timestamp = Date.now();
15797
15812
  for (const [, session] of sessions) {
15798
- if (!session.isLocal) {
15799
- session.server.sendResourceListChanged();
15800
- notified++;
15813
+ for (const [name, handle] of session.resourceHandles) {
15814
+ handle.update({ uri: `ui://${name}-${timestamp}` });
15815
+ }
15816
+ for (const { handle, resourceName, toolMeta } of session.toolHandles) {
15817
+ const newUri = `ui://${resourceName}-${timestamp}`;
15818
+ handle.update({
15819
+ _meta: {
15820
+ ...toolMeta,
15821
+ ui: { ...toolMeta.ui, resourceUri: newUri },
15822
+ "ui/resourceUri": newUri
15823
+ }
15824
+ });
15801
15825
  }
15802
15826
  }
15803
- if (notified > 0) {
15804
- console.log(`[MCP] Notified ${notified} session(s) of resource changes`);
15805
- }
15827
+ console.log(`[MCP] Cache-busted ${sessions.size} session(s) with timestamp ${timestamp}`);
15806
15828
  }
15807
15829
  };
15808
15830
  }