@portel/photon 1.0.0
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 +21 -0
- package/README.md +952 -0
- package/dist/base.d.ts +58 -0
- package/dist/base.d.ts.map +1 -0
- package/dist/base.js +92 -0
- package/dist/base.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1441 -0
- package/dist/cli.js.map +1 -0
- package/dist/dependency-manager.d.ts +49 -0
- package/dist/dependency-manager.d.ts.map +1 -0
- package/dist/dependency-manager.js +165 -0
- package/dist/dependency-manager.js.map +1 -0
- package/dist/loader.d.ts +86 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +612 -0
- package/dist/loader.js.map +1 -0
- package/dist/marketplace-manager.d.ts +261 -0
- package/dist/marketplace-manager.d.ts.map +1 -0
- package/dist/marketplace-manager.js +767 -0
- package/dist/marketplace-manager.js.map +1 -0
- package/dist/path-resolver.d.ts +21 -0
- package/dist/path-resolver.d.ts.map +1 -0
- package/dist/path-resolver.js +71 -0
- package/dist/path-resolver.js.map +1 -0
- package/dist/photon-doc-extractor.d.ts +89 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -0
- package/dist/photon-doc-extractor.js +228 -0
- package/dist/photon-doc-extractor.js.map +1 -0
- package/dist/readme-syncer.d.ts +33 -0
- package/dist/readme-syncer.d.ts.map +1 -0
- package/dist/readme-syncer.js +93 -0
- package/dist/readme-syncer.js.map +1 -0
- package/dist/registry-manager.d.ts +76 -0
- package/dist/registry-manager.d.ts.map +1 -0
- package/dist/registry-manager.js +220 -0
- package/dist/registry-manager.js.map +1 -0
- package/dist/schema-extractor.d.ts +83 -0
- package/dist/schema-extractor.d.ts.map +1 -0
- package/dist/schema-extractor.js +396 -0
- package/dist/schema-extractor.js.map +1 -0
- package/dist/security-scanner.d.ts +52 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +172 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +474 -0
- package/dist/server.js.map +1 -0
- package/dist/template-manager.d.ts +56 -0
- package/dist/template-manager.d.ts.map +1 -0
- package/dist/template-manager.js +509 -0
- package/dist/template-manager.js.map +1 -0
- package/dist/test-client.d.ts +52 -0
- package/dist/test-client.d.ts.map +1 -0
- package/dist/test-client.js +168 -0
- package/dist/test-client.js.map +1 -0
- package/dist/test-marketplace-sources.d.ts +5 -0
- package/dist/test-marketplace-sources.d.ts.map +1 -0
- package/dist/test-marketplace-sources.js +53 -0
- package/dist/test-marketplace-sources.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/version-checker.d.ts +48 -0
- package/dist/version-checker.d.ts.map +1 -0
- package/dist/version-checker.js +128 -0
- package/dist/version-checker.js.map +1 -0
- package/dist/watcher.d.ts +26 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +72 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +79 -0
- package/templates/photon.template.ts +55 -0
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Wraps a .photon.ts file as an MCP server using @modelcontextprotocol/sdk
|
|
5
|
+
*/
|
|
6
|
+
export interface PhotonServerOptions {
|
|
7
|
+
filePath: string;
|
|
8
|
+
devMode?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class PhotonServer {
|
|
11
|
+
private loader;
|
|
12
|
+
private mcp;
|
|
13
|
+
private server;
|
|
14
|
+
private options;
|
|
15
|
+
constructor(options: PhotonServerOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Set up MCP protocol handlers
|
|
18
|
+
*/
|
|
19
|
+
private setupHandlers;
|
|
20
|
+
/**
|
|
21
|
+
* Format tool result as text
|
|
22
|
+
*/
|
|
23
|
+
private formatResult;
|
|
24
|
+
/**
|
|
25
|
+
* Format template result to MCP prompt response
|
|
26
|
+
*/
|
|
27
|
+
private formatTemplateResult;
|
|
28
|
+
/**
|
|
29
|
+
* Format static result to MCP resource response
|
|
30
|
+
*/
|
|
31
|
+
private formatStaticResult;
|
|
32
|
+
/**
|
|
33
|
+
* Check if a URI is a template (contains {parameters})
|
|
34
|
+
*/
|
|
35
|
+
private isUriTemplate;
|
|
36
|
+
/**
|
|
37
|
+
* Match URI pattern with actual URI
|
|
38
|
+
* Example: github://repos/{owner}/{repo} matches github://repos/foo/bar
|
|
39
|
+
*/
|
|
40
|
+
private matchUriPattern;
|
|
41
|
+
/**
|
|
42
|
+
* Parse parameters from URI based on pattern
|
|
43
|
+
* Example: pattern="github://repos/{owner}/{repo}", uri="github://repos/foo/bar"
|
|
44
|
+
* Returns: { owner: "foo", repo: "bar" }
|
|
45
|
+
*/
|
|
46
|
+
private parseUriParams;
|
|
47
|
+
/**
|
|
48
|
+
* Format error for AI consumption
|
|
49
|
+
* Provides structured, actionable error messages
|
|
50
|
+
*/
|
|
51
|
+
private formatError;
|
|
52
|
+
/**
|
|
53
|
+
* Initialize and start the server
|
|
54
|
+
*/
|
|
55
|
+
start(): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Stop the server
|
|
58
|
+
*/
|
|
59
|
+
stop(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Reload the MCP file (for dev mode hot reload)
|
|
62
|
+
*/
|
|
63
|
+
private reloadFailureCount;
|
|
64
|
+
private readonly MAX_RELOAD_FAILURES;
|
|
65
|
+
private reloadRetryTimeout?;
|
|
66
|
+
reload(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Send list_changed notifications to inform client that tools/prompts/resources changed
|
|
69
|
+
* Used after hot reload to tell clients (like Claude Desktop) to refresh
|
|
70
|
+
*/
|
|
71
|
+
private notifyListsChanged;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,GAAG,CAAuC;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAsB;gBAEzB,OAAO,EAAE,mBAAmB;IA6BxC;;OAEG;IACH,OAAO,CAAC,aAAa;IAyJrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAoBpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAa1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAQvB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA2BtB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA+DnB;;OAEG;IACG,KAAK;IAuBX;;OAEG;IACG,IAAI;IAcV;;OAEG;IACH,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAEtC,MAAM;IAuEZ;;;OAGG;YACW,kBAAkB;CAuBjC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Wraps a .photon.ts file as an MCP server using @modelcontextprotocol/sdk
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
9
|
+
import { PhotonLoader } from './loader.js';
|
|
10
|
+
export class PhotonServer {
|
|
11
|
+
loader;
|
|
12
|
+
mcp = null;
|
|
13
|
+
server;
|
|
14
|
+
options;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.options = options;
|
|
17
|
+
this.loader = new PhotonLoader(true); // verbose=true for server mode
|
|
18
|
+
// Create MCP server instance
|
|
19
|
+
this.server = new Server({
|
|
20
|
+
name: 'photon-mcp',
|
|
21
|
+
version: '1.0.0',
|
|
22
|
+
}, {
|
|
23
|
+
capabilities: {
|
|
24
|
+
tools: {
|
|
25
|
+
listChanged: true, // We support hot reload notifications
|
|
26
|
+
},
|
|
27
|
+
prompts: {
|
|
28
|
+
listChanged: true, // We support hot reload notifications
|
|
29
|
+
},
|
|
30
|
+
resources: {
|
|
31
|
+
listChanged: true, // We support hot reload notifications
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
// Set up protocol handlers
|
|
36
|
+
this.setupHandlers();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Set up MCP protocol handlers
|
|
40
|
+
*/
|
|
41
|
+
setupHandlers() {
|
|
42
|
+
// Handle tools/list
|
|
43
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
44
|
+
if (!this.mcp) {
|
|
45
|
+
return { tools: [] };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
tools: this.mcp.tools.map(tool => ({
|
|
49
|
+
name: tool.name,
|
|
50
|
+
description: tool.description,
|
|
51
|
+
inputSchema: tool.inputSchema,
|
|
52
|
+
})),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
// Handle tools/call
|
|
56
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
57
|
+
if (!this.mcp) {
|
|
58
|
+
throw new Error('MCP not loaded');
|
|
59
|
+
}
|
|
60
|
+
const { name: toolName, arguments: args } = request.params;
|
|
61
|
+
try {
|
|
62
|
+
const result = await this.loader.executeTool(this.mcp, toolName, args || {});
|
|
63
|
+
// Normalize result to MCP tool response format
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: 'text',
|
|
68
|
+
text: this.formatResult(result),
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Format error for AI consumption
|
|
75
|
+
return this.formatError(error, toolName, args);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Handle prompts/list
|
|
79
|
+
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
80
|
+
if (!this.mcp) {
|
|
81
|
+
return { prompts: [] };
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
prompts: this.mcp.templates.map(template => ({
|
|
85
|
+
name: template.name,
|
|
86
|
+
description: template.description,
|
|
87
|
+
arguments: Object.entries(template.inputSchema.properties || {}).map(([name, schema]) => ({
|
|
88
|
+
name,
|
|
89
|
+
description: schema.description || '',
|
|
90
|
+
required: template.inputSchema.required?.includes(name) || false,
|
|
91
|
+
})),
|
|
92
|
+
})),
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
// Handle prompts/get
|
|
96
|
+
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
97
|
+
if (!this.mcp) {
|
|
98
|
+
throw new Error('MCP not loaded');
|
|
99
|
+
}
|
|
100
|
+
const { name: promptName, arguments: args } = request.params;
|
|
101
|
+
// Find the template
|
|
102
|
+
const template = this.mcp.templates.find(t => t.name === promptName);
|
|
103
|
+
if (!template) {
|
|
104
|
+
throw new Error(`Prompt not found: ${promptName}`);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
// Execute the template method
|
|
108
|
+
const result = await this.loader.executeTool(this.mcp, promptName, args || {});
|
|
109
|
+
// Handle Template/TemplateResponse return types
|
|
110
|
+
return this.formatTemplateResult(result);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`Failed to get prompt: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// Handle resources/list (static URIs only, no parameters)
|
|
117
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
118
|
+
if (!this.mcp) {
|
|
119
|
+
return { resources: [] };
|
|
120
|
+
}
|
|
121
|
+
// Only return resources with static URIs (no {parameters})
|
|
122
|
+
const staticResources = this.mcp.statics.filter(s => !this.isUriTemplate(s.uri));
|
|
123
|
+
return {
|
|
124
|
+
resources: staticResources.map(static_ => ({
|
|
125
|
+
uri: static_.uri,
|
|
126
|
+
name: static_.name,
|
|
127
|
+
description: static_.description,
|
|
128
|
+
mimeType: static_.mimeType || 'text/plain',
|
|
129
|
+
})),
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
// Handle resources/templates/list (parameterized URIs)
|
|
133
|
+
this.server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
|
|
134
|
+
if (!this.mcp) {
|
|
135
|
+
return { resourceTemplates: [] };
|
|
136
|
+
}
|
|
137
|
+
// Only return resources with URI templates (has {parameters})
|
|
138
|
+
const templateResources = this.mcp.statics.filter(s => this.isUriTemplate(s.uri));
|
|
139
|
+
return {
|
|
140
|
+
resourceTemplates: templateResources.map(static_ => ({
|
|
141
|
+
uriTemplate: static_.uri,
|
|
142
|
+
name: static_.name,
|
|
143
|
+
description: static_.description,
|
|
144
|
+
mimeType: static_.mimeType || 'text/plain',
|
|
145
|
+
})),
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
// Handle resources/read
|
|
149
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
150
|
+
if (!this.mcp) {
|
|
151
|
+
throw new Error('MCP not loaded');
|
|
152
|
+
}
|
|
153
|
+
const { uri } = request.params;
|
|
154
|
+
// Find the static resource by URI
|
|
155
|
+
const static_ = this.mcp.statics.find(s => s.uri === uri || this.matchUriPattern(s.uri, uri));
|
|
156
|
+
if (!static_) {
|
|
157
|
+
throw new Error(`Resource not found: ${uri}`);
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
// Parse URI parameters if URI is a pattern
|
|
161
|
+
const params = this.parseUriParams(static_.uri, uri);
|
|
162
|
+
// Execute the static method
|
|
163
|
+
const result = await this.loader.executeTool(this.mcp, static_.name, params);
|
|
164
|
+
// Handle Static return type
|
|
165
|
+
return this.formatStaticResult(result, static_.mimeType);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw new Error(`Failed to read resource: ${error.message}`);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Format tool result as text
|
|
174
|
+
*/
|
|
175
|
+
formatResult(result) {
|
|
176
|
+
if (typeof result === 'string') {
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
else if (result && typeof result === 'object') {
|
|
180
|
+
// Handle {success, content} format
|
|
181
|
+
if ('success' in result && 'content' in result) {
|
|
182
|
+
return result.content || String(result);
|
|
183
|
+
}
|
|
184
|
+
// Handle {success, error} format
|
|
185
|
+
if ('success' in result && 'error' in result) {
|
|
186
|
+
if (!result.success) {
|
|
187
|
+
throw new Error(result.error);
|
|
188
|
+
}
|
|
189
|
+
return result.error || 'Success';
|
|
190
|
+
}
|
|
191
|
+
return JSON.stringify(result, null, 2);
|
|
192
|
+
}
|
|
193
|
+
return String(result);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Format template result to MCP prompt response
|
|
197
|
+
*/
|
|
198
|
+
formatTemplateResult(result) {
|
|
199
|
+
// Check if result is a TemplateResponse object
|
|
200
|
+
if (result && typeof result === 'object' && 'messages' in result) {
|
|
201
|
+
return {
|
|
202
|
+
messages: result.messages,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// Otherwise, treat as simple string template
|
|
206
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
207
|
+
return {
|
|
208
|
+
messages: [
|
|
209
|
+
{
|
|
210
|
+
role: 'user',
|
|
211
|
+
content: {
|
|
212
|
+
type: 'text',
|
|
213
|
+
text,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Format static result to MCP resource response
|
|
221
|
+
*/
|
|
222
|
+
formatStaticResult(result, mimeType) {
|
|
223
|
+
const text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
224
|
+
return {
|
|
225
|
+
contents: [
|
|
226
|
+
{
|
|
227
|
+
uri: '',
|
|
228
|
+
mimeType: mimeType || 'text/plain',
|
|
229
|
+
text,
|
|
230
|
+
},
|
|
231
|
+
],
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Check if a URI is a template (contains {parameters})
|
|
236
|
+
*/
|
|
237
|
+
isUriTemplate(uri) {
|
|
238
|
+
return /\{[^}]+\}/.test(uri);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Match URI pattern with actual URI
|
|
242
|
+
* Example: github://repos/{owner}/{repo} matches github://repos/foo/bar
|
|
243
|
+
*/
|
|
244
|
+
matchUriPattern(pattern, uri) {
|
|
245
|
+
// Convert URI pattern to regex
|
|
246
|
+
// Replace {param} with capturing groups
|
|
247
|
+
const regexPattern = pattern.replace(/\{[^}]+\}/g, '([^/]+)');
|
|
248
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
249
|
+
return regex.test(uri);
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Parse parameters from URI based on pattern
|
|
253
|
+
* Example: pattern="github://repos/{owner}/{repo}", uri="github://repos/foo/bar"
|
|
254
|
+
* Returns: { owner: "foo", repo: "bar" }
|
|
255
|
+
*/
|
|
256
|
+
parseUriParams(pattern, uri) {
|
|
257
|
+
const params = {};
|
|
258
|
+
// Extract parameter names from pattern
|
|
259
|
+
const paramNames = [];
|
|
260
|
+
const paramRegex = /\{([^}]+)\}/g;
|
|
261
|
+
let match;
|
|
262
|
+
while ((match = paramRegex.exec(pattern)) !== null) {
|
|
263
|
+
paramNames.push(match[1]);
|
|
264
|
+
}
|
|
265
|
+
// Convert pattern to regex with capturing groups
|
|
266
|
+
const regexPattern = pattern.replace(/\{[^}]+\}/g, '([^/]+)');
|
|
267
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
268
|
+
// Extract values from URI
|
|
269
|
+
const values = uri.match(regex);
|
|
270
|
+
if (values) {
|
|
271
|
+
// Skip first element (full match)
|
|
272
|
+
for (let i = 0; i < paramNames.length; i++) {
|
|
273
|
+
params[paramNames[i]] = values[i + 1];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return params;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Format error for AI consumption
|
|
280
|
+
* Provides structured, actionable error messages
|
|
281
|
+
*/
|
|
282
|
+
formatError(error, toolName, args) {
|
|
283
|
+
// Determine error type
|
|
284
|
+
let errorType = 'runtime_error';
|
|
285
|
+
let errorMessage = error.message || String(error);
|
|
286
|
+
let suggestion = '';
|
|
287
|
+
// Categorize common errors and provide suggestions
|
|
288
|
+
if (errorMessage.includes('not a function') || errorMessage.includes('undefined')) {
|
|
289
|
+
errorType = 'implementation_error';
|
|
290
|
+
suggestion = 'The tool implementation may have an issue. Check that all methods are properly defined.';
|
|
291
|
+
}
|
|
292
|
+
else if (errorMessage.includes('required') || errorMessage.includes('validation')) {
|
|
293
|
+
errorType = 'validation_error';
|
|
294
|
+
suggestion = 'Check the parameters provided match the tool schema requirements.';
|
|
295
|
+
}
|
|
296
|
+
else if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {
|
|
297
|
+
errorType = 'timeout_error';
|
|
298
|
+
suggestion = 'The operation took too long. Try again or check external service availability.';
|
|
299
|
+
}
|
|
300
|
+
else if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('network')) {
|
|
301
|
+
errorType = 'network_error';
|
|
302
|
+
suggestion = 'Cannot connect to external service. Check network connection and service availability.';
|
|
303
|
+
}
|
|
304
|
+
else if (errorMessage.includes('permission') || errorMessage.includes('EACCES')) {
|
|
305
|
+
errorType = 'permission_error';
|
|
306
|
+
suggestion = 'Permission denied. Check file/resource access permissions.';
|
|
307
|
+
}
|
|
308
|
+
else if (errorMessage.includes('not found') || errorMessage.includes('ENOENT')) {
|
|
309
|
+
errorType = 'not_found_error';
|
|
310
|
+
suggestion = 'Resource not found. Check that the file or resource exists.';
|
|
311
|
+
}
|
|
312
|
+
// Build structured error message for AI
|
|
313
|
+
let structuredMessage = `❌ Tool Error: ${toolName}\n\n`;
|
|
314
|
+
structuredMessage += `Error Type: ${errorType}\n`;
|
|
315
|
+
structuredMessage += `Message: ${errorMessage}\n`;
|
|
316
|
+
if (suggestion) {
|
|
317
|
+
structuredMessage += `\nSuggestion: ${suggestion}\n`;
|
|
318
|
+
}
|
|
319
|
+
// Include parameters for debugging (in dev mode)
|
|
320
|
+
if (this.options.devMode && Object.keys(args || {}).length > 0) {
|
|
321
|
+
structuredMessage += `\nParameters provided:\n${JSON.stringify(args, null, 2)}\n`;
|
|
322
|
+
}
|
|
323
|
+
// Include stack trace in dev mode
|
|
324
|
+
if (this.options.devMode && error.stack) {
|
|
325
|
+
structuredMessage += `\nStack trace:\n${error.stack}\n`;
|
|
326
|
+
}
|
|
327
|
+
// Log to stderr for debugging
|
|
328
|
+
console.error(`[Photon Error] ${toolName}: ${errorMessage}`);
|
|
329
|
+
if (this.options.devMode && error.stack) {
|
|
330
|
+
console.error(error.stack);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
content: [
|
|
334
|
+
{
|
|
335
|
+
type: 'text',
|
|
336
|
+
text: structuredMessage,
|
|
337
|
+
},
|
|
338
|
+
],
|
|
339
|
+
isError: true,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Initialize and start the server
|
|
344
|
+
*/
|
|
345
|
+
async start() {
|
|
346
|
+
try {
|
|
347
|
+
// Load the Photon MCP file
|
|
348
|
+
console.error(`Loading ${this.options.filePath}...`);
|
|
349
|
+
this.mcp = await this.loader.loadFile(this.options.filePath);
|
|
350
|
+
// Connect to stdio transport
|
|
351
|
+
const transport = new StdioServerTransport();
|
|
352
|
+
await this.server.connect(transport);
|
|
353
|
+
console.error(`Server started: ${this.mcp.name}`);
|
|
354
|
+
// In dev mode, we could set up file watching here
|
|
355
|
+
if (this.options.devMode) {
|
|
356
|
+
console.error('Dev mode enabled - hot reload active');
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
console.error(`Failed to start server: ${error.message}`);
|
|
361
|
+
console.error(error.stack);
|
|
362
|
+
process.exit(1);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Stop the server
|
|
367
|
+
*/
|
|
368
|
+
async stop() {
|
|
369
|
+
try {
|
|
370
|
+
// Call lifecycle hook if present
|
|
371
|
+
if (this.mcp?.instance?.onShutdown) {
|
|
372
|
+
await this.mcp.instance.onShutdown();
|
|
373
|
+
}
|
|
374
|
+
await this.server.close();
|
|
375
|
+
console.error('Server stopped');
|
|
376
|
+
}
|
|
377
|
+
catch (error) {
|
|
378
|
+
console.error(`Error stopping server: ${error.message}`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Reload the MCP file (for dev mode hot reload)
|
|
383
|
+
*/
|
|
384
|
+
reloadFailureCount = 0;
|
|
385
|
+
MAX_RELOAD_FAILURES = 3;
|
|
386
|
+
reloadRetryTimeout;
|
|
387
|
+
async reload() {
|
|
388
|
+
// Clear any pending retry
|
|
389
|
+
if (this.reloadRetryTimeout) {
|
|
390
|
+
clearTimeout(this.reloadRetryTimeout);
|
|
391
|
+
this.reloadRetryTimeout = undefined;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
console.error('🔄 Reloading...');
|
|
395
|
+
// Store old instance in case we need to rollback
|
|
396
|
+
const oldInstance = this.mcp;
|
|
397
|
+
// Call shutdown hook on old instance (but keep it for rollback)
|
|
398
|
+
if (oldInstance?.instance?.onShutdown) {
|
|
399
|
+
try {
|
|
400
|
+
await oldInstance.instance.onShutdown();
|
|
401
|
+
}
|
|
402
|
+
catch (shutdownError) {
|
|
403
|
+
console.error(`⚠️ Shutdown hook failed: ${shutdownError.message}`);
|
|
404
|
+
// Continue with reload anyway
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Reload the file
|
|
408
|
+
const newMcp = await this.loader.reloadFile(this.options.filePath);
|
|
409
|
+
// Success! Update instance and reset failure count
|
|
410
|
+
this.mcp = newMcp;
|
|
411
|
+
this.reloadFailureCount = 0;
|
|
412
|
+
// Send list_changed notifications to inform client of updates
|
|
413
|
+
await this.notifyListsChanged();
|
|
414
|
+
console.error('✅ Reload complete');
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
this.reloadFailureCount++;
|
|
418
|
+
console.error(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
419
|
+
console.error(`❌ Reload failed (attempt ${this.reloadFailureCount}/${this.MAX_RELOAD_FAILURES})`);
|
|
420
|
+
console.error(`Error: ${error.message}`);
|
|
421
|
+
console.error(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
|
|
422
|
+
if (error.name === 'PhotonInitializationError') {
|
|
423
|
+
console.error(`\n💡 The onInitialize() lifecycle hook failed.`);
|
|
424
|
+
console.error(` Common causes:`);
|
|
425
|
+
console.error(` - Database connection failure`);
|
|
426
|
+
console.error(` - API authentication error`);
|
|
427
|
+
console.error(` - Missing environment variables`);
|
|
428
|
+
console.error(` - Invalid configuration`);
|
|
429
|
+
}
|
|
430
|
+
if (this.reloadFailureCount >= this.MAX_RELOAD_FAILURES) {
|
|
431
|
+
console.error(`\n⚠️ Maximum reload failures reached (${this.MAX_RELOAD_FAILURES})`);
|
|
432
|
+
console.error(` Keeping previous working version active.`);
|
|
433
|
+
console.error(` Fix the errors and save the file again to retry.`);
|
|
434
|
+
console.error(`\n Or restart the server: photon mcp <name> --dev`);
|
|
435
|
+
// Reset counter after cooling off
|
|
436
|
+
this.reloadFailureCount = 0;
|
|
437
|
+
}
|
|
438
|
+
else {
|
|
439
|
+
// Schedule automatic retry
|
|
440
|
+
const retryDelay = Math.min(5000 * this.reloadFailureCount, 15000); // 5s, 10s, 15s max
|
|
441
|
+
console.error(`\n🔄 Will retry reload in ${retryDelay / 1000}s if file changes again...`);
|
|
442
|
+
console.error(` Previous working version remains active.`);
|
|
443
|
+
}
|
|
444
|
+
// Keep the old instance running - it's still functional
|
|
445
|
+
console.error(`\n✓ Server still running with previous version`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Send list_changed notifications to inform client that tools/prompts/resources changed
|
|
450
|
+
* Used after hot reload to tell clients (like Claude Desktop) to refresh
|
|
451
|
+
*/
|
|
452
|
+
async notifyListsChanged() {
|
|
453
|
+
try {
|
|
454
|
+
// Send tools list changed notification
|
|
455
|
+
await this.server.notification({
|
|
456
|
+
method: 'notifications/tools/list_changed',
|
|
457
|
+
});
|
|
458
|
+
// Send prompts list changed notification
|
|
459
|
+
await this.server.notification({
|
|
460
|
+
method: 'notifications/prompts/list_changed',
|
|
461
|
+
});
|
|
462
|
+
// Send resources list changed notification
|
|
463
|
+
await this.server.notification({
|
|
464
|
+
method: 'notifications/resources/list_changed',
|
|
465
|
+
});
|
|
466
|
+
console.error('Sent list_changed notifications');
|
|
467
|
+
}
|
|
468
|
+
catch (error) {
|
|
469
|
+
// Notification sending is best-effort - don't fail reload if it fails
|
|
470
|
+
console.error(`Warning: Failed to send list_changed notifications: ${error.message}`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manages marketplace documentation templates
|
|
3
|
+
*
|
|
4
|
+
* Templates are stored in .marketplace/_templates/ and can be customized by users.
|
|
5
|
+
* Hash-based detection prevents overwriting user customizations.
|
|
6
|
+
*/
|
|
7
|
+
export declare class TemplateManager {
|
|
8
|
+
private workingDir;
|
|
9
|
+
private marketplaceDir;
|
|
10
|
+
private templateDir;
|
|
11
|
+
private hashFile;
|
|
12
|
+
private static readonly TEMPLATE_VERSION;
|
|
13
|
+
constructor(workingDir: string);
|
|
14
|
+
/**
|
|
15
|
+
* Ensure templates directory exists and templates are initialized
|
|
16
|
+
*/
|
|
17
|
+
ensureTemplates(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a template has been customized by the user
|
|
20
|
+
*/
|
|
21
|
+
isTemplateCustomized(templateName: string): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Render a template with provided data
|
|
24
|
+
*/
|
|
25
|
+
renderTemplate(templateName: string, data: any): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Simple template renderer using template literals
|
|
28
|
+
* Safely evaluates ${expression} in templates
|
|
29
|
+
*/
|
|
30
|
+
private render;
|
|
31
|
+
/**
|
|
32
|
+
* Ensure a single template exists and is up-to-date
|
|
33
|
+
*/
|
|
34
|
+
private ensureTemplate;
|
|
35
|
+
/**
|
|
36
|
+
* Load template hashes from file
|
|
37
|
+
*/
|
|
38
|
+
private loadHashes;
|
|
39
|
+
/**
|
|
40
|
+
* Save template hashes to file
|
|
41
|
+
*/
|
|
42
|
+
private saveHashes;
|
|
43
|
+
/**
|
|
44
|
+
* Calculate SHA-256 hash of content
|
|
45
|
+
*/
|
|
46
|
+
private calculateHash;
|
|
47
|
+
/**
|
|
48
|
+
* Get default README template
|
|
49
|
+
*/
|
|
50
|
+
private getDefaultReadmeTemplate;
|
|
51
|
+
/**
|
|
52
|
+
* Get default Photon documentation template
|
|
53
|
+
*/
|
|
54
|
+
private getDefaultPhotonTemplate;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=template-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../src/template-manager.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,qBAAa,eAAe;IAQd,OAAO,CAAC,UAAU;IAP9B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAW;gBAE/B,UAAU,EAAE,MAAM;IAMtC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAetC;;OAEG;IACG,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAWtE;;;OAGG;IACH,OAAO,CAAC,MAAM;IAqDd;;OAEG;YACW,cAAc;IAqD5B;;OAEG;YACW,UAAU;IAaxB;;OAEG;YACW,UAAU;IAQxB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2MhC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAsHjC"}
|