@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.
Files changed (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +952 -0
  3. package/dist/base.d.ts +58 -0
  4. package/dist/base.d.ts.map +1 -0
  5. package/dist/base.js +92 -0
  6. package/dist/base.js.map +1 -0
  7. package/dist/cli.d.ts +8 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +1441 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/dependency-manager.d.ts +49 -0
  12. package/dist/dependency-manager.d.ts.map +1 -0
  13. package/dist/dependency-manager.js +165 -0
  14. package/dist/dependency-manager.js.map +1 -0
  15. package/dist/loader.d.ts +86 -0
  16. package/dist/loader.d.ts.map +1 -0
  17. package/dist/loader.js +612 -0
  18. package/dist/loader.js.map +1 -0
  19. package/dist/marketplace-manager.d.ts +261 -0
  20. package/dist/marketplace-manager.d.ts.map +1 -0
  21. package/dist/marketplace-manager.js +767 -0
  22. package/dist/marketplace-manager.js.map +1 -0
  23. package/dist/path-resolver.d.ts +21 -0
  24. package/dist/path-resolver.d.ts.map +1 -0
  25. package/dist/path-resolver.js +71 -0
  26. package/dist/path-resolver.js.map +1 -0
  27. package/dist/photon-doc-extractor.d.ts +89 -0
  28. package/dist/photon-doc-extractor.d.ts.map +1 -0
  29. package/dist/photon-doc-extractor.js +228 -0
  30. package/dist/photon-doc-extractor.js.map +1 -0
  31. package/dist/readme-syncer.d.ts +33 -0
  32. package/dist/readme-syncer.d.ts.map +1 -0
  33. package/dist/readme-syncer.js +93 -0
  34. package/dist/readme-syncer.js.map +1 -0
  35. package/dist/registry-manager.d.ts +76 -0
  36. package/dist/registry-manager.d.ts.map +1 -0
  37. package/dist/registry-manager.js +220 -0
  38. package/dist/registry-manager.js.map +1 -0
  39. package/dist/schema-extractor.d.ts +83 -0
  40. package/dist/schema-extractor.d.ts.map +1 -0
  41. package/dist/schema-extractor.js +396 -0
  42. package/dist/schema-extractor.js.map +1 -0
  43. package/dist/security-scanner.d.ts +52 -0
  44. package/dist/security-scanner.d.ts.map +1 -0
  45. package/dist/security-scanner.js +172 -0
  46. package/dist/security-scanner.js.map +1 -0
  47. package/dist/server.d.ts +73 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +474 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/template-manager.d.ts +56 -0
  52. package/dist/template-manager.d.ts.map +1 -0
  53. package/dist/template-manager.js +509 -0
  54. package/dist/template-manager.js.map +1 -0
  55. package/dist/test-client.d.ts +52 -0
  56. package/dist/test-client.d.ts.map +1 -0
  57. package/dist/test-client.js +168 -0
  58. package/dist/test-client.js.map +1 -0
  59. package/dist/test-marketplace-sources.d.ts +5 -0
  60. package/dist/test-marketplace-sources.d.ts.map +1 -0
  61. package/dist/test-marketplace-sources.js +53 -0
  62. package/dist/test-marketplace-sources.js.map +1 -0
  63. package/dist/types.d.ts +108 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +12 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/version-checker.d.ts +48 -0
  68. package/dist/version-checker.d.ts.map +1 -0
  69. package/dist/version-checker.js +128 -0
  70. package/dist/version-checker.js.map +1 -0
  71. package/dist/watcher.d.ts +26 -0
  72. package/dist/watcher.d.ts.map +1 -0
  73. package/dist/watcher.js +72 -0
  74. package/dist/watcher.js.map +1 -0
  75. package/package.json +79 -0
  76. package/templates/photon.template.ts +55 -0
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,yBAAyB,GAI1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,OAAO,YAAY;IACf,MAAM,CAAe;IACrB,GAAG,GAAkC,IAAI,CAAC;IAC1C,MAAM,CAAS;IACf,OAAO,CAAsB;IAErC,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,+BAA+B;QAErE,6BAA6B;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CACtB;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;SACjB,EACD;YACE,YAAY,EAAE;gBACZ,KAAK,EAAE;oBACL,WAAW,EAAE,IAAI,EAAE,sCAAsC;iBAC1D;gBACD,OAAO,EAAE;oBACP,WAAW,EAAE,IAAI,EAAE,sCAAsC;iBAC1D;gBACD,SAAS,EAAE;oBACT,WAAW,EAAE,IAAI,EAAE,sCAAsC;iBAC1D;aACF;SACF,CACF,CAAC;QAEF,2BAA2B;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YAC/D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACvB,CAAC;YAED,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAE3D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAE7E,+CAA+C;gBAC/C,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;yBAChC;qBACF;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,kCAAkC;gBAClC,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;YACjE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACzB,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI;oBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;oBACjC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;wBACxF,IAAI;wBACJ,WAAW,EAAG,MAAc,CAAC,WAAW,IAAI,EAAE;wBAC9C,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK;qBACjE,CAAC,CAAC;iBACJ,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,qBAAqB;QACrB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAE7D,oBAAoB;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;YACrD,CAAC;YAED,IAAI,CAAC;gBACH,8BAA8B;gBAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;gBAE/E,gDAAgD;gBAChD,OAAO,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,0DAA0D;QAC1D,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACnE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;YAC3B,CAAC;YAED,2DAA2D;YAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEjF,OAAO;gBACL,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACzC,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,YAAY;iBAC3C,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,uDAAuD;QACvD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAC3E,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;YACnC,CAAC;YAED,8DAA8D;YAC9D,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAElF,OAAO;gBACL,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBACnD,WAAW,EAAE,OAAO,CAAC,GAAG;oBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,YAAY;iBAC3C,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAE/B,kCAAkC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,CAAC;gBACH,2CAA2C;gBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAErD,4BAA4B;gBAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAE7E,4BAA4B;gBAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,MAAW;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChD,mCAAmC;YACnC,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;gBAC/C,OAAO,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YACD,iCAAiC;YACjC,IAAI,SAAS,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;gBACD,OAAO,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC;YACnC,CAAC;YACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,MAAW;QACtC,+CAA+C;QAC/C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;YACjE,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC;QAED,6CAA6C;QAC7C,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI;qBACL;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAW,EAAE,QAAiB;QACvD,MAAM,IAAI,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,EAAE;oBACP,QAAQ,EAAE,QAAQ,IAAI,YAAY;oBAClC,IAAI;iBACL;aACF;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAW;QAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,OAAe,EAAE,GAAW;QAClD,+BAA+B;QAC/B,wCAAwC;QACxC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,OAAe,EAAE,GAAW;QACjD,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,uCAAuC;QACvC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,cAAc,CAAC;QAClC,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACnD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;QAED,iDAAiD;QACjD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;QAE9C,0BAA0B;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,kCAAkC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,WAAW,CAAC,KAAU,EAAE,QAAgB,EAAE,IAAS;QACzD,uBAAuB;QACvB,IAAI,SAAS,GAAG,eAAe,CAAC;QAChC,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,mDAAmD;QACnD,IAAI,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClF,SAAS,GAAG,sBAAsB,CAAC;YACnC,UAAU,GAAG,yFAAyF,CAAC;QACzG,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACpF,SAAS,GAAG,kBAAkB,CAAC;YAC/B,UAAU,GAAG,mEAAmE,CAAC;QACnF,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClF,SAAS,GAAG,eAAe,CAAC;YAC5B,UAAU,GAAG,gFAAgF,CAAC;QAChG,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,SAAS,GAAG,eAAe,CAAC;YAC5B,UAAU,GAAG,wFAAwF,CAAC;QACxG,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClF,SAAS,GAAG,kBAAkB,CAAC;YAC/B,UAAU,GAAG,4DAA4D,CAAC;QAC5E,CAAC;aAAM,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjF,SAAS,GAAG,iBAAiB,CAAC;YAC9B,UAAU,GAAG,6DAA6D,CAAC;QAC7E,CAAC;QAED,wCAAwC;QACxC,IAAI,iBAAiB,GAAG,iBAAiB,QAAQ,MAAM,CAAC;QACxD,iBAAiB,IAAI,eAAe,SAAS,IAAI,CAAC;QAClD,iBAAiB,IAAI,YAAY,YAAY,IAAI,CAAC;QAElD,IAAI,UAAU,EAAE,CAAC;YACf,iBAAiB,IAAI,iBAAiB,UAAU,IAAI,CAAC;QACvD,CAAC;QAED,iDAAiD;QACjD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,iBAAiB,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACpF,CAAC;QAED,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACxC,iBAAiB,IAAI,mBAAmB,KAAK,CAAC,KAAK,IAAI,CAAC;QAC1D,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,KAAK,YAAY,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,iBAAiB;iBACxB;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,2BAA2B;YAC3B,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE7D,6BAA6B;YAC7B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAErC,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAElD,kDAAkD;YAClD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvC,CAAC;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,GAAG,CAAC,CAAC;IACd,mBAAmB,GAAG,CAAC,CAAC;IACjC,kBAAkB,CAAkB;IAE5C,KAAK,CAAC,MAAM;QACV,0BAA0B;QAC1B,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACtC,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAEjC,iDAAiD;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC;YAE7B,gEAAgE;YAChE,IAAI,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC1C,CAAC;gBAAC,OAAO,aAAkB,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,CAAC,6BAA6B,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpE,8BAA8B;gBAChC,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEnE,mDAAmD;YACnD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;YAClB,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAE5B,8DAA8D;YAC9D,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAEhC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAClG,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;YAE7E,IAAI,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBACnC,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAClD,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC9C,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBACrF,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrE,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBAErE,kCAAkC;gBAClC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,mBAAmB;gBACvF,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,GAAG,IAAI,4BAA4B,CAAC,CAAC;gBAC1F,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC/D,CAAC;YAED,wDAAwD;YACxD,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,MAAM,EAAE,kCAAkC;aACpC,CAAC,CAAC;YAEV,yCAAyC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,MAAM,EAAE,oCAAoC;aACtC,CAAC,CAAC;YAEV,2CAA2C;YAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;gBAC7B,MAAM,EAAE,sCAAsC;aACxC,CAAC,CAAC;YAEV,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,sEAAsE;YACtE,OAAO,CAAC,KAAK,CAAC,uDAAuD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF"}
@@ -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"}