@portel/photon 1.2.0 → 1.4.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/README.md +319 -60
- package/dist/cli-alias.d.ts +21 -0
- package/dist/cli-alias.d.ts.map +1 -0
- package/dist/cli-alias.js +232 -0
- package/dist/cli-alias.js.map +1 -0
- package/dist/cli-formatter.d.ts +25 -0
- package/dist/cli-formatter.d.ts.map +1 -0
- package/dist/cli-formatter.js +326 -0
- package/dist/cli-formatter.js.map +1 -0
- package/dist/cli.js +961 -484
- package/dist/cli.js.map +1 -1
- package/dist/daemon/client.d.ts +15 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +126 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/manager.d.ts +32 -0
- package/dist/daemon/manager.d.ts.map +1 -0
- package/dist/daemon/manager.js +155 -0
- package/dist/daemon/manager.js.map +1 -0
- package/dist/daemon/protocol.d.ts +48 -0
- package/dist/daemon/protocol.d.ts.map +1 -0
- package/dist/daemon/protocol.js +7 -0
- package/dist/daemon/protocol.js.map +1 -0
- package/dist/daemon/server.d.ts +12 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +215 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/session-manager.d.ts +46 -0
- package/dist/daemon/session-manager.d.ts.map +1 -0
- package/dist/daemon/session-manager.js +120 -0
- package/dist/daemon/session-manager.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +16 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +125 -19
- package/dist/loader.js.map +1 -1
- package/dist/path-resolver.d.ts +12 -19
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +35 -61
- package/dist/path-resolver.js.map +1 -1
- package/dist/photon-cli-runner.d.ts +15 -0
- package/dist/photon-cli-runner.d.ts.map +1 -0
- package/dist/photon-cli-runner.js +1124 -0
- package/dist/photon-cli-runner.js.map +1 -0
- package/dist/photon-doc-extractor.d.ts +10 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +89 -9
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/schema-extractor.d.ts +27 -0
- package/dist/schema-extractor.d.ts.map +1 -1
- package/dist/schema-extractor.js +333 -2
- package/dist/schema-extractor.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -8
- package/dist/server.js.map +1 -1
- package/dist/template-manager.js +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/daemon/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon Protocol Types
|
|
3
|
+
*
|
|
4
|
+
* Defines message types for IPC communication between CLI client and daemon server
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Message from CLI client to daemon server
|
|
8
|
+
*/
|
|
9
|
+
export interface DaemonRequest {
|
|
10
|
+
type: 'command' | 'ping' | 'shutdown';
|
|
11
|
+
id: string;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
clientType?: 'cli' | 'mcp' | 'code-mode';
|
|
14
|
+
method?: string;
|
|
15
|
+
args?: Record<string, any>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Response from daemon server to CLI client
|
|
19
|
+
*/
|
|
20
|
+
export interface DaemonResponse {
|
|
21
|
+
type: 'result' | 'error' | 'pong';
|
|
22
|
+
id: string;
|
|
23
|
+
success?: boolean;
|
|
24
|
+
data?: any;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Daemon status information
|
|
29
|
+
*/
|
|
30
|
+
export interface DaemonStatus {
|
|
31
|
+
running: boolean;
|
|
32
|
+
pid?: number;
|
|
33
|
+
startTime?: number;
|
|
34
|
+
lastActivity?: number;
|
|
35
|
+
photonName: string;
|
|
36
|
+
activeSessions?: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Session information
|
|
40
|
+
*/
|
|
41
|
+
export interface PhotonSession {
|
|
42
|
+
id: string;
|
|
43
|
+
instance: any;
|
|
44
|
+
createdAt: number;
|
|
45
|
+
lastActivity: number;
|
|
46
|
+
clientType?: string;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,GAAG,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/daemon/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Daemon Server
|
|
4
|
+
*
|
|
5
|
+
* Runs as a background process for stateful photons
|
|
6
|
+
* - Loads and initializes the photon
|
|
7
|
+
* - Listens on Unix socket / named pipe
|
|
8
|
+
* - Handles command requests
|
|
9
|
+
* - Manages idle timeout and shutdown
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":";AAEA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Daemon Server
|
|
4
|
+
*
|
|
5
|
+
* Runs as a background process for stateful photons
|
|
6
|
+
* - Loads and initializes the photon
|
|
7
|
+
* - Listens on Unix socket / named pipe
|
|
8
|
+
* - Handles command requests
|
|
9
|
+
* - Manages idle timeout and shutdown
|
|
10
|
+
*/
|
|
11
|
+
import * as net from 'net';
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import { SessionManager } from './session-manager.js';
|
|
14
|
+
// Command line args: photonName photonPath socketPath
|
|
15
|
+
const photonName = process.argv[2];
|
|
16
|
+
const photonPath = process.argv[3];
|
|
17
|
+
const socketPath = process.argv[4];
|
|
18
|
+
if (!photonName || !photonPath || !socketPath) {
|
|
19
|
+
console.error('[daemon-server] Missing required arguments');
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
let sessionManager = null;
|
|
23
|
+
let idleTimeout = 600000; // 10 minutes default
|
|
24
|
+
let idleTimer = null;
|
|
25
|
+
/**
|
|
26
|
+
* Initialize session manager
|
|
27
|
+
*/
|
|
28
|
+
async function initializeSessionManager() {
|
|
29
|
+
try {
|
|
30
|
+
console.error(`[daemon-server] Initializing session manager for: ${photonName}`);
|
|
31
|
+
sessionManager = new SessionManager(photonPath, photonName, idleTimeout);
|
|
32
|
+
console.error(`[daemon-server] Session manager initialized`);
|
|
33
|
+
console.error(`[daemon-server] Session timeout: ${idleTimeout}ms`);
|
|
34
|
+
// Start idle timer if timeout is set
|
|
35
|
+
if (idleTimeout > 0) {
|
|
36
|
+
startIdleTimer();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error(`[daemon-server] Failed to initialize session manager: ${error.message}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Start idle timer
|
|
46
|
+
*/
|
|
47
|
+
function startIdleTimer() {
|
|
48
|
+
if (idleTimer) {
|
|
49
|
+
clearTimeout(idleTimer);
|
|
50
|
+
}
|
|
51
|
+
if (idleTimeout <= 0) {
|
|
52
|
+
return; // Idle timeout disabled
|
|
53
|
+
}
|
|
54
|
+
idleTimer = setTimeout(() => {
|
|
55
|
+
if (!sessionManager)
|
|
56
|
+
return;
|
|
57
|
+
const lastActivity = sessionManager.getLastActivity();
|
|
58
|
+
const idleTime = Date.now() - lastActivity;
|
|
59
|
+
if (idleTime >= idleTimeout) {
|
|
60
|
+
console.error(`[daemon-server] Idle timeout reached (${idleTime}ms). Shutting down.`);
|
|
61
|
+
shutdown();
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Restart timer with remaining time
|
|
65
|
+
startIdleTimer();
|
|
66
|
+
}
|
|
67
|
+
}, idleTimeout);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Reset idle timer (called on each activity)
|
|
71
|
+
*/
|
|
72
|
+
function resetIdleTimer() {
|
|
73
|
+
startIdleTimer();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Handle incoming command request
|
|
77
|
+
*/
|
|
78
|
+
async function handleRequest(request) {
|
|
79
|
+
resetIdleTimer();
|
|
80
|
+
if (request.type === 'ping') {
|
|
81
|
+
return {
|
|
82
|
+
type: 'pong',
|
|
83
|
+
id: request.id,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (request.type === 'shutdown') {
|
|
87
|
+
shutdown();
|
|
88
|
+
return {
|
|
89
|
+
type: 'result',
|
|
90
|
+
id: request.id,
|
|
91
|
+
success: true,
|
|
92
|
+
data: { message: 'Shutting down' },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (request.type === 'command') {
|
|
96
|
+
if (!request.method) {
|
|
97
|
+
return {
|
|
98
|
+
type: 'error',
|
|
99
|
+
id: request.id,
|
|
100
|
+
error: 'Method name required',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (!sessionManager) {
|
|
104
|
+
return {
|
|
105
|
+
type: 'error',
|
|
106
|
+
id: request.id,
|
|
107
|
+
error: 'Session manager not initialized',
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
// Get or create session for this client
|
|
112
|
+
const session = await sessionManager.getOrCreateSession(request.sessionId, request.clientType);
|
|
113
|
+
console.error(`[daemon-server] Executing: ${request.method} (session: ${session.id})`);
|
|
114
|
+
// Execute method on session's photon instance using loader
|
|
115
|
+
const result = await sessionManager.loader.executeTool(session.instance, request.method, request.args || {});
|
|
116
|
+
return {
|
|
117
|
+
type: 'result',
|
|
118
|
+
id: request.id,
|
|
119
|
+
success: true,
|
|
120
|
+
data: result,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(`[daemon-server] Error executing ${request.method}: ${error.message}`);
|
|
125
|
+
return {
|
|
126
|
+
type: 'error',
|
|
127
|
+
id: request.id,
|
|
128
|
+
error: error.message,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
type: 'error',
|
|
134
|
+
id: request.id,
|
|
135
|
+
error: `Unknown request type: ${request.type}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Start IPC server
|
|
140
|
+
*/
|
|
141
|
+
function startServer() {
|
|
142
|
+
const server = net.createServer((socket) => {
|
|
143
|
+
console.error('[daemon-server] Client connected');
|
|
144
|
+
let buffer = '';
|
|
145
|
+
socket.on('data', async (chunk) => {
|
|
146
|
+
buffer += chunk.toString();
|
|
147
|
+
// Process complete JSON messages (newline-delimited)
|
|
148
|
+
const lines = buffer.split('\n');
|
|
149
|
+
buffer = lines.pop() || ''; // Keep incomplete line in buffer
|
|
150
|
+
for (const line of lines) {
|
|
151
|
+
if (!line.trim())
|
|
152
|
+
continue;
|
|
153
|
+
try {
|
|
154
|
+
const request = JSON.parse(line);
|
|
155
|
+
const response = await handleRequest(request);
|
|
156
|
+
socket.write(JSON.stringify(response) + '\n');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error(`[daemon-server] Error processing request: ${error.message}`);
|
|
160
|
+
socket.write(JSON.stringify({
|
|
161
|
+
type: 'error',
|
|
162
|
+
id: 'unknown',
|
|
163
|
+
error: error.message,
|
|
164
|
+
}) + '\n');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
socket.on('end', () => {
|
|
169
|
+
console.error('[daemon-server] Client disconnected');
|
|
170
|
+
});
|
|
171
|
+
socket.on('error', (error) => {
|
|
172
|
+
console.error(`[daemon-server] Socket error: ${error.message}`);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
server.listen(socketPath, () => {
|
|
176
|
+
console.error(`[daemon-server] Listening on ${socketPath}`);
|
|
177
|
+
console.error(`[daemon-server] PID: ${process.pid}`);
|
|
178
|
+
});
|
|
179
|
+
server.on('error', (error) => {
|
|
180
|
+
console.error(`[daemon-server] Server error: ${error.message}`);
|
|
181
|
+
process.exit(1);
|
|
182
|
+
});
|
|
183
|
+
// Graceful shutdown handlers
|
|
184
|
+
process.on('SIGTERM', shutdown);
|
|
185
|
+
process.on('SIGINT', shutdown);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Shutdown daemon
|
|
189
|
+
*/
|
|
190
|
+
function shutdown() {
|
|
191
|
+
console.error('[daemon-server] Shutting down...');
|
|
192
|
+
if (idleTimer) {
|
|
193
|
+
clearTimeout(idleTimer);
|
|
194
|
+
}
|
|
195
|
+
// Destroy session manager
|
|
196
|
+
if (sessionManager) {
|
|
197
|
+
sessionManager.destroy();
|
|
198
|
+
}
|
|
199
|
+
// Clean up socket file (Unix only)
|
|
200
|
+
if (fs.existsSync(socketPath) && process.platform !== 'win32') {
|
|
201
|
+
try {
|
|
202
|
+
fs.unlinkSync(socketPath);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
// Ignore cleanup errors
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
process.exit(0);
|
|
209
|
+
}
|
|
210
|
+
// Main execution
|
|
211
|
+
(async () => {
|
|
212
|
+
await initializeSessionManager();
|
|
213
|
+
startServer();
|
|
214
|
+
})();
|
|
215
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages isolated photon instances per client session
|
|
5
|
+
* Handles session lifecycle, cleanup, and resource management
|
|
6
|
+
*/
|
|
7
|
+
import { PhotonLoader } from '../loader.js';
|
|
8
|
+
import { PhotonSession } from './protocol.js';
|
|
9
|
+
export declare class SessionManager {
|
|
10
|
+
private sessions;
|
|
11
|
+
private photonPath;
|
|
12
|
+
private photonName;
|
|
13
|
+
loader: PhotonLoader;
|
|
14
|
+
private sessionTimeout;
|
|
15
|
+
private cleanupInterval;
|
|
16
|
+
constructor(photonPath: string, photonName: string, sessionTimeout?: number);
|
|
17
|
+
/**
|
|
18
|
+
* Get or create a session
|
|
19
|
+
*/
|
|
20
|
+
getOrCreateSession(sessionId: string | undefined, clientType?: string): Promise<PhotonSession>;
|
|
21
|
+
/**
|
|
22
|
+
* Get session count
|
|
23
|
+
*/
|
|
24
|
+
getSessionCount(): number;
|
|
25
|
+
/**
|
|
26
|
+
* Get all sessions (for debugging)
|
|
27
|
+
*/
|
|
28
|
+
getSessions(): PhotonSession[];
|
|
29
|
+
/**
|
|
30
|
+
* Clean up idle sessions
|
|
31
|
+
*/
|
|
32
|
+
private cleanup;
|
|
33
|
+
/**
|
|
34
|
+
* Start periodic cleanup
|
|
35
|
+
*/
|
|
36
|
+
private startCleanup;
|
|
37
|
+
/**
|
|
38
|
+
* Stop cleanup and destroy all sessions
|
|
39
|
+
*/
|
|
40
|
+
destroy(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get last activity time across all sessions
|
|
43
|
+
*/
|
|
44
|
+
getLastActivity(): number;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/daemon/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI9C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IACpB,MAAM,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,eAAe,CAA+B;gBAE1C,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAE,MAAe;IAUnF;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAiCpG;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE;IAI9B;;OAEG;IACH,OAAO,CAAC,OAAO;IAuBf;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,eAAe,IAAI,MAAM;CAS1B"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages isolated photon instances per client session
|
|
5
|
+
* Handles session lifecycle, cleanup, and resource management
|
|
6
|
+
*/
|
|
7
|
+
import { PhotonLoader } from '../loader.js';
|
|
8
|
+
const DEFAULT_SESSION_ID = 'default';
|
|
9
|
+
export class SessionManager {
|
|
10
|
+
sessions = new Map();
|
|
11
|
+
photonPath;
|
|
12
|
+
photonName;
|
|
13
|
+
loader; // Public to allow executeTool access
|
|
14
|
+
sessionTimeout;
|
|
15
|
+
cleanupInterval = null;
|
|
16
|
+
constructor(photonPath, photonName, sessionTimeout = 600000) {
|
|
17
|
+
this.photonPath = photonPath;
|
|
18
|
+
this.photonName = photonName;
|
|
19
|
+
this.sessionTimeout = sessionTimeout;
|
|
20
|
+
this.loader = new PhotonLoader(false); // verbose = false
|
|
21
|
+
// Start periodic cleanup
|
|
22
|
+
this.startCleanup();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get or create a session
|
|
26
|
+
*/
|
|
27
|
+
async getOrCreateSession(sessionId, clientType) {
|
|
28
|
+
const id = sessionId || DEFAULT_SESSION_ID;
|
|
29
|
+
if (this.sessions.has(id)) {
|
|
30
|
+
const session = this.sessions.get(id);
|
|
31
|
+
session.lastActivity = Date.now();
|
|
32
|
+
return session;
|
|
33
|
+
}
|
|
34
|
+
// Create new session
|
|
35
|
+
console.error(`[session-manager] Creating new session: ${id} (${clientType || 'unknown'})`);
|
|
36
|
+
try {
|
|
37
|
+
const instance = await this.loader.loadFile(this.photonPath);
|
|
38
|
+
const session = {
|
|
39
|
+
id,
|
|
40
|
+
instance,
|
|
41
|
+
createdAt: Date.now(),
|
|
42
|
+
lastActivity: Date.now(),
|
|
43
|
+
clientType
|
|
44
|
+
};
|
|
45
|
+
this.sessions.set(id, session);
|
|
46
|
+
console.error(`[session-manager] Session created. Active sessions: ${this.sessions.size}`);
|
|
47
|
+
return session;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error(`[session-manager] Failed to create session: ${error.message}`);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get session count
|
|
56
|
+
*/
|
|
57
|
+
getSessionCount() {
|
|
58
|
+
return this.sessions.size;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get all sessions (for debugging)
|
|
62
|
+
*/
|
|
63
|
+
getSessions() {
|
|
64
|
+
return Array.from(this.sessions.values());
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Clean up idle sessions
|
|
68
|
+
*/
|
|
69
|
+
cleanup() {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const expiredSessions = [];
|
|
72
|
+
for (const [id, session] of this.sessions) {
|
|
73
|
+
const idleTime = now - session.lastActivity;
|
|
74
|
+
if (idleTime > this.sessionTimeout) {
|
|
75
|
+
console.error(`[session-manager] Session ${id} expired (idle ${idleTime}ms)`);
|
|
76
|
+
expiredSessions.push(id);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Remove expired sessions
|
|
80
|
+
for (const id of expiredSessions) {
|
|
81
|
+
this.sessions.delete(id);
|
|
82
|
+
}
|
|
83
|
+
if (expiredSessions.length > 0) {
|
|
84
|
+
console.error(`[session-manager] Cleaned up ${expiredSessions.length} sessions. Active: ${this.sessions.size}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Start periodic cleanup
|
|
89
|
+
*/
|
|
90
|
+
startCleanup() {
|
|
91
|
+
// Run cleanup every minute
|
|
92
|
+
this.cleanupInterval = setInterval(() => {
|
|
93
|
+
this.cleanup();
|
|
94
|
+
}, 60000);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Stop cleanup and destroy all sessions
|
|
98
|
+
*/
|
|
99
|
+
destroy() {
|
|
100
|
+
if (this.cleanupInterval) {
|
|
101
|
+
clearInterval(this.cleanupInterval);
|
|
102
|
+
this.cleanupInterval = null;
|
|
103
|
+
}
|
|
104
|
+
console.error(`[session-manager] Destroying ${this.sessions.size} active sessions`);
|
|
105
|
+
this.sessions.clear();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get last activity time across all sessions
|
|
109
|
+
*/
|
|
110
|
+
getLastActivity() {
|
|
111
|
+
let latest = 0;
|
|
112
|
+
for (const session of this.sessions.values()) {
|
|
113
|
+
if (session.lastActivity > latest) {
|
|
114
|
+
latest = session.lastActivity;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return latest;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/daemon/session-manager.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @portel/photon
|
|
3
|
+
*
|
|
4
|
+
* Build MCP servers and CLI tools from single .photon.ts files
|
|
5
|
+
*
|
|
6
|
+
* Re-exports @portel/photon-core for backward compatibility
|
|
7
|
+
* and adds Photon-specific runtime functionality
|
|
8
|
+
*/
|
|
9
|
+
export * from '@portel/photon-core';
|
|
10
|
+
export { PhotonLoader } from './loader.js';
|
|
11
|
+
export { PhotonServer } from './server.js';
|
|
12
|
+
export { PhotonDocExtractor } from './photon-doc-extractor.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @portel/photon
|
|
3
|
+
*
|
|
4
|
+
* Build MCP servers and CLI tools from single .photon.ts files
|
|
5
|
+
*
|
|
6
|
+
* Re-exports @portel/photon-core for backward compatibility
|
|
7
|
+
* and adds Photon-specific runtime functionality
|
|
8
|
+
*/
|
|
9
|
+
// Re-export everything from @portel/photon-core
|
|
10
|
+
export * from '@portel/photon-core';
|
|
11
|
+
// Export Photon-specific runtime components
|
|
12
|
+
export { PhotonLoader } from './loader.js';
|
|
13
|
+
export { PhotonServer } from './server.js';
|
|
14
|
+
export { PhotonDocExtractor } from './photon-doc-extractor.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gDAAgD;AAChD,cAAc,qBAAqB,CAAC;AAEpC,4CAA4C;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/loader.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Loads a single .photon.ts file and extracts tools
|
|
5
5
|
*/
|
|
6
|
-
import { PhotonMCPClass, PhotonMCPClassExtended } from '
|
|
6
|
+
import { PhotonMCPClass, PhotonMCPClassExtended } from '@portel/photon-core';
|
|
7
7
|
export declare class PhotonLoader {
|
|
8
8
|
private dependencyManager;
|
|
9
9
|
private verbose;
|
|
@@ -12,6 +12,21 @@ export declare class PhotonLoader {
|
|
|
12
12
|
* Log message only if verbose mode is enabled
|
|
13
13
|
*/
|
|
14
14
|
private log;
|
|
15
|
+
/**
|
|
16
|
+
* Directory where MCP-specific dependencies are cached
|
|
17
|
+
*/
|
|
18
|
+
private getDependencyCacheDir;
|
|
19
|
+
/**
|
|
20
|
+
* Path to metadata file describing installed dependencies
|
|
21
|
+
*/
|
|
22
|
+
private getDependencyMetadataPath;
|
|
23
|
+
private readDependencyMetadata;
|
|
24
|
+
private dependenciesEqual;
|
|
25
|
+
private writeDependencyMetadata;
|
|
26
|
+
private ensureDependenciesWithHash;
|
|
27
|
+
private shouldRetryInstall;
|
|
28
|
+
private static parseDependenciesFromSource;
|
|
29
|
+
private static mergeDependencySpecs;
|
|
15
30
|
/**
|
|
16
31
|
* Load a single Photon MCP file
|
|
17
32
|
*/
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAmE,cAAc,EAAE,sBAAsB,EAAwC,MAAM,qBAAqB,CAAC;AAQpL,qBAAa,YAAY;IACvB,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,OAAe;IAKpC;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAI7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;YAInB,sBAAsB;IASpC,OAAO,CAAC,iBAAiB;YAYX,uBAAuB;YAMvB,0BAA0B;IAwBxC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,MAAM,CAAC,2BAA2B;IAqB1C,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAWnC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAiIjE;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAuBnE;;OAEG;YACW,iBAAiB;IAuC/B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,OAAO;IAIf;;OAEG;IACH,OAAO,CAAC,eAAe;IAmBvB;;OAEG;IACH,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0BtB;;OAEG;YACW,YAAY;IAgG1B;;OAEG;YACW,wBAAwB;IAWtC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkF/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2D5B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAuClC;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAyBxF"}
|