@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,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":";AACA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AA2BrC,MAAM,OAAO,aAAa;IAChB,OAAO,CAAgB;IACvB,SAAS,GAAG,CAAC,CAAC;IACd,eAAe,GAAG,IAAI,GAAG,EAG7B,CAAC;IAEL,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,IAAc,EAAE,GAA4B;QACvE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;gBAClC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;aAChC,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;gBAClC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;gBAC1B,SAAS,EAAE,QAAQ;aACpB,CAAC,CAAC;YAEH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACrB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;oBACjD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACtD,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;wBACzC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,IAAI,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,uDAAuD;YACvD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,CAAC;oBACxC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;oBAC1B,SAAS,EAAE,QAAQ;iBACpB,CAAC,CAAC;gBAEH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3B,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBACtC,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,kCAAkC;YAClC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAY;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QAC5B,MAAM,OAAO,GAAe;YAC1B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM;YACN,MAAM;SACP,CAAC;QAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAElD,0BAA0B;YAC1B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,EAAE,KAAK,CAAC,CAAC;YAEV,IAAI,CAAC,OAAQ,CAAC,KAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA8C;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAC7B,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,UAAU,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE;SACpE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAU;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAiB;QAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpC,MAAM,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACN,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBAC3E,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,QAAQ,QAAQ,EAAE,CAAC,CAAC;oBACpD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC,CAAC;oBACzC,MAAM,EAAE,CAAC;gBACX,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS,EAAE,CAAC,QAAqB,EAAE,EAAE,CACnC,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,+BAA+B;IAElE,QAAQ,EAAE,CAAC,QAAqB,EAAE,EAAE,CAClC,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,8BAA8B;IAEhE,cAAc,EAAE,CAAC,OAAe,EAAE,KAAc,EAAE,EAAE,CAAC,CAAC,QAAqB,EAAE,EAAE;QAC7E,MAAM,KAAK,GAAG,KAAK;YACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,OAAO,mBAAmB,KAAK,EAAE,CAAC;IAC7E,CAAC;IAED,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,QAAqB,EAAE,EAAE;QACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,GAAQ,QAAQ,CAAC,MAAM,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO,kBAAkB,KAAK,EAAE,CAAC;YACnC,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,EAAE,CAAC,QAAa,EAAE,KAAc,EAAE,EAAE,CAAC,CAAC,QAAqB,EAAE,EAAE;QACnE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,KAAK,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;IACxF,CAAC;IAED,MAAM,EAAE,CAAC,EAAqC,EAAE,EAAE,CAAC,CAAC,QAAqB,EAAE,EAAE;QAC3E,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,EAAE,CAAC,GAAG,UAA8D,EAAE,EAAE,CAAC,CAAC,QAAqB,EAAE,EAAE;QACpG,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,MAAM,KAAK,IAAI;gBAAE,OAAO,MAAM,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Quick test script to verify marketplace source parsing
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=test-marketplace-sources.d.ts.map
@@ -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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"}
@@ -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"}