@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
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP Test Client - Automated testing for Photon MCPs
|
|
4
|
+
*
|
|
5
|
+
* Spawns MCP servers, sends protocol messages, validates responses
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import * as readline from 'readline';
|
|
9
|
+
export class MCPTestClient {
|
|
10
|
+
process;
|
|
11
|
+
requestId = 0;
|
|
12
|
+
pendingRequests = new Map();
|
|
13
|
+
async start(command, args, env) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
this.process = spawn(command, args, {
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
17
|
+
env: { ...process.env, ...env },
|
|
18
|
+
});
|
|
19
|
+
if (!this.process.stdout || !this.process.stdin) {
|
|
20
|
+
reject(new Error('Failed to create stdio pipes'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Read responses line by line
|
|
24
|
+
const rl = readline.createInterface({
|
|
25
|
+
input: this.process.stdout,
|
|
26
|
+
crlfDelay: Infinity,
|
|
27
|
+
});
|
|
28
|
+
rl.on('line', (line) => {
|
|
29
|
+
try {
|
|
30
|
+
const response = JSON.parse(line);
|
|
31
|
+
const pending = this.pendingRequests.get(response.id);
|
|
32
|
+
if (pending) {
|
|
33
|
+
this.pendingRequests.delete(response.id);
|
|
34
|
+
pending.resolve(response);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('[test-client] Failed to parse response:', line);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// Log stderr for debugging (MCP servers log to stderr)
|
|
42
|
+
if (this.process.stderr) {
|
|
43
|
+
const stderrRl = readline.createInterface({
|
|
44
|
+
input: this.process.stderr,
|
|
45
|
+
crlfDelay: Infinity,
|
|
46
|
+
});
|
|
47
|
+
stderrRl.on('line', (line) => {
|
|
48
|
+
console.error('[mcp-stderr]', line);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
this.process.on('error', (error) => {
|
|
52
|
+
reject(error);
|
|
53
|
+
});
|
|
54
|
+
// Wait a bit for process to start
|
|
55
|
+
setTimeout(() => resolve(), 100);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
async send(method, params) {
|
|
59
|
+
if (!this.process?.stdin) {
|
|
60
|
+
throw new Error('MCP process not started');
|
|
61
|
+
}
|
|
62
|
+
const id = ++this.requestId;
|
|
63
|
+
const request = {
|
|
64
|
+
jsonrpc: '2.0',
|
|
65
|
+
id,
|
|
66
|
+
method,
|
|
67
|
+
params,
|
|
68
|
+
};
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
this.pendingRequests.set(id, { resolve, reject });
|
|
71
|
+
// Set timeout for request
|
|
72
|
+
setTimeout(() => {
|
|
73
|
+
if (this.pendingRequests.has(id)) {
|
|
74
|
+
this.pendingRequests.delete(id);
|
|
75
|
+
reject(new Error(`Request timeout: ${method}`));
|
|
76
|
+
}
|
|
77
|
+
}, 10000);
|
|
78
|
+
this.process.stdin.write(JSON.stringify(request) + '\n');
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async initialize(serverInfo) {
|
|
82
|
+
return this.send('initialize', {
|
|
83
|
+
protocolVersion: '2024-11-05',
|
|
84
|
+
capabilities: {},
|
|
85
|
+
clientInfo: serverInfo || { name: 'test-client', version: '1.0.0' },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async listTools() {
|
|
89
|
+
return this.send('tools/list');
|
|
90
|
+
}
|
|
91
|
+
async callTool(name, args) {
|
|
92
|
+
return this.send('tools/call', { name, arguments: args || {} });
|
|
93
|
+
}
|
|
94
|
+
async runTests(tests) {
|
|
95
|
+
const errors = [];
|
|
96
|
+
let passed = 0;
|
|
97
|
+
let failed = 0;
|
|
98
|
+
for (const test of tests) {
|
|
99
|
+
try {
|
|
100
|
+
console.log(`\n🧪 Running: ${test.name}`);
|
|
101
|
+
const response = await this.send(test.method, test.params);
|
|
102
|
+
const result = test.validate(response);
|
|
103
|
+
if (result === true) {
|
|
104
|
+
console.log(`✅ PASS: ${test.name}`);
|
|
105
|
+
passed++;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const errorMsg = typeof result === 'string' ? result : 'Validation failed';
|
|
109
|
+
console.log(`❌ FAIL: ${test.name}\n ${errorMsg}`);
|
|
110
|
+
errors.push(`${test.name}: ${errorMsg}`);
|
|
111
|
+
failed++;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
console.log(`❌ ERROR: ${test.name}\n ${error.message}`);
|
|
116
|
+
errors.push(`${test.name}: ${error.message}`);
|
|
117
|
+
failed++;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { passed, failed, errors };
|
|
121
|
+
}
|
|
122
|
+
async shutdown() {
|
|
123
|
+
if (this.process) {
|
|
124
|
+
this.process.stdin?.end();
|
|
125
|
+
this.process.kill();
|
|
126
|
+
this.process = undefined;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Validation helpers
|
|
131
|
+
export const validators = {
|
|
132
|
+
hasResult: (response) => response.result !== undefined || 'Response missing result field',
|
|
133
|
+
hasError: (response) => response.error !== undefined || 'Response missing error field',
|
|
134
|
+
matchesPattern: (pattern, field) => (response) => {
|
|
135
|
+
const value = field
|
|
136
|
+
? JSON.stringify(response.result?.[field])
|
|
137
|
+
: JSON.stringify(response.result);
|
|
138
|
+
return pattern.test(value) || `Pattern ${pattern} did not match: ${value}`;
|
|
139
|
+
},
|
|
140
|
+
hasField: (field) => (response) => {
|
|
141
|
+
const parts = field.split('.');
|
|
142
|
+
let current = response.result;
|
|
143
|
+
for (const part of parts) {
|
|
144
|
+
if (current?.[part] === undefined) {
|
|
145
|
+
return `Missing field: ${field}`;
|
|
146
|
+
}
|
|
147
|
+
current = current[part];
|
|
148
|
+
}
|
|
149
|
+
return true;
|
|
150
|
+
},
|
|
151
|
+
equals: (expected, field) => (response) => {
|
|
152
|
+
const actual = field ? response.result?.[field] : response.result;
|
|
153
|
+
const match = JSON.stringify(actual) === JSON.stringify(expected);
|
|
154
|
+
return match || `Expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`;
|
|
155
|
+
},
|
|
156
|
+
custom: (fn) => (response) => {
|
|
157
|
+
return fn(response.result);
|
|
158
|
+
},
|
|
159
|
+
and: (...validators) => (response) => {
|
|
160
|
+
for (const validator of validators) {
|
|
161
|
+
const result = validator(response);
|
|
162
|
+
if (result !== true)
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
return true;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
//# sourceMappingURL=test-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-client.js","sourceRoot":"","sources":["../src/test-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-marketplace-sources.d.ts","sourceRoot":"","sources":["../src/test-marketplace-sources.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quick test script to verify marketplace source parsing
|
|
3
|
+
*/
|
|
4
|
+
import { MarketplaceManager } from './marketplace-manager.js';
|
|
5
|
+
async function testMarketplaceParsing() {
|
|
6
|
+
const manager = new MarketplaceManager();
|
|
7
|
+
await manager.initialize();
|
|
8
|
+
const testCases = [
|
|
9
|
+
// GitHub shorthand
|
|
10
|
+
{ input: 'username/repo', expected: 'github', name: 'repo' },
|
|
11
|
+
// GitHub HTTPS
|
|
12
|
+
{ input: 'https://github.com/username/repo', expected: 'github', name: 'repo' },
|
|
13
|
+
{ input: 'https://github.com/username/repo.git', expected: 'github', name: 'repo' },
|
|
14
|
+
// GitHub SSH
|
|
15
|
+
{ input: 'git@github.com:username/repo.git', expected: 'git-ssh', name: 'repo' },
|
|
16
|
+
// Direct URL
|
|
17
|
+
{ input: 'https://example.com/my-marketplace.json', expected: 'url', name: 'my-marketplace' },
|
|
18
|
+
{ input: 'https://cdn.example.com/photons/marketplace.json', expected: 'url', name: 'marketplace' },
|
|
19
|
+
// Local paths
|
|
20
|
+
{ input: './local-mcps', expected: 'local', name: 'local-mcps' },
|
|
21
|
+
{ input: '/absolute/path/to/mcps', expected: 'local', name: 'mcps' },
|
|
22
|
+
{ input: '~/my-photons', expected: 'local', name: 'my-photons' },
|
|
23
|
+
];
|
|
24
|
+
console.log('Testing marketplace source parsing...\n');
|
|
25
|
+
for (const testCase of testCases) {
|
|
26
|
+
try {
|
|
27
|
+
// Use private method via any cast to test parsing
|
|
28
|
+
const parsed = manager.parseMarketplaceSource(testCase.input);
|
|
29
|
+
if (!parsed) {
|
|
30
|
+
console.log(`❌ ${testCase.input}`);
|
|
31
|
+
console.log(` Failed to parse\n`);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const typeMatch = parsed.sourceType === testCase.expected;
|
|
35
|
+
const nameMatch = parsed.name === testCase.name;
|
|
36
|
+
if (typeMatch && nameMatch) {
|
|
37
|
+
console.log(`✅ ${testCase.input}`);
|
|
38
|
+
console.log(` Type: ${parsed.sourceType}, Name: ${parsed.name}, URL: ${parsed.url}\n`);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.log(`❌ ${testCase.input}`);
|
|
42
|
+
console.log(` Expected type: ${testCase.expected}, got: ${parsed.sourceType}`);
|
|
43
|
+
console.log(` Expected name: ${testCase.name}, got: ${parsed.name}\n`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.log(`❌ ${testCase.input}`);
|
|
48
|
+
console.log(` Error: ${error.message}\n`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
testMarketplaceParsing().catch(console.error);
|
|
53
|
+
//# sourceMappingURL=test-marketplace-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-marketplace-sources.js","sourceRoot":"","sources":["../src/test-marketplace-sources.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon MCP Core Types
|
|
3
|
+
*/
|
|
4
|
+
export interface PhotonTool {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object';
|
|
9
|
+
properties: Record<string, any>;
|
|
10
|
+
required?: string[];
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface ExtractedSchema {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: 'object';
|
|
18
|
+
properties: Record<string, any>;
|
|
19
|
+
required?: string[];
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface PhotonMCPClass {
|
|
23
|
+
name: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
tools: PhotonTool[];
|
|
26
|
+
instance: any;
|
|
27
|
+
}
|
|
28
|
+
export interface ConstructorParam {
|
|
29
|
+
name: string;
|
|
30
|
+
type: string;
|
|
31
|
+
isOptional: boolean;
|
|
32
|
+
hasDefault: boolean;
|
|
33
|
+
defaultValue?: any;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Template type - for text generation with variable substitution
|
|
37
|
+
* Maps to MCP Prompts, HTTP template endpoints, CLI help generators, etc.
|
|
38
|
+
*/
|
|
39
|
+
export type Template = string & {
|
|
40
|
+
__brand: 'Template';
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Static type - for read-only data/content
|
|
44
|
+
* Maps to MCP Resources, HTTP GET endpoints, CLI read commands, etc.
|
|
45
|
+
*/
|
|
46
|
+
export type Static = string & {
|
|
47
|
+
__brand: 'Static';
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Helper to cast string as Template (optional, for clarity)
|
|
51
|
+
*/
|
|
52
|
+
export declare const asTemplate: (str: string) => Template;
|
|
53
|
+
/**
|
|
54
|
+
* Helper to cast string as Static (optional, for clarity)
|
|
55
|
+
*/
|
|
56
|
+
export declare const asStatic: (str: string) => Static;
|
|
57
|
+
/**
|
|
58
|
+
* Message format for templates (MCP compatibility)
|
|
59
|
+
*/
|
|
60
|
+
export interface TemplateMessage {
|
|
61
|
+
role: 'user' | 'assistant';
|
|
62
|
+
content: {
|
|
63
|
+
type: 'text' | 'image';
|
|
64
|
+
text?: string;
|
|
65
|
+
data?: string;
|
|
66
|
+
mimeType?: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Template response format (for advanced cases)
|
|
71
|
+
*/
|
|
72
|
+
export interface TemplateResponse {
|
|
73
|
+
messages: TemplateMessage[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Template metadata
|
|
77
|
+
*/
|
|
78
|
+
export interface TemplateInfo {
|
|
79
|
+
name: string;
|
|
80
|
+
description: string;
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object';
|
|
83
|
+
properties: Record<string, any>;
|
|
84
|
+
required?: string[];
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Static resource metadata
|
|
89
|
+
*/
|
|
90
|
+
export interface StaticInfo {
|
|
91
|
+
name: string;
|
|
92
|
+
uri: string;
|
|
93
|
+
description: string;
|
|
94
|
+
mimeType?: string;
|
|
95
|
+
inputSchema: {
|
|
96
|
+
type: 'object';
|
|
97
|
+
properties: Record<string, any>;
|
|
98
|
+
required?: string[];
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extended PhotonMCPClass with templates and statics
|
|
103
|
+
*/
|
|
104
|
+
export interface PhotonMCPClassExtended extends PhotonMCPClass {
|
|
105
|
+
templates: TemplateInfo[];
|
|
106
|
+
statics: StaticInfo[];
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,GAAG,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,QAA2B,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,KAAG,MAAuB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,cAAc;IAC5D,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Photon MCP Core Types
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Helper to cast string as Template (optional, for clarity)
|
|
6
|
+
*/
|
|
7
|
+
export const asTemplate = (str) => str;
|
|
8
|
+
/**
|
|
9
|
+
* Helper to cast string as Static (optional, for clarity)
|
|
10
|
+
*/
|
|
11
|
+
export const asStatic = (str) => str;
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiDH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAY,EAAE,CAAC,GAAe,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAa,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Checker - Check for MCP updates from marketplace
|
|
3
|
+
*/
|
|
4
|
+
import { MarketplaceManager, Marketplace } from './marketplace-manager.js';
|
|
5
|
+
interface VersionInfo {
|
|
6
|
+
local?: string;
|
|
7
|
+
remote?: string;
|
|
8
|
+
needsUpdate: boolean;
|
|
9
|
+
marketplace?: Marketplace;
|
|
10
|
+
}
|
|
11
|
+
export declare class VersionChecker {
|
|
12
|
+
private marketplaceManager;
|
|
13
|
+
constructor(marketplaceManager?: MarketplaceManager);
|
|
14
|
+
initialize(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Extract version from MCP source file
|
|
17
|
+
*/
|
|
18
|
+
extractVersion(filePath: string): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Fetch remote version from marketplace
|
|
21
|
+
*/
|
|
22
|
+
fetchRemoteVersion(mcpName: string): Promise<{
|
|
23
|
+
version: string;
|
|
24
|
+
marketplace: Marketplace;
|
|
25
|
+
} | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Compare versions (semver-like)
|
|
28
|
+
*/
|
|
29
|
+
compareVersions(v1: string, v2: string): number;
|
|
30
|
+
/**
|
|
31
|
+
* Check if MCP needs update
|
|
32
|
+
*/
|
|
33
|
+
checkForUpdate(mcpName: string, localPath: string): Promise<VersionInfo>;
|
|
34
|
+
/**
|
|
35
|
+
* Check all MCPs in working directory for updates
|
|
36
|
+
*/
|
|
37
|
+
checkAllUpdates(workingDir: string): Promise<Map<string, VersionInfo>>;
|
|
38
|
+
/**
|
|
39
|
+
* Download and update MCP from marketplace
|
|
40
|
+
*/
|
|
41
|
+
updateMCP(mcpName: string, targetPath: string): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Format version info for display
|
|
44
|
+
*/
|
|
45
|
+
formatVersionInfo(info: VersionInfo): string;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=version-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-checker.d.ts","sourceRoot":"","sources":["../src/version-checker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE3E,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,kBAAkB,CAAC,EAAE,kBAAkB;IAI7C,UAAU;IAIhB;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAU9D;;OAEG;IACG,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE,GAAG,IAAI,CAAC;IAIxG;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM;IAY/C;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB9E;;OAEG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAwB5E;;OAEG;IACG,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAetE;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM;CAmB7C"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Version Checker - Check for MCP updates from marketplace
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'fs/promises';
|
|
5
|
+
import * as path from 'path';
|
|
6
|
+
import { MarketplaceManager } from './marketplace-manager.js';
|
|
7
|
+
export class VersionChecker {
|
|
8
|
+
marketplaceManager;
|
|
9
|
+
constructor(marketplaceManager) {
|
|
10
|
+
this.marketplaceManager = marketplaceManager || new MarketplaceManager();
|
|
11
|
+
}
|
|
12
|
+
async initialize() {
|
|
13
|
+
await this.marketplaceManager.initialize();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract version from MCP source file
|
|
17
|
+
*/
|
|
18
|
+
async extractVersion(filePath) {
|
|
19
|
+
try {
|
|
20
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
21
|
+
const versionMatch = content.match(/@version\s+(\d+\.\d+\.\d+)/);
|
|
22
|
+
return versionMatch ? versionMatch[1] : null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fetch remote version from marketplace
|
|
30
|
+
*/
|
|
31
|
+
async fetchRemoteVersion(mcpName) {
|
|
32
|
+
return await this.marketplaceManager.fetchVersion(mcpName);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Compare versions (semver-like)
|
|
36
|
+
*/
|
|
37
|
+
compareVersions(v1, v2) {
|
|
38
|
+
const parts1 = v1.split('.').map(Number);
|
|
39
|
+
const parts2 = v2.split('.').map(Number);
|
|
40
|
+
for (let i = 0; i < 3; i++) {
|
|
41
|
+
if (parts1[i] > parts2[i])
|
|
42
|
+
return 1;
|
|
43
|
+
if (parts1[i] < parts2[i])
|
|
44
|
+
return -1;
|
|
45
|
+
}
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if MCP needs update
|
|
50
|
+
*/
|
|
51
|
+
async checkForUpdate(mcpName, localPath) {
|
|
52
|
+
const local = await this.extractVersion(localPath);
|
|
53
|
+
const remoteInfo = await this.fetchRemoteVersion(mcpName);
|
|
54
|
+
if (!local || !remoteInfo) {
|
|
55
|
+
return {
|
|
56
|
+
local: local || undefined,
|
|
57
|
+
remote: remoteInfo?.version,
|
|
58
|
+
needsUpdate: false,
|
|
59
|
+
marketplace: remoteInfo?.marketplace,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
const needsUpdate = this.compareVersions(remoteInfo.version, local) > 0;
|
|
63
|
+
return {
|
|
64
|
+
local,
|
|
65
|
+
remote: remoteInfo.version,
|
|
66
|
+
needsUpdate,
|
|
67
|
+
marketplace: remoteInfo.marketplace,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check all MCPs in working directory for updates
|
|
72
|
+
*/
|
|
73
|
+
async checkAllUpdates(workingDir) {
|
|
74
|
+
const updates = new Map();
|
|
75
|
+
try {
|
|
76
|
+
const entries = await fs.readdir(workingDir, { withFileTypes: true });
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (entry.isFile() && entry.name.endsWith('.photon.ts')) {
|
|
79
|
+
const mcpName = entry.name.replace('.photon.ts', '');
|
|
80
|
+
const filePath = path.join(workingDir, entry.name);
|
|
81
|
+
const versionInfo = await this.checkForUpdate(mcpName, filePath);
|
|
82
|
+
if (versionInfo.local || versionInfo.remote) {
|
|
83
|
+
updates.set(mcpName, versionInfo);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Directory doesn't exist or other error
|
|
90
|
+
}
|
|
91
|
+
return updates;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Download and update MCP from marketplace
|
|
95
|
+
*/
|
|
96
|
+
async updateMCP(mcpName, targetPath) {
|
|
97
|
+
try {
|
|
98
|
+
const result = await this.marketplaceManager.fetchMCP(mcpName);
|
|
99
|
+
if (!result) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
await fs.writeFile(targetPath, result.content, 'utf-8');
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format version info for display
|
|
111
|
+
*/
|
|
112
|
+
formatVersionInfo(info) {
|
|
113
|
+
if (!info.local && !info.remote) {
|
|
114
|
+
return 'unknown';
|
|
115
|
+
}
|
|
116
|
+
if (!info.local) {
|
|
117
|
+
return `remote: ${info.remote}`;
|
|
118
|
+
}
|
|
119
|
+
if (!info.remote) {
|
|
120
|
+
return `local: ${info.local}`;
|
|
121
|
+
}
|
|
122
|
+
if (info.needsUpdate) {
|
|
123
|
+
return `${info.local} → ${info.remote} (update available)`;
|
|
124
|
+
}
|
|
125
|
+
return `${info.local} (up to date)`;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=version-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-checker.js","sourceRoot":"","sources":["../src/version-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher for Dev Mode
|
|
3
|
+
*
|
|
4
|
+
* Watches .photon.ts file for changes and triggers hot reload
|
|
5
|
+
*/
|
|
6
|
+
import { PhotonServer } from './server.js';
|
|
7
|
+
export declare class FileWatcher {
|
|
8
|
+
private watcher;
|
|
9
|
+
private server;
|
|
10
|
+
private filePath;
|
|
11
|
+
private reloadTimeout;
|
|
12
|
+
constructor(server: PhotonServer, filePath: string);
|
|
13
|
+
/**
|
|
14
|
+
* Start watching the file
|
|
15
|
+
*/
|
|
16
|
+
start(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Handle file change event
|
|
19
|
+
*/
|
|
20
|
+
private handleFileChange;
|
|
21
|
+
/**
|
|
22
|
+
* Stop watching
|
|
23
|
+
*/
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAA+B;gBAExC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM;IAKlD;;OAEG;IACH,KAAK;IAsBL;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;OAEG;IACG,IAAI;CAaX"}
|