@supernal/interface 1.0.2 → 1.0.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.
- package/LICENSE +1 -1
- package/README.md +1 -1
- package/dist/cjs/src/background/location/LocationContext.js +159 -0
- package/dist/cjs/src/background/location/LocationContext.js.map +1 -0
- package/dist/cjs/src/background/navigation/ContentResolver.js +37 -0
- package/dist/cjs/src/background/navigation/ContentResolver.js.map +1 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js +125 -11
- package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/cjs/src/background/registry/ToolRegistry.js +98 -0
- package/dist/cjs/src/background/registry/ToolRegistry.js.map +1 -1
- package/dist/cjs/src/browser.js.map +1 -1
- package/dist/cjs/src/decorators/Component.js +30 -19
- package/dist/cjs/src/decorators/Component.js.map +1 -1
- package/dist/cjs/src/decorators/LocationScope.js +65 -0
- package/dist/cjs/src/decorators/LocationScope.js.map +1 -0
- package/dist/cjs/src/decorators/Tool.js +14 -1
- package/dist/cjs/src/decorators/Tool.js.map +1 -1
- package/dist/cjs/src/decorators/ToolProvider.js +11 -0
- package/dist/cjs/src/decorators/ToolProvider.js.map +1 -1
- package/dist/cjs/src/decorators/index.js +20 -2
- package/dist/cjs/src/decorators/index.js.map +1 -1
- package/dist/cjs/src/index.js +14 -3
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/mcp/index.js +16 -0
- package/dist/cjs/src/mcp/index.js.map +1 -0
- package/dist/cjs/src/mcp/server.js +281 -0
- package/dist/cjs/src/mcp/server.js.map +1 -0
- package/dist/cjs/src/mcp/transport.js +131 -0
- package/dist/cjs/src/mcp/transport.js.map +1 -0
- package/dist/cjs/src/mcp/types.js +23 -0
- package/dist/cjs/src/mcp/types.js.map +1 -0
- package/dist/cjs/src/mcp-cli.js +55 -0
- package/dist/cjs/src/mcp-cli.js.map +1 -0
- package/dist/cjs/src/mcp-server.js +17 -0
- package/dist/cjs/src/mcp-server.js.map +1 -0
- package/dist/cjs/src/react/useNavigationHandler.js +53 -12
- package/dist/cjs/src/react/useNavigationHandler.js.map +1 -1
- package/dist/cjs/src/react/usePersistedState.js +1 -1
- package/dist/cjs/src/react/usePersistedState.js.map +1 -1
- package/dist/cjs/src/state/StateSync.js +130 -0
- package/dist/cjs/src/state/StateSync.js.map +1 -0
- package/dist/cjs/src/storage/LocalStorageAdapter.js +1 -1
- package/dist/cjs/src/storage/LocalStorageAdapter.js.map +1 -1
- package/dist/cjs/src/storage/StateManager.js +2 -2
- package/dist/cjs/src/tools/SystemTools.js +1 -1
- package/dist/cjs/src/tools/SystemTools.js.map +1 -1
- package/dist/cjs/src/types/StateManagers.js +2 -2
- package/dist/cjs/src/types/StateManagers.js.map +1 -1
- package/dist/cjs/src/ui/react/chat/ChatBubble.js +3 -3
- package/dist/cjs/src/ui/react/chat/ChatBubble.js.map +1 -1
- package/dist/esm/src/background/location/LocationContext.d.ts +118 -0
- package/dist/esm/src/background/location/LocationContext.d.ts.map +1 -0
- package/dist/esm/src/background/location/LocationContext.js +155 -0
- package/dist/esm/src/background/location/LocationContext.js.map +1 -0
- package/dist/esm/src/background/navigation/ContentResolver.d.ts +139 -0
- package/dist/esm/src/background/navigation/ContentResolver.d.ts.map +1 -0
- package/dist/esm/src/background/navigation/ContentResolver.js +36 -0
- package/dist/esm/src/background/navigation/ContentResolver.js.map +1 -0
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts +1 -0
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts +24 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.js +125 -11
- package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/esm/src/background/registry/ToolRegistry.d.ts +48 -0
- package/dist/esm/src/background/registry/ToolRegistry.d.ts.map +1 -1
- package/dist/esm/src/background/registry/ToolRegistry.js +98 -0
- package/dist/esm/src/background/registry/ToolRegistry.js.map +1 -1
- package/dist/esm/src/browser.d.ts +1 -0
- package/dist/esm/src/browser.d.ts.map +1 -1
- package/dist/esm/src/browser.js.map +1 -1
- package/dist/esm/src/decorators/Component.d.ts.map +1 -1
- package/dist/esm/src/decorators/Component.js +30 -19
- package/dist/esm/src/decorators/Component.js.map +1 -1
- package/dist/esm/src/decorators/LocationScope.d.ts +49 -0
- package/dist/esm/src/decorators/LocationScope.d.ts.map +1 -0
- package/dist/esm/src/decorators/LocationScope.js +60 -0
- package/dist/esm/src/decorators/LocationScope.js.map +1 -0
- package/dist/esm/src/decorators/Tool.d.ts +3 -1
- package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
- package/dist/esm/src/decorators/Tool.js +14 -1
- package/dist/esm/src/decorators/Tool.js.map +1 -1
- package/dist/esm/src/decorators/ToolProvider.d.ts +11 -0
- package/dist/esm/src/decorators/ToolProvider.d.ts.map +1 -1
- package/dist/esm/src/decorators/ToolProvider.js +10 -0
- package/dist/esm/src/decorators/ToolProvider.js.map +1 -1
- package/dist/esm/src/decorators/index.d.ts +19 -1
- package/dist/esm/src/decorators/index.d.ts.map +1 -1
- package/dist/esm/src/decorators/index.js +19 -1
- package/dist/esm/src/decorators/index.js.map +1 -1
- package/dist/esm/src/index.d.ts +5 -2
- package/dist/esm/src/index.d.ts.map +1 -1
- package/dist/esm/src/index.js +6 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/mcp/index.d.ts +10 -0
- package/dist/esm/src/mcp/index.d.ts.map +1 -0
- package/dist/esm/src/mcp/index.js +9 -0
- package/dist/esm/src/mcp/index.js.map +1 -0
- package/dist/esm/src/mcp/server.d.ts +84 -0
- package/dist/esm/src/mcp/server.d.ts.map +1 -0
- package/dist/esm/src/mcp/server.js +276 -0
- package/dist/esm/src/mcp/server.js.map +1 -0
- package/dist/esm/src/mcp/transport.d.ts +53 -0
- package/dist/esm/src/mcp/transport.d.ts.map +1 -0
- package/dist/esm/src/mcp/transport.js +126 -0
- package/dist/esm/src/mcp/transport.js.map +1 -0
- package/dist/esm/src/mcp/types.d.ts +175 -0
- package/dist/esm/src/mcp/types.d.ts.map +1 -0
- package/dist/esm/src/mcp/types.js +20 -0
- package/dist/esm/src/mcp/types.js.map +1 -0
- package/dist/esm/src/mcp-cli.d.ts +25 -0
- package/dist/esm/src/mcp-cli.d.ts.map +1 -0
- package/dist/esm/src/mcp-cli.js +53 -0
- package/dist/esm/src/mcp-cli.js.map +1 -0
- package/dist/esm/src/mcp-server.d.ts +10 -0
- package/dist/esm/src/mcp-server.d.ts.map +1 -0
- package/dist/esm/src/mcp-server.js +10 -0
- package/dist/esm/src/mcp-server.js.map +1 -0
- package/dist/esm/src/react/useNavigationHandler.d.ts +29 -11
- package/dist/esm/src/react/useNavigationHandler.d.ts.map +1 -1
- package/dist/esm/src/react/useNavigationHandler.js +53 -12
- package/dist/esm/src/react/useNavigationHandler.js.map +1 -1
- package/dist/esm/src/react/usePersistedState.js +1 -1
- package/dist/esm/src/react/usePersistedState.js.map +1 -1
- package/dist/esm/src/state/StateSync.d.ts +57 -0
- package/dist/esm/src/state/StateSync.d.ts.map +1 -0
- package/dist/esm/src/state/StateSync.js +123 -0
- package/dist/esm/src/state/StateSync.js.map +1 -0
- package/dist/esm/src/storage/LocalStorageAdapter.d.ts.map +1 -1
- package/dist/esm/src/storage/LocalStorageAdapter.js +1 -1
- package/dist/esm/src/storage/LocalStorageAdapter.js.map +1 -1
- package/dist/esm/src/storage/StateManager.d.ts +2 -2
- package/dist/esm/src/storage/StateManager.js +2 -2
- package/dist/esm/src/tools/SystemTools.js +1 -1
- package/dist/esm/src/tools/SystemTools.js.map +1 -1
- package/dist/esm/src/types/StateManagers.d.ts +2 -2
- package/dist/esm/src/types/StateManagers.d.ts.map +1 -1
- package/dist/esm/src/types/StateManagers.js +2 -2
- package/dist/esm/src/types/StateManagers.js.map +1 -1
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts +4 -0
- package/dist/esm/src/ui/react/chat/ChatBubble.d.ts.map +1 -1
- package/dist/esm/src/ui/react/chat/ChatBubble.js +3 -3
- package/dist/esm/src/ui/react/chat/ChatBubble.js.map +1 -1
- package/package.json +9 -17
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Supernal MCP Server
|
|
4
|
+
*
|
|
5
|
+
* MCP (Model Context Protocol) server that exposes Supernal Interface tools
|
|
6
|
+
* to external AI agents like Claude Desktop, Cursor, and custom MCP clients.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createSupernalMCPServer } from '@supernal/interface';
|
|
11
|
+
*
|
|
12
|
+
* const server = createSupernalMCPServer({
|
|
13
|
+
* name: 'my-app-tools',
|
|
14
|
+
* version: '1.0.0'
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* await server.start();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.SupernalMCPServer = void 0;
|
|
22
|
+
exports.createSupernalMCPServer = createSupernalMCPServer;
|
|
23
|
+
const ToolRegistry_1 = require("../background/registry/ToolRegistry");
|
|
24
|
+
const ToolExecutor_1 = require("../ai/ToolExecutor");
|
|
25
|
+
const types_1 = require("./types");
|
|
26
|
+
/**
|
|
27
|
+
* Default server configuration
|
|
28
|
+
*/
|
|
29
|
+
const DEFAULT_CONFIG = {
|
|
30
|
+
name: 'supernal-interface',
|
|
31
|
+
version: '1.0.0',
|
|
32
|
+
description: 'MCP server for Supernal Interface tools',
|
|
33
|
+
capabilities: {
|
|
34
|
+
tools: {},
|
|
35
|
+
resources: {},
|
|
36
|
+
prompts: {}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Supernal MCP Server implementation
|
|
41
|
+
*/
|
|
42
|
+
class SupernalMCPServer {
|
|
43
|
+
constructor(config = {}) {
|
|
44
|
+
this.running = false;
|
|
45
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
46
|
+
this.executor = new ToolExecutor_1.ToolExecutor();
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start the MCP server with given transport
|
|
50
|
+
*/
|
|
51
|
+
async start(transport) {
|
|
52
|
+
if (this.running) {
|
|
53
|
+
throw new Error('Server is already running');
|
|
54
|
+
}
|
|
55
|
+
this.transport = transport;
|
|
56
|
+
this.running = true;
|
|
57
|
+
console.error(`[MCP Server] Starting: ${this.config.name} v${this.config.version}`);
|
|
58
|
+
// Message processing loop
|
|
59
|
+
while (this.running) {
|
|
60
|
+
try {
|
|
61
|
+
const request = await this.transport.receive();
|
|
62
|
+
const response = await this.handle(request);
|
|
63
|
+
// Only send response if not null (notifications return null)
|
|
64
|
+
if (response !== null) {
|
|
65
|
+
await this.transport.send(response);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (!this.running)
|
|
70
|
+
break; // Transport closed
|
|
71
|
+
console.error('[MCP Server] Error processing message:', error);
|
|
72
|
+
// Send error response
|
|
73
|
+
if (this.transport) {
|
|
74
|
+
await this.transport.send({
|
|
75
|
+
jsonrpc: '2.0',
|
|
76
|
+
error: {
|
|
77
|
+
code: types_1.MCPErrorCode.INTERNAL_ERROR,
|
|
78
|
+
message: error instanceof Error ? error.message : 'Internal server error',
|
|
79
|
+
data: error
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Stop the MCP server
|
|
88
|
+
*/
|
|
89
|
+
async stop() {
|
|
90
|
+
this.running = false;
|
|
91
|
+
if (this.transport) {
|
|
92
|
+
await this.transport.close();
|
|
93
|
+
this.transport = undefined;
|
|
94
|
+
}
|
|
95
|
+
console.error('[MCP Server] Stopped');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Handle incoming MCP request
|
|
99
|
+
*/
|
|
100
|
+
async handle(request) {
|
|
101
|
+
const { method, params, id } = request;
|
|
102
|
+
try {
|
|
103
|
+
// Handle notifications (no response needed)
|
|
104
|
+
if (method.startsWith('notifications/')) {
|
|
105
|
+
console.error(`[MCP Server] Received notification: ${method}`);
|
|
106
|
+
return null; // No response for notifications
|
|
107
|
+
}
|
|
108
|
+
switch (method) {
|
|
109
|
+
case 'tools/list':
|
|
110
|
+
return this.handleToolsList(id);
|
|
111
|
+
case 'tools/call':
|
|
112
|
+
return await this.handleToolCall(id, params);
|
|
113
|
+
case 'initialize':
|
|
114
|
+
return this.handleInitialize(id);
|
|
115
|
+
default:
|
|
116
|
+
return this.errorResponse(id, types_1.MCPErrorCode.METHOD_NOT_FOUND, `Method not found: ${method}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return this.errorResponse(id, types_1.MCPErrorCode.INTERNAL_ERROR, error instanceof Error ? error.message : 'Internal error', error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Handle tools/list request
|
|
125
|
+
*
|
|
126
|
+
* Returns location-filtered tools based on LocationContext.getCurrent()
|
|
127
|
+
* Uses @LocationScope decorators to determine tool availability
|
|
128
|
+
*/
|
|
129
|
+
handleToolsList(id) {
|
|
130
|
+
const toolsByContainer = ToolRegistry_1.ToolRegistry.getToolsGroupedByContainerForLocation();
|
|
131
|
+
const mcpTools = [];
|
|
132
|
+
for (const [container, containerTools] of Object.entries(toolsByContainer)) {
|
|
133
|
+
for (const tool of containerTools) {
|
|
134
|
+
mcpTools.push(this.convertToMCPTool(container, tool));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const response = {
|
|
138
|
+
tools: mcpTools
|
|
139
|
+
};
|
|
140
|
+
return {
|
|
141
|
+
jsonrpc: '2.0',
|
|
142
|
+
id,
|
|
143
|
+
result: response
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Handle tools/call request
|
|
148
|
+
*/
|
|
149
|
+
async handleToolCall(id, params) {
|
|
150
|
+
const { name, arguments: args } = params;
|
|
151
|
+
if (!name) {
|
|
152
|
+
return this.errorResponse(id, types_1.MCPErrorCode.INVALID_PARAMS, 'Missing tool name');
|
|
153
|
+
}
|
|
154
|
+
// Parse tool name (format: container.toolName)
|
|
155
|
+
const [container, toolName] = name.split('.');
|
|
156
|
+
if (!container || !toolName) {
|
|
157
|
+
return this.errorResponse(id, types_1.MCPErrorCode.INVALID_PARAMS, `Invalid tool name format: ${name}. Expected: container.toolName`);
|
|
158
|
+
}
|
|
159
|
+
// Find tool by containerId and tool name
|
|
160
|
+
// The tool may be registered with its class name, but exposed with containerId
|
|
161
|
+
// Handle undefined containerId (treat as matching the container name used in MCP)
|
|
162
|
+
const tool = Array.from(ToolRegistry_1.ToolRegistry.getAllTools().values()).find(t => {
|
|
163
|
+
const toolContainer = t.containerId || 'global'; // undefined becomes 'global'
|
|
164
|
+
return toolContainer === container && t.name === toolName;
|
|
165
|
+
});
|
|
166
|
+
if (!tool) {
|
|
167
|
+
return this.errorResponse(id, types_1.MCPErrorCode.TOOL_NOT_FOUND, `Tool not found: ${name}`);
|
|
168
|
+
}
|
|
169
|
+
// Execute tool
|
|
170
|
+
try {
|
|
171
|
+
// Convert args object to array format expected by ToolExecutor
|
|
172
|
+
const argsArray = Object.values(args || {});
|
|
173
|
+
const result = await this.executor.execute(tool, argsArray);
|
|
174
|
+
if (!result.success) {
|
|
175
|
+
return this.errorResponse(id, types_1.MCPErrorCode.TOOL_EXECUTION_FAILED, result.message || 'Tool execution failed', { error: result.error, timing: result.timing });
|
|
176
|
+
}
|
|
177
|
+
// Format success response
|
|
178
|
+
const response = {
|
|
179
|
+
content: [
|
|
180
|
+
{
|
|
181
|
+
type: 'text',
|
|
182
|
+
text: JSON.stringify({
|
|
183
|
+
success: true,
|
|
184
|
+
result: result.data,
|
|
185
|
+
timing: result.timing,
|
|
186
|
+
message: result.message
|
|
187
|
+
}, null, 2)
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
};
|
|
191
|
+
return {
|
|
192
|
+
jsonrpc: '2.0',
|
|
193
|
+
id,
|
|
194
|
+
result: response
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
return this.errorResponse(id, types_1.MCPErrorCode.TOOL_EXECUTION_FAILED, error instanceof Error ? error.message : 'Tool execution failed', error);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Handle initialize request
|
|
203
|
+
*/
|
|
204
|
+
handleInitialize(id) {
|
|
205
|
+
return {
|
|
206
|
+
jsonrpc: '2.0',
|
|
207
|
+
id,
|
|
208
|
+
result: {
|
|
209
|
+
protocolVersion: '2024-11-05',
|
|
210
|
+
serverInfo: {
|
|
211
|
+
name: this.config.name,
|
|
212
|
+
version: this.config.version
|
|
213
|
+
},
|
|
214
|
+
capabilities: this.config.capabilities
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Convert Supernal tool to MCP tool format
|
|
220
|
+
*/
|
|
221
|
+
convertToMCPTool(container, tool) {
|
|
222
|
+
// tool.inputSchema is already a full schema object {type, properties, required}
|
|
223
|
+
// Use it directly, or create a default if missing
|
|
224
|
+
const inputSchema = tool.inputSchema || {
|
|
225
|
+
type: 'object',
|
|
226
|
+
properties: {},
|
|
227
|
+
required: []
|
|
228
|
+
};
|
|
229
|
+
return {
|
|
230
|
+
name: `${container}.${tool.name}`,
|
|
231
|
+
description: tool.description || `Tool: ${tool.name}`,
|
|
232
|
+
inputSchema,
|
|
233
|
+
annotations: {
|
|
234
|
+
container,
|
|
235
|
+
category: tool.category,
|
|
236
|
+
elementId: tool.elementId,
|
|
237
|
+
componentName: tool.componentName,
|
|
238
|
+
toolType: tool.toolType,
|
|
239
|
+
aiEnabled: tool.aiEnabled
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Create error response
|
|
245
|
+
*/
|
|
246
|
+
errorResponse(id, code, message, data) {
|
|
247
|
+
const error = {
|
|
248
|
+
code,
|
|
249
|
+
message,
|
|
250
|
+
data
|
|
251
|
+
};
|
|
252
|
+
return {
|
|
253
|
+
jsonrpc: '2.0',
|
|
254
|
+
id,
|
|
255
|
+
error
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.SupernalMCPServer = SupernalMCPServer;
|
|
260
|
+
/**
|
|
261
|
+
* Create and configure a Supernal MCP server
|
|
262
|
+
*
|
|
263
|
+
* @param config - Server configuration
|
|
264
|
+
* @returns Configured MCP server instance
|
|
265
|
+
*
|
|
266
|
+
* @example
|
|
267
|
+
* ```typescript
|
|
268
|
+
* const server = createSupernalMCPServer({
|
|
269
|
+
* name: 'my-app-tools',
|
|
270
|
+
* version: '1.0.0'
|
|
271
|
+
* });
|
|
272
|
+
*
|
|
273
|
+
* // Start with stdio transport
|
|
274
|
+
* const transport = new StdioTransport();
|
|
275
|
+
* await server.start(transport);
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
function createSupernalMCPServer(config) {
|
|
279
|
+
return new SupernalMCPServer(config);
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Stdio Transport for MCP
|
|
4
|
+
*
|
|
5
|
+
* Implements MCP transport over stdin/stdout for integration with
|
|
6
|
+
* Claude Desktop, Cursor, and other MCP clients.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.StdioTransport = void 0;
|
|
10
|
+
exports.createStdioTransport = createStdioTransport;
|
|
11
|
+
const readline_1 = require("readline");
|
|
12
|
+
/**
|
|
13
|
+
* Stdio transport implementation
|
|
14
|
+
*
|
|
15
|
+
* Reads JSON-RPC messages from stdin (one per line)
|
|
16
|
+
* Writes JSON-RPC responses to stdout (one per line)
|
|
17
|
+
*/
|
|
18
|
+
class StdioTransport {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.messageQueue = [];
|
|
21
|
+
this.waitingResolvers = [];
|
|
22
|
+
this.closed = false;
|
|
23
|
+
this.setupReadline();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Setup readline interface for stdin
|
|
27
|
+
*/
|
|
28
|
+
setupReadline() {
|
|
29
|
+
this.readline = (0, readline_1.createInterface)({
|
|
30
|
+
input: process.stdin,
|
|
31
|
+
output: process.stdout,
|
|
32
|
+
terminal: false
|
|
33
|
+
});
|
|
34
|
+
this.readline.on('line', (line) => {
|
|
35
|
+
try {
|
|
36
|
+
const message = JSON.parse(line);
|
|
37
|
+
// If someone is waiting for a message, give it to them immediately
|
|
38
|
+
if (this.waitingResolvers.length > 0) {
|
|
39
|
+
const resolve = this.waitingResolvers.shift();
|
|
40
|
+
resolve(message);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// Otherwise queue it
|
|
44
|
+
this.messageQueue.push(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error('[Stdio Transport] Failed to parse message:', error);
|
|
49
|
+
console.error('[Stdio Transport] Line:', line);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
this.readline.on('close', () => {
|
|
53
|
+
this.closed = true;
|
|
54
|
+
// Reject all waiting resolvers
|
|
55
|
+
for (const resolve of this.waitingResolvers) {
|
|
56
|
+
resolve({
|
|
57
|
+
jsonrpc: '2.0',
|
|
58
|
+
method: '__transport_closed__'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
this.waitingResolvers = [];
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Send message to client (write to stdout)
|
|
66
|
+
*/
|
|
67
|
+
async send(message) {
|
|
68
|
+
if (this.closed) {
|
|
69
|
+
throw new Error('Transport is closed');
|
|
70
|
+
}
|
|
71
|
+
const json = JSON.stringify(message);
|
|
72
|
+
process.stdout.write(json + '\n');
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Receive message from client (read from stdin)
|
|
76
|
+
*/
|
|
77
|
+
async receive() {
|
|
78
|
+
if (this.closed) {
|
|
79
|
+
throw new Error('Transport is closed');
|
|
80
|
+
}
|
|
81
|
+
// If we have queued messages, return the first one
|
|
82
|
+
if (this.messageQueue.length > 0) {
|
|
83
|
+
return this.messageQueue.shift();
|
|
84
|
+
}
|
|
85
|
+
// Otherwise wait for the next message
|
|
86
|
+
return new Promise((resolve) => {
|
|
87
|
+
this.waitingResolvers.push(resolve);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Close transport
|
|
92
|
+
*/
|
|
93
|
+
async close() {
|
|
94
|
+
if (this.closed)
|
|
95
|
+
return;
|
|
96
|
+
this.closed = true;
|
|
97
|
+
if (this.readline) {
|
|
98
|
+
this.readline.close();
|
|
99
|
+
this.readline = undefined;
|
|
100
|
+
}
|
|
101
|
+
// Reject all waiting resolvers
|
|
102
|
+
for (const resolve of this.waitingResolvers) {
|
|
103
|
+
resolve({
|
|
104
|
+
jsonrpc: '2.0',
|
|
105
|
+
method: '__transport_closed__'
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
this.waitingResolvers = [];
|
|
109
|
+
this.messageQueue = [];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.StdioTransport = StdioTransport;
|
|
113
|
+
/**
|
|
114
|
+
* Create stdio transport
|
|
115
|
+
*
|
|
116
|
+
* @returns Stdio transport instance
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* import { createSupernalMCPServer, createStdioTransport } from '@supernal/interface';
|
|
121
|
+
*
|
|
122
|
+
* const server = createSupernalMCPServer();
|
|
123
|
+
* const transport = createStdioTransport();
|
|
124
|
+
*
|
|
125
|
+
* await server.start(transport);
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
function createStdioTransport() {
|
|
129
|
+
return new StdioTransport();
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/mcp/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Protocol Types
|
|
4
|
+
*
|
|
5
|
+
* Type definitions for Model Context Protocol (MCP) integration.
|
|
6
|
+
* Based on @ai-sdk/mcp specification.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MCPErrorCode = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* MCP error codes
|
|
12
|
+
*/
|
|
13
|
+
var MCPErrorCode;
|
|
14
|
+
(function (MCPErrorCode) {
|
|
15
|
+
MCPErrorCode[MCPErrorCode["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
|
|
16
|
+
MCPErrorCode[MCPErrorCode["INVALID_REQUEST"] = -32600] = "INVALID_REQUEST";
|
|
17
|
+
MCPErrorCode[MCPErrorCode["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
|
|
18
|
+
MCPErrorCode[MCPErrorCode["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
|
|
19
|
+
MCPErrorCode[MCPErrorCode["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
|
|
20
|
+
MCPErrorCode[MCPErrorCode["TOOL_NOT_FOUND"] = -1] = "TOOL_NOT_FOUND";
|
|
21
|
+
MCPErrorCode[MCPErrorCode["TOOL_EXECUTION_FAILED"] = -2] = "TOOL_EXECUTION_FAILED";
|
|
22
|
+
})(MCPErrorCode || (exports.MCPErrorCode = MCPErrorCode = {}));
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/mcp/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA6HH;;GAEG;AACH,IAAY,YAQX;AARD,WAAY,YAAY;IACtB,kEAAoB,CAAA;IACpB,0EAAwB,CAAA;IACxB,4EAAyB,CAAA;IACzB,wEAAuB,CAAA;IACvB,wEAAuB,CAAA;IACvB,oEAAmB,CAAA;IACnB,kFAA0B,CAAA;AAC5B,CAAC,EARW,YAAY,4BAAZ,YAAY,QAQvB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Supernal MCP CLI Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Starts the Supernal MCP server with stdio transport for use with
|
|
6
|
+
* Claude Desktop, Cursor, and other MCP clients.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```bash
|
|
10
|
+
* npx @supernal/interface-mcp
|
|
11
|
+
* ```
|
|
12
|
+
*
|
|
13
|
+
* Or in Claude Desktop config:
|
|
14
|
+
* ```json
|
|
15
|
+
* {
|
|
16
|
+
* "mcpServers": {
|
|
17
|
+
* "supernal": {
|
|
18
|
+
* "command": "npx",
|
|
19
|
+
* "args": ["@supernal/interface-mcp"]
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* }
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const mcp_1 = require("./mcp");
|
|
27
|
+
async function main() {
|
|
28
|
+
const server = (0, mcp_1.createSupernalMCPServer)({
|
|
29
|
+
name: 'supernal-interface',
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
description: 'MCP server for Supernal Interface tools'
|
|
32
|
+
});
|
|
33
|
+
const transport = (0, mcp_1.createStdioTransport)();
|
|
34
|
+
console.error('[Supernal MCP] Starting server...');
|
|
35
|
+
try {
|
|
36
|
+
await server.start(transport);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error('[Supernal MCP] Server error:', error);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Handle shutdown gracefully
|
|
44
|
+
const handleShutdown = () => {
|
|
45
|
+
console.error('[Supernal MCP] Shutting down...');
|
|
46
|
+
process.exit(0);
|
|
47
|
+
};
|
|
48
|
+
process.on('SIGINT', handleShutdown);
|
|
49
|
+
process.on('SIGTERM', handleShutdown);
|
|
50
|
+
// Start server
|
|
51
|
+
main().catch((error) => {
|
|
52
|
+
console.error('[Supernal MCP] Fatal error:', error);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=mcp-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-cli.js","sourceRoot":"","sources":["../../../src/mcp-cli.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;AAEH,+BAAsE;AAEtE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,6BAAuB,EAAC;QACrC,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,yCAAyC;KACvD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAA,0BAAoB,GAAE,CAAC;IAEzC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,6BAA6B;AAC7B,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,QAAe,EAAE,cAAc,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,SAAgB,EAAE,cAAc,CAAC,CAAC;AAE7C,eAAe;AACf,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server Entry Point (Node.js only)
|
|
4
|
+
*
|
|
5
|
+
* This file should ONLY be used in Node.js environments (MCP servers).
|
|
6
|
+
* DO NOT import this in browser code.
|
|
7
|
+
*
|
|
8
|
+
* For browser usage, import from '@supernal/interface' (without /mcp)
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.StdioTransport = exports.SupernalMCPServer = exports.createStdioTransport = exports.createSupernalMCPServer = void 0;
|
|
12
|
+
var mcp_1 = require("./mcp");
|
|
13
|
+
Object.defineProperty(exports, "createSupernalMCPServer", { enumerable: true, get: function () { return mcp_1.createSupernalMCPServer; } });
|
|
14
|
+
Object.defineProperty(exports, "createStdioTransport", { enumerable: true, get: function () { return mcp_1.createStdioTransport; } });
|
|
15
|
+
Object.defineProperty(exports, "SupernalMCPServer", { enumerable: true, get: function () { return mcp_1.SupernalMCPServer; } });
|
|
16
|
+
Object.defineProperty(exports, "StdioTransport", { enumerable: true, get: function () { return mcp_1.StdioTransport; } });
|
|
17
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../../src/mcp-server.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAEH,6BAce;AAbb,8GAAA,uBAAuB,OAAA;AACvB,2GAAA,oBAAoB,OAAA;AACpB,wGAAA,iBAAiB,OAAA;AACjB,qGAAA,cAAc,OAAA"}
|
|
@@ -3,24 +3,33 @@
|
|
|
3
3
|
* useNavigationHandler - React Hook for Automatic Navigation Setup
|
|
4
4
|
*
|
|
5
5
|
* Single-line hook that sets up navigation for any page.
|
|
6
|
-
*
|
|
6
|
+
* Now also tracks location in LocationContext for location-aware tools.
|
|
7
7
|
*
|
|
8
|
-
* This
|
|
8
|
+
* This hook:
|
|
9
|
+
* 1. Tracks current page/route in LocationContext
|
|
10
|
+
* 2. Sets up navigation handler in NavigationGraph
|
|
11
|
+
* 3. Updates location when route changes
|
|
9
12
|
*/
|
|
10
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
14
|
exports.useNavigationHandler = useNavigationHandler;
|
|
12
15
|
const react_1 = require("react");
|
|
13
16
|
const NavigationGraph_1 = require("../background/navigation/NavigationGraph");
|
|
17
|
+
const LocationContext_1 = require("../background/location/LocationContext");
|
|
14
18
|
/**
|
|
15
19
|
* Set up automatic navigation handler for the current page
|
|
16
20
|
*
|
|
17
21
|
* This hook:
|
|
18
|
-
* 1.
|
|
19
|
-
* 2.
|
|
20
|
-
* 3.
|
|
21
|
-
* 4.
|
|
22
|
+
* 1. Tracks current page/route in LocationContext for location-aware tools
|
|
23
|
+
* 2. Gets routes from NavigationGraph (populated by container definitions)
|
|
24
|
+
* 3. Creates a handler that resolves page names → routes
|
|
25
|
+
* 4. Registers the handler with NavigationGraph
|
|
26
|
+
* 5. Supports dynamic routes (e.g., "blog/post-slug")
|
|
22
27
|
*
|
|
23
|
-
* @param router - Next.js router or any router with
|
|
28
|
+
* @param router - Next.js router or any router with `push`, `pathname`, `route`
|
|
29
|
+
* @param options - Optional configuration
|
|
30
|
+
* @param options.components - Currently mounted component IDs
|
|
31
|
+
* @param options.elements - Currently visible element IDs
|
|
32
|
+
* @param options.metadata - Additional location metadata
|
|
24
33
|
*
|
|
25
34
|
* @example
|
|
26
35
|
* ```typescript
|
|
@@ -29,7 +38,8 @@ const NavigationGraph_1 = require("../background/navigation/NavigationGraph");
|
|
|
29
38
|
*
|
|
30
39
|
* export default function MyPage() {
|
|
31
40
|
* const router = useRouter();
|
|
32
|
-
*
|
|
41
|
+
* // Track location automatically
|
|
42
|
+
* useNavigationHandler(router);
|
|
33
43
|
*
|
|
34
44
|
* return <div>...</div>;
|
|
35
45
|
* }
|
|
@@ -37,13 +47,28 @@ const NavigationGraph_1 = require("../background/navigation/NavigationGraph");
|
|
|
37
47
|
*
|
|
38
48
|
* @example
|
|
39
49
|
* ```typescript
|
|
40
|
-
* //
|
|
41
|
-
* useNavigationHandler(
|
|
50
|
+
* // With component tracking
|
|
51
|
+
* useNavigationHandler(router, {
|
|
52
|
+
* components: ['blog-header', 'blog-editor'],
|
|
53
|
+
* metadata: { userRole: 'editor' }
|
|
54
|
+
* });
|
|
42
55
|
* ```
|
|
43
56
|
*/
|
|
44
|
-
function useNavigationHandler(router) {
|
|
57
|
+
function useNavigationHandler(router, options) {
|
|
45
58
|
(0, react_1.useEffect)(() => {
|
|
46
59
|
const graph = NavigationGraph_1.NavigationGraph.getInstance();
|
|
60
|
+
// Update LocationContext with current page/route
|
|
61
|
+
if (router) {
|
|
62
|
+
const page = router.pathname || '/';
|
|
63
|
+
const route = router.route || router.pathname || '/';
|
|
64
|
+
LocationContext_1.LocationContext.setCurrent({
|
|
65
|
+
page,
|
|
66
|
+
route,
|
|
67
|
+
components: options?.components,
|
|
68
|
+
elements: options?.elements,
|
|
69
|
+
metadata: options?.metadata
|
|
70
|
+
});
|
|
71
|
+
}
|
|
47
72
|
const handler = (pageNameOrRoute) => {
|
|
48
73
|
const pageName = typeof pageNameOrRoute === 'string' ? pageNameOrRoute : pageNameOrRoute?.name || pageNameOrRoute?.path;
|
|
49
74
|
if (!pageName)
|
|
@@ -64,6 +89,14 @@ function useNavigationHandler(router) {
|
|
|
64
89
|
else if (typeof window !== 'undefined') {
|
|
65
90
|
window.location.href = routePath;
|
|
66
91
|
}
|
|
92
|
+
// Update location after navigation
|
|
93
|
+
LocationContext_1.LocationContext.setCurrent({
|
|
94
|
+
page: routePath,
|
|
95
|
+
route: routePath,
|
|
96
|
+
components: options?.components,
|
|
97
|
+
elements: options?.elements,
|
|
98
|
+
metadata: options?.metadata
|
|
99
|
+
});
|
|
67
100
|
}
|
|
68
101
|
return;
|
|
69
102
|
}
|
|
@@ -77,12 +110,20 @@ function useNavigationHandler(router) {
|
|
|
77
110
|
else if (typeof window !== 'undefined') {
|
|
78
111
|
window.location.href = routePath;
|
|
79
112
|
}
|
|
113
|
+
// Update location after navigation
|
|
114
|
+
LocationContext_1.LocationContext.setCurrent({
|
|
115
|
+
page: routePath,
|
|
116
|
+
route: routePath,
|
|
117
|
+
components: options?.components,
|
|
118
|
+
elements: options?.elements,
|
|
119
|
+
metadata: options?.metadata
|
|
120
|
+
});
|
|
80
121
|
};
|
|
81
122
|
graph.setNavigationHandler(handler);
|
|
82
123
|
return () => {
|
|
83
124
|
// Clean up handler on unmount
|
|
84
125
|
graph.setNavigationHandler(() => { });
|
|
85
126
|
};
|
|
86
|
-
}, [router]);
|
|
127
|
+
}, [router, options?.components, options?.elements, options?.metadata]);
|
|
87
128
|
}
|
|
88
129
|
//# sourceMappingURL=useNavigationHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useNavigationHandler.js","sourceRoot":"","sources":["../../../../src/react/useNavigationHandler.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"useNavigationHandler.js","sourceRoot":"","sources":["../../../../src/react/useNavigationHandler.ts"],"names":[],"mappings":"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"}
|