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.
- package/dist/mcp/index.cjs +52 -30
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +52 -30
- package/dist/mcp/index.js.map +1 -1
- package/package.json +1 -1
package/dist/mcp/index.cjs
CHANGED
|
@@ -15520,27 +15520,30 @@ function createAppServer(config, simulations, viteMode) {
|
|
|
15520
15520
|
},
|
|
15521
15521
|
{ capabilities: { resources: {}, tools: {} } }
|
|
15522
15522
|
);
|
|
15523
|
-
const
|
|
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 (!
|
|
15532
|
-
|
|
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
|
-
|
|
15536
|
-
|
|
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 (
|
|
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 ${
|
|
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: ${
|
|
15560
|
+
`[MCP] ReadResource: ${readUri.href} → ${sizeKB}KB${prodBuild ? " (prod build)" : " (vite)"}`
|
|
15558
15561
|
);
|
|
15559
15562
|
return {
|
|
15560
15563
|
contents: [
|
|
15561
15564
|
{
|
|
15562
|
-
|
|
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
|
-
|
|
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(
|
|
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, {
|
|
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
|
-
|
|
15810
|
+
if (sessions.size === 0) return;
|
|
15811
|
+
const timestamp = Date.now();
|
|
15797
15812
|
for (const [, session] of sessions) {
|
|
15798
|
-
|
|
15799
|
-
|
|
15800
|
-
|
|
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
|
-
|
|
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
|
}
|